作者: Hao

最後編輯日期: 2024-10-23

Docker 介紹

部署方式

傳統部署

  • 應用程序直接運行在操作系統上,操作系統運行在硬件上。
  • 每個應用程序都需要獨立的操作系統支持,這樣會導致資源浪費和操作系統間的相互干擾。

虛擬化部署

  • 在硬件上安裝操作系統,然後使用 Hypervisor(虛擬機監控器)來管理虛擬機。
  • 每個虛擬機運行自己的操作系統和應用程序。
  • 虛擬機共享硬件資源,但每個虛擬機之間是相互隔離的,提供更好的資源利用和隔離性。

容器部署

  • 在硬件上安裝操作系統,然後使用容器運行時來管理容器。
  • 每個容器運行自己的應用程序和可執行文件/庫,但共享宿主操作系統的內核。
  • 容器之間是相互隔離的,但相比虛擬機更輕量級,啟動速度更快,資源利用率更高。

Docker 架構

  • 容器類似於輕量級的虛擬機。
  • 容器共享操作系統內核。
  • 容器擁有自己的文件系統、CPU、內存、進程空間等。
  • 容器之間相互隔離。

Docker 基本操作

鏡像操作

  • 搜索鏡像:docker search
  • 下載鏡像:docker pull
  • 列出本地鏡像:docker images
  • 刪除鏡像:docker rmi

容器操作

運行:docker run

🔴 注意事項:若執行docker run -d -p 88:80 --name mynginx nginx可能會無法訪問,因為 server 防火牆可能會阻擋非 80 端口,需要去設定。

  • 語法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 說明:運行一個新的容器,從指定的鏡像創建並啟動。
  • 常用選項:
    • -d:在後台運行容器並返回容器 ID。
    • -p:將主機端口映射到容器端口,例如 -p 8080:80 將主機的 8080 端口映射到容器的 80 端口。
    • --name:指定容器的名稱。
    • -v:將主機目錄或文件掛載到容器,例如 -v /host/path:/container/path
  • 範例:docker run -d -p 80:80 --name mynginx nginx

查看:docker ps

  • 語法:docker ps [OPTIONS]
  • 說明:列出當前正在運行的容器。
  • 常用選項:
    • -a:顯示所有容器,包括未運行的容器。
    • -q:只顯示容器 ID。
    • --filter:根據條件過濾容器,例如 --filter "status=exited" 只顯示已退出的容器。
  • 範例:docker ps -a

停止:docker stop

  • 語法:docker stop [OPTIONS] CONTAINER [CONTAINER...]
  • 說明:停止一個或多個正在運行的容器。
  • 常用選項:
    • -t:等待容器停止前的超時秒數(默認 10 秒)。
  • 範例:docker stop mynginx

分享至 Docker Hub

保存狀態:docker commit

docker commit 指令用於將容器的當前狀態保存為新的鏡像。

  • 語法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  • 範例:docker commit -m "Updated configuration" -a "Your Name" mynginx mynginx:v1.0

保存 tar 文件:docker save

  • 語法:docker save [OPTIONS] IMAGE [IMAGE...]
  • 範例:docker save -o mynginx.tar mynginx:v1.0

從 tar 文件加載鏡像:docker load

  • 語法:docker load [OPTIONS]
  • 範例:docker load -i mynginx.tar

清理資源

  • docker rm [CONTAINER]:刪除已停止的容器。
  • docker system prune:清除所有停止的容器、無用的映像檔及其他資源。
  • docker volume prune:刪除未使用的 volume。

Docker 網路操作

  • docker network ls:列出所有 Docker 網路。
  • docker network create [NETWORK_NAME]:創建自訂網路。
  • docker network connect [NETWORK] [CONTAINER]:將容器連接到指定網路。

Volume 操作

  • docker volume create [VOLUME_NAME]:創建 volume。
  • docker volume ls:列出所有 volume。
  • docker volume rm [VOLUME_NAME]:刪除 volume。

Docker Compose

Docker Compose 是一個工具,用於定義和運行多個 Docker 容器的應用。透過撰寫 docker-compose.yml 文件,您可以輕鬆管理應用的服務、網絡和卷。

docker-compose.yml 文件

這是 Docker Compose 的核心文件,用於定義應用的各個服務。在此範例中,我們有三個服務:redis、mysql 和一個應用(app)。

  • 常用命令

    • 上線:docker compose up -d,啟動並在後台運行定義在 docker-compose.yml 文件中的所有服務。
    • 下線:docker compose down,停止並移除定義在 docker-compose.yml 文件中的所有服務。
    • 啟動特定服務:docker compose start x1 x2 x3,啟動一個或多個已定義的服務。
    • 停止特定服務:docker compose stop x1 x3,停止一個或多個已運行的服務。
    • 擴容:docker compose scale x2=3,調整服務的運行實例數量。
  • 使用範例 以下是 docker-compose.yml 文件的一個範例,它定義了三個服務:redis、mysql 和一個簡單的應用(web)。

version: "3.8"

services:
  redis:
    image: "redis:latest"
    ports:
      - "6379:6379"

  mysql:
    image: "mysql:latest"
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - "3306:3306"

  web:
    image: "nginx:latest"
    ports:
      - "80:80"
    depends_on:
      - redis
      - mysql
  • 操作範例
    • 啟動所有服務:docker compose up -d
    • 檢查運行狀況:docker compose ps
    • 停止所有服務:docker compose down
    • 啟動特定服務:docker compose start web
    • 停止特定服務:docker compose stop web
    • 擴展服務:docker compose up --scale web=3 -d
      • 假設 web 服務需要擴展到 3 個實例