Trong các bài trước, bạn đã làm quen với các lệnh trong Docker, cách tạo Dockerfile.
Dockerfile giúp bạn không cần lặp đi lặp lại việc gõ command line để tạo và run container. Nhưng trong ví dụ ở Part 8, bạn vẫn phải đánh rất nhiều lệnh để tạo ra 2 ứng dụng (ASP.NET Core và SQL Server), kết nối trong cùng 1 network.
Trong bài viết này, mình sẽ hướng dẫn các bạn tạo ra file Docker-compose để gom các lệnh đó vào trong cùng 1 file và gõ 1 lệnh duy nhất để run application.
Trước tiên, chúng ta cần tìm hiểu về YAML
YAML là gì?
Khi định nghĩa file docker-compose, bạn sẽ thấy file *.yaml.
YAML (YAML Ain’t Markup Language) là một chuẩn dữ liệu kiểu serialization dành cho tất cả các ngôn ngữ. Nó được sử dụng phổ biến để tạo ra các file config cho nhiều ứng dụng, VD: như Docker Compose.
Version mới nhất: 1.2
Định dạng mở rộng: .yaml, .yml
Các cú pháp cơ bản
Chú thích
# đây là chú thích
Giá trị một đối tượng được biểu diễn bằng viết trên một dòng key:giá-trị
# Ví dụ YAML
product: Petro 95
price: 31500
Khi một đối tượng cha chứa đối tượng con, thì đối tượng đó không được chứa giá trị và các đối tượng con biểu diễn bằng các dòng key:value thụt đầu dòng 2 khoẳng trắng so với phần tử cha.
# Ví dụ YAML
product: Petro 95
price: 31500
specifications:
vehicle: Vision, Lead
hdd: 500 GB
Đối tượng mảng
Sau tên mảng là :, các phần tử mảng biểu diễn trên mỗi dòng, thụt 2 khoảng trắng và bắt đầu bằng -# Ví dụ YAML
product: Laptop ABC
price: 333
specifications:
os: Windows 10
hdd: 500 GB
ram: # Mảng ram
- branch: XYZ
- speed: XXX
Hướng dẫn tạo file Docker compose
-
Tạo và chạy các thành phần định nghĩa trong docker-compose.yml (các dịch vụ, image, container, mạng, đĩa ...).
docker-compose up - Dừng và xóa: image, container, mạng, đĩa tạo ra bởi docker-compose up
docker-compose down - Chỉ stop chứ không xoá image, container, networks, volumes
docker-compose stop - Xem các container đang chạy, trạng thái, ports, và command của chúng
docker-compose ps - Xem log của service đang chạy
docker-compose logs [SERVICES]
docker-compose pull
docker-compose up -d
#Other useful commands for docker-compose are start/stop, config, ps and down.
# Starts all stopped containers in the work directory
docker-compose start
# Stops all currently running containers in the work directory
docker-compose stop
# Validates and shows the configuration
docker-compose config
# Lists all running containers in the work directory
docker-compose ps
# Stops and removes all containers in the work directory
docker-compose down
File mẫu YAML
# VIẾT THEO CÚ PHÁP YAML, CHÚ Ý CHÍNH XÁC KHOẢNG TRẮNG ĐẦU CÁC DÒNG
version: "3" # chọn viết theo bản 3 docs.docker.com/compose/compose-file/
services: # CÁC DỊCH VỤ (CONTAINER) NĂM TRONG services
________________________________________
pro-memcached: # (((1))) BẮT ĐẦU TẠO DỊCH VỤ THỨ NHẤT
image: "memcached:latest" # Image tạo ra dịch vụ
container_name: c-memcached01 # Tên container khi chạy
restart: always
hostname: memcached
networks:
- my-network # nối vào mạng my-network (tạo mạng này ở dưới)
command:
- "--conn-limit=2048" # Giới hạn kết nối là 2048
- "--memory-limit=2048" # Giới hạn cho phép dùng tới 4096 MB bộ nhớ làm cache
________________________________________
xtlab-apache: # (((2))) TẠO DỊCH VỤ HTTPD
image: "httpd:version2" # sử dụng image custome lại ở trên để tạo container
container_name: c-httpd01 # tên khi chạy container HTTPD
restart: always
hostname: httpd01
networks:
- my-network
ports:
- "8080:80" # Mở cổng 8080 public, ánh xạ vào 80
- "443:443"
volumes: # Ánh xạ thự mục vào container
- dir-site:/home/sites/ # Bind ổ đĩa - dir-site
________________________________________
xtlab-mysql: # (((3))) TẠO DỊCH VỤ MYSQL
image: "mysql:latest"
container_name: mysql-product
restart: always
hostname: mysql01
networks:
- my-network
environment:
MYSQL_ROOT_PASSWORD: abc123 #Thiết lập password
volumes:
- /mycode/db:/var/lib/mysql # thư mục lưu DB
- /mycode/db/my.cnf:/etc/mysql/my.cnf # ánh xạ file cấu hình
________________________________________
xtlab-php: # (((4))) TẠO DỊCH VỤ PHP
image: "php:version2"
container_name: php-product # tên container
hostname: php01
restart: always
networks:
- my-network
volumes:
- dir-site:/home/sites/ # Bind ổ đĩa - dir-site
________________________________________
networks: # TẠO NETWORK
my-network:
driver: bridge
________________________________________
volumes: # TẠO Ổ ĐĨA
dir-site: # ổ đĩa này lưu dữ liệu ở /mycode/
driver_opts:
device: /mycode/ # Hãy đảm bảo có thư mục /mycode/default
o: bind
Tạo file Docker compose
Có rất nhiều lệnh trong Docker compose. Dưới đây là 1 file compose cơ bản:version: "3.8"
services:
...
volumes:
...
networks:
...
Dòng đầu tiên chỉ ra version của file Docker compose. Các bạn có thể tham khảo version ở đây: https://docs.docker.com/compose/compose-file/compose-versioning/
Compose file format | Docker Engine release |
---|---|
Compose specification | 19.03.0+ |
3.8 | 19.03.0+ |
3.7 | 18.06.0+ |
3.6 | 18.02.0+ |
3.5 | 17.12.0+ |
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
Services
Định nghĩa Services sẽ chỉ tới Containers configurationservices:
sql:
container_name: sql1
image: "mcr.microsoft.com/mssql/server:2019-latest"
...
contoso:
build:
context: .
container_name: contoso
...
Ví dụ trên chia web ra làm 2 thành phần: ASP.NET Core (contoso) và Database (sql1).
Các bạn lưu ý container_name. Chúng ta sẽ dùng nó thay cho địa chỉ IP động.Pull và Build Image
Trong ví dụ này, chúng ta sẽ cấu hình SQL Server 2019.
image: pull image về từ hubs.docker.com environment: thiết lập biến môi trường. Trong ví dụ này, bạn chấp nhận cài đặt SQL Server, và đặt mật khẩu sa là Dance@2022services:
sql:
container_name: sql1
image: "mcr.microsoft.com/mssql/server:2019-latest"
networks:
- api-network
restart: always
ports:
- 1431:1433
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Dance@2022
Ví dụ 2:
Build container từ local folder hoặc từ git
services:
my-custom-app:
build: /path/to/dockerfile/
...
my-custom-app2:
build: https://github.com/my-company/my-project.git
...
Thiết lập Network
Định nghĩa 1 network mới tên là api-networknetworks:
api-network:
driver: bridge
Dependency
Thông thường, chúng ta cần tạo một chuỗi phụ thuộc giữa các service với nhau, để một số service được tải trước (và được tải xuống sau) các dịch vụ khác. Chúng ta có thể đạt được kết quả này thông qua từ khóa depend_on:services:
kafka:
image: wurstmeister/kafka:2.11-0.11.0.3
depends_on:
- zookeeper
...
zookeeper:
image: wurstmeister/zookeeper
...
Service zookeeper sẽ được tạo trước và hoàn thành trước khi tạo service kafka
Kết hợp
Dựa vào những ví dụ trên đây, chúng ta sẽ tạo file Docker compose cho ví dụ trong Part 8version: "3.9"
networks:
api-network:
driver: bridge
services:
sql:
container_name: sql1
image: "mcr.microsoft.com/mssql/server:2019-latest"
networks:
- api-network
restart: always
ports:
- 1431:1433
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Dance@2022
contoso:
build:
context: .
networks:
- api-network
container_name: contoso
environment:
- serverName=sql1,1433
- userName=sa
- password=Dance@2022
- databaseName=ContosoUniversity
restart: always
ports:
- 8080:80
depends_on:
- sql1
Chúc các bạn thành công
Nhatkyhoctap's blog
https://herewecode.io/blog/create-a-postgresql-database-using-docker-compose/
Trả lờiXóa