Giới thiệu

Lúc đầu, Docker có vẻ quá sức. Tuy nhiên, các lệnh khá trực quan và chỉ cần thực hành một chút, bạn sẽ nhanh chóng quen thuộc với Docker.

Cú pháp cho Docker có thể được phân loại thành bốn nhóm chính:

  • Chạy container
  • Quản lý & kiểm tra container
  • Quản lý Docker image
  • Số liệu thống kê và thông tin daemon Docker

Trước hết, đảm bảo bạn hãy có đầy đủ kiến thức về Containerisation technology trước khi bắt đầu, vì bài này tôi sẽ đi vào cú pháp Docker thay vì giải thích cơ bản.

Quản lý Docker image

Docker Pull

Trước khi chúng ta có thể chạy một Docker container, trước tiên chúng ta cần một image. 

Trong ví dụ này, chúng tôi sẽ sử dụng image Nginx để chạy máy chủ web trong vùng chứa. Trước khi tải xuống image, hãy chia nhỏ các lệnh và cú pháp cần thiết để tải xuống image. Có thể tải xuống image bằng cách sử dụng docker pull và cung cấp tên của image.

$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
-- omitted for brevity --
Status: Downloaded newer image for nginx:latest

Bằng cách chạy lệnh này, chúng tôi đang tải xuống phiên bản mới nhất (lastest) của image có tiêu đề “nginx”. Image có các nhãn này được gọi là tag. Các tag này được sử dụng để chỉ các biến thể của image. Ví dụ: một image có thể có cùng tên nhưng các tag khác nhau để biểu thị một phiên bản khác.

  • docker pull ubuntu:latest (mặc định)
  • docker pull ubuntu:22.04
  • docker pull ubuntu:20.04
  • docker pull ubuntu:18.04

Docker image

Lệnh docker image, với tùy chọn thích hợp, cho phép người dùng quản lý image của mình.

$ docker image

Usage:  docker image COMMAND

Manage images

Commands:
  build       Build an image from a Dockerfile
  history     Show the history of an image
  import      Import the contents from a tarball to create a filesystem image
  inspect     Display detailed information on one or more images
  load        Load an image from a tar archive or STDIN
  ls          List images
  prune       Remove unused images
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rm          Remove one or more images
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE

Run 'docker image COMMAND --help' for more information on a command.

Docker image ls

Lệnh này cho phép người dùng liệt kê tất cả các image được lưu trữ trên hệ thống cục bộ. Chúng ta có thể sử dụng lệnh này để xác minh xem một image đã được tải xuống chính xác hay chưa và thông tin của nó.

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       22.04     2dc39ba059dc   10 days ago   77.8MB
nginx        latest    2b7d6430f78d   2 weeks ago   142MB

Docker image rm

Nếu muốn xóa một image khỏi hệ thống, chúng ta có thể sử dụng docker image rm cùng với tên (hoặc ID hình ảnh). Trong ví dụ sau, tôi sẽ loại bỏ image “ubuntu” với tag “22.04”. 

$ docker image rm ubuntu:22.04
Untagged: ubuntu:22.04
Untagged: ubuntu@sha256:20fa2d7bb4de7723f542be5923b06c4d704370f0390e4ae9e1c833c8785644c1
Deleted: sha256:2dc39ba059dcd42ade30aae30147b5692777ba9ff0779a62ad93a74de02e3e1f
Deleted: sha256:7f5cbd8cc787c8d628630756bcc7240e6c96b876c2882e6fc980a8b60cdfa274

Kiểm tra docker image ls sẽ thấy image không còn nữa.

Chạy Docker container

Docker run

Lệnh docker run tạo các container từ image. Đây là nơi các lệnh từ Dockerfile (cũng như đầu vào của chính chúng ta khi chạy) được chạy. Do đó, nó sẽ là một trong những cú pháp đầu tiên bạn học.

Hãy nhớ cú pháp cần thiết để chạy một container:  docker run [OPTIONS] IMAGE_NAME [COMMAND] [ARGUMENTS...]. Trong ví dụ này, tôi sẽ cấu hình container để chạy như sau:

  • Một image có tên là “helloworld”
  • “Interactive” bằng cách cung cấp tuỳ chọn -it
  • Tôi sẽ tạo ra một shell bên trong vùng chứa bằng cách cung cấp /bin/bash dưới dạng đối số
$ docker run -it helloworld /bin/bash
root@30eff5ed7492:/#

Có thể xác minh rằng chúng ta đã khởi chạy container thành công vì terminal đã thay đổi thành tài khoản người dùng và tên máy chủ khác. Tên máy chủ của container là ID container (có thể thấy bằng cách sử dụng docker ps). Trong ví dụ trên, tên người dùng và tên máy chủ là root@30eff5ed7492.

