Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Soạn ngăn xếp - Đơn giản hóa việc triển khai Docker của MySQL Containers

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:

  1. Tạo mạng
  2. Tạo âm lượng
  3. Kéo hình ảnh
  4. Tạo mysql-drupal (vì vùng chứa “drupal” phụ thuộc vào nó)
  5. 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ắng

Soạ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

!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao mã SQL này đưa ra lỗi 1066 (Không phải bảng / bí danh duy nhất:'người dùng')?

  2. Cách Tham gia MySQL và Postgres trong Chế độ xem Trực tiếp Vật chất hóa

  3. MySQL THAM GIA VÀ SỬ DỤNG?

  4. Sử dụng Đếm để tìm số lần xuất hiện

  5. Ví dụ EXTRACT () - MySQL