Skip to main content

Command Palette

Search for a command to run...

Docker入門

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

Updated
2 min readView as Markdown
Docker入門
S

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
    

流程參考

https://app.heptabase.com/bb1393db-1266-4a01-9ddb-f0e83041c337/card/605e6ffa-9da3-41fd-98ce-e49c810dbc1a


部分參考自YouTube影片 奇乐编程学院 Docker 10分钟快速入门