Docker là gì? Các kiến thức cần biết về Docker.

Docker là một open platform cung cấp cho người sử dụng những công cụ và service để người sử dụng có thể đóng gói và chạy chương trình của mình trên các môi trường khác nhau một cách nhanh nhất.

Kiến trúc Docker

  • Docker Client: là cách mà bạn tương tác với docker thông qua command trong terminal. Docker Client sẽ sử dụng API gửi lệnh tới Docker Daemon.
  • Docker Daemon: là server Docker cho yêu cầu từ Docker API. Nó quản lý images, containers, networks và volume.
  • Docker Volumes: là cách tốt nhất để lưu trữ dữ liệu liên tục cho việc sử dụng và tạo apps.
  • Docker Registry: là nơi lưu trữ riêng của Docker Images. Images được push vào registry và client sẽ pull images từ registry. Có thể sử dụng registry của riêng bạn hoặc registry của nhà cung cấp như : AWS, Google Cloud, Microsoft Azure.
  • Docker Hub: là Registry lớn nhất của Docker Images ( mặc định). Có thể tìm thấy images và lưu trữ images của riêng bạn trên Docker Hub ( miễn phí).
  • Docker Repository: là tập hợp các Docker Images cùng tên nhưng khác tags. VD: golang:1.11-alpine.
  • Docker Networking: cho phép kết nối các container lại với nhau. Kết nối này có thể trên 1 host hoặc nhiều host.
  • Docker Compose: là công cụ cho phép run app với nhiều Docker containers 1 cách dễ dàng hơn. Docker Compose cho phép bạn config các command trong file docker-compose.yml để sử dụng lại. Có sẵn khi cài Docker.
  • Docker Swarm: để phối hợp triển khai container.
  • Docker Services: là các containers trong production. 1 service chỉ run 1 image nhưng nó mã hoá cách thức để run image — sử dụng port nào, bao nhiêu bản sao container run để service có hiệu năng cần thiết và ngay lập tức.

Docker Networking

Khi bạn cài đặt xong Docker, sẽ có 3 loại networks được tự động tạo ra. Network của docker được quản lý thông qua một virtual bridge gọi là docker0. Mục đích của việc này là để tạo ra một network độc lập, tách biệt với môi trường khác.

Chúng ta có thể liệt kê tất cả bằng câu lệnh:

docker network ls  

Khi chúng ta khởi động docker deamon (thông qua sudo service docker start chẳng hạn) thì những step dưới đây sẽ diễn ra

  • Virtual bridge docker0 sẽ được tạo ra
  • Docker tự dộng tìm ra một khoảng ip range còn trống từ trong route của máy host
  • Chọn ra random một khoảng ip bất kì
  • Assign khoảng ip đó cho docker0

Sau đó khi chúng ta khởi động một container bất kì, thì container đó sẽ được assign những thứ dưới đây:

  • veth (Virtual Eithernet) interface gắn với docker0
  • Một ip bất kì trong range mà docker0 vừa thu được ở trên

Hãy bắt tay vào thử nghiệm nào, đầu tiên khi chưa có container nào khởi động

$ brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.000000000000       no
NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host
Docker Bridge Mode Networking

Kết nối từ network ở ngoài vào container

Để kết nối từ network ở ngoài vào container thì chúng ta phải mapping port của máy host với port mà container expose thông qua docker0.
Ví dụ chúng ta muốn map port 8080 của máy host vào port 80 của docker , sử dụng apache container:

$ ID=$(docker run -d -p 8080:80 tcnksm/apache)
caad0cfc2a0

Chúng ta có thể kiểm tra mapping như sau

$ docker ps
CONTAINER ID        IMAGE                  COMMAND                CREATED              STATUS              PORTS                  NAMES
caad0cfc2a03        tcnksm/apache:latest   /usr/sbin/apache2 -D   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   elegant_thompson
$ docker port $ID 80
0.0.0.0:8080

Sau đó thử curl từ máy host:

$ curl http://localhost:8080
Hello, docker
$ ID=$(docker run -d -p 80 tcnksm/apache)
$ docker port $ID 80
0.0.0.0:49156
$ curl docker port $ID 80
Hello, docker

Cài đặt Docker

Các lệnh cơ bản

docker --version
docker info
sudo docker run hello-world

Dockerfile là gì?

