Docker and Docker commands
1. Docker
Docker là gì?
- Docker là open flatform cung cấp cho developer các công cụ, service để đóng gói, triển khai và chạy ứng dụng trên các môi trường khác nhau một cách nhanh, gọn, nhẹ nhờ sử dụng containers.
- Docker (ban đầu viết bằng Python, hiện tại đã chuyển sang Go-lang) giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hoá.
- Docker đưa một giải pháp mới cho vấn đề ảo hoá, thay vì tạo ra các máy ảo con chạy độc lập kiểu hypervisors (tạo phần cứng ảo và cài đặt hệ điều hành lên đó), các ứng dụng sẽ được đóng gói thành Container riêng lẻ. Các Container dùng chung kernel với Host OS, chia sẻ chung tài nguyên của máy chủ, do đó, hoạt động nhẹ và nhanh hơn các máy ảo dạng hypervisors.
Sự khác biệt giữa Docker và Hypervisors?
-
Virtual Machine(Hypervisors):
- Ảo hỏa nằm ở tầng Hardware (phần cứng), tức là mô phỏng phần cứng và chạy những OS con trên phần cứng đó (Các công cụ Hypervisor như Virtual Box, VMware..).
- Cần thêm một Guest OS cho nên sẽ tốn tài nguyên hơn và làm chậm máy thật khi sử dụng. Thời gian khởi động trung bình là 20s có thể lên đến hàng phút, thay đổi phụ thuộc vào tốc độ của ổ đĩa.
-
Docker:
-
Containerization
là công nghệ ảo hóa ở tầng OS (hệ điều hành), công nghệ được sử dụng ở đây chính là Docker. - Dùng chung kernel, chạy độc lập trên Host Operating System và có thể chạy trên bất kì hệ điều hành nào cũng như cloud. Khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.
-
So sánh giữa Virtual Machine với container
-
Container chỉ là một user space bao gồm ứng
dụng, system binaries và libraries mà không cần guest OS
hoặc ảo hóa phần cứng như VMs. Container chạy trực tiếp
trên môi trường máy chủ như một tiến trình
và chia sẻ phần kernel bên dưới dùng chung với
máy chủ chứa nó.
- Các container nhỏ và nhẹ hơn vì chúng có chung nhân hệ điều hành.
- Không mất nhiều thời gian để khởi động (trong một vài giây).
- Hiệu suất cao với việc sử dụng tài nguyên thấp hơn
- Virtual Machine tạo ra một môi trường giả lập hoàn toàn tách biệt như 1 máy hoàn chỉnh thông qua việc phân bổ tài nguyên của máy chủ, do đó sẽ tốn tài nguyên nhiều hơn cho hệ điều hành của máy ảo
Docker architecture
- Docker client: Giao diện để tương tác giữa người dùng với Docker Daemon - HOST, nó cung cấp cho người dùng giao diện dòng lệnh và thực hiện phản hồi với các Docker Daemon. Daemon sẽ biên dịch và thực thi các câu lệnh đã tương tác qua Docker client.
- Docker Daemon (HOST): Docker daemon chạy trên các máy host. Người dùng sẽ không tương tác trực tiếp với các daemon, mà thông qua Docker client. Docker sử dụng kiến trúc client-server. Docker client sẽ liên lạc với các Docker daemon, các Docker daemon sẽ thực hiện các tác vụ build, run và distribuing các Docker container. Cả Docker client và Docker daemon có thể chạy trên cùng 1 máy, hoặc có thể kết nối theo kiểu Docker client điều khiển các docker daemon giao tiếp với nhau thông qua socket hoặc RESTful API.
- Docker Hub (registry): Nơi lưu trữ các images
Docker mang lại những giá trị gì?
- Với Docker, chúng ta có thể đóng gói mọi ứng dụng như webapp, backend, MySQL, BigData…thành các containers và có thể chạy ở “hầu hết” các môi trường như Linux, Mac, Window…
- Docker Containers có một API cho phép quản trị các container từ bên ngoài. Giúp cho chúng ta có thể dễ dàng quản lí, thay đổi, chỉnh sửa các container.
- Hầu hết các ứng dụng Linux có thể chạy với Docker Containers.
- Docker rất dễ cho mọi người sử dụng từ developers, systems admins, architects,... nó tận dụng lợi thế của container để build, test nhanh chóng. Có thể đóng gói ứng dụng trên laptop của họ và chạy trên public cloud, private cloud..v.v… “Build once, run anywhere”.
- Docker Containers có tốc độ chạy nhanh hơn hẳn các VMs truyền thống (theo kiểu Hypervisor). Điều này là một ưu điểm nổi bật nhất của Docker.
Khi nào sử dụng Docker?
- Khi bạn cần triển khai kiến trúc Mircoservices.
- Khi ứng dụng bạn cần scale một cách linh hoạt.
- Khi bạn cần build 1 lần và chạy ở nhiều máy khác nhau mà không cần quan tâm đến config.
- Khi bạn cần một cách tiếp cận mới về building, shipping, running ứng dụng một cách nhanh chóng dễ dàng.
Các khái niệm cơ bản
-
Docker Engine: Docker engine hoạt động như một ứng
dụng client-server, Docker engine cung cấp cho chúng ta function để
có thể làm việc được với docker image hay docker container. Để
sử dụng các function này chúng ta có thể sử dụng
Rest API hoặc CLI của docker. (
docker run ...
).- Docker Community Edition (CE): Là phiên bản miễn phí và chủ yếu dựa vào các sản phầm nguồn mở khác.
-
Docker Enterprise(EE): Khi sử dụng phiên bản
này bạn sẽ nhận được sự support của nhà phát
hành, có thêm các tính năng quản
lý và security.
- Server hay còn được gọi là docker daemon: chịu trách nhiệm tạo, quản lý các Docker objects như images, containers, networks, volume.
- REST API: docker daemon cung cấp các api cho Client sử dụng để thao tác với Docker.
- Client là thành phần đầu cuối cung cấp một tập hợp các câu lệnh sử dụng api để người dùng thao tác với Docker.
-
Docker hub: là nơi dùng để lưu trữ
các image, giống như Github hay Gitlab chứa source code vậy.
Chúng ta có thể pull hoặc
push
image
lênDocker hub
để lưu trữ cũng như public cho cộng đồng sử dụng. - Docker Machine: Machine tạo Docker Engine trên laptop của bạn hoặc trên bất cứ dịch vụ cloud phổ biến nào như AWS, Azure, Google Cloud, Softlayer hoặc trên hệ thống data center như VMware, OpenStack. Docker Machine sẽ tạo các máy ảo và cài Docker Engine lên chúng và cuối cùng nó sẽ cấu hình Docker Client để giao tiếp với Docker Engine một cách bảo mật.
- Docker Compose: là một công cụ để tạo, xác định và chạy nhiều container có mối liên quan với nhau trong cùng một thời điểm, được khai báo trong một file với định dạng YAML. Khởi động tất cả các dịch vụ chỉ với 1 câu lệnh duy nhất.
- Docker swarm : Có thể hiểu là nó là một thằng trung gian giữa bạn và các docker host, nó sẽ tập trung các docker host về một khối. Khi làm việc chúng ta sẽ làm việc với cái virtual host mà docker swarm tạo ra. Khi số lượng containers tăng lên việc quản lý, triển khai trở nên phức tạp hơn thì không thể không sử dụng Docker Swarm.
- Docker cloud : là hệ thống Paas cho phép bạn dễ dàng triển khai các app của mình lên môi trường cloud.
- Docker toolbox : đây là tool của docker được sử dụng trên MacOS và WIndows.
- Docker Trusted Registry : Docker Trusted Registry giống như Docker hub nhưng là ở một phiên bản private tuy nhiên chúng ta sẽ mất phí. Nếu công ty nào đó cần bảo mật, private image thì sẽ dùng đến registry này.
- Dockerfile là một tập tin dạng text chứa một chuỗi các câu lệnh, chỉ thị để tạo nên một image. Dockerfile bao gồm các câu lệnh liên tiếp thực hiện tự động dựa trên một image có sẵn để tạo ra một image mới.
- Docker Images: Là một template chỉ cho phép đọc, ví dụ một image có thể chứa hệ điều hành Ubuntu và web app. Images được dùng để tạo Docker container. Docker cho phép chúng ta build và cập nhật các image có sẵn một cách cơ bản nhất, hoặc bạn có thể download Docker images của người khác.
- Docker Containers: Docker container có nét giống với các directory. Một Docker container giữ mọi thứ chúng ta cần để chạy một app. Mỗi container được tạo từ Docker image (là một instance của một image). Docker container có thể có các trạng thái run, started, stopped, moved và deleted.
- Docker Volume: được dùng để chia sẻ dữ liệu cho container.
- Docker network: dùng để gắn địa chỉ ip cho các container thông qua một virtual bridge.
Quy trình thực thi của một hệ thống sử dụng Docker
Một hệ thống Docker được thực thi với 3 bước chính :
BULD => PUSH => PULL, RUN
- Build: Đầu tiên tạo một dockerfile, trong dockerfile này chính là code của chúng ta. Dockerfile này sẽ được Build tại một máy tính đã cài đặt Docker Engine. Sau khi build ta sẽ có được Image, Run Image sẽ tạo ra 1 Container, trong Container này chứa ứng dụng kèm bộ thư viện của chúng ta.
- Push: Sau khi có được Container, chúng ta thực hiện push Container này lên cloud và lưu tại đó.
- Pull, Run: Nếu một máy tính khác muốn sử dụng Container của chúng ta thì bắt buộc máy đó phải thực hiện việc Pull container này về máy, tất nhiên máy này cũng phải cài Docker Engine. Sau đó thực hiện Run Container này.
2. Docker Commands
Command | Description |
---|---|
1. Xem thông tin và liệt kê các container, image |
|
|
Liệt kê các images hiện có |
docker pull image_name |
Pull một image từ Docker Hub |
docker version |
Xem phiên bản docker |
docker info |
Xem thông tin chi tiết cơ bản của phiên bản docker |
docker network ls | Liệt kê danh sách Network ở Docker |
docker inspect container_id | Xem chi tiết thông tin của container được tạo ra |
docker network inspect network_name | Xem các thông tin chi tiết của một Network |
docker network inspect bridge | Xem các ip của container |
docker inspect {container_id/container_name} | grep -C2 Binds | Xem các volume trong container |
docker logs container_id | Xem lịch sử container |
docker ps |
Liệt kê các container đang chạy |
docker ps -a |
Liệt kê các container đã tắt |
docker ps -s |
Giống docker ps tuy nhiên nó còn hiển thị thêm 1 field là dung lượng container được tạo ra |
docker port container_name |
Kiểm tra các port ánh xạ của container |
2. Xóa 1 container, images: |
|
docker rm {container_id/name} |
Xóa một container |
docker rm -f {container_id/name} |
Giống lệnh trên nhưng xóa được cả container đang chạy (f là force) |
docker rm $(docker ps -a -q) |
Xóa toàn bộ các container đang tồn tại |
docker kill container_id/container_name |
Tắt 1 container |
docker rmi {image_id/name} |
Xóa một image |
docker rmi -f {image_id/name} |
Xóa một image kể cả khi đang chạy |
docker system prune |
This will remove:
|
3. Bật, chạy container |
|
docker start {new_container_name} |
Khởi động một container |
docker stop web1 |
Dừng hoạt động của container |
docker stop $(docker ps -a -q) |
Dừng tất cả các container đang chạy |
docker run -d --name web1 ubuntu |
Khởi động container ở chế độ chạy nền |
docker run -v <forder_in_computer>:<forder_in_container>
-p <port_in_computer>:<port_in_container> -it
<image_name> /bin/bash
|
Tạo mới container bằng cách chạy image (kèm theo các tùy chọn):
|
|
Truy cập vào container đang chạy |
4. Thao tác quản lý phiên bản |
|
uname -a |
Hiển thị thông tin của Kernel ubuntu |
docker history { image_name || id } |
Xem lịch sử các commit trên image (trong đó image_name = ‘REPOSITORY’ + ‘TAG’) |
docker diff { container_name || id } |
Xem các thay đổi trên container |
docker pull < image_name > |
Pull 1 docker image mới về, chú ý lấy các docker image này trên docker hub |
docker tag { image_id } { image_new_name }: { tag }
|
Thay đổi tag và image_name (trong window nó là cột REPOSITORY) cho image tồn tại trong hệ thống. Đây cũng có thể coi là đổi tên image |
docker rename docker-curent-name docker-new-name |
Đổi tên container |
docker search { name_image } |
Tìm kiếm image trên hub docker |
docker commit [option] { image_id } { image_name }: { tag }
|
Commit thay đổi lên images. Khi thực hiện với lệnh này nó sẽ tạo ra 1 image mới với 1 số thông tin với option là:
|
docker build -t="{ username_docker_hub/image_name:version
}" .
|
Xây dựng lên 1 bản image từ Dockerfile (là 1 file cấu hình docker mình sẽ đề cập nó trong bài kế tiếp). Chú ý, dấu chấm “.” ở cuối đoạn lệnh ko thể quên nhé… vì ở đây nó coi Dockerfile là file ở ngay đường dẫn thực hiện lệnh build |
docker build –pull –t …. |
Giống như docker build –t nhưng nó sẽ đảm bảo image bạn build lựa chọn theo sẽ được cập nhật mới nhất |
5. Thao tác lưu trữ, tích hợp container, image |
|
Image
|
|
docker save { image_name } > { host_path/new_image.taz }
|
Lưu trữ image thành file .taz |
docker import { host_path_file } { image_name }: { tag }
|
Import file image.taz từ local và đặt tên cho nó, sử dụng với windows |
cat { host_path_file } | sudo docker import - { image_name }: { tag
}
|
Import sử dụng với ubuntu |
Container
|
|
docker export {container_id} > {host_path/new_container.taz
}
|
Xuất ra file container |
Để import 1 container ta vẫn dùng câu lệnh import giống
như trên image
|
Tuy nhiên khi import container nó sẽ tự tạo ra 1 image mới chứ không phải 1 container mới. Tiếp theo bạn chạy container mới từ image tạo mới này |