This page looks best with JavaScript enabled

Tìm hiểu và sử dụng docker (P1)

 ·  ☕ 13 min read  ·  🐉 Edisc
Toàn bộ series này được tham khảo từ hai nguồn chính: XuanThuLabChanelDockerDoc. Em xin chân thành cảm ơn sự cống hiến của các tác giả của những kênh nói trên.❤️❤️❤️

Làm quen với docker command line

Khi làm việc với docker, lệnh chúng ta hay dùng đó chính là docker. Sau lệnh docker sẽ có nhiều lệnh nhỏ, để xem danh sách các lệnh nhỏ này, ta gõ

1
$ docker 

docker_list

1
$ docker run -d -p 80:80 docker/getting-started

Trong đó:

  • -d: chạy container ở chế độ detached mode (ở background)
  • -p 80:80: ánh xạ cổng 80 của host vào cổng 80 của container.
  • docker/getting-started: image sử dụng

Docker images

Liệt kê các images

1
2
3
4
5
6
❯ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
debian                   latest              4a7a1f401734        3 weeks ago         114MB
ubuntu                   latest              7e0aa2d69a15        6 weeks ago         72.7MB
docker/getting-started   latest              3ba8f2ff0727        2 months ago        27.9MB
hello-world              latest              d1165f221234        3 months ago        13.3kB

Ở đây,

  • REPOSITORY là tên của image,
  • TAG là phiên bản của image,
  • IMAGE ID là một mã hash của image,
  • CREATED là thời gian được tạo của image,
  • SIZE là kích thước của image.
    Các images này lấy từ hub.docker.com. Chúng ta vào hub.docker.com để tìm kiếm image thích hợp mà mình muốn tải. Lưu ý nếu lần đầu bạn vào trang này, bạn cần đăng kí một tài khoản. Ngoài ra, ta có thể tìm kiếm trực tiếp trên terminal với lệnh:
1
docker search <keyword>

