Docker and CTF
Docker
Docker là gì?
Docker là gì? Docker là nền tảng sử dụng để phát triển, đóng gói và chạy ứng dụng. Về cơ bản, Docker sử dụng công nghệ Container hóa để cô lập các ứng dụng và tách nó ra khỏi hạ tầng sử dụng, bằng cách này thì việc triển khai và phát triển sẽ đồng bộ hơn. Cái này tương tự việc ảo hóa nhưng cái này thì nhẹ và dễ cài đặt, thay đổi hơn nhiều.
Ví dụ: mình cần chạy ứng dụng khác với môi trường hiện tại trên máy như là đang chạy Mysql 8.0 mà cần Mysql 5.7 hoặc Mariadb thì thay vì gỡ hiện tại ra cài lại, hoặc tạo một máy ảo chỉ để host server này thì chỉ cần khởi chạy một Container chứa Mysql 5.7 là xong, môi trường sẽ độc lập với môi trường mình đang có.
Điểm qua tính năng của Docker
Docker tương đối nhiều tính năng nhưng mình điểm qua một số tính năng và câu lệnh mình hay dùng cho việc audit.
Run
Đơn giản là chạy một container từ một image. Cuối cùng mục đích sau này là chạy được lệnh này
# Run a container from image docker/getting-started
docker run docker/getting-started
# Run with detached mode
docker run -d docker/getting-started
# Run with pseudo-TTY
docker run -it docker/getting-started
# Remove container after run
docker run --rm docker/getting-started
# Ps container
docker ps
# Stop container
docker stop <cotainer-id>
# Remove container
docker rm <container-id>
# Exec command
docker exec <container-id> <command>
# Copy file to environment
docker cp <container-id>:<source> <target>
# Copy file from environment
docker cp <source> <container-id>:<target>
Build
Thay vì dùng image có sẵn, có thể tạo ra các Image của riêng mình và build, sử dụng cho việc vọc sau này. Đầu tiền cần tạo ra một file để Docker có thể tạo ra image từ đó. Ví dụ mình cần chạy một app Node.js đã được code xong như sau thì mình tạo một Dockerfile:
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
Để build Dockerfile trên thành image chỉ cần chạy.
docker build -t getting-started
Cái này có lợi việc audit sau này là chỉ cần thêm Debugger vào các image có sẵn là có thể sử dụng luôn mà không phải Setup nhiều.
Volume
Về cơ bản các container tạo ra ở trên được cô lập với môi trường bên ngoài. Nếu Container độc lập dữ liệu với môi trường bên ngoài nên khi bị xóa thì dữ liệu sẽ mất hết. Docker có cung cấp một chức năng là tạo ra volume để lưu trữ dữ liệu từ container này. Có hai loại volume ở đây bao gồm:
- Named Volumes: là các volume mà docker quản lý nơi lưu trữ, mình chỉ quan tâm tới việc sử dụng tên. Phù hợp lưu trữ liệu từ Database cho các container và sử dụng lại khi tạo lại container.
- Bind Mounts: gắn dữ liệu trong phân vùng với dữ liệu hiện có trên môi trường. Phù hợp với việc Dev và chạy luôn kết quả.
# Create Volume with name mysql-data
docker run -dp 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
# Run with nodemon, restart app when change in source code at ./app
# without rebuild image
docker run -dp 3000:3000 \
-w /app -v "$(pwd):/app" \
node:12-alpine \
sh -c "yarn install && yarn run dev"
Network
Như đã nói ở trên thì container tương đối cô lập với môi trường bên ngoài, nên để có thể sử dụng được các kết nối ra môi trường bên ngoài và các container khác thông qua network thì tùy các case có thể liên quan đến việc:
- Thiết lập network giữa các container: thì các container có cần chung một network khi đó, các container có thể liên lạc với nhau qua alias name như một host.
- Public port ra ngoài môi trường bằng cách binding port.
# Create network for todo-app
docker network create todo-app
# Run database with host mysql
docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
# Run app with same network, database can connect via host mysql
# Port 3000 in container will be map to localhost:80
docker run -d -p 80:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:12-alpine \
sh -c "yarn install && yarn run dev"
Docker-compose
Tạo ra tạo lại liên tục các Image và Container bằng tay có vẻ hơi lâu nên có Docker-compose được sinh ra để giải quyết cái này một cách đồng bộ.
Chúng ta có thể gom tất cả việc bên trên vào một file Docker-compose.yml như sau
version: "3.7"
services:
app:
image: node:12-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:5.7
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:
Và sử dụng Docker-compose để khởi tạo, quản lý thông qua service name thay vì từ container.
docker-compose up -d
docker-compose down
docker-compose start
docker-compose stop
docker-compose exec <name-service> <command>
Tổng kết
Còn khá nhiều chức năng, đặc tả mình chưa nhắc đến khi sử dụng. Tùy từng trường hợp mọi người có thể đọc thêm ở các tài liệu khác.
Reference
https://docs.docker.com/get-started/overview/
Docker and PHP
Comming soon...
Docker and Java
Comming soon...
Docker and Nodejs
Comming soon...
Docker and Python
Comming soon...


