DOCKER FOR THE ABSOLUTE BEGINNER – HANDS-ON – DEVOPS
1 Section 1: Introduction
2 Section 2: Docker commands
2.1 run – start a container
Download nếu chưa có and run image
[root@ansible-master ~]# docker run nginx
2.2 run – attach and detach
Run docker in background
[root@ansible-master ~]# docker run -d kodekloud/simple-webapp
2.3 ps – list container
[root@ansible-master ~]# docker ps
List running container
[root@ansible-master ~]# docker ps -a
List all container
2.4 stop – stop container
[root@ansible-master ~]# docker stop <container_name>
Stop all container
[root@ansible-master ~]# docker stop $(docker ps -a -q)
2.5 rm – Remove container
[root@ansible-master ~]# docker rm <container_name>
Remove all
[root@ansible-master ~]# docker rm $(docker ps -a -q)
2.6 images – List images
[root@ansible-master ~]# docker images
2.7 rmi – Remove images
[root@ansible-master ~]# docker rmi <images_name>
Remove images all
[root@ansible-master ~]# docker rmi $(docker images -a -q)
2.8 pull – download images only
[root@ansible-master ~]# docker pull <images_name>
2.9 exec – execute a command
[root@ansible-master ~]# docker exec <container_name> <command>
[root@ansible-master ~]# docker exec <container_name> cat /etc/hosts
3 Section 3: Docker run
3.1 Docker run
[root@ansible-master ~]# docker run -d redis
[root@ansible-master ~]# docker run -d redis:4.0 (tag)
3.2 Run – stdin
Mở terminal
[root@ansible-master ~]# docker run -it kodekloud/simple-prompt-docker
3.3 Run – port mapping
[root@ansible-master ~]# docker run -d -p 8888:8080 kodekloud/simple-webapp
8888: host port
8080: container port
3.4 Run – volume mapping
root@ubuntu18-1:~# docker run -d -p 3306:3306 -v /opt/datadir:/var/lib/mysql mysql
/opt/datadir: host volume
/var/lib/mysql: container volume
3.5 Inspect container
3.6 Advanced Docker Run
root@ubuntu18-1:~# docker run -d -p 8080:8080 jenkins/Jenkins
4 Section 4: Docker images
4.1 Docker images
4.2 Demo
4.2.1
Create Dockerfile
root@ubuntu18-1:~# git clone /> />root@ubuntu18-1:~# cd simple-webapp-flask/
Tạo Dockerfile
4.2.2
Build images
root@ubuntu18-1:~/simple-webapp-flask# docker build -t simple-webapp-flask:1.0.0 .
4.2.3
Run container
root@ubuntu18-1:~/simple-webapp-flask# docker run -d -p 5000:8080 simple-webappflask:1.0.0
4.2.4
Tag image
docker image tag simple-webapp-flask:1.0.0 lamnguyentt/simple-webapp-flask:1.0.0
lamnguyentt: registry account
4.2.5
Push registry
root@ubuntu18-1:~/simple-webapp-flask# docker image push lamnguyentt/simplewebapp-flask:1.0.0
4.3 Environment Variables
4.4 Command vs Entrypoint
4.5 Multi-build stage
/>Các bản dựng nhiều giai đoạn hữu ích cho bất kỳ ai gặp khó khăn trong việc tối ưu hóa
Dockerfiles trong khi vẫn giữ cho chúng dễ đọc và dễ bảo trì.
4.5.1
Before multi-stage build
Một trong những điều khó khăn nhất khi xây dựng hình ảnh là giảm kích thước images.
Mỗi lệnh RUN, COPY và ADD trong Dockerfile sẽ thêm một lớp vào images và bạn cần
nhớ xóa sạch bất kỳ phần mềm nào bạn khơng cần trước khi chuyển sang lớp tiếp theo.
Để viết một Dockerfile thực sự hiệu quả, theo truyền thống, bạn cần phải sử dụng các thủ
thuật trình bao và logic khác để giữ các lớp càng nhỏ càng tốt và đảm bảo rằng mỗi lớp
có các tạo tác mà nó cần từ lớp trước và khơng có gì khác. Thực sự rất phổ biến khi có
một Dockerfile để sử dụng cho phát triển (chứa mọi thứ cần thiết để xây dựng ứng dụng
của bạn) và một tệp thu gọn để sử dụng cho sản xuất, chỉ chứa ứng dụng của bạn và chính
xác những gì cần thiết để chạy nó. Điều này đã được gọi là " builder pattern". Duy trì hai
Dockerfiles không phải là lý tưởng.
4.5.2
Use multi-stage builds
Với các bản dựng nhiều giai đoạn, bạn sử dụng nhiều câu lệnh FROM trong Dockerfile
của mình. Mỗi lệnh FROM có thể sử dụng một cơ sở khác nhau và mỗi lệnh bắt đầu một
giai đoạn mới của quá trình xây dựng. Bạn có thể sao chép có chọn lọc các phần tạo tác
từ giai đoạn này sang giai đoạn khác, bỏ lại mọi thứ bạn không muốn trong images cuối
cùng. Để cho biết cách này hoạt động, hãy điều chỉnh Dockerfile từ phần trước để sử
dụng các bản dựng nhiều giai đoạn.
How does it work? The second FROM instruction starts a new build stage with the
alpine:latest
image as its base. The COPY
--from=0
line copies just the built artifact
from the previous stage into this new stage. The Go SDK and any intermediate artifacts
are left behind, and not saved in the final image.
4.5.3
Name build stage
4.5.4
Use an external image as a “stage”
4.5.5
Example
/>
4.5.5.1 Build stage
Có thể thấy kích thước image go-dockerize là 419MB
4.5.5.2 Run test
Check
4.5.5.3 Multi-stage
Để giảm kích thước images
root@ubuntu18-1:~/admin/go/src/github.com/thanhlam/go-dockerize# docker build -t godockerize:2.0.0 .
Có thể thấy kích thước images giảm chỉ còn 12.6MB
5 Section 5: Docker compose
5.1 Docker compose
5.1.1
Introduction
Kết hợp nhiều Dockerfile
5.1.2
Docker run --link
5.1.3
Docker-compose.yml
5.1.4
Docker-compose build
Dùng khi chưa build sẵn image
5.1.5
5.1.6
Docker-compose version
Version 1: dùng “link”
Version 2: dùng “depends_on”
Version 3: support docker swarm
Separate network
Mặc định docker-compose tạo network bridge như hình
Tuy nhiên, nếu muốn chia network rõ ràng thành front-end và back-end. Thì dockercompose file như sau:
5.2 Demo
5.2.1
Clone source code
/>root@ubuntu18-1:~# git clone />
5.2.2
Build & run vote app
root@ubuntu18-1:~/example-voting-app/vote# docker build . -t voting-app
root@ubuntu18-1:~/example-voting-app/vote# docker run -d -p 5000:80 voting-app
Click chọn thử → fail do chưa có redis
5.2.3
Run redis
root@ubuntu18-1:~/example-voting-app/vote# docker run -d --name=redis redis
Run lại voting-app
root@ubuntu18-1:~/example-voting-app/vote# docker run -d -p 5000:80 --link redis
voting-app
5.2.4
Run postgres
root@ubuntu18-1:~/example-voting-app/worker# docker run -d --name=db -e
POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres postgres:9.4
5.2.5
Build and run worker-app
root@ubuntu18-1:~/example-voting-app/worker# docker build . -t worker-app
root@ubuntu18-1:~/example-voting-app/worker# docker run --link redis --link db
worker-app
5.2.6
Build and run result app
root@ubuntu18-1:~/example-voting-app/result# docker build . -t result-app
root@ubuntu18-1:~/example-voting-app/result# docker run -d -p 5001:80 --link db
result-app
5.3 Demo with docker-compose
5.3.1
Install docker-compose
root@ubuntu18-1:~# sudo curl -L
" />-s)-$(uname -m)" -o /usr/bin/docker-compose
root@ubuntu18-1:~# sudo chmod +x /usr/bin/docker-compose
root@ubuntu18-1:~# docker-compose --version
5.3.2
Build images
5.3.3
Create docker-compose.yml
root@ubuntu18-1:~# touch docker-compose.yml