This page looks best with JavaScript enabled

Tìm hiểu về docker

 ·  ☕ 10 min read  ·  🐉 Edisc
Toàn bộ series này được tham khảo từ hai nguồn chính: XuanThuLabChanelDockerDoc. Em xin chân thành cảm ơn sự cống hiến của các tác giả của những kênh nói trên.❤️❤️❤️

Tổng quan về Docker


Docker là gì?

  • Docker là một container platform để phát triển, triển khai và quản lí ứng dụng nhanh chóng.
  • Docker là nền tảng mở (open platform) để phát triển (developing), vận chuyển (shipping) hoặc chạy (running) các ứng dụng.
  • Docker cho phép ứng dụng của chúng ta độc lập với cơ sở hạ tầng (infrastructure) của máy, do đó, chúng ta có thể dễ dàng chia sẻ ứng dụng một cách dễ dàng giữa các thiết bị. Chúng ta có thể quản lí cở sở hạ tầng (infrastructure) giống như cách quản lí những ứng dụng trên máy.
  • Sử dụng LibContainer để quản lý những function của Linux kernel và sử dụng những nhóm công nghệ độc lập như: Namespaces, Control Groups, AppArmor, security profiles, network interface, rule for the firewall necessary for the operation of containers.

The Docker platform

  • Docker cung cấp một khả năng đóng gói và chạy ứng dụng trên một môi trường cô lập, khả năng này gọi là container.
  • Container nhẹ và chứa tất cả những thức cần thiết để chạy ứng dụng, do đó, chúng ta chỉ cần tải về và chạy trên máy cá nhân (host). Ngoài ra, môi trường được chạy là môi trường độc lập và bảo mật (security) cho phép chúng ta chạy nhiều container đồng thời và dễ dàng chia sẻ container trong khi chúng ta làm việc, và đảm bảo tất cả mọi người đều được chúng ta chia sẻ một container sẽ có chung 1 môi trường thực thi ứng dụng, và cho kết quả thực thi giống nhau.
  • Docker cung cấp công cụ và nền tảng để quản lí vòng đời (lifecycle) containers của chúng ta:
    • Phát triển ứng dụng của chúng ta và hỗ trợ những thành phần để ứng dụng có thể sử dụng container.
    • Container trở thành một đơn vị (unit) để phân phối và kiểm tra ứng dụng của chúng ta.

Dùng docker để làm gì?

Nhanh, phân phối nhất quán ứng dụng của chúng ta

Docker sắp xếp hợp lí vòng đời phát triển bằng cách cho phép các developers làm việc trong môi trường chuẩn, sử dụng local container - nơi cung cấp những ứng dụng và dịch vụ (services). Conatiner là một giải pháp cho quy trình làm việc CI/CD (continuous integration and continuous delivery).

Khả năng triển khai và mở rộng

  • Nền tảng dựa của container docker đáp ứng cho khối công việc có khả năng linh động cao. Docker container có thể chạy trên laptop của lập trình viên, có thể chạy trên máy thật hoặc máy ảo trong các data center, trên clouder provider, hoặc trong hỗn hợp các môi trường (mixture of environments)
  • Tính linh động và nhẹ của docker làm cho nó dễ dàng trong việc quản lý động các công việc, mở rộng hoặc chia nhỏ các ứng dụng, dịch vụ theo nhu cầu kinh doanh, trong thời gian thực.

Chạy được nhiêu công việc hơn trong cùng một phần cứng (hardware).

Vì docker nhẹ và nhanh, nó có khả năng thay thế những máy ảo được xây dựng dựa trên hypervisor, chúng ta có thể sử dụng nhiều khả năng tính toán hơn để thực hiện mục tiêu của mình. Docker hoạt động hiệu quả cho cả môi trường triển khai có mật độ cao, vừa hoặc nhỏ, nơi mà chúng ta cần làm việc với ít tài nguyên hơn.

Kiến trúc của Docker.

  • Docker sử dụng kiến trúc client-server.
  • Docker client sẽ nói chuyện với docker daemon - trình thực hiện xây dựng, chạy, phân phối docker container của chúng ta.
    • Docker client và daemon có thể chạy trên cùng 1 hệ thống, hoặc có thể kết nối docker client tới một trình điều khiển docker daemon (remote docker daemon)
    • Chúng giao tiếp với nhau thông qua sử dụng REST API, qua UNIX sockets hoặc network interface.