Dockerfile là file config cho Docker để build ra image. Đồn thời là một nền tảng mở dành cho các lập trình viên, quản trị hệ thống dùng để xây dựng, chạy các ứng dụng phân tán. Dockerfile chứa tập hợp các lệnh để docker có thể đọc hiểu và thực hiện để đóng gói thành một image theo yêu cầu người dùng.

Nó dùng một image cơ bản để xây dựng lớp image ban đầu. Một số image cơ bản: python, unbutu and alpine. Sau đó nếu có các lớp bổ sung thì nó được xếp chồng lên lớp cơ bản. Cuối cùng một lớp mỏng có thể được xếp chồng lên nhau trên các lớp khác trước đó.

– Các config :

  • FROM — chỉ định image gốc: python, unbutu, alpine…
  • LABEL — cung cấp metadata cho image. Có thể sử dụng để add thông tin maintainer. Để xem các label của images, dùng lệnh docker inspect.
  • ENV — thiết lập một biến môi trường.
  • RUN — Có thể tạo một lệnh khi build image. Được sử dụng để cài đặt các package vào container.
  • COPY — Sao chép các file và thư mục vào container.
  • ADD — Sao chép các file và thư mục vào container.
  • CMD — Cung cấp một lệnh và đối số cho container thực thi. Các tham số có thể được ghi đè và chỉ có một CMD.
  • WORKDIR — Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…
  • ARG — Định nghĩa giá trị biến được dùng trong lúc build image.
  • ENTRYPOINT — cung cấp lệnh và đối số cho một container thực thi (excute/run)
  • EXPOSE — khai báo port lắng nghe của image.
  • VOLUME — tạo một điểm gắn thư mục để truy cập và lưu trữ data.

Docker file mẫu:

# FROM: base on this image
FROM ubuntu:14.04

#MAINTAINER: Dockerfile author
MAINTAINER HUYLQ15
#-- ENV: to set an environment variable
ENV USER root
ENV HOME /root

#-- RUN: run a command
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo "root:123456" | chpasswd

#-- EXPOSE: exposes port for container
EXPOSE 22
#-- ENTRYPOINT: make container executable with command
ENTRYPOINT /usr/sbin/sshd -D
  • Tạo Docker File tại thư mục gốc (.). Sau đó dùng lệnh docker build để tạo image
sudo docker build –t myimage:0.1 .
docker build -t huylq15/ssh .

với user root và pass 123456 đã khai báo trong Dockerfile:

<code># ssh root@0.0.0.0 -p 49153</code>
  • Dùng lệnh docker image để hiển thị image vừa tạo
sudo docker images 

Docker compose là gì?

Docker compose là công cụ dùng để định nghĩa và run multi-container cho Docker application. Với compose bạn sử dụng file YAML để config các services cho application của bạn. Sau đó dùng command để create và run từ những config đó.

Sử dụng cũng khá đơn giản chỉ với ba bước:

  • Khai báo app’s environment trong Dockerfile.
  • Khai báo các services cần thiết để chạy application trong file docker-compose.yml.
  • Run docker-compose up để start và run app.

Cài đặt docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

# Hiển thị các process đạng chạy

docker-compose ps
Name                              Command                     State   Ports
__________________________________________________________________________________________
ownclouddockerserver_db_1         … /bin/s6-svscan /etc/s6    Up      3306/tcp
ownclouddockerserver_owncloud_1   … /usr/bin/owncloud server  Up      0.0.0.0:8080->8080/tcp
ownclouddockerserver_redis_1      … /bin/s6-svscan /etc/s6    Up      6379/tcp

# Hiển thị danh sánh các Volume của các app trong container

docker volume ls | grep ownclouddockerserver
[huylq15@localhost owncloud-docker-server]$ sudo docker volume ls
DRIVER              VOLUME NAME
local               owncloud-docker-server_backup
local               owncloud-docker-server_files
local               owncloud-docker-server_mysql
local               owncloud-docker-server_redis

# Build và start docker

 docker-compose up -d 

# Hủy docker

dockerr-compose down

Tham khảo

https://kipalog.com/posts/Co-ban-ve-docker-network

https://medium.com/@jamesemyn/basic-docker-networking-9130ab889359

https://medium.com/@phamducquan

Leave a Reply

Your email address will not be published. Required fields are marked *