Skip to main content

Command Palette

Search for a command to run...

Docker and CTF

Published
5 min read

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...

220 views

Wiki

Part 1 of 1

Một vài bài viết của mình trong việc học tập và làm việc với WebSec