Pquoctruong / se2022-15.1

0 stars 2 forks source link

Tìm hiểu Docker, Docker Compose

1. Docker

1.1 Docker là gì?

Docker là một nền tảng mở (open platform), dùng để phát triển và vận hành ứng dụng.

Nó giúp chúng ta đóng gói các môi trường thành một container. Các container cùng nhau chia sẻ kernel hệ điều hành, với những phân vùng mà hệ điều hành chia sẻ các container chỉ được đọc, và mỗi container sở hữu một phân vục riêng có thể ghi trong đó.

Do đó docker có thể tạo ra một môi trường giống như server và chạy thử trên đó, chia sẻ môi trường làm việc cho các thành viên khác mà không cân phải cài quá nhiều thứ.

1.2 Lợi ích khi dùng Docker

So sánh docker và virtual machine (máy ảo)

Docker VM
Kích thước (dung lượng) nhỏ Kích thước (dung lượng) lớn
Container sẽ sử dụng hệ điều hành của host Mỗi máy ảo sẽ có một hệ điều hành riêng.
Ảo hóa về mặt hệ điều hành Ảo hóa về mặt phần cứng
Thời gian khởi động tính theo mili giây Thời gian khởi động tính theo phút
Yêu cầu ít dung lượng bộ nhớ hơn Phân bổ bộ nhớ theo nhu cầu cần thiết
Cô lập ở mức tiến trình, có thể kém an toàn hơn Hoàn toàn bị cô lập và an toàn hơn

img

1.3 Cài đặt

Trên trang chủ của Docker cũng đã có hướng dẫn cách cài đặt Docker: https://docs.docker.com/get-docker/

Sau khi cài đặt xong để kiểm tra xem cài đặt thành công hay không, sử dụng command line chạy các lệnh sau:

$ docker version
$ docker info
$ docker run hello-world

1.4 Một số khái niệm trong Docker

img

Sau đây là hình ảnh minh họa cho các mối liên hệ giữa các thành phần trên img

1.5 Viết Dockerfile

Dockerfile là file config cho Docker để build ra image. 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ấu trúc của Dockerfile

# Comment
INSTRUCTION arguments

Một số lệnh trong file Dockerfile:

1.6 Demo docker trong ứng dụng Springboot

Dockerfile

FROM openjdk:latest
WORKDIR /app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY src ./src
CMD ["./mvnw", "spring-boot:run"]

Build image với Dockerfile

docker build --tag springboot-docker .

Tạo tag mới cho image vừa tạo ở trên

docker tag springboot-docker:latest springboot-docker:v1.0.0

Push image lên Docker Hub

docker push <username>/springboot-docker:v1.0.0

Xóa image

rm image-id/image-name

Pull và start/run container

docker run -dp 8085:8083 \
-- name springboot-docker-container \
-v "${pwd}:/app" \
<username>/springboot-docker:v1.0.0

1.7 Các lệnh cơ bản trong Docker

Xem thêm: https://docs.docker.com/engine/reference/commandline/

2. Docker Compose

Docker compose là công cụ dùng để định nghĩa và run multi-container cho Docker application. Với compose ta sử dụng file YAML để config các services cho application. 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:

Ví dụ

version: '3.8'
#containers -> services
services:
  mysql-springboot-container:
    image: mysql:8
    container_name: mysql-springboot-container
    ports:
      - 3310:3306
    volumes:
      - mysql-springboot-data:/var/lib/mysql
      - mysql-springboot-config-deamond:/etc/mysql/
    networks:
      - backend
    environment:
      MYSQL_USER: admin
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: StudentManagement
  springboot-docker-container:
    image: <username>/springboot-docker:v1.0.0
    container_name: springboot-container
    ports:
      - 8085:8083
    volumes:
      - ./:/app

#create network
networks:
  backend:
    name: springboot-app-network
volumes:
   mysql-springboot-data:
   mysql-springboot-config-deamond:

File docker-compose.yml được tổ chức gồm 4 phần:

Directive Ý nghĩa
version Chỉ ra version của file Compose
services Với Docker, một service là tên của một container
networks Phần này được sử dụng để cấu hình network cho ứng dụng. Có thể cài đặt network mặc định hoặc định nghĩa network chỉ định cho ứng dụng
volumes Gắn đường dẫn trên host machine được sử dụng trên container

Với phần config services, có một vài directive thường được sử dụng:

Directive Ý nghĩa
image Chỉ ra image được sử dụng để build container. Sử dụng directive với các image chỉ định trên host machine hoặc trên Docker Hub.
build Directive này có thể được sử dụng thay directive image. Chỉ ra vị trí của Dockerfile để build container
db Ở file Dockercomposer trên ví dụ, db là một biến cho container mà ta sắp định nghĩa.
restart Yêu cầu container restart khi hệ thống restart
volumes Gắn đường dẫn trên host machine được sử dụng trên container
environment Định nghĩa các biến môi trường truyền vào Docker khi chạy command
depends_on Chọn các service được dùng là dependency cho container được xác định trong service hiện tại.
port Kết nối port từ container đến host theo cách thức host:container
links Liên kết service này với bất kỳ service nào khác trong Docker Compose file bằng các chỉ rõ tên