The Docker Daemon( dockerd)

Lắng nghe những yêu cầu từ Docker API và quản lí đối tượng của docker như: images, container, networks, volumes. Một daemon can thể giao tiếp với những daemons khác để quản lí docker services.

The Docker client (docker)

Là cách mà người dùng tương tác với docker. khi chúng ta thực hiện những câu lệnh như docker run, client sẽ gửi câu lệnh này với dockered để đem chúng ra ngoài. Lệnh docker sử dụng Docker API. Docker client có thể giao tiếp với một hoặc nhiều daemon.

Docker registries

Môt docker registry lưu trữ Docker images. Docker Hub là một public registry mà mọi người đều có thể sử dụng, và docker được cấu hình mặc định để tìm kiếm những images trên Docker Hub. chúng ta còn có thể chạy những registry của riêng chúng ta.
Khi chúng ta thực hiện lệnh docker pull hoặc docker run, những images yêu cầu sẽ được kéo từ registry của chúng ta về máy, và khi thực hiện lệnh docker push, images của chúng ta sẽ được đẩy lên trên registry.

Docker Object

Images

Một image là một mẫu chỉ đọc với tập lệnh để tạo ra một docker container. Thông thường, một image dựa trên những image khác với một số tùy chỉnh bổ sung. Ví dụ, chúng ta muốn xây dựng một image dựa trên ubuntu image, nhưng có cài thêm Apache web server, ứng dụng riêng của chúng ta cũng như những cấu hình cần thiết để có ứng dụng chạy.
chúng ta có thể tạo images riêng hoặc sử dụng những images đã có sẵn trên các registry.
Để xây dựng riêng images, chúng ta tạo Dockfile với những cú pháp đơn giản định nghĩa các bước cần thiết để tạo image và chạy nó. Mỗi câu lệnh trong Dockerfile tạo một layer trong image. Khi bạn thay đổi Dockerfile và rebuild image, chỉ những layer bị thay đổi mới buil lại. Đây chính là lí do làm cho image trở nên nhẹ, nhỏ, nhanh khi đem so sánh với những công nghệ ảo hóa khác.

Containers

  • Docker đóng gói phần mềm thành một đơn vị chuẩn, gọi là container, nơi lưu tất cả những thứ cần thiết để chạy phần mềm, bao gồm: libraries, systemtools, and code
  • Một container có thể chạy một images. Chúng ta có thể create, start, stop, move, delete một container bằng sử dụng Docker API hoặc CLI. Chúng ta có thể kết nối từ một container tới một hoặc nhiều networks, đính kèm bộ nhớ vào trong nó, hoặc thâm chí có thể tạo ra một image mới dựa trên trạng thái hiện tại của nó.
  • Theo mặc định, một container độc lập với những container khác và với host machine. Chúng ta có thể kiểm soát mức độ độc lập của network, bộ nhớ hoặc những hệ thống con cơ bản từ môt container tới những container khác hoặc từ host machine tới những container.
  • Một container được định nghĩa bởi images của nó, cũng như bất kỳ tùy chọn cấu hình nào bạn cung cấp cho nó khi tạo hoặc khởi động nó. Khi một container bị xóa, những thay đổi về trạng thái của nó không được lưu mà sẽ bị xóa.

Ví dụ về docker run command

Những câu lệnh sau run một ubuntu container:

1
$ docker run -i -t ubuntu /bin/bash

