# Linux 容器環境安裝與使用 ## ```mermaid graph TD A[Docker Client] -->|發送指令| B[Docker Daemon] B -->|管理| C[Images] B -->|管理| D[Containers] B -->|管理| E[Networks] B -->|管理| F[Volumes] C -->|由| G[Dockerfile 建立] C -->|從| H[Docker Registry 下載] D -->|運行| C D -->|使用| E D -->|使用| F ``` ## Docker 安裝 Ubuntu 24.04 的版本預設的套件來源就有docker相關軟體,所以安裝就相對簡單。 `apt install docker-compose-v2` 一行指就可以完成安裝了。 ### 安裝後調整 預設上面安裝完基本容器的環境就可以使用了,不過習慣上我還會調整一些東西。改變 docker 預設啟動的狀態,docker 啟動調整主要在 `/etc/docker/daemon.json`,這檔案如果不再就新增一個就好,下面是一般我設定的內容。 ```json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } , "registry-mirrors": ["https://mirror.gcr.io"] } ``` 裡面主要交待兩件事: 1. 調整容器的預設log,最大 10mb,最多保留 3 份。 2. 設定拉取 image 透過 google 的 mirror 映像站,因為 `https://hub.docker.com/` 後來有限制單一IP每天的拉取次數,透過 google 的 mirror 比較不會處碰到那個閥值。 ## Docker 基本指令操作 ### 檢查 Docker 版本 ```bash docker --version docker info ``` ### 拉取映像檔 ```bash docker pull ubuntu:latest ``` ### 列出本地映像檔 ```bash docker images ``` ### 啟動容器 ```bash docker run -it ubuntu:latest /bin/bash ``` ### 列出運行中的容器 ```bash docker ps ``` ### 間看目前運行容器的狀態 ```bash docker stats ``` ### 停止容器 ```bash docker stop <container_id> ``` ### 刪除容器 ```bash docker rm <container_id> ``` ### 刪除映像檔 ```bash docker rmi <image_id> ``` ### 查看目前 docker 各種資源的佔用空間 ``` docker system df ``` ### 刪除所有沒使用的 docker 資源 ``` docker system prune -a -f ``` ## Docker Compose 指令操作 ### 檢查 Docker Compose 版本 ```bash docker compose version ``` ### 建立 `docker-compose.yml` 文件 ```yaml services: web: image: nginx ports: - "80:80" volumes: - ./Doc:/usr/share/nginx/html restart: always ``` ### 在背景模式啟動服務 ```bash docker compose up -d ``` ### 停止服務 ```bash docker compose down ``` ### 查看服務日誌 ```bash docker compose logs ``` ### 重啟服務 ```bash docker compose restart ``` ### 列出服務 ```bash docker compose ps ``` ## 操作範例 ### 範例一:啟動 Nginx 服務 1. 建立 `docker-compose.yml` 文件: ```yaml services: web: image: nginx ports: - "80:80" ``` 2. 啟動服務: ```bash docker compose up -d ``` 3. 確認服務運行: ```bash docker compose ps ``` 4. 停止服務: ```bash docker compose down ``` ### 範例二:啟動 MSSQL 2022 服務 1. 建立 `docker-compose.yml` 文件: ```yaml services: mssql: image: mcr.microsoft.com/mssql/server:2022-latest environment: # 設定時區 TZ: "Asia/Taipei" # 設定預設環境編碼 LANG: "C.UTF-8" # 同意SQL EULA ACCEPT_EULA: "Y" # 預設 SA 密碼 MSSQL_SA_PASSWORD: "YourStrong!Passw0rd" # 資料庫預設定序設定 MSSQL_COLLATION: "Chinese_Taiwan_Stroke_CI_AS" # 啟用 SQL AGENT 功能 MSSQL_AGENT_ENABLED: "true" # 設定 SQL 記憶體上限 4096 MB MSSQL_MEMORY_LIMIT_MB: "4096" # 設定運行版本為 Developer MSSQL_PID: "Developer" volumes: # SQL 資料保存拉出到指定目錄 - ./SqlVolume:/var/opt/mssql # 設定重開機後容器也要自動啟動 restart: always ports: # 1433 port 對外開放 - "1433:1433" ``` 2. 建立SqlVolume 目錄調整權限 ```bash mkdir ./SqlVolume chown 10001:10001 ./SqlVolume ``` 上面設定範例透過 volumes , 將 SQL 運作的資料拉到外部目錄 ./SqlVolume , 當 `docker compose up -d` 啟動容器時,docker compose 會自動建立 ./SqlVolume 目錄沒錯,但因為SQL2022 預設 image 不是用 root 執行 ,是用 mssql:mssql 身份執行,docker compose 建立的目錄預設是 root:root , 所以要先建立好目錄 ./SqlVolume,然後調整目錄的 owner 跟 group,容器啟動才不會發生資料寫入權限不足的問題。 3. 啟動服務: ```bash docker compose up -d ``` 4. 確認服務運行: ```bash docker compose ps ``` 5. 停止服務: ```bash docker compose down ``` 6. 對應等價的 docker run 指令 上面的 docker compose設定可以等價下面的docker run 啟動,這只是一個容器的狀態,就已經很囉唆了,實際應用狀況可能還需要多個容器配合才能完成整個系統架構的時候,用純 docker run 的方式啟動後續的調整或修改就不太好紀錄了。不好紀錄的東西未來要重建或移植的時候也容器出錯。 ```bash docker run -d \ --name mssql \ -e TZ="Asia/Taipei" \ -e LANG="C.UTF-8" \ -e ACCEPT_EULA="Y" \ -e MSSQL_SA_PASSWORD='YourStrong!Passw0rd' \ -e MSSQL_COLLATION="Chinese_Taiwan_Stroke_CI_AS" \ -e MSSQL_AGENT_ENABLED="true" \ -e MSSQL_MEMORY_LIMIT_MB="4096" \ -e MSSQL_PID="Developer" \ -v $(pwd)/SqlVolume:/var/opt/mssql \ --restart always \ -p 1433:1433 \ mcr.microsoft.com/mssql/server:2022-latest ```