Một vài tip/trick docker

Tailing logs

Thỉnh thoảng ta muốn truy cập logs của docker nhanh chóng thì có thể sử dụng lệnh dưới đây:

$ docker logs -t --tail 1000 [container_name or container_id] 2>&1 | grep -i error

Ố ồ chờ tý

Trong docker-compose, đôi khi ta muốn chạy nhiều service mà service A phụ thuộc vào service B chạy xong mới chạy. Nếu về thứ tự chạy thì dùng depend_on, còn phụ thuộc chạy xong hoàn toàn (tức tính available -sẵn dùng) thì ta sẽ phải dùng cách khác.
Dưới đây là một ví dụ:

version: '3'
networks:
  test_net:

services:
  webserver:
    image: nginx:alpine
    command: sh -c 'sleep 10 && nginx -g "daemon off;"'
    networks:
      - test_net

  test:
    image: alpine
    command:  sh -c 'while ! nc webserver 80; do echo '.' && sleep 1; done && echo "Webserver up and running, bye bye..!"'
    networks:
      - test_net

Chạy cron tasks trong docker Alpine container

Docker Alpine là một Docker image nhẹ phổ biến có chứa một danh sách các tiện ích Linux cơ bản. Trong đó có crond.
Để chạy các nhiệm vụ của theo định kỳ, ta có thể gắn các tập lệnh của mình dựa trên thời điểm ta muốn thực hiện nó. Trong ví dụ này, các tập lệnh được đặt trong cron_tasks_folder sẽ được thực thi hàng giờ

version: '3'
services:
      cron:
          image: alpine:3.6
          command: crond -f -l 8
          volumes:
           - ./cron_tasks_folder:/etc/periodic/hourly/:ro

Volumes trong docker-compose

Host mounted volumes

Syntax: /host/path:/container/path

/host/path : có thể là đường dẫn tương đối hoặc tuyệt đối. Nên sử dụng loại volume này khi đang chạy cơ sở hạ tầng (container) trong một máy duy nhất (sử dụng Docker hoặc docker compose).
Named volumes

Syntax: named_volume_name:/container/path

Với loại volumes này có thể sử dụng trên một máy hoặc mở rộng trên một cụm máy (sử dụng Docker, docker composer hoặc docker swarm).
Docker volumes có thể là internal hoặc external. Internal volumes có phạm vi trong docker-compose file trong khi external thì cần khai báo trước khi sử dụng:

$ docker volume create my_volume

Sử dụng .dockerignore

Khái niệm về .dockerignore tương tự .gitignore nhưng lần nó được sử dụng để xây dựng image Docker tốt hơn. Với tệp này, ta có thể tránh tải lên các tệp không cần thiết làm giảm thời gian build và kích thước image.
Tạo một file tên là .dockerignore, thêm vào các config file, tệp ta không muốn chúng được thêm vào image.
Ví dụ 1:

$ cat .dockerignore
logs/
MY_SECRET_PASSWORDS.txt
.dockerignore

Ví dụ 2 dưới đây loại trừ tất cả file và thư mục, ngoại trừ thư mục src:

$ cat .dockerignore
**
!src

Truyền các biến môi trường vào docker

Có 2 option là -e--env.file (khi muốn truyền nhiều biến môi trường)

$ docker run -it -e TEST=1234 --env TEST1=3456 --rm alpine /bin/ash
- write in terminal
echo $TEST   - you should have result '1234'

Tham khảo thêm tại đây

Backup of container

Đôi khi ta cần backup một container đang chạy và đem nó sang một máy khác để chạy

$ dokcer ps -a // sau đó lấy container_id hoặc container_name
$ docker commit -p <container_id> <your_backup_name>
$ docker images // xuất hiện image mới tên là <your_backup_name>
$ docker save -o <container_file>.tar <your_backup_name>

Sau khi copy file .tar bên trên sang máy khác có thể restore nó

$ docker load -i <container_file>.tar

thực hiện list docker images trên máy host vừa copy sang sẽ thấy một image mới vừa được restore từ file .tar kia

Minimal base image nhất có thể

Đôi khi không cần thiết phải tạo image từ "ubuntu" mà có thể tạo các image từ các image base nhỏ hơn như debian, alpine, scratch.
ubuntu -> debian -> alpine -> scratch

FROM scratch
.....
or
FROM alpine
....

Chạy nhiều container

Hãy nghĩ ngay tới docker-compose.

Xem docker internal files

Đầu tiên lấy docker container_id qua lệnh sau

$ docker ps -a

sau đó thực hiện như bên dưới

$ sudo su 
$ cd /var/lib/docker
$ ls -list     // show tất cả các container
$ cd /containers/<CONTAINER_ID>+<OTHER_HASH_NAME>
$ ls -list     // show tất cả file của container

Hiển thị thông tin với --format

Đôi khi thông tin hiển thị rườm rà, ta có thể config lại cho ngắn gọn với tham số --format rồi sort và in ra dạng table chẳng hạn

docker images --format '{{.Size}}\t{{.Repository}}:{{.Tag}}\t{{.ID}}' | sort -h | column -t