Khi chúng ta chạy lệnh này, quá trình thực hiện sẽ nhưu sau (xét trường hợp cấu hình là default):
1. Nếu chúng ta không có ubuntu image ở local, Docker pulls nó từ configured registry của chúng ta, chúng ta có thể kéo nó xuống bằng câu lệnh: docker pull ubuntu
2. Docker tạo ra một container mới, chúng ta có thể tự thực hiện bằng lệnh: docker container create.
3. Docker phân bổ read-write filesystem vào container, như là lớp cuối cùng của nó (final layer). Nó cho phép chạy để tạo hoặc chỉnh sửa file hoặc thư mục ở local filesystem.
4. Docker tạo ra network interface để để nối contain tới default network, vì chúng ta không chỉ định bất kì tùy chọn mạng nào - gán IP adress vào container. Theo định nghĩa, container có thể kết nối với mạng bên ngoài thông qua sử dụng kết nối mạng của máy host.
5. Docker chạy container rồi thực thì /bin/bash. Vì container đang chạy ở chế độ tương tác và gán vào terminal (-i, -t flags), chúng ta có thể input từ keyboard và output được ghi vào terminal của bạn.
6. Khi chúng ta gõ exit để dừng /bin/bash, container sẽ dừng nhưng không bị xóa, do đó, ta có thể chạy lại hoặc xóa nó.

The underlying technology

Docker được viết bằng ngôn ngữ GO và tận dụng một số tính năng từ Linux kernel để trở thành chức năng của nó.
Docker sử dụng một công nghệ được gọi là namespaces để cung cấp không gian độc lập được gọi là container. Khi bạn chạy một container, Docker tạo ra một tập namespaces cho container đó.
Những namespaces cung cấp một lớp độc lập, mỗi khía cạnh của một vùng chứa chạy trong một không gian tên riêng biệt và quyền truy cập của nó bị giới hạn trong không gian tên đó.

Cài docker


Post-installation steps for Linux


Quản lý docker với tư cách là non-root user

  • Docker daemon kết nối với Unix socket thay vì cổng TCP. Mặc định, Unix socket được sở hữu bởi root
    và những user khác chỉ có thể truy cập thông qua lệnh sudo. Do đó, Docker daemon luôn luôn chạy
    với tư cách là root user.
  • Chúng ta có thể thiết lập lại để chạy mà không cần lệnh sudo bằng cách tạo ra một Unix group là docker
    và thêm user vào nó. Khi docker daemon chạy, nó tạo một Unix socket mà tất cả các thành phần của docker group
    có thể truy cập vào.
  1. Tạo docker group:
1
    $ sudo groupadd docker
  1. Thêm user vào docker group
1
    $ sudo usermod -aG docker $USER
  1. Kích hoạt sự thay đổi
1
    $ newgrp docker

Configure Docker to start on boot

  • Trên Debian và Ubuntu, Docker service mặc định được cấu hình để khởi động khí boot.
    Với những distros khác, ta có thể sử dụng lệnh sau đây để tự động chạy:
1
2
    $ sudo systemctl enable docker.service
    $ sudo systemctl enable containerd.service
  • Và để tắt chế độ trên:
1
2
    $ sudo systemctl disable docker.service
    $ sudo systemctl disable containerd.service

Cấu hình nơi Docker daemon lắng nghe để kết nối

  • Mặc định, Docker daemon sẽ nghe kết nối ở UNIX socket để chấp nhận các yêu cầu từ local client.
    Ngoài ra, chúng ta có thể cho phép Docker chấp nhận những yêu cầu từ remote host bằng việc cấu hình để nó lắng nghe
    trên một địa chỉ IP và một cổng, giống như UNIX socket.

Configuring remote access with systemd unit file

  1. sudo systemctl edit docker.service để ghi đè file docker.service.
  2. Thêm / sửa những lệnh sau:
1
2
3
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
  1. Lưu file
  2. Reload lại cấu hình systemctl
1
$ sudo systemctl daemon-reload
  1. Chạy lại Docker
1
$ sudo systemctl restart docker.service
  1. Kiểm tra đảm bảo sự thay đổi
1
$ sudo netstat -lntp | grep dockerd

Configuring remote access with daemon.json

  1. Thêm dòng lệnh vào /etc/docker/daemon.json để kết nối với UNIX socket và địa chỉ IP:
1
2
3
{
  "hosts": ["unix:///var/run/docker.sock", "tcp://127.0.0.1:2375"]
}
  1. Khởi động lại Docker
  2. Kiểm tra đảm bảo sự thay đổi
1
$ sudo netstat -lntp | grep dockerd

Thêm nhiều cấu hình khác

Share on

Edisc
WRITTEN BY
Edisc
Cyber Security Engineer

 
What's on this Page