Toàn bộ series này được tham khảo từ hai nguồn chính: XuanThuLabChanel và DockerDoc. 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 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.
Tải image
Để tải image, ta sử dụng:
Ở đâ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 .}}'
|
Print the current context
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:
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
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 udp
và sctp
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.