Chuyển đến nội dung chính

Docker: Sử dụng Docker compose - Part 9

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]
Tóm lại
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 configuration
services:
  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@2022
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
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-network
networks:
  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 8
version: "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

Nhận xét

  1. https://herewecode.io/blog/create-a-postgresql-database-using-docker-compose/

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.