Như đã đề cập trước đây, Docker container có thể chạy với nhiều tùy chọn khác nhau. Một số tuỳ chọn phổ biến sau đây:

  • -d: detached mode, chạy container ở background
  • -it: interactive mode, chạy một shell tương tác với container
  • -v: volumn, mount thư mục máy chính:thư mục máy container
  • -p: port, bind cổng máy chính:cổng máy container
  • –rm: remove, xoá container sau khi nó thực hiện xong việc
  • –name: naming, đặt tên cho container
  • –net: network: chỉ định network cho container

Docker ps

Để liệt kê các container đang chạy, chúng ta có thể sử dụng lệnh docker ps.

$ docker ps
CONTAINER ID   IMAGE                           COMMAND        CREATED        STATUS      PORTS     NAMES                                                                                      
                             
a913a8f6e30f   helloworld:latest   "sleep"   1 months ago   Up 3 days   0.0.0.0:8000->8000/tcp   helloworld

Lệnh này cũng sẽ hiển thị thông tin về container, bao gồm:

  • ID của container
  • Container đang chạy lệnh gì
  • Container được tạo khi nào
  • Container đã chạy được bao lâu
  • Cổng nào được ánh xạ
  • Tên của container

Mẹo: Để liệt kê tất cả các container (thậm chí đã dừng), bạn có thể sử dụng docker ps -a.

Giới thiệu Dockerfile

Cú pháp Dockerfile

Dockerfiles đóng một vai trò thiết yếu trong Docker. Dockerfiles là một tệp văn bản được định dạng, về cơ bản phục vụ như một hướng dẫn sử dụng về những gì các container nên làm và cuối cùng là lắp ráp một image Docker.

Bạn sử dụng Dockerfiles để chứa các lệnh mà bộ chứa sẽ thực thi khi nó được tạo. Để bắt đầu với Dockerfiles, chúng ta cần biết một số cú pháp và hướng dẫn cơ bản. Dockerfiles được định dạng theo cách sau:

INSTRUCTION argument

Đầu tiên, hãy tìm hiểu các instruction cần thiết:

  • FROM: chọn base image cho container
  • RUN: thực thi lệnh trong layer mới (1 step khi build)
  • COPY: copy file/thư mục từ máy chính
  • WORKDIR: đặt thư mục làm việc của container
  • CMD: lệnh chạy khi container bắt đầu
  • EXPOSE: đặt cổng mở khi container chạy

Hãy xem một ví dụ hoạt động của Dockerfile.

# THIS IS A COMMENT
# Use Ubuntu 22.04 as the base operating system of the container
FROM ubuntu:22.04

# Set the working directory to the root of the container
WORKDIR /

# Create helloworld.txt
RUN touch helloworld.txt

Điều quan trọng cần nhớ là các hệ điều hành được sử dụng trong các bộ chứa thường rất tối giản. Tức là, đừng mong đợi một lệnh sẽ có ngay từ đầu (thậm chí các lệnh như curl , ping , v.v. , có thể cũng cần được cài đặt.)

Docker build

Khi có Dockerfile, chúng ta có thể tạo một image bằng docker build. Lệnh này yêu cầu một số thông tin:

  1. Bạn có muốn tự đặt tên cho image hay không (chúng ta sẽ sử dụng -t).
  2. Tên mà bạn sẽ cung cấp cho image.
  3. Vị trí của Dockerfile mà bạn muốn xây dựng.
$ docker build -t helloworld .
Sending build context to Docker daemon  4.778MB
Step 1/3 : FROM ubuntu:22.04
22.04: Pulling from library/ubuntu
2b55860d4c66: Pull complete
Digest: sha256:20fa2d7bb4de7723f542be5923b06c4d704370f0390e4ae9e1c833c8785644c1
Status: Downloaded newer image for ubuntu:22.04
 ---> 2dc39ba059dc
Step 2/3 : WORKDIR /
 ---> Running in 64d497097f8a
Removing intermediate container 64d497097f8a
 ---> d6bd1253fd4e
Step 3/3 : RUN touch helloworld.txt
 ---> Running in 54e94c9774be
Removing intermediate container 54e94c9774be
 ---> 4b11fc80fdd5
Successfully built 4b11fc80fdd5
Successfully tagged helloworld:latest

Tôi đang sử dụng dấu chấm để đại diện cho thư mục hiện tại. Bạn có thể kiểm tra bằng cách sử dụng docker image ls.

Nâng cấp Dockerfile

Cho đến nay, container của chúng ta mới chỉ tạo một tệp – điều đó không hữu ích lắm! Hãy tạo một dockerfile chạy một máy chủ web apache2 sử dụng Ubuntu 22.04 làm hệ điều hành và chạy trên nền cổng 80.

# THIS IS A COMMENT
FROM ubuntu:22.04

# Update the APT repository to ensure we get the latest version of apache2
RUN apt-get update -y

# Install apache2
RUN apt-get install apache2 -y

