Docker入門
介紹Docker:概念、好處、容器、卷、映像檔、Docker Hub、Dockerfile、Docker Compose及操作

Hi, I'm Sharon
What is Docker
避免環境不一致導致程式無法運行,讓運行的環境一致,使應用程式能順利執行。
主要為開發者使用,方便開發環境、測試環境、生產環境一致
Why use docker
資源開銷小、啟動速度快
在同一台物理機上使用虛擬機跟使用docker的資源使用差異
虛擬機
資源開銷大:虛擬機需要的作業系統( Windows、macOS、Linux),運行所需的資源多
無介面的作業系統:許多 Linux 發行版,如 Ubuntu Server,主要使用命令行界面(CLI),沒有圖形介面。
有介面的作業系統:Windows 和 Ubuntu Desktop 等作業系統則包括圖形用戶界面,便於使用者操作。
啟動速度慢:虛擬機啟動需要加載完整的作業系統,啟動時間較長。
Docker
資源開銷小:Docker 容器共享宿主機的操作系統內核,運行所需的資源更少。
啟動速度快:容器只需啟動應用程式和其依賴的環境,啟動時間很短。
Docker Container (Docker 容器)
環境隔離互不影響,在概念上一個容器就像一台虛擬機。
Volume (數據卷)
當容器刪除其數據資料也會刪除,若要保存數據則需使用到Volume卷。 Volume 通常用於保存應用程式的數據,例如數據庫文件,日誌文件等。
Docker image(鏡像檔/映像檔)
運行Docker container的基礎。
Docker Hub
有很多開源的Docker image 像是mysql官方數據庫的image,也可以上傳自己的image和版控。
Docker file (腳本)
創建Docker image用。
概念可理解為安裝流程,只是用程式碼來執行安裝流程。
Dockerfile 包含一系列的指令來設定構建步驟,例如基於哪個 Image、預安裝哪些依賴項、設置環境變量、添加文件等。
Dockerfile,可以自動化 Image的構建過程,確保每次構建的 Image都是一樣的。
```bash
使用輕量級的 Python 鏡像
FROM python:3.9-alpine
設置工作目錄
WORKDIR /data/prj_dept
設置環境變量,ARG只在建構過程中使用
ARG DJANGO_SETTINGS_MODULE=default_value
複製 requirements.txt 並安裝必要的包和庫,然後清理
COPY requirements.txt ./ RUN apk update && \ apk add --no-cache gcc musl-dev libffi-dev mariadb-connector-c-dev gettext && \ python3 -m pip install --upgrade pip && \ pip install -r requirements.txt && \ apk del gcc musl-dev libffi-dev && \ rm -rf /var/cache/apk/* && \ ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \ echo 'Asia/Taipei' >/etc/timezone
創建非root用戶和組
RUN addgroup -S daphne && adduser -S daphneuser -G daphne
COPY . .
保護敏感文件的暫時變量,ARG只在建構過程中使用
ARG SECRET_KEY=default_value ARG ALLOWED_HOSTS=default_value ARG MYSQL_NAME=default_value ARG MYSQL_USER=default_value ARG MYSQL_ROOT_PASSWORD=default_value ARG MYSQL_PASSWORD=default_value ARG MYSQL_HOST=default_value ARG MYSQL_PORT=default_value ARG REDIS_LOCATION=default_value ARG CELERY_BROKER_URL=default_value ARG CELERY_RESULT_BACKEND=default_value ARG NGROK_AUTHTOKEN=default_value
收集靜態文件
RUN python manage.py collectstatic --noinput
設置執行權限
RUN chmod +x /data/prj_dept/start.prod.sh
暴露端口
EXPOSE 8000
使用非root用戶運行容器
USER daphneuser
---
# Docker compose
> 能一次啟動多個 Docker 容器的工具。
* 定義多個 Docker 容器的設定、指定 Image、創建、容器間的溝通、啟動順序等等...…,確保達到網站(應用程式)順利運行。
* 使用 YAML 文件來設定應用程式的服務、網絡和卷。
```bash
version: '3.8'
services:
web:
image: ppp300a/prj_dept-web:1.0.1
container_name: dept-web
build:
context: .
dockerfile: Dockerfile
environment:
- PYTHONPATH=/data/prj_dept
entrypoint: ["/bin/sh", "/data/prj_dept/start.prod.sh"]
depends_on:
- mysql
healthcheck:
test: ["CMD", "python", "-c", "import http.client; conn = http.client.HTTPConnection('localhost', 8000); conn.request('HEAD', '/'); res = conn.getresponse();"]
interval: 60s
timeout: 15s
retries: 5
ports:
- "8000:8000"
mysql:
image: ppp300a/prj_dept-mysql8:1.0.1
volumes:
- mysql-data:/var/lib/mysql
entrypoint: ["/usr/local/bin/mysql8-init.sh"]
command:
- "--max-connections=200"
- "--slow-query-log=1"
- "--long-query-time=2"
- "--log-error=/var/log/mysql/mysql_error.log"
- "--slow-query-log-file=/var/log/mysql/mysql_slow.log"
ports:
- "3306:3306"
volumes:
mysql-data:
Docker compose相關命令
在當前目錄下運行 docker-compose 命令,且該目錄中有一個名為 docker-compose.yml 的檔案,則 docker-compose 會預設使用該檔案,無需指定 -f 或 --file 選項。
停止所有由
docker-compose up啟動的容器docker-compose stop刪除所有透過
docker-compose.yml啟動目前已停止運行的容器,不會刪除任何網路(networks)、卷(volumes)或映像檔(images)docker-compose rm停止並刪除容器及網路(networks)以及定義在.yml中的服務
docker-compose down運行yml檔,將自動運行此檔名docker-compose.yml
docker-compose up指定yml檔案運行
docker-compose -f docker-compose-build.yml up
流程參考
部分參考自YouTube影片 奇乐编程学院 Docker 10分钟快速入门



