Slide 1

Slide 1 text

一鍵開服,創建你的虛擬世界 2025/03/18 by YuKai

Slide 2

Slide 2 text

01 為什麼你該學 Docker 02 如何使用 Docker 03 一個 Docker 不夠用,那就多用幾個 (docker compose) Outline 04 給我更多更多的 container

Slide 3

Slide 3 text

架服務會遇到的難題 我這跑得好好的 肯定是你的電腦有問題

Slide 4

Slide 4 text

為什麼你該學 Docker? 01

Slide 5

Slide 5 text

● 容器化技術(container) ● 不需要 HyperVisor,直接使用 host machine 效能 ● 以 Golang 語言開發 What is Docker

Slide 6

Slide 6 text

● 輕量級的虛擬化技術 ● 將應用程式、環境一起打包 ● 隔離彼此的應用程式,不受其他應用程式影響 容器化技術

Slide 7

Slide 7 text

● 輕鬆在任何環境部屬應用程式 ○ Game server(Ex: Minecraft server) ○ Web Application(Ex: Frontend、Backend) ○ Tools ○ AI Agent(MCP) Docker 能幹嘛

Slide 8

Slide 8 text

● Registry ● Image ● Container Docker Architecture

Slide 9

Slide 9 text

Registry、Repository、Image Registry Repository1 Image-name:tag1 Image-name:tag2 Image-name:tag3 Repository2 Image-name:tag1 Image-name:tag2 Image-name:tag3

Slide 10

Slide 10 text

● Registry 又分 Public 和 Private ○ Docker Hub ○ GitLab container registry ○ Google Container Registry(gcr.io) Registry、Repository、Image

Slide 11

Slide 11 text

● Image 是一個 readonly 的模板,包含了必要的 os、application、package ● Container 按照 image 建立而成,container 彼 此是獨立的,只要刪掉 container 就可以移除上面 的所有資料 Image、Container

Slide 12

Slide 12 text

Virtual Machine vs. Container VM Container 啟動時間 基本上都要幾分鐘 快速 容量 大(GB) 小(MB) 效能 較慢 較快 Host machine 可支撐的數量 數十個 數百個 複製環境 較慢 較快

Slide 13

Slide 13 text

● Play with docker ● Docker Install 教學 Docker Install、Online Docker

Slide 14

Slide 14 text

如何使用 Docker 02 How to TCPdump effectively in Docker

Slide 15

Slide 15 text

● 拉取 Image ● 建立 container ● 啟用/停止 container ● 列出 container / image ● 刪除 container / image Docker 常見指令

Slide 16

Slide 16 text

● 拉取 image,預設 latest ● 拉取特定 tag 的 image 常見指令 – 拉取 Image docker pull [image name] docker pull [image name]:[tag]

Slide 17

Slide 17 text

常見指令 – 建立 container docker run –d --name [container name] [image name] [other command] -d:背景執行 -it:提供交互模式 --name:定義容器名稱 -e:加入環境變數 -p:綁定 host 和 container 的 port --rm:當 container 不使用時就刪除

Slide 18

Slide 18 text

● 啟用 container ● 停止 container 常見指令 – 啟用/停止 container docker start [container name] docker stop [container name]

Slide 19

Slide 19 text

● 列出已啟用的 container ● 列出所有 container ● 列出所有 image 常見指令 – 列出 container/image docker ps docker ps -a docker images

Slide 20

Slide 20 text

● 刪除沒有啟用的 container ● 刪除未使用的 image 常見指令 – 刪除 container/image docker rm [container name] docker rmi [image name]

Slide 21

Slide 21 text

● 進入 container 查看 ● 查看 image/container 詳細資訊 一些實用的指令 docker exec –it [container name] bash docker inspect [image name]/[container name] docker run –it --name [container name] [image name] bash

Slide 22

Slide 22 text

● 列出 container log ● 列出 image history 一些實用的指令 docker logs [container name] docker logs [container name] -f docker history [image name]

Slide 23

Slide 23 text

● 拉取 Ubuntu Image 並輸出 Hello World ● 拉取一個你有興趣的 Image 並將其建立出一個 container Lab 1 docker pull ubuntu:latest docker run --name ub-1 ubuntu echo hello wolrd

Slide 24

Slide 24 text