# Tell the container to expose port 80 to allow us to connect to the web server
EXPOSE 80

# Tell the container to run the apache2 service
CMD ["apache2ctl", "-D","FOREGROUND"]

Sau khi khởi động container với các tùy chọn thích hợp docker run -d --name webserver -p 80:80  webserver, chúng ta có thể điều hướng đến địa chỉ IP máy cục bộ trong trình duyệt của mình!

Tối ưu hóa Dockerfile

Chắc chắn có một nghệ thuật đối với Docker, và nó không dừng lại với Dockerfiles! Đầu tiên, chúng ta cần tự hỏi tại sao việc tối ưu hóa Dockerfile lại cần thiết? Dockerfiles cồng kềnh rất khó đọc và bảo trì và thường sử dụng rất nhiều bộ nhớ không cần thiết!

Bạn có thể giảm kích thước của docker image (và giảm thời gian xây dựng) bằng một số cách sau:

  1. Chỉ cài đặt các gói cần thiết
  2. Xóa các tệp được lưu trong bộ nhớ cache
  3. Sử dụng các hệ điều hành cơ sở tối thiểu trong FROM (ví dụ ubuntu:22.04-minimal hoặc gói alpine chỉ với 5,59 MB!)
  4. Giảm thiểu số lượng layer trong lệnh RUN

Mỗi lệnh RUN sẽ được chạy trong một layer riêng của nó. Các layer tăng thời gian xây dựng! Mục tiêu là có càng ít layer càng tốt.

Giới thiệu về Docker Compose

Trước tiên hãy hiểu Docker Compose là gì và tại sao nó đáng để hiểu. Cho đến nay, chúng tôi chỉ tương tác với các container riêng lẻ. Tóm lại, Docker Compose cho phép nhiều container tương tác với nhau trong khi chạy tách biệt với nhau.

Bạn có thể đã nhận thấy một vấn đề với Docker cho đến nay. Thông thường, các ứng dụng yêu cầu nhiều dịch vụ bổ sung để chạy, điều mà chúng ta không thể thực hiện trong một container. Ví dụ: các trang web hiện đại sử dụng các dịch vụ như cơ sở dữ liệu và máy chủ web.

Vì lợi ích của nhiệm vụ này, chúng tôi sẽ coi mỗi ứng dụng là một “microservice”. Docker Compose cho phép chúng tôi tạo các “microservice” này dưới dạng một “dịch vụ” duy nhất. 

Docker Compose

Trước khi tìm hiểu Docker Compose, hãy tìm hiểu các nguyên tắc cơ bản trước:

  1. Bạn cần phải cài đặt Docker Compose (theo mặc định nó không đi kèm với Docker). Bạn có thể kiểm tra các cài đặt ở đây.
  2. Chúng tôi cần một tệp docker-compose.yml đúng cú pháp của nó.
  3. Hiểu biết cơ bản về cách sử dụng Docker Compose để xây dựng và quản lý container.

Trước hết, tìm hiểu một số lệnh Docker Compose cần thiết

  • docker-compose up: build và start các container
  • docker-compose build: build các container
  • docker-compose start: start các container
  • docker-compose stop: stop các container
  • docker-compose down: stop và delete các container

Hiểu đơn giản, với Docker Compose, bạn chỉ cần một lệnh docker-compose up để chạy nhiều container và các cấu hình cùng nhau, cũng như chia sẻ để người khác cũng có thể thiết lập hoạt động chính xác theo cách đã cấu hình.

Cú pháp Docker-compose.yml

Một tập tin để cai trị tất cả. Định dạng của tệp docker-compose.yml khác với định dạng của Dockerfile. Điều quan trọng cần lưu ý là YAML yêu cầu thụt đầu dòng hai khoảng trắng phải nhất quán.

Trước tiên, tôi sẽ chỉ cho bạn một số hướng dẫn mới mà bạn sẽ cần học:

  • version: phiên bản mà bạn đặt
  • services: các dịch vụ được quản lý
  • name: cần đổi thành tên của container cần cấu hình
  • build: thư mục chứa dockerfile cho container
  • ports: xác định cổng mở
  • volumes: xác định thư mục mount
  • environment: đặt các biến môi trường và giá trị
  • image: tên image sử dụng
  • networks: tên network kết nối

Ví dụ, đây là giao diện của tệp docker-compose.yml chạy máy chủ web và cơ sở dữ liệu định trước (xin nhắc lại, điều cần thiết là phải chú ý đến phần thụt đầu dòng):

version: '3.3'
services:
  web:
    build: ./web
    networks:
      - ecommerce
    ports:
      - '80:80'
  database:
    image: mysql:latest
    networks:
      - ecommerce
    environment:
      - MYSQL_DATABASE=ecommerce
      - MYSQL_USERNAME=root
      - MYSQL_ROOT_PASSWORD=helloword
networks:
  ecommerce:

Leave a Reply

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.