Docker
Docker-compose
單個 Dockerfile 可定義單容器應用,但日常工作中,Web 項目等常需 Web 服務、數據庫、負載均衡等多容器配合,手動按序啟停容器會導致維護量大、效率低。
Docker Compose 是高效的多容器管理工具,通過單個 docker-compose.yml
(YAML 格式)文件定義關聯資源集,輕松管理容器。
其有兩個核心概念:
- 服務(Service):一個應用的容器,可包含多個運行相同鏡像的容器實例。
- 項目(Project):由一組關聯服務容器組成的完整業務單元,定義于
docker-compose.yml
中。
Compose 默認管理對象為項目,通過子命令對項目內容器進行生命周期管理。它最初由 Python 編寫,后用 Go 重寫,調用 Docker API 管理容器,支持所有兼容 Docker API 的平臺。
命令說明
[root@docker ~]# docker compose -h
Flag shorthand -h has been deprecated, please use --helpUsage: docker compose [OPTIONS] COMMANDDefine and run multi-container applications with DockerOptions:--all-resources Include all resources, even those not used by services--ansi string Control when to print ANSI control characters("never"|"always"|"auto") (default "auto")--compatibility Run compose in backward compatibility mode--dry-run Execute command in dry run mode--env-file stringArray Specify an alternate environment file-f, --file stringArray Compose configuration files--parallel int Control max parallelism, -1 for unlimited (default -1)--profile stringArray Specify a profile to enable--progress string Set type of progress output (auto, tty, plain,quiet) (default "auto")--project-directory string Specify an alternate working directory(default: the path of the, first specified, Composefile)-p, --project-name string Project nameCommands:attach Attach local standard input, output, and error streams to a service's running containerbuild Build or rebuild servicesconfig Parse, resolve and render compose file in canonical formatcp Copy files/folders between a service container and the local filesystemcreate Creates containers for a servicedown Stop and remove containers, networksevents Receive real time events from containersexec Execute a command in a running containerimages List images used by the created containerskill Force stop service containerslogs View output from containersls List running compose projectspause Pause servicesport Print the public port for a port bindingps List containerspull Pull service imagespush Push service imagesrestart Restart service containersrm Removes stopped service containersrun Run a one-off command on a servicescale Scale servicesstart Start servicesstats Display a live stream of container(s) resource usage statisticsstop Stop servicestop Display the running processesunpause Unpause servicesup Create and start containersversion Show the Docker Compose version informationwait Block until the first service container stopswatch Watch build context for service and rebuild/refresh containers when files are updatedRun 'docker compose COMMAND --help' for more information on a command.
[root@docker ~]# docker compose version
Docker Compose version v2.27.0
Compose 模板
模板文件是使用 Compose 的核心,涉及到的指令關鍵字也比較多。但大家不用擔心,這里面大部分指令 跟 docker run 相關參數的含義都是類似的。
默認的模板文件名稱為 docker-compose.yml ,格式為 YAML 格式。
模板文件結構
- version:用來定義模板文件的版本,不同版本的模板,格式也不一樣。
- 資源列表:用來定義資源清單,包括service、secret、network、volume等。
- 注釋行: # 開頭的注釋行。
示例:使用版本3模板,定義一個使用httpd鏡像的services。
version: "3"
services:webapp:image: httpd
實戰-Wordpress
方法一:
用docker run
[root@docker ~]# docker pull mysql[root@docker ~]# docker pull wordpress[root@docker ~]# docker run -tid --name db --restart always -v /db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=wordpress mysql
8da76295432326d26a11844fef60042756234194b562d10a9edc5346d78e9da2
[root@docker ~]# docker run -tid --name blog -v /web:/var/www/html -p 80:80 --link db -e WORDPRESS_DB_HOST=db -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123 -e WORDPRESS_DB_NAME=wordpress wordpress
fcaa6809d5c6d860db16c2fe845bf1b27979e003ce652b27d9f637a67dadf79e[root@docker ~]# docker ps
測試
方法二:
用docker compose
# 先刪除之前的環境
[root@docker ~]# docker rm -f $(docker ps -aq)
fcaa6809d5c6
8da762954323# 通過docker compose實現多個容器一起啟動
[root@docker wordpress]# vim docker-compose.yml
[root@docker wordpress]# cat docker-compose.yml
services:blog: #服務名字,相當于docker run的時候指定的一個名稱image: wordpress:latest #必選,鏡像的名字restart: alwayslinks:- dbports: #可選,等價于 docker container run 里的 -p 選項指定端口映射- "80:80"environment: #可選,等價于 docker run 里的 --env 選項設置環境變量- WORDPRESS_DB_HOST=db- WORDPRESS_DB_USER=root- WORDPRESS_DB_PASSWORD=123- WORDPRESS_DB_NAME=wordpressdb:image: mysql:latestrestart: alwaysenvironment:- MYSQL_ROOT_PASSWORD=123- MYSQL_DATABASE=wordpress# 寫完檢查下語法
[root@docker wordpress]# docker compose config -q# 后端運行
[root@docker wordpress]# docker compose up -d
[+] Running 3/3? Network wordpress_default Created 0.3s? Container wordpress-db-1 Started 0.5s? Container wordpress-blog-1 Started
# 查看
[root@docker wordpress]# docker ps
測試
docker圖形界面管理
DockerUI 容器管理器的安裝與使用
簡介:
DockerUI是一個易用且輕量化的 Docker 管理工具,通過 Web 界面的操作,更方便對于 Docker 指令不 熟悉的用戶更容易操作 Docker。
功能:
-
Docker主機管理:數據卷管理,鏡像管理,容器管理,構建管理,倉庫配置管理,網絡配置管理
-
Docker Swarm集群管理:集群概要信息,節點管理,Service管理,任務管理,密碼管理,配置管 理
鏡像:
使用的鏡像來自于@joinsunsoft ,他發布在Docker Hub的鏡像地址為:http s://hub.docker.com/r/joinsunsoft/docker.ui
安裝
[root@docker ~]# docker pull joinsunsoft/docker.ui# 啟動容器并映射8999端口:
[root@docker ~]# docker run -d --name docker.ui --restart always -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui
14357a64e8df7b96764e6aa23d4fd094056c9421eef8a642d5c322c9411a0177
測試
瀏覽器訪問192.168.108.30:8999
默認用戶名密碼:ginghan/123456
可以管理鏡像容器
# 拉取httpd和busybox
[root@docker ~]# docker pull httpd[root@docker ~]# docker pull busybox# 回到ui界面
[root@docker ~]# docker run -itd busybox
81080c93ff6619e4c1c16d6c66b934b5a1dda2a1ff6ed3a1d85de62650de2e49
Docker 圖形化界面管理工具 Portainer
安裝
# 創建存儲卷
[root@docker ~]# docker volume create portainer_data
portainer_data
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local 12d86d6267f1848241d91473cbace4209d3fb5c7098a183114400b7c9924471f
local 558dac1cf2e863b38f0d6c81f1ef451eef72bfe615d5150b89601ab02f20509e
local portainer_data# 通過docker安裝Portainer
[root@docker ~]# docker pull portainer/portainer-ce:latest[root@docker ~]# docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
f11d6bd62d48d632a9596f493911c7297b19663280fe1ac0c01747d326bc7d4c
訪問
瀏覽器 https://192.168.108.30:9443訪問 Portainer,首次訪問需要創建管理員賬號
設置密碼
訪問
使用
Docker swarm
概念
集群化:從 “單主機” 到 “整體資源池”
Docker Swarm 的核心是管理 Docker Host 集群,先理解 “集群化(Clustering)” 的價值:
- 集群定義:由網絡互聯的多臺服務器組成,協同工作時像 “單個系統”,同時具備高可用、負載均衡、并行處理能力(這是與 “一堆獨立服務器” 的核心區別)。
- 為什么需要集群:
- 避免資源浪費:獨立服務器無法動態適配應用資源波動(如早高峰內存需求高、下午低),提前分配主機易導致利用率低;
- 減少人工干預:獨立服務器宕機時,需手動遷移受影響應用;集群可自動處理故障,保障業務彈性;
- 簡化管理思維:無需關注 “應用跑在某臺主機”,只需定義 “應用需多少 CPU / 內存”,集群管理工具(如 Swarm)會自動調度資源。
- 集群擴容 / 縮容:通過添加 / 刪除主機節點實現,操作后集群仍保持 “整體” 屬性,不改變使用邏輯。
Docker Swarm Mode:內置的集群能力
- 版本里程碑:Docker v1.12 后,Swarm 功能完全集成到 Docker Engine 中,無需額外安裝軟件(如之前依賴的 Consul/etcd/Zookeeper 等外部數據庫),啟動 “Swarm Mode” 即可使用集群能力。
- 優勢:對比 Kubernetes,Swarm 集群創建更簡單(無額外配置),適合作為容器編排的入門學習工具。
- 兼容性:同一 Docker 主機可同時運行 “Swarm 服務(service)” 和 “獨立容器”,不沖突。
Swarm 核心概念拆解
Swarm(集群實例)
- 定義:由多個運行 Docker Engine 的主機組成的 “集群單元”,當某臺主機初始化 Swarm 或加入現有 Swarm 時,即啟動 “Swarm Mode”。
- 能力邊界:未啟動 Swarm Mode 時,Docker 僅能執行單容器命令;啟動后,新增 “編排 service” 的能力(如管理多副本容器、故障自愈)。
Node(節點)
-
定義:Swarm 中的每臺 Docker Engine 主機都是一個 Node,分兩種角色,且一臺主機僅占一種角色:
角色 核心職責 關鍵特性 Manager Node(管理節點) 1. 接收部署命令,拆解任務并分配給 Worker; 2. 維護集群狀態(如 service 期望副本數); 3. 多管理節點時自動選舉 Leader(執行編排) - 生產環境需 3/5/7 個(奇數,防腦裂); - 默認同時是 Worker,可配置為 “僅管理節點”(專職集群管理) Worker Node(工作節點) 1. 接收并執行 Manager 派發的任務; 2. 定期向 Manager 匯報自身資源(CPU / 內存)和任務狀態 僅負責運行容器,不參與集群管理
Service(服務)
- 定義:對 “應用部署需求” 的抽象描述(如 “用 httpd:latest 鏡像,啟動 3 個副本,提供 HTTP 服務”),是 Swarm 編排的最小單元。
- 核心邏輯:Manager 確保 Service 始終處于 “期望狀態”,舉例:
- 部署 httpd 服務(3 副本),Manager 分析節點資源后,分配 2 個副本到 Worker1、1 個到 Worker2;
- 若 Worker2 宕機,Manager 監控到故障,立即在 Worker3 上新建 1 個 httpd 副本,維持 “3 副本” 的期望狀態(故障自愈)。
部署swarm集群
創建三節點集群
swarm-manager 是 manager node,swarm-worker1 和 swarm-worker2 是 worker node。
# 在 swarm-manager 上執行如下命令創建 swarm
[root@swarm-manager ~]# docker swarm init --advertise-addr 192.168.108.30
Swarm initialized: current node (t2wuubtvlwx0qngw3qi6kp6zc) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-24dky4f5899mt9hvc4i2h27xqf1ep0sd88b3i1gv7v9izx7xrb-cd03s0sgd0i1l7y3sav2k79da 192.168.108.30:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instruct ions.# 執行 docker node ls 查看當前 swarm 的 node,目前只有一個 manager。
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
t2wuubtvlwx0qngw3qi6kp6zc * swarm-manager Ready Active Leader 26.1.3
防火墻設置,三個節點都要執行
[root@swarm-manager ~]# firewall-cmd --set-default-zone=trusted
success
[root@swarm-worker1 ~]# firewall-cmd --set-default-zone=trusted
success
[root@swarm-worker2 ~]# firewall-cmd --set-default-zone=trusted
success
復制前面的 docker swarm join 命令,在 swarm-worker1 和 swarm-worker2 上執行,將它們添 加到 swarm 中。
[root@swarm-worker1 ~]# docker swarm join --token SWMTKN-1-24dky4f5899mt9hvc4i2h27xqf1ep0sd88b3i1gv7v9izx7xrb-cd03s0sgd0i1l7y3sav2k79da 192.168.108.30:2377
This node joined a swarm as a worker.[root@swarm-worker2 ~]# docker swarm join --token SWMTKN-1-24dky4f5899mt9hvc4i2h27xqf1ep0sd88b3i1gv7v9izx7xrb-cd03s0sgd0i1l7y3sav2k79da 192.168.108.30:2377
This node joined a swarm as a worker.# 兩個 worker node 已經添加進來了
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
t2wuubtvlwx0qngw3qi6kp6zc * swarm-manager Ready Active Leader 26.1.3
m8w1ijonr4jrp006rg5o7fgft swarm-worker1 Ready Active 26.1.3
qiw3ydp7o20a65rlfare0g0a8 swarm-worker2 Ready Active 26.1.3
可以通過 docker swarm join-token worker 再次查看docker swarm init 提示的添加 worker 的完整命令。
[root@swarm-manager ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-24dky4f5899mt9hvc4i2h27xqf1ep0sd88b3i1gv7v9izx7xrb-cd03s0sgd0i1l7y3sav2k79da 192.168.108.30:2377
運行第一個 Service
部署一個運行 httpd 鏡像的 service
[root@swarm-manager ~]# docker service create --name web_server httpdxzlkc6a9md74ca23xg4khsh85
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service xzlkc6a9md74ca23xg4khsh85 converged# --name : service 命名
# httpd :鏡像的名字# 查看當前 swarm 中的 service
[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xzlkc6a9md74 web_server replicated 1/1 httpd:latest# 查看service 每個副本的狀態
[root@swarm-manager ~]# docker service ps web_server
# 下圖可以看到容器web_server在swarm-worker2上運行# 驗證httpd 容器已經運行
# 去swarm-worker2上驗證
[root@swarm-worker2 ~]# docker ps
如何實現 Service 伸縮
增加 service 的副本數就可以
[root@swarm-manager ~]# docker service scale web_server=5
web_server scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service web_server converged
副本數增加到 5,通過 docker service ls 和 docker service ps 查看副本的詳細信息。
[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xzlkc6a9md74 web_server replicated 5/5 httpd:latest
[root@swarm-manager ~]# docker service ps web_server
5 個副本已經分布在 swarm 的所有三個節點上。
數增加到 5,通過 docker service ls 和 docker service ps 查看副本的詳細信息。
[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
xzlkc6a9md74 web_server replicated 5/5 httpd:latest
[root@swarm-manager ~]# docker service ps web_server
[外鏈圖片轉存中…(img-XERJfLCW-1757517387121)]
5 個副本已經分布在 swarm 的所有三個節點上。