Please enable JavaScript.
Coggle requires JavaScript to display documents.
Docker - Coggle Diagram
Docker
Lý thuyết
Image
- khuôn mẫu, lớp chứa các file cần thiết để tạo nên một container
- Chứa những tài nguyên có sẵn
- Không được tiếp cận vào CPU, memory, storage...
Container
- Tồn tại trên host với 1 IP
- Được deploy, chạy và xóa bỏ thông qua remote client
Docker engine
-
- Chạy lệnh trong chế độ daemon
- Linux trở thành máy chủ Docker
- Container được deploy, chạy, xóa bỏ thông qua remote client
Docker daemon
- Tiến trình chạy ngầm quản lý các container
Docker client
- kiểm soát hầu hết các workflow của docker
- Giao tiếp với các máy chủ docker thông qua daemon
Docker là gi
- Tạo ra các container cho các ứng dụng phần mềm
- Vận chuyển container
- Chia sẻ container
Khẩu quyết của Docker
Build, ship and deploy any application, anywhere
- Build: đóng gói ứng dụng trong một container
- Ship: vận chuyển container
- Deploy: triển khải, chạy container
- Bất cứ ứng dụng nào chạy được trên Linux
- Tất cả mọi nơi: laptop, máy chủ, máy ảo, cloud instance..
- Đóng gói phần mềm dễ dàng
- Deploy nhanh
- Không cần cấu hình và cài đặt môi trường rườm rà
- Image: component để triển khai ứng dụng bao gồm mã nguồn, thư viện, framework, file...
- Trừu tượng hóa giải pháp và đóng gói vào một image kèm dependencies
- => Tránh conflic môi trường triển khai
Batteries included butr replaceable
- Một component có thể được thay thế bằng cách implement cùng một interface có sẵn
- Docker framework được phân chia thành các mô-đun có khả năng mở rộng cao
Điểm mạnh của Docker
- Deploy nhanh hơn
- Hệ thống augmented file system
- Thêm các layer bên trên root kernel
- Dễ dàng tổng hợp các layer thành một
- Độc lập
- Lỗi xảy ra với một container không ảnh hướng các container khá
- Cơ động
- Tránh conflict môi trường
- Trao đổi giữa các máy
- Nhất quán khi chạy trên các máy khác nhau
- Chụp ảnh hệ thống(snapshot)
- Lưu snapshot thành container hoặc image
- Tag
- Tạo container y hệt từ snapshot
- Kiểm soát việc sử dụng tài nguyên(CPU, RAM, storage..)
- Đơn giản hóa sự phụ thuộc lẫn nhau giữa các ứng dụng(dependency)
- Xác định dependency ở Dockerfile
- Thuận tiện cho việc chia sẻ
- DockerHub(public/private registry)
- Dockerfile
Một số lần tưởng về Docker
- Không phải công cụ quản lý thiết lập hay thiết lập tự động(Puppet, Chef, ...)
- Không phải giải pháp ảo hóa phần cứng(VMWare, KVM, ...)
- Không phải một nền tảng điện toán đám mây(OpenStack, CLoudStack,...)
- Không phải là một deployment framework(Capistrano, Fabric, ...)
- Không phải là một công cụ quản lý workload(Mesos, Fleet, ....)
- Không phải là một môi trường phát triển(Vagrant,...)
Cơ chế hoạt động của Docker
- Phản hồi các thông điệp từ phần cứng
- Khởi tạo và đặt lịch cho các chương trình
- Quản lý và hệ thống các tác vụ
- Truyền tin giữa các chương trình
- Phân chia tài nguyên, bộ nhớ, CPU, mạng, ...
- Tạo container bằng cách chỉnh thiết lập kernel
Docker
- Viết trên ngôn ngữ Go
- Quản lý các đặc tính kernel
- Hướng tiếp cận tồn tại vài năm trước khi có Docker
- Docker đơn giản hóa việc viết script cho các hệ thống phân tán
- Docker bao gồm 2 phần: client và server
- Server nhận lệnh qua socket(qua mạng hoặc qua "file")
- Client thậm chí có thể được chạy ở trong docker
Kiến trúc Docker
- kiến trúc client-server
- 3 thành phần chính
- Docker Client
- Docker Host
- Docker Registry(Hub)
- Docker Daemon nhận lệnh từ Docker Client thông qua CLI hoặc REST API
- Docker Client ở trên cùng host hoặc khác host với Docker Daemon
- Docker Hub: dịch vụ lưu trữ, chia sẻ image
- Nhiều container có thể liên kết với nhau để tạo kiến trúc ứng dụng đa tầng
- Nếu đóng container và chưa commit thì mọi thay đổi trên container sẽ bị mất
Quy trình Docker
- Dockerfile buid => Image(run) => Container
Cơ chế lưu trữ của Docker
- Cơ chế lưu trữ copy-on-write
- Tạo một hệ thống mới ngay lập tức mà không cần copy tất cả file hệ thống
- Hệ thống lưu trữ lưu lại mỗi thay đổi
Container
-
-
Để loại bỏ một container, sử dụng lệnh dưới đây:
docker container rm <container ID>
Để xóa nhiều container, gõ
docker container rm <container ID> <container ID>
Docker: Xóa Container khi thoát ứng dụng
Nếu bạn không cần container sau khi tạo nó, thì bạn chỉ cần sử dụng lệnh -rm để xóa nó.
docker run –-rm <container_name>
Docker: Remove Container theo mẫu
Để xem tất cả container phù hợp với mẫu của bạn, hãy sử dụng lệnh dưới đây. Quá trình này gần giống với những gì bạn sẽ sử dụng để xóa image theo mẫu:
docker ps -a | grep "pattern"
Tiếp theo, chỉ cần sử dụng lệnh rep cùng với awk để remove container:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rmi
Mạng nội bộ trong container
- Các chương trình trong container được mặc định tách biệt hoàn toàn khỏi Internet
- Nhóm các container lại thành một mạng nội bộ
- Kiểm soát sự liên kết giữa container này với container kia
- Sử dụng phương thức expose cổng và link container
- Docker có cơ chế đặc biệt giúp các container tìm và liên kết với nhau
- Xác định cổng bên trong và bên ngoài container
- Không giới hạn số lượng cổng để mở
- docker run --rm -ti -p 111:111 -p 222:222 --name reply <image> bash => ý nghĩa -p 111:111: portal 111 ở bên trái là portal trong container, portal 111 ở bên phải là portal ngoài container. lắng nghe dữ liệu vào từ port 111 ở ngoài container vào portal 111 ở trong container và truyền dữ liệu qua portal 222 ở trong container và truyền dữ liệu ra ngoài portal 222 ở ngoài container
Mở cổng container
- Cần sự phối hợp giữa các container
- Dễ dàng tìm kiếm cổng được mở
- Cổng bên trong container là cố định
- Cổng bên ngoài container được lựa chọn ngẫu nhiên
- Cho phép nhiều container chạy các chương trình với cổng cố định
- Thường được sử dụng v ới các chương trình tìm kiếm dịch vụ(service discovery)
- docker run --rm -ti -p 111 -p 222 --name reply <image> bash => ko điền cổng ở ngoải docker thì docker sẽ tự động lấy ngẫu nhiên, và docker cam kết không trùng portal.
docker portal <ContainerID|Name>Mở cổng UDP
- docker run -p outside-portal:inside-portal/protocol(tcp/udp)
- ví dụ docker run -p 111:222/udp. mặc định không truyền vào udp là tcp
- thứ tự cổng: từ ngoài vảo trong
Liên kết động giữa các container
- Docker cung cấp tính năng tạo mạng riêng nội bộ
- Name server với cơ chế quản lý địa chỉ IP và name
- Cần tạo lập mạng trước rồi chạy các container liên quan
- docker network create [OPTIONS] <Tên NETWORK>
- docker network ls => danh sách network
- docker network inspect bridge => xem chi tiết network bride
- docker network connect bridge <ContainerID|Name> => muốn container kết nối vào mạng bridge
Image
Quản lý imageXem danh sách
- docker images [OPTIONS] [REPOSITORY[:TAG]]
- docker images => cách ghi tắt của docker image ls
- docker images –a
tag image
- đặt tên cho image
- docker tag image[:TAG] image[:TAG]
- Lệnh docker commit bao gồm luôn việc tag image
- docker commit [OPTIONS] [ContainerId|Name] [REPOSITORY[:TAG]]
- Cấu trúc tên
- registry.repo.com:port/organization/image-name:version-tag
Xóa image
- Dung lượng các image tăng rất nhanh nếu bạn không xóa bớt những image không dùng
- docker rmi [OPTIONS] IMAGE [IMAGE...] => cách ghi tắt của docker image rm
Xuất và nhập image
- docker save [OPTIONS] IMAGE [IMAGE ...]
- ví dụ: docker save -o backup-images.tar.gz <tên image | id>
- docker load [OPTIONS]
- ví dụ: docker load -i backup-images.tar.gz
- sao lưu dữ liệu giữa các ổ đĩa
Xóa image
docker image rmi <image_id>
Xóa nhiều image
docker images rmi <image_id> <image_id>Xóa toàn bộ image
- docker rmi -f $(docker images -a -q)
docker system prune: xóa hết data không dùng đến( stopped container, network not used, ...)
-
-
Docker Registry
- Quản lý và phân phối image
- Dịch vụ miễn phí từ Docker
- Có thể setup một Registry cho cá nhân hoặc doanh nghiệp
- Tìm kiếm image: docker search [OPTIONS] TERM
Lưu ý
- Không nên để file quan trọng hoặc password nằm trong image và phát tán lên mạng
- Dọn dẹp sao lưu và đẩy image lên thường xuyên
- Cảnh giác mỗi khi download image không rõ nguồn gốc
Volumes
Liệt kê volume:
docker volume ls
Xóa một hoặc nhiều volumes:
docker volume rm <volume_name> <volume_name>
Remove Dangling Volumes
Volumes không tồn tại mà không có containers. Nếu bạn loại bỏ containers và để trống volumes, chúng sẽ không tự động remove. Để xóa volumes, chúng ta có thể thực hiện theo quy trình tương tự như xóa dangling images:
Đầu tiên, chúng ta có thể liệt kê tất cả dangling volumes bằng bộ lọc -f, sau đó sử dụng lệnh prune để remove dangling volumes.
Liệt kê dangling volumes:
docker volume ls –f dangling=true
Remove dangling volumes:
docker volume prune
Remove container và Volume của nó
Volumes không tên có thể được xóa bằng containers của nó bằng cách sử dụng tùy chọn -v:
docker rm -v <container_name>
Volume
- Đĩa ảo để chứa và chia sẻ dữ liệu
- 2 loại chính:
- Volume giữa host và container
- Volume giữa các container
- Không phải một phần của image
Chia sẻ dữ liệu giữa host và container
- Có thư mực chia sẻ chung với host
- Có thể chia sẻ file đơn lẻ với host
- File cần được tạo trước khi chạy container, nếu không folder cha sẽ được chia sẻ
-ví dụ: docker run -ti -v /share:/container_data ubuntu bash
Chia sẻ dữ liệu giữa các container
- Param volumes-from
- Dữ liệu được chia sẻ chỉ tồn tại cho tới khi các tontainer đều thoát
- ví dụ: docker run -ti --name pc1 -v /share ubuntu bash
- docker run -ti --name pc2 --volumes-from pc1 ubuntu bash
Docker volumn
Là một nơi lưu trữ data nằm ngoài container, mục đích không làm mất data khi xóa containerSỬ dụng Volume khi nào
- Khi chia sẻ dữ liệu giữa nhiều container đang chạy
- Lưu dữ liệu tới một server remote hoặc cloud
- Khi cần backup, restore hoặc migrate dữ liệu từ Docker Host này sang Docker Host khác
Lệnh liên quan tới volume
- docker volume create => tạo mạng mới
- docker volume inspect => xem chi tiết mạng
- docker volume ls => hiển thị những mạng đang có
- docker volume rm => xóa mạng
- docker volume prune => Xóa các volume rỗng
Dockerfile
Định nghĩa
- File định nghĩa tất cả những thứ cần tạo ra trong image
- docker build [options] PATH|URL| -
- ví dụ: docker build -t demo:1.0 .
- param -t ý nghĩa t là tag.
- dấu chấm cuối câu lệnh ý nghĩa tìm dockerfile ở câu lệnh hiện tại đang đứng ở folder chạy lệnh này. chỉ định dockerfile ở chỗ khác thì thay dấu chấm = đường dẫn khác
- docker build -t hello-aspnetcore:v1 .
docker run -it --rm -p 8080:80 hello-aspnetcore:v1
- khi build xong, image sẽ nằm ở local registry trên máy
Tạo image ở mỗi dòng
- Mỗi dòng lấy image tạo ra từ dòng trước đó để tạo một image mới
- Image trước đó không đổi
- Không chỉnh sửa trạng thái của dòng trước đó
- Không nên để các file dung lượng lớn làm phình dung lượng image
Lưu cache ở mỗi dòng
- Kiểm tra kết quả build để tìm từ khóa "using cache"
- Docker bỏ qua các dòng mà không thay đổi từ bản build trước
- Nếu dòng đầu tiên là "download latest file", không phải lúc nào nó cũng được chạy
- Cache giúp tiết kiệm thời gian
- Phần code chỉnh sửa nên đặt ở cuối Docker file
Docker file vs Shell script
- Dockerfile trông giống shell script
- Dockerfile không phải là shell script
- Dockerfile không phải là shell script
- Các tiến trình bạn chạy trên một dòng sẽ không chạy ở dòng tiếp theo
- Các biến môi trường bạn đặt sẽ được giữ lại ở dòng tiếp theo
- Dùng lệnh ENV để đặt giá trị cho biến môi trường
- Mỗi dòng trong dockerfile đều gọi tới docker run
-
-
docker-compose
Các lệnh trong Docker Compose
- version: chỉ ra phiên bản docker-compose đã sử dụng
- services: thiết lập các services(containers) muốn cài đặt và chạy
- image: chỉ ra image được sử dụng trong lúc tạo ra container
- build: dùng để tạo container
- ports: thiết lập ports chạy tại máy host và trong container
- restart: tự động khởi chạy khi container bị tắt
- environment: thiết lập biến môi trường(thường sử dụng trong lúc config các thông số của db)
- depends_on: chỉ ra sự phụ thuộc. Tức là services nào phải được cìa đặt và chạy trước thì service được config tại đó mới được chạy
- volumes: dùng để mount hai thư mục trên host và container với nhau
- links: Cho phép đăng ký một cái tên(Bí danh) để cho các Server khác có thể gọi nó. Điều đặc biệt là nó có thể đem lại một cái tên "Hợp vệ sinh", chúng ta không cần phải nhớ truy cập trên cổng nào như trên host. Chỉ cần sử dụng tên là có thể kết nối với service mong muốn
- context: Xác ddinhjj thư mục chứa gốc, dựa vào thư mục này chúng ta sẽ khai báo tiếp đường dẫn dockerfile
Command Docker Compose
- Build image
- Run
- Stop
- Start lại container
- Stop và Xóa Container
Docker networks
Để kết nối các container trong cùng mạng hoặc khác mạng với nhau.Các câu lệnh thao tác với mạng
- docker network create => tạo mạng mới
- docker network inspect => Xem chi tiết mạng
- docker network ls => Hiển thị những mạng đang có
- docker network rm => Xóa mạng
- docker network prune => Xóa đồng loạt các mạng không sử dụng
- docker network connect => tạo kết nối mạng
- docker network disconnect => Ngắt kết nối mạng
docker push Registry
- registry local
- docker run -d -p 5000:5000 --name registry registry:2
- docker image tag ubuntu localhost:5000/myfirstimage
- docker push localhost:5000/myfirstimage
- xem danh sách image localhost:5000/v2/_catalog
- Now stop your registry and remove all data
- docker container stop registry && docker container rm -v registry