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ứ.
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 |
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
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
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:
FROM
MAINTAINER <tên_tác_giả>: câu lệnh này dùng để khai báo trên tác giả tạo ra Image, chúng ta có thể khai báo nó hoặc không.
RUN <câu_lệnh>: chúng ta sử dụng lệnh này để chạy một command cho việc cài đặt các công cụ cần thiết cho Image của chúng ta.
CMD <câu_lệnh>: trong một Dockerfile thì chúng ta chỉ có duy nhất một câu lệnh CMD, câu lệnh này dùng để xác định quyền thực thi của các câu lệnh khi chúng ta tạo mới Image.
ADD
ENV <tên_biến>: định nghĩa biến môi trường trong Container.
ENTRYPOINT <câu_lệnh>: định nghĩa những command mặc định, cái mà sẽ được chạy khi container running.
VOLUME <tên_thư_mục>: dùng để truy cập hoặc liên kết một thư mục nào đó trong Container.
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
Xem thêm: https://docs.docker.com/engine/reference/commandline/
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 |