簡單架一個 web server,首先新增 main.py 建立自己的 Image from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, Flask!" if __name__ == '__main__': app.run(host='0.0.0.0', debug=True)

Slide 25

Slide 25 text

建立一個 Dockerfile Dockerfile FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"]

Slide 26

Slide 26 text

FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"] Dockerfile 拉取 base image 延伸閱讀:docker 鏡像差異

Slide 27

Slide 27 text

FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"] Dockerfile 新建 /app 目錄到 image

Slide 28

Slide 28 text

FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"] Dockerfile 複製現在的目錄到 image 的 /app 底下

Slide 29

Slide 29 text

FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"] Dockerfile 執行指令(建立 image 時)

Slide 30

Slide 30 text

補充:生成 requirements 這樣就可以將需要的套件列入 requirements.txt pip freeze > requirements.txt

Slide 31

Slide 31 text

FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"] Dockerfile 開放 80 port

Slide 32

Slide 32 text

FROM python:3.9-slim WORKDIR /app COPY . /app RUN pip install --no-cache-dir -r requirements.txt EXPOSE 80 CMD ["python", "main.py"] Dockerfile 執行指令(構建 container 時)

Slide 33

Slide 33 text

● 建立 image ● 刪除 none image 常見指令 docker build -t [image name] . docker image prune

Slide 34

Slide 34 text

使用 Dockerfile 建立簡單的 Application Lab2 docker build -t [image name] . docker run –d --name [container name] –p 5000:5000 [image name]

Slide 35

Slide 35 text

Docker Compose 一個 Docker 不夠用,那就多用幾個 03

Slide 36

Slide 36 text

● 幫助定義、運行、管理多個 docker ● 使用 yaml 配置 ● 保持整套系統的一致性 What is Docker Compose?

Slide 37

Slide 37 text

● 建立一個 compose.yml ● version:使用哪個版本 ● services:有哪些 application Docker Compose version: '3.8' services: flask: build: . ports: - "5000:5000" environment: - FLASK_ENV=development tunnel: image: cloudflare/cloudflared command: --url http://flask:5000 depends_on: - flask

Slide 38

Slide 38 text

flask: build: . ports: - "5000:5000" environment: - FLASK_ENV=development 第一個 application(flask) Docker Compose 用同個目錄下的 Dockerfile 建構 綁定 5000 port 設定環境變數

Slide 39

Slide 39 text

第二個 application(tunnel) Docker Compose tunnel: image: cloudflare/cloudflared command: --url http://flask:5000 depends_on: - flask 使用哪個 image 等待 flask 建立好 在 container 執行的指令

Slide 40

Slide 40 text

記得先切到 compose.yml 同個目錄下 ● 根據 compose.yml 建立所有 image 和 container ● 將 compose.yml 的 container 移除 常用指令 – 建立/啟用/移除 docker-compose build up -d docker-compose down

Slide 41

Slide 41 text

嘗試用 Docker compose 建立先前的 Service Lab3 docker-compose build up -d

Slide 42

Slide 42 text

給我更多更多的 Container 04

Slide 43

Slide 43 text

Volume:避免資料在容器刪除後被移除 More Docker Usage Host Machine Container /my_database/sqlite.db /certs/certificate.crt /my_db /my_certs

Slide 44

Slide 44 text

Network:建立容器間溝通 ● bridge:預設模式 More Docker Usage 圖源

Slide 45

Slide 45 text

Network:建立容器間溝通 ● overlay:能使不同 docker daemon 通信 More Docker Usage 圖源

Slide 46

Slide 46 text

Network:建立容器間溝通 ● macvlan ○ 能使用 physical address More Docker Usage 圖源

Slide 47

Slide 47 text

Network:建立容器間溝通 ● host ○ 會使得 Network 隔離效果消失 ○ 安全風險(延伸資料:docker escape) More Docker Usage

Slide 48

Slide 48 text

Docker Swarm • 在多台實體機器上執行 Container,形 成一個叢集(Cluster)的一個工具 Kubernets(K8s) • 用於自動部署、擴充和管理「容器化應用 程式」的開源系統 More Container

Slide 49

Slide 49 text

● Dockage ● Portainer ● Docker Desktop I need Some GUI

Slide 50

Slide 50 text

No content