+9

[Thực hành Docker] Docker compose

Khi sử dụng docker nếu chúng ta cần tạo và quản lý các container, network hay ổ đĩa sẽ phải chạy các lệnh để tạo thủ công, nhưng khi cần tạo nhiều container hoặc nhiều network thì việc tạo thủ công này rất mất thời gian và việc quản lý Docker trên một hệ thống lớn với rất nhiều các containers khác nhau sẽ rất phức tạp và khả năng sinh ra nhiều lỗi, thật may là có docker compose giải quyết vấn đề này.

Khái niệm docker compose

Docker compose

Là công cụ giúp ta thiết lập và quản lý nhiều container, network, volume (gọi chung là các service) và thiết lập cấu hình cho các service một cách nhanh chóng và đơn giản bằng việc chạy theo các chỉ định trong file docker-compose.yml

Những tính năng chính của Compose bao gồm:

  • Tạo và quản lý nhiều môi trường độc lập trong một máy host đảm bảo độc lập các phân vùng ổ nhớ tránh say ra xung đột
  • Chỉ tạo lại container thay đổi, nhận biết các container không thay đổi và sử dụng lại
  • Định nghĩa và sử dụng biến môi trường trong file YAML

Docker-compose.yml

Là một file lưu dạng yaml, file này lưu các chỉ thị để docker compose đọc file này và thực thi các chỉ thị đó, các chỉ thị như tạo container từ image, tạo network, cấu hình cho các dịch vụ.

ví dụ: file mysql.yml như sau

version: "2.2"

services:
  mysql:
    image: mysql:8
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    mem_limit: ${MYSQL_MEMORY_LIMIT:-1G}
    volumes:
      - ${PATH_DATA:-./data}/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root}

Thực hành docker compose

Nhiệm vụ thực hành của chúng ta là định nghĩa docker file để tạo ra các thành phần sau

  • Container MySQL
  • Container HTTP APACHE
  • Container PHP-FPM
  • Network (bridge) để các service trên kết nối vào mạng này
  • Ánh xạ cổng 9999 của máy host vào cổng 80 của máy chủ HTTP

Tạo docker-compose.yml

Tạo thư mục mycode bên trong ta tạo file docker-compose.yml với nội dung như sau (mình có comment giải thích trong phần nội dung file)

version: "3" #là phiên bản docker composer

#Tạo mạng tên là my-network
networks:
    my-network:
        driver: bridge

# Tạo các dịch vụ (container)
services:

    #Tạo container my-php từ imgae php:latest có kết nối với mạng my-network
    my-php:
        container_name: php-product
        image: 'php:latest'
        hostname: php
        restart: always
        networks:
            - my-network

    #Tạo container my-httpd từ imgae httpd:latest có kết nối với mạng my-network, ánh xạ cổng 9999 của máy host vào cổng 80
    my-httpd:
        container_name: c-httpd01
        image: 'httpd:latest'
        hostname: httpd
        restart: always
        networks:
            - my-network
        ports:
            - "9999:80"
            - "443:443"
            
     #Tạo container my-mysql từ imgae mysql:latest có kết nối với mạng my-network,config các biến môi trường
    my-mysql:
        container_name: myql-product
        image: "mysql:latest"
        hostname: mysql
        restart: always
        networks:
            - my-network
        environment:
            - MYSQL_ROOT_PASSWORD=123abc
            - MYSQL_DATABASE=db_site
            - MYSQL_USER=sites
            - MYSQL_PASSWORD=123abc

File trên được chia làm 3 phần

  • phần đầu là khai báo phiên bản docker composer, ở đây mình dùng phiên bản 3

  • Phần tiếp theo là khai báo tạo các mạng, ở đây mình tạo một mạng tên là my-network kiểu mạng là bridge ( về phần Network bài trước mình có viết các bạn tìm hiểu thêm tại đây )

  • Phần tiếp theo là tạo các services, ở đây là tạo 3 services là 3 container (php, httpd, mysql), các service này đều kết nối đến mạng my-network đã tạo trên phần 2

    • Container my-php tạo từ imgae php:latest có kết nối với mạng my-network
    • Container my-httpd tạo từ imgae httpd:latest có kết nối với mạng my-network, ánh xạ cổng 9999 của máy host vào cổng 80 và cổng 443 với 443 máy host
    • Container my-mysql tạo từ imgae mysql:latest có kết nối với mạng my-network,config các biến môi trường như MYSQL_ROOT_PASSWORD, MYSQL_DATABASE,MYSQL_USER, MYSQL_PASSWORD

Run file docker-compose.yml tạo các service

Tạo xong file docker compose, giờ chúng ta sẽ run file này để tạo ra các service đã định nghĩa.

Ta vào thư mục chứa file docker-compose.yml và chạy lệnh

docker-compose up

Vậy là xong rồi, giờ ta bật một terminal khác để kiểm tra xem đã có các container và network theo như mục tiêu đề ra hay chưa

Chạy lệnh docker psdocker network ls để xem danh sách container đang chạy và network

Muốn dừng các services đang chạy thì ta dùng lệnh

docker-compose stop

Để kết thúc các services đang chạy và xóa hoàn toàn container ta dùng lệnh

docker-compose down

Theo dõi Logs các services

docker-compose logs [SERVICES]

Kết bài

Sau bài viết này chúng ta cũng đã tìm hiểu những kiến thức và thực hành cơ bản về docker-compose. Cảm ơn mọi người.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí