Docker 1.13 giới thiệu một tính năng được chờ đợi từ lâu được gọi là hỗ trợ soạn tệp, cho phép chúng tôi xác định vùng chứa của mình bằng một tệp cấu hình đơn giản đẹp mắt thay vì một lệnh dài. Nếu bạn đã xem các bài đăng trên blog “MySQL trên Docker” trước đây của chúng tôi, chúng tôi đã sử dụng nhiều dòng lệnh dài để chạy các vùng chứa và dịch vụ. Bằng cách sử dụng tập tin soạn thảo, các vùng chứa dễ dàng được chỉ định để triển khai. Điều này làm giảm nguy cơ mắc lỗi của con người vì bạn không phải nhớ các lệnh dài với nhiều tham số.
Trong bài đăng trên blog này, chúng tôi sẽ chỉ cho bạn cách sử dụng tệp biên dịch bằng cách sử dụng các ví dụ đơn giản về triển khai MySQL. Chúng tôi giả sử bạn đã cài đặt Docker Engine 1.13 trên 3 máy chủ vật lý và chế độ Swarm được định cấu hình trên tất cả các máy chủ.
Giới thiệu về Soạn-Tệp
Trong tệp Soạn, bạn chỉ định mọi thứ ở định dạng YAML thay vì cố gắng nhớ tất cả các đối số mà chúng ta phải chuyển cho các lệnh Docker. Bạn có thể xác định dịch vụ, mạng và khối lượng tại đây. Định nghĩa sẽ được Docker chọn và nó rất giống với việc chuyển các tham số dòng lệnh vào lệnh “docker run | network | volume”.
Như phần giới thiệu, chúng tôi sẽ triển khai một vùng chứa MySQL độc lập đơn giản. Trước khi bắt đầu viết tệp Soạn, trước tiên bạn cần biết lệnh chạy. Lấy từ loạt blog MySQL trên Docker đầu tiên của chúng tôi, hãy soạn lệnh “docker run” sau:
$ docker run --detach \
--name=test-mysql \
--publish 6603:3306 \
--env="MYSQL_ROOT_PASSWORD=mypassword" \
-v /storage/docker/mysql-datadir:/var/lib/mysql \
mysql
Lệnh docker-comp sẽ tìm kiếm một tệp mặc định có tên là “docker-compos.yml” trong thư mục hiện tại. Vì vậy, trước tiên hãy tạo các thư mục bắt buộc trước:
$ mkdir -p ~/compose-files/mysql/single
$ mkdir -p /storage/docker/mysql-datadir
$ cd ~/compose-files/mysql/single
Trong YAML, đây là những gì nên được viết:
version: '2'
services:
mysql:
image: mysql
container_name: test-mysql
ports:
- 6603:3306
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
volumes:
- /storage/docker/mysql-datadir:/var/lib/mysql
Lưu nội dung trên vào “~ / compo-files / mysql / single / docker-compile.yml”. Đảm bảo bạn đang ở trong thư mục hiện tại ~ / compile-files / mysql / single, sau đó kích hoạt nó bằng cách chạy lệnh sau:
$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.
Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.
To deploy your application across the swarm, use `docker stack deploy`.
Creating test-mysql
Xác minh xem vùng chứa có đang chạy ở chế độ tách biệt hay không:
[[email protected] single]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
379d5c15ef44 mysql "docker-entrypoint..." 8 minutes ago Up 8 minutes 0.0.0.0:6603->3306/tcp test-mysql
Xin chúc mừng! Bây giờ chúng ta đã có một vùng chứa MySQL đang chạy chỉ với một lệnh duy nhất.
Triển khai ngăn xếp
Compose-file đơn giản hóa mọi thứ, nó cung cấp cho chúng tôi cái nhìn rõ ràng hơn về cơ sở hạ tầng trông như thế nào. Hãy tạo một ngăn xếp vùng chứa bao gồm một trang web chạy trên Drupal, sử dụng phiên bản MySQL trong một mạng chuyên dụng và liên kết chúng với nhau.
Tương tự như trên, hãy xem phiên bản dòng lệnh theo đúng thứ tự để tạo ngăn xếp này:
$ docker volume create mysql_data
$ docker network create drupal_mysql_net --driver=bridge
$ docker run -d --name=mysql-drupal --restart=always -v mysql_data:/var/lib/mysql --net=drupal_mysql_net -e MYSQL_ROOT_PASSWORD="mypassword" -e MYSQL_DATABASE="drupal" mysql
$ docker run -d --name=drupal -p 8080:80 --restart=always -v /var/www/html/modules -v /var/www/html/profiles -v /var/www/html/themes -v /var/www/html/sites --link mysql:mysql --net=drupal_mysql_net drupal
Để bắt đầu soạn, trước tiên hãy tạo một thư mục cho ngăn xếp mới của chúng tôi:
$ mkdir -p ~/compose-files/drupal-mysql
$ cd ~/compose-files/drupal-mysql
Sau đó, tạo nội dung ghi của docker-compos.yml như sau:
version: '2'
services:
mysql:
image: mysql
container_name: mysql-drupal
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
MYSQL_DATABASE: "drupal"
volumes:
- mysql_data:/var/lib/mysql
restart: always
networks:
- drupal_mysql_net
drupal:
depends_on:
- mysql
image: drupal
container_name: drupal
ports:
- 8080:80
volumes:
- /var/www/html/modules
- /var/www/html/profiles
- /var/www/html/themes
- /var/www/html/sites
links:
- mysql:mysql
restart: always
networks:
- drupal_mysql_net
volumes:
mysql_data:
networks:
drupal_mysql_net:
driver: bridge
Khởi động chúng:
$ docker-compose up -d
..
Creating network "drupalmysql_drupal_mysql_net" with driver "bridge"
Creating volume "drupalmysql_mysql_data" with default driver
Pulling drupal (drupal:latest)...
..
Creating mysql-drupal
Creating drupal
Docker sẽ thực hiện việc triển khai như sau:
- Tạo mạng
- Tạo âm lượng
- Kéo hình ảnh
- Tạo mysql-drupal (vì vùng chứa “drupal” phụ thuộc vào nó)
- Tạo vùng chứa drupal
Tại thời điểm này, kiến trúc của chúng tôi có thể được minh họa như sau:
Sau đó, chúng tôi có thể chỉ định ‘mysql’ làm máy chủ lưu trữ MySQL trong trang hướng dẫn cài đặt vì cả hai vùng chứa đều được liên kết với nhau. Đó là nó. Để chia nhỏ chúng, chỉ cần chạy lệnh sau trong cùng một thư mục:
$ docker-compose down
Các vùng chứa tương ứng sẽ được kết thúc và loại bỏ tương ứng. Hãy lưu ý rằng lệnh docker-compile được liên kết với máy chủ vật lý riêng lẻ đang chạy Docker. Để chạy trên nhiều máy chủ vật lý trên Swarm, nó cần được xử lý khác nhau bằng cách sử dụng lệnh "docker stack". Chúng tôi sẽ giải thích điều này trong phần tiếp theo.
Somenines MySQL trên Docker:Cách chứa cơ sở dữ liệu của bạn Khám phá tất cả những gì bạn cần hiểu khi cân nhắc chạy dịch vụ MySQL trên đầu ảo hóa vùng chứa DockerTải xuống Sách trắngSoạn một ngăn xếp trên bầy
Trước tiên, hãy đảm bảo rằng công cụ Docker đang chạy trên v1.13 và chế độ Swarm được bật và ở trạng thái sẵn sàng:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8n8t3r4fvm8u01yhli9522xi9 * docker1.local Ready Active Reachable
o1dfbbnmhn1qayjry32bpl2by docker2.local Ready Active Reachable
tng5r9ax0ve855pih1110amv8 docker3.local Ready Active Leader
Để sử dụng tính năng ngăn xếp cho chế độ Docker Swarm, chúng ta phải sử dụng định dạng Docker Compose phiên bản 3. Chúng tôi sẽ triển khai một thiết lập tương tự như trên, ngoài thiết lập Galera 3 nút làm phần phụ trợ MySQL. Chúng tôi đã giải thích chi tiết trong bài đăng blog này.
Đầu tiên, hãy tạo một thư mục cho ngăn xếp mới của chúng tôi:
$ mkdir -p ~/compose-files/drupal-galera
$ cd ~/compose-files/drupal-galera
Sau đó, thêm các dòng sau vào “docker-compos.yml”:
version: '3'
services:
galera:
deploy:
replicas: 3
restart_policy:
condition: on-failure
delay: 30s
max_attempts: 3
window: 60s
update_config:
parallelism: 1
delay: 10s
max_failure_ratio: 0.3
image: severalnines/pxc56
environment:
MYSQL_ROOT_PASSWORD: "mypassword"
CLUSTER_NAME: "my_galera"
XTRABACKUP_PASSWORD: "mypassword"
DISCOVERY_SERVICE: '192.168.55.111:2379,192.168.55.112:2379,192.168.55.207:2379'
MYSQL_DATABASE: 'drupal'
networks:
- galera_net
drupal:
depends_on:
- galera
deploy:
replicas: 1
image: drupal
ports:
- 8080:80
volumes:
- drupal_modules:/var/www/html/modules
- drupal_profile:/var/www/html/profiles
- drupal_theme:/var/www/html/themes
- drupal_sites:/var/www/html/sites
networks:
- galera_net
volumes:
drupal_modules:
drupal_profile:
drupal_theme:
drupal_sites:
networks:
galera_net:
driver: overlay
Lưu ý rằng hình ảnh Galera mà chúng tôi đã sử dụng (vàinines / pxc56) yêu cầu một cụm etcd đang chạy được cài đặt trên mỗi máy chủ vật lý Docker. Vui lòng tham khảo bài đăng trên blog này về các bước điều kiện tiên quyết.
Một trong những phần quan trọng trong tập tin soạn thảo của chúng tôi là tham số max_attempts trong phần restart_policy. Chúng tôi phải chỉ định một giới hạn cứng về số lần khởi động lại trong trường hợp không thành công. Điều này sẽ làm cho quá trình triển khai an toàn hơn vì theo mặc định, bộ lập lịch Swarm sẽ không bao giờ từ bỏ việc cố gắng khởi động lại vùng chứa. Nếu điều này xảy ra, vòng lặp quy trình sẽ lấp đầy không gian đĩa của máy chủ vật lý bằng các vùng chứa không sử dụng được khi bộ lập lịch không thể đưa các vùng chứa lên trạng thái mong muốn. Đây là một cách tiếp cận phổ biến khi xử lý các dịch vụ trạng thái như MySQL. Tốt hơn là nên hạ tất cả chúng xuống thay vì làm cho chúng chạy ở trạng thái không nhất quán.
Để bắt đầu tất cả, chỉ cần thực hiện lệnh sau trong cùng một thư mục nơi docker-compost.yml cư trú:
$ docker stack deploy --compose-file=docker-compose.yml my_drupal
Xác minh rằng ngăn xếp được tạo bằng 2 dịch vụ (drupal và galera):
$ docker stack ls
NAME SERVICES
my_drupal 2
Chúng tôi cũng có thể liệt kê các tác vụ hiện tại trong ngăn xếp đã tạo. Kết quả là phiên bản kết hợp của lệnh “docker service ps my_drupal_galera” và “docker service ps my_drupal_drupal”:
$ docker stack ps my_drupal
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
609jj9ji6rxt my_drupal_galera.1 severalnines/pxc56:latest docker3.local Running Running 7 minutes ago
z8mcqzf29lbq my_drupal_drupal.1 drupal:latest docker1.local Running Running 24 minutes ago
skblp9mfbbzi my_drupal_galera.2 severalnines/pxc56:latest docker1.local Running Running 10 minutes ago
cidn9kb0d62u my_drupal_galera.3 severalnines/pxc56:latest docker2.local Running Running 7 minutes ago
Khi chúng tôi nhận được CURRENT STATE là RUNNING, chúng tôi có thể bắt đầu cài đặt Drupal bằng cách kết nối với bất kỳ địa chỉ IP máy chủ Docker hoặc tên máy chủ nào trên cổng 8080, như trong trường hợp này, chúng tôi đã sử dụng docker3 (mặc dù vùng chứa drupal được triển khai trên docker1), http ://192.168.55.113:8080 /. Tiến hành cài đặt và chỉ định ‘galera’ làm máy chủ MySQL và ‘drupal’ làm tên cơ sở dữ liệu (như được định nghĩa trong tệp soạn trong biến môi trường MYSQL_DATABASE):
Đó là nó. Việc triển khai ngăn xếp đã được đơn giản hóa bằng cách sử dụng Compose-file. Tại thời điểm này, kiến trúc của chúng tôi trông giống như sau:
Cuối cùng, để loại bỏ ngăn xếp, chỉ cần chạy lệnh sau:
$ docker stack rm my_drupal
Removing service my_drupal_galera
Removing service my_drupal_drupal
Removing network my_drupal_galera_net
Sử dụng tập tin soạn thảo có thể giúp bạn tiết kiệm thời gian và giảm nguy cơ mắc lỗi do con người so với khi làm việc với các dòng lệnh dài. Đây là một công cụ hoàn hảo để bạn thành thạo trước khi làm việc với các ứng dụng Docker nhiều vùng chứa, xử lý nhiều môi trường triển khai (ví dụ:dev, test, staging, pre-prod, prod) và xử lý các dịch vụ phức tạp hơn nhiều, giống như MySQL Galera Cluster. Chúc mừng
!