Docker - Docker commands

Docker - Docker commands

Docker and Docker commands

1. Docker

enlightenedDocker 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.

enlightenedSự khác biệt giữa Docker và Hypervisors? 

Docker and Hypervisor

  • 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.

enlightenedSo 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

enlightened Docker architecture

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

enlightenedDocker 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.

enlightened 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.

enlightenedCá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 Engine

  • 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ên Docker 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.

enlightened 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

docker images

docker image list

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: 

  • all stopped containers
  • all networks not used by at least one container
  • all dangling images
  • all build cache

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):

  • -v {/host_path}:{/container_path} … tạo 1 volume liên kết thưc mục (hay đại loại là share file) giữa thư mục máy thật host_path với thư mục ảo hóa container_path. Có thể chỉ định tạo nhiều volume với –v.
  • -p {host_port}:{container_port}… map 1 cổng từ máy ảo (container_port) sang 1 cổng máy thật (host_port). Bạn có thể tạo nhiều map port với nhiều tham số -p giống như –v vậy. Chẳng hạn –p 8080:80 –p 8085:85 –p 8082:3000
  • -P (-publish-all): export ra toàn bộ các cổng được defind trong Dockerfile hoặc defind trong môi trường image. Kiểu export này sẽ ko có chỉ định trước port như của -p
  • –it chỉ định image sử dụng (nếu image ko có ẵn nó sẽ tự động pull về, câu lệnh này ó -i -t). image ko chỉ định được nhiều chỉ chỉ định được duy nhất 1 image khi tạo container.
    • -i (-interactive): giữ cho stdin mở kể cả khi không attach.
    • -t (-tty ): Allocate a pseudo-TTY. Ý nghĩa của nó là cho phép phân bổ 1 giả lệnh tty (tty là 1 khái niệm dòng lệnh tương tự như shell command trong linux và các hệ điều hành unix khác, nó giúp ta nhập các dòng lệnh tương tác hoặc chạy 1 kịch bản ‘script’. Đích đến của nó là một chương trình hoặc máy in).
    • -it hay –ti trong docker giúp ta mở cửa số dòng lệnh stdin và tạo 1 tty giả lập để cho người dùng (chính là ta) sử dụng và tương tác với môi trường docker.
  • -w (-workdir=””): chọn đường dẫn bắt đầu làm việc, nghĩa là khi bạn thực thi lệnh để chui vào container bằng lệnh exec ở trên hoặc attach thì nó sẽ mặc định chui vào đường dẫn mà bạn define với cờ -w
  • -m (-memory=””): giới hạn dung lượng bộ nhớ chạy một container
  • -d (-detach): chạy ứng dụng dưới chế độ nền. Nghĩa là khi bạn start một container với cờ này thì ứng dụng sẽ không chạy thằng vào dòng lệnh bên trong container mà nó sẽ chạy ngầm và trả lại cho bạn một container Id. Để làm việc với container mà bạn chạy dưới cờ -d thì bạn sử dụng docker attach hoặc docker exec … như ở trên đã đề cập.
  • -: Thiết lập các biến môi trường cho container
  • -net = “name”: Kết nối container tới mạng network chỉ định của docker (Để xem các mạng chỉ định mà docker có sẵn bạn gõ docker network ls). Mặc định khi bạn không chạy với cờ này thì docker sẽ tự động assign một mạng network cho cotainer mà bạn tạo. (Để xem cotainer mà bạn tạo thuộc mạng nào, bạn sử dụng lệnh docker inspect container_id ở trên và xem chi tiết trong này sẽ thây network mà docker đã assign tự động cho cotainer bạn tạo).
  • exit: thoát khoải môi trường ảo container đang chạy.
  • Ctrl + P sau đó Ctrl + Q : deatch khỏi cửa sổ thực thi trong cotainer, nó khác exit là nó không thoát hoàn toàn ứng dụng mà các ứng dụng bạn đang chạy vẫn chạy bình thường.
  • docker attach { container_id }: chui lại vào container bạn vừa detach, (chú ý: phải gõ enter 2 lần)

docker exec -it {container_name} /bin/bash

docker attach {container_name}

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à:

  • --author, -a: author
  • --change, -c : áp dụng hướng dẫn docker file tới image đã tạo
  • --message, -m: chú thích
  • --pause, -p (default = true): Tạm dừng container sau khi commit
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

Reference:

Đăng nhận xét

Mới hơn Cũ hơn