Ví dụ, ta muốn tìm kiếm các images của ubuntu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
❯ docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   12337               [OK]                
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   539                                     [OK]
websphere-liberty                                         WebSphere Liberty multi-architecture images …   273                 [OK]                
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   253                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   241                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   110                 [OK]                
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                                      [OK]
open-liberty                                              Open Liberty multi-architecture images based…   46                  [OK]                
ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   44                  [OK]                
i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys…   25                                      
nuagebec/ubuntu                                           Simple always updated Ubuntu docker images w…   24                                      [OK]
solita/ubuntu-systemd                                     Ubuntu + systemd                                24                                      [OK]
1and1internet/ubuntu-16-apache-php-5.6                    ubuntu-16-apache-php-5.6                        14                                      [OK]
1and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        13                                      [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       11                                      [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             9                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6                     ubuntu-16-nginx-php-5.6                         8                                       [OK]
1and1internet/ubuntu-16-apache-php-7.1                    ubuntu-16-apache-php-7.1                        7                                       [OK]
1and1internet/ubuntu-16-nginx-php-7.0                     ubuntu-16-nginx-php-7.0                         4                                       [OK]
pivotaldata/ubuntu                                        A quick freshening-up of the base Ubuntu doc…   4                                       
pivotaldata/ubuntu16.04-build                             Ubuntu 16.04 image for GPDB compilation         2                                       
pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              1                                       
smartentry/ubuntu                                         ubuntu with smartentry                          1                                       [OK]
1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                                       [OK]
1and1internet/ubuntu-16-php-7.1                           ubuntu-16-php-7.1                               1                                       [OK]

Mục OFFICIAL cho biết phiên bản này là chính chủ. Để sử dụng một image nào đó, chúng ta cần đọc thông tin của image trên hub.docker và các phiển bản của image nằm ở phần tag.
docker_images_tag

Tải image

Để tải image, ta sử dụng:

1
docker pull image:tag

Ở đây, tag là phiên bản mà chúng ta muốn sử dụng. Nếu chúng ta muốn tải bản ubuntu 20.04 thì câu lệnh sẽ là:

1
2
3
4
❯ docker pull ubuntu:20.04
20.04: Pulling from library/ubuntu
Digest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Downloaded newer image for ubuntu:20.04

Chúng ta kiểm tra lại để xác nhận docker đã được tải bằng lệnh docker images

1
2
3
4
5
6
7
❯ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
debian                   latest              4a7a1f401734        3 weeks ago         114MB
ubuntu                   20.04               7e0aa2d69a15        6 weeks ago         72.7MB
ubuntu                   latest              7e0aa2d69a15        6 weeks ago         72.7MB
docker/getting-started   latest              3ba8f2ff0727        2 months ago        27.9MB
hello-world              latest              d1165f221234        3 months ago        13.3kB

Khi chúng ta không để tag, mặc định nó xem như tag này là latest và sẽ tải bản mới nhất về, và khi chúng ta in ra các images, những images này sẽ có tag là latest.

1
2
3
4
5
6
❯ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete 
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest

Xóa Image

Để xóa một image không sử dụng, chúng ta dùng câu lệnh:

1
docker image rm <ten_image_muon_xoa:tag>

Ví dụ, tôi muốn xóa image ubuntu:20.04, ta làm như sau:

1
2
❯ docker image rm ubuntu:20.04
Untagged: ubuntu:20.04

Kết quả sau khi xóa:

1
2
3
4
5
6
❯ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
debian                   latest              4a7a1f401734        3 weeks ago         114MB
ubuntu                   latest              7e0aa2d69a15        6 weeks ago         72.7MB
docker/getting-started   latest              3ba8f2ff0727        2 months ago        27.9MB
hello-world              latest              d1165f221234        3 months ago        13.3kB

Ngoài ra, chúng ta còn có thể xóa bằng cách dùng IMAGE ID, ví dụ, ta muốn xóa image hello-world,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
❯ docker image rm d1165f221234
Untagged: hello-world:latest
Untagged: hello-world@sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
❯ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
debian                   latest              4a7a1f401734        3 weeks ago         114MB
ubuntu                   latest              7e0aa2d69a15        6 weeks ago         72.7MB
docker/getting-started   latest              3ba8f2ff0727        2 months ago        27.9MB

Docker version


Usage

1
$ docker version [OPTIONS]

Get the server version

1
$ docker version --format '{{.Server.Version}}'

Dump raw JSON data

1
$ docker version --format '{{json .}}'
1
$ docker version --format='{{.Client.Context}}'

Docker run

Image sẽ đươc chạy trong các container, để chạy ta thực hiện câu lệnh:

  • Usage:
1
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • Có rất nhiều tham số, các bạn có thể đọc ở đây

Ví dụ:

Chạy một image

1
docker run -it <ten_image/image_id>

Ở đây, -it là viết gọn của 2 options: -i (interactive) và -t (terminal) chỉ định tạo ra container và có thể tương tác với nó trực tiếp trên terminal. Giả sử ta chạy image ubuntu:latest.

1
2
❯ docker run -it ubuntu:latest
root@b2d8e983bcef:/# 

Vậy là chúng ta đã chạy image ubuntu:latest và đang ở container ubuntu, tài khoản root với hostname là b2d8e983bcef. Chúng ta kiểm tra thông tin của ubuntu này.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
root@ff7140c65b73:/# cat /etc/*release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.2 LTS"
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
root@ff7140c65b73:/# 

Để kiểm tra có những container nào đang chạy trên máy, chúng ta dùng lệnh:

1
2
3
❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ff7140c65b73        ubuntu:latest       "/bin/bash"         2 minutes ago       Up 2 minutes                            unruffled_goldberg

Kết quả trên cho thấy, hệ thống đang chạy một container có id là ff7140c65b73 và chạy từ image ubuntu:latest, với command /bin/bash.
Khi chúng ta gõ lệnh exit để thoát khỏi container, lệnh docker ps sẽ không hiển thị container nào, tuy nhiên, lệnh docker ps -a sẽ liệt kê tất cả các container đang hiện có trên máy kèm theo trạng thái của nó.

1
2
3
4
❯ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ff7140c65b73        ubuntu:latest       "/bin/bash"         9 minutes ago       Exited (0) 5 seconds ago                        unruffled_goldberg
b2d8e983bcef        ubuntu:latest       "/bin/bash"         11 minutes ago      Exited (0) 11 minutes ago                       gallant_snyder

Trạng thái Exited thể hiện container đã bị dừng, và để khởi động lại docker đã dừng, ta dùng lệnh docker start

1
2
3
4
5
6
7
8
9
❯ docker start ff7140c65b73
ff7140c65b73
❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ff7140c65b73        ubuntu:latest       "/bin/bash"         12 minutes ago      Up 6 seconds                            unruffled_goldberg
❯ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ff7140c65b73        ubuntu:latest       "/bin/bash"         12 minutes ago      Up 11 seconds                                   unruffled_goldberg
b2d8e983bcef        ubuntu:latest       "/bin/bash"         14 minutes ago      Exited (0) 14 minutes ago                       gallant_snyder

Để vào lại hệ điều hành trong container, ta dùng lệnh docker attach container_id, lưu ý, id chúng ta không cần ghi hết, chỉ cần ghi 2-3 chữ cái đầu là được.

1
2
❯ docker attach ff
root@ff7140c65b73:/# 

Để thoát khỏi container mà không dừng nó, ta dùng tổ hợp phím ctrl + P, ctrl + Q. Khi chúng ta dùng tổ hợp này, ta sẽ có kết quả sau:

1
2
❯ docker attach ff
root@ff7140c65b73:/# read escape sequence

Từ máy host, để dừng container, ta dùng lệnh docker stop <container_name/container_id>

1
2
3
4
5
6
7
❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ff7140c65b73        ubuntu:latest       "/bin/bash"         26 minutes ago      Up 14 minutes                           unruffled_goldberg
❯ docker stop unruffled_goldberg
unruffled_goldberg
❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Đặt tên cho container

1
2
❯ docker run -it --name "centos_docker" -h centos1 centos:latest
[root@centos1 /]# 

Ví dụ trên chạy container có tên là centos_docker sử dụng image centos:latest.

  • -it tạo một tương tác bash shell trong container.
  • --name: đặt tên cho container.
  • -h: đặt hostname cho container.
    Chúng ta có thể kiểm tra
1
2
3
❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ddf68933af54        centos:latest       "/bin/bash"         2 minutes ago       Up 3 seconds                            centos_docker

Capture container ID (–cidfile)

1
2
3
4
5
6
7
8
9
❯ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
345e3491a907: Pull complete 
57671312ef6f: Pull complete 
5e9250ddb7d0: Pull complete 
Digest: sha256:adf73ca014822ad8237623d388cedf4d5346aa72c270c5acc01431cc93e18e2d
Status: Downloaded newer image for ubuntu:latest
test
  • Lệnh này tạo container và in test ra màn hình console. Flag cidfile yêu cầu Docker tạo một file mới và
    viết container ID vào nó. Nếu file đã tồn tại, Docker sẽ trả về error. Docker sẽ đóng file khi docker run kết thúc.

Full container capabilities (–privileged)

1
2
3
4
❯ docker run -t -i --rm ubuntu bash
root@bd1340e91d1e:/# mount -t tmpfs none /mnt
mount: /mnt: permission denied.
root@bd1340e91d1e:/# 
  • --rm tự động xóa container nếu như nó đã tồn tại.
  • Lệnh này không hoạt động, vì theo mặc định, những câu lệnh đem lại khả năng nguy hiểm tới kernel sẽ bị loại bỏ, bao gồm cap_sys_admin (lệnh yêu cầu mount filesystems). Tuy nhiên, flag --privileged sẽ cho phép chúng ta run:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  ❯ docker run -t -i --privileged ubuntu bash
root@a3c5921afbbc:/# mount -t tmpfs none /mnt
root@a3c5921afbbc:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         110G   58G   46G  56% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda2       110G   58G   46G  56% /etc/hosts
shm              64M     0   64M   0% /dev/shm
none            3.9G     0  3.9G   0% /mnt
root@a3c5921afbbc:/# 
  • flag --privileged sẽ cấp hết tất cả capabilities cho container, và loại bỏ mọi giới hạn được đặt ra bởi cgroup controller. Nói cách khác, container có thể chạy hầu hết mọi thứ mà máy host có thể làm.

Set working directory (-w)

1
$ docker  run -w /path/to/dir/ -i -t  ubuntu pwd
  • -w cho phép câu lệnh thực thi bên trong thư mục đã chỉ định. Nếu đường dẫn tới thư mục không tồn tại,
    nó sẽ tạo một thư mục mới trong container tương ứng đường dẫn đó.

Set storage driver options per container

1
$ docker run -it --storage-opt size=120G fedora /bin/bash
  • size cho phép chúng ta thiết lập container rootfs size tới 120G tại thời điểm tạo.
    Option này chỉ hiệu quả cho devicemapper, btrfs, overlay2, windowsfilter và zfs graph drives

  • Với devicemapper, btrfs, windowsfilter and zfs graph drivers user không thể gán kích thước
    nhỏ hơn Default BasFS Size

  • Với overlay2 storage drive, size option chỉ hoạt động nếu trình fs được gán là xfs
    và mounted với option pquota. trường hợp này, người dùng có thể cấp size.

Mount tmpfs (–tmpfs)

1
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image

flag --tmpfs mount một empty tmpfs vào container với rw, noexec, nosuid, size=65536k

Mount volume (-v, –read-only)

1
$ docker  run  -v `pwd`:`pwd` -w `pwd` -i -t  ubuntu pwd
  • -v mount thư mục hiện tại vào container
  • -w cho phép command được thực thi bên trong thư mục hiện tại bằng cách thay đổi trong thư mục
    thành giá trị được trả về bởi pwd. Nó sẽ thực thi kết hợp câu lệnh sử dụng container,
    nhưng bên trong thư mục hiện tại:
1
$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

Khi host directory của bind-mounted volume không tồn tại, Docker sẽ tự động tạo thư mục này trên host cho bạn.
Trong ví dụ trên, Docker sẽ tạo thư mục /doesnt/exist trước khi chạy container.

1
$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here
  • --read-only để kiểm soát nơi container viết file, --read-only flag mount container’s root filesystem chỉ để đọc.
1
$ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh

Bằng cách liên kết docker unix socket với docker binary liên kết tĩnh, chúng ta cấp container toàn quyền truy cập
và chỉnh sửa host’s Docker daemon.

Add bind mounts or volumes using the –mount flag

  • Ví dụ:
1
$ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
1
$ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh

Publish or expose port (-p, –expose)

1
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
  • Câu lệnh kết nối cổng 8080 của container tới cồng 80 TCP trên 127.0.0.1 của host machine.
    Chúng ta có thể chỉ định udpsctp ports.

  • Có một lưu ý, những port không ràng buộc bởi host sẽ có thể được truy cập từ bên ngoài.
    Điều này cũng áp dụng nếu chúng ta muốn cấu hình UFW để chặn công cụ này, vì Docker quản lý các quy tác iptables
    của riêng mình.

1
$ docker run --expose 80 ubuntu bash

Hiển thị cổng 80 của container mà không có xuất hiện port trên host system.

Set environment variables (-e, –env, –env-file)

1
docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash
  • Sử dụng những flag -e, --env, --env-file để thiết lập những biến môi trường (không phải dạng array)
    cho container bạn đang chạy, hoặc ghi đè những file đó có sẵn.

ví dụ:

1
2
3
❯ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
VAR2=value2
VAR1=value1

Connect a container to a network (–network)

1
$ docker run -itd --network=my-net busybox

Chúng ta có thể chọn địa chỉ IP cho container với flag --ip hoặc --ip6 khi bạn chạy container
trên user-defined network

1
$ docker run -itd --network=my-net --ip=10.10.9.75 busybox

Docker rm

Để xóa container khi nó đang dừng, ta dùng lệnh docker rm container_id

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
❯ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
ddf68933af54        centos:latest       "/bin/bash"         9 minutes ago       Exited (0) 7 minutes ago                           centos_docker
ff7140c65b73        ubuntu:latest       "/bin/bash"         About an hour ago   Exited (0) 45 minutes ago                          unruffled_goldberg
b2d8e983bcef        ubuntu:latest       "/bin/bash"         About an hour ago   Exited (0) About an hour ago                       gallant_snyder
❯ docker rm b2
b2
❯ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
ddf68933af54        centos:latest       "/bin/bash"         10 minutes ago      Exited (0) 7 minutes ago                        centos_docker
ff7140c65b73        ubuntu:latest       "/bin/bash"         About an hour ago   Exited (0) 45 minutes ago                       unruffled_goldberg

Trường hợp container đang chạy mà ta muốn xóa thì ta thêm options -f

1
docker rm -f container_id/container_name

Tổng kết


Trong bài học này, chúng ta đã học được từ anh XuanThuLabChanel những kiến thức như sau:

  • docker images: Liệt kê danh sách tất cả các images trên docker
  • docker pull image:tag tải image về máy
  • docker image rm image_name/image_id xóa image
  • docker version: xem version của docker
  • docker run -it --name "ten_container" -h "host_name" image: tạo container.
  • ctrl + P, ctrl + Q: thoát khỏi container nhưng vẫn để container chạy.
  • docker ps: in ra container chạy
  • docker stop container_id/name: buộc container đang chạy dừng khi ta đang ở host.
  • docker attach container_id/name: trở lại container đang chạy.
  • docker rm containerid/name: xóa container đã dừng.
  • docker rm -f containerid/name: xóa container đang chạy.
    Kết thúc bài viết này, một lần nữa em xin chân thành gửi lời cảm ơn đến anh XuanThuLabChanel đã làm những bài học quý giá và bổ ích này.
Share on

Edisc
WRITTEN BY
Edisc
Cyber Security Engineer

 
What's on this Page