docker-compose 是 docker 官方的一個開源項目,可以實現對 docker 容器集群的快速編排,docker-compose 通過一個 配置文件 來管理多個 Docker 容器,在配置文件中,所有的容器通過services 來定義,然后使用 docker-compose腳本 來 啟動,停止和重啟 容器,使用 docker-compose 可以對項目進行 快速部署
?
一.Docker命令部署Nginx + Go Web+Mysql項目
golang 部署 見 [Docker]六.Docker自動部署nodejs以及golang項目
1.Docker部署mysql數據庫
(1).docker images查看是否存在mysql鏡像
docker images查看是否存在mysql鏡像不存在則通過docker pull mysql 下載
#查看鏡像
[root@MiWiFi-R3L-srv ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos v1 4ba38cf3943b 18 hours ago 434MB#發現沒有mysql鏡像,下載
[root@MiWiFi-R3L-srv ~]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
8e0176adc18c: Pull complete
2d2c52718f65: Pull complete
d88d03ce139b: Pull complete
4a7d7f11aa1e: Pull complete
ce5949193e4c: Pull complete
f7f024dfb329: Pull complete
5fc3c840facc: Pull complete
509068e49488: Pull complete
cbc847bab598: Pull complete
942bef62a146: Pull complete
Digest: sha256:1773f3c7aa9522f0014d0ad2bbdaf597ea3b1643c64c8ccc2123c64afd8b82b1
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest#已經下載好了mysql鏡像
[root@MiWiFi-R3L-srv ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos v1 4ba38cf3943b 18 hours ago 434MB
mysql latest a3b6608898d6 4 weeks ago 596MB
(2).創建mysql配置文件
(3).通過mysql鏡像啟動一個容器
docker run --name myMysql -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
#通過mysql鏡像,啟動mysql容器
[root@MiWiFi-R3L-srv mysql]# docker run --name myMysql -p 3306:3306 -v /root/mysql/conf.d:/etc/mysql/conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
14aca92308e4816d26fbf4187635888421b4b8be141a5e65bef35614e0d2b921#查看是否啟動mysql容器
[root@MiWiFi-R3L-srv mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14aca92308e4 mysql "docker-entrypoint.s…" About a minute ago Up 58 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp myMysql
(4).通過可視化工具連接mysql
?(5).修改項目app.ini文件,連接容器mysql
?
通過上面布置,說明了goweb項目能夠操作容器的mysql了,接下來就需要把本地的goweb項目部署到遠程服務器上,也就是部署到遠程服務器的容器上
2.打包Go Web項目,發布到遠程容器中
(1).打包Go Web項目
參考[Docker]六.Docker自動部署nodejs以及golang項目
進入項目文件,執行下面語句,生成linux可執行文件:? ? ? ?
????????set CGO_ENABLED=0????????set GOOS=linux????????set GOARCH=amd64????????go build -o goweb main.go

下一步需要把可執行文件,conf,static,templates,go.mod等靜態文件發布到遠程
(2).發布項目到遠程
這里以發布到虛擬機(192.168.31.81)為例,發布到/root/wwwroot下
?(3).瀏覽器訪問
接下來就需要把Go Web項目部署到容器中去?
(4).啟動一個centos的docker容器,部署Go Web項目
docker run -it -d --name 容器名 -p 本地端口 : 容器端口 -v 本地文件夾:容器文件夾? ?--link 容器名 : 鏡像名 ? 鏡像名
- -v 映射數據卷(映射目錄)
- --link 容器名:鏡像名? ?表示配置別名,這樣可以通過容器名來訪問容器
- docker run -it -d??--name goweb01 --link myMysql:mysql -p 8080:8080 -v ?/root/wwwroot/:/root centos
- 比如上面的 goweb01就可以通過myMysql來訪問數據庫
啟動一個centos容器:?
#啟動一個centos容器,并指定名稱以及開啟端口,映射數據卷等
[root@MiWiFi-R3L-srv ~]# docker run -it -d --name goweb01 --link myMysql:mysql -p 8080:8080 -v /root/wwwroot/:/root 4ba38cf3943b
ecec9c9dd9627dfd9b2008a257f72668908d88b49967aa248a728ad11bf412ef
[root@MiWiFi-R3L-srv ~]# #發現已經啟動了goweb01
[root@MiWiFi-R3L-srv ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecec9c9dd962 4ba38cf3943b "/bin/sh -c /bin/bash" 7 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp goweb01
14aca92308e4 mysql "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp myMysql
進入容器,然后設置項目后臺運行,然后curl訪問:
命令:nohup ./goweb &? ?項目可以在后臺運行
#查看運行的容器
[root@MiWiFi-R3L-srv ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecec9c9dd962 4ba38cf3943b "/bin/sh -c /bin/bash" 7 seconds ago Up 2 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp goweb01
14aca92308e4 mysql "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp myMysql#進入goweb01容器
[root@MiWiFi-R3L-srv ~]# docker exec -it ecec9c9dd962 /bin/bash
bash-4.2# cd /root/
bash-4.2# ls
ginGorm#設置權限
bash-4.2# chmod -R 777 ginGorm/
bash-4.2# cd ginGorm/
bash-4.2# ls
conf go.mod go.sum goweb static templates#啟動項目,后臺運行
bash-4.2# nohup ./goweb &
[1] 27
bash-4.2# nohup: ignoring input and appending output to 'nohup.out'#curl訪問,沒問題
bash-4.2# curl 127.0.0.1:8080<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="/static/css/base.css">
</head>
<body><h1>我是一個GoWeb+Mysql的項目</h1><br>我是一個msg<br>2023-07-19 17:40:18<br><h3>這里可以顯示客戶端ip:</h3><p> 172.17.0.3</p></body>
</html>
bash-4.2#
在瀏覽器中訪問:
? 這里講一下上面的--link,在啟動容器后,進入容器cat /etc/hosts可以看到:
[root@MiWiFi-R3L-srv ~]# docker exec -it ecec9c9dd962 /bin/bash
bash-4.2# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters#這里就是--link配置后生成的mysql,有一個myMysql,這個是一個別名,項目就可以通過這個別名來訪問數據庫
172.17.0.2 mysql 14aca92308e4 myMysql
172.17.0.3 ecec9c9dd962
bash-4.2# #可以ping通
bash-4.2# ping myMysql
PING mysql (172.17.0.2) 56(84) bytes of data.
64 bytes from mysql (172.17.0.2): icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from mysql (172.17.0.2): icmp_seq=2 ttl=64 time=0.130 ms
^C
--- mysql ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1011ms
可以修改app.ini數據庫配置,直接使用別名訪問:
3.docker 部署nginx轉發服務 ?
當需要通過域名而不是ip訪問項目時,就需要配置nginx了
(1).創建nginx配置目錄
(2).生成nginx.conf文件
upstream backendtest {ip_hash;server goweb01:8080;
}
server {listen 80;server_name docker.test.com;location / {#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP#禁用緩存proxy_buffering off;#反向代理的地址proxy_pass http://backendtest;}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
(3).下載nginx鏡像,并啟動一個nginx容器?
docker run -it?-d --name 容器名 -p 本地端口:容器端口 --link 容器名:鏡像名?-v 數據卷:容器數據卷?鏡像名
docker pull nginx
docker run -it -d --name nginxweb -p 80:80 --link goweb01:centos -v/root/nginx/conf.d/:/etc/nginx/conf.d nginx
#啟動一個nignx容器,并開啟端口,映射數據卷
[root@MiWiFi-R3L-srv conf.d]# docker run -it -d --name nginxweb -p 80:80 --link goweb01:centos -v /root/nginx/conf.d/:/etc/nginx/conf.d nginx
a0f45848b9ed30b10e178e66d1bf58478f5719f017a0bb736b8b9fc7f0de0000#查看啟動的容器: 已經啟動了mysql,goweb01,nginx容器
[root@MiWiFi-R3L-srv conf.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0f45848b9ed nginx "/docker-entrypoint.…" 13 seconds ago Up 5 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginxweb
ecec9c9dd962 4ba38cf3943b "/bin/sh -c /bin/bash" 34 minutes ago Up 34 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp goweb01
14aca92308e4 mysql "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp myMysql
(4).配置本地hosts,設置域名
?二.Dockerfile部署Nginx+ Go Web+mysql項目
Dockerfile 部署 Nginx+ Go Web+mysql 項目 和docker部署項目類似,這里在另一臺服務器(192.168.31.117)上演示
?1.Docker部署mysql數據庫
該步驟和上面步驟mysql數據庫步驟一致,這里就不講解了
2.打包Go Web項目,發布到遠程容器中
(1).打包Go Web項目,并發布到遠程服務端/root/wwwroot/下
該步驟和上面步驟一致,結果如下:
?(2).新建Dockerfile,編寫生成鏡像所需
在/root/wwwroot/下新建Dockerfile,并寫入以下內容
FROM centos:centos7
ADD ginGorm.tar.gz /root
WORKDIR /root
RUN chmod -R 777 ginGorm
WORKDIR /root/ginGorm
EXPOSE 8080
ENTRYPOINT ["./goweb"]
(3).打包項目
(4).執行build,生成鏡像
[root@MiWiFi-R3L-srv wwwroot]# docker build -t gowebimg:v1.0.1 .
[+] Building 19.4s (10/10) FINISHED docker:default=> [internal] load build definition from Dockerfile 0.1s=> => transferring dockerfile: 242B 0.0s=> [internal] load .dockerignore 0.1s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/centos:centos7 1.1s=> [internal] load build context 0.6s=> => transferring context: 8.94MB 0.6s=> CACHED [1/5] FROM docker.io/library/centos:centos7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 0.0s=> [2/5] ADD /ginGorm.tar.gz /root 0.5s=> [3/5] WORKDIR /root 0.0s=> [4/5] RUN chmod -R 777 ginGorm 9.8s=> [5/5] WORKDIR /root/ginGorm 0.5s=> exporting to image 5.8s=> => exporting layers 4.6s=> => writing image sha256:be3c1ee42ce234885fe50ff06de2e7dcca79e8c4dfa01183f462accaa38ba871 0.8s=> => naming to docker.io/library/gowebimg:v1.0.1 0.4s
[root@MiWiFi-R3L-srv wwwroot]#
[root@MiWiFi-R3L-srv wwwroot]# ll
total 8736
-rw-r--r--. 1 root root 143 Nov 22 04:04 Dockerfile
drwxrwxrwx. 5 root root 90 Nov 22 03:49 ginGorm
-rw-r--r--. 1 root root 8940056 Nov 22 04:00 ginGorm.tar.gz#查看生成的gowebimg鏡像
[root@MiWiFi-R3L-srv wwwroot]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
gowebimg v1.0.1 be3c1ee42ce2 About a minute ago 237MB
mycentos v1 38ea0d55bfbe 24 hours ago 434MB
mysql latest a3b6608898d6 4 weeks ago 596MB
[root@MiWiFi-R3L-srv wwwroot]#
(4).通過生成的gowebimg鏡像啟動容器
docker run -it -d --name goweb01 -p 8080:8080 --link myMysql:mysql gowebimg:v1.0.1
(5).直接進入容器訪問測試
#查看gowebimg容器生成的鏡像
[root@MiWiFi-R3L-srv wwwroot]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b89c74fa36d0 gowebimg:v1.0.1 "./goweb" 13 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp goweb01
1eba1d7316e1 mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp myMysql#進入goweb01容器
[root@MiWiFi-R3L-srv wwwroot]# docker exec -it b8 /bin/bash#curl測試訪問,發現沒問題
[root@b89c74fa36d0 ginGorm]# curl 127.0.0.1:8080<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="/static/css/base.css">
</head>
<body><h1>我是一個GoWeb+Mysql的項目</h1><br>我是一個msg<br>2023-07-19 17:40:18<br><h3>這里可以顯示客戶端ip:</h3><p> 172.17.0.3</p></body>
</html>
[root@b89c74fa36d0 ginGorm]#
上面就是通過Dockerfile生成一個項目鏡像,然后啟動容器訪問項目,這樣的話,goweb項目就部署好了,下來就來配置nginx了
3.docker 部署nginx轉發服務 ?
這里和上面一致,就不再講解了,部署完后,修改hosts文件就可以通過瀏覽器訪問了
好了,通過Dockerfile部署項目就完成了,通過上面的部署,發現:要部署mysql,nginx,goweb項目三個docker,那有沒有一種方式可以通過一個文件一次性地部署幾個docker呢,下面講解docker compose
?三.通過docker compose 部署項目
Docker-Compose 是 Docker 官方的開源項目,可以實現對 Docker 容器集群的快速編排,使用 docker compose可以對項目進行快速部署
1.安裝docker-compose?
見linux環境,centos8下 docker及docker compose安裝教程
2.docker-compose 部署nginx+mysql+goWeb項目
(1).編寫docker-compose.yml文件
要使用docker-compose? 部署項目,就需要一個docker-compose.yml文件,內容如下:
#指定docker-compose 版本
version: "3"#services下就是容器的編寫
services:#容器,myMysql:#來自哪個鏡像image: mysql#容器名,如果不指定,則使用myMysql這個容器默認名稱container_name: myMysql#環境變量:配置用戶名,密碼等environment:MYSQL_ROOT_PASSWORD: 123456#restart: 表示容器掛掉后是否重啟, always 一直重啟restart: always#映射的端口ports:- 3306:3306#數據卷的掛載volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01項目容器goweb01:#build編譯成鏡像,可以使用上面的/root/wwwroot/Dockerfile里面的build:context: ./dockerfile: Dockerfile#當然,也可以使用已經編譯號的gowebimg鏡像#image: gowebimgcontainer_name: goweb01restart: alwaysports:- 8080:8080#depends_on表示創建好myMysql這個容器后,再來創建goweb01這個容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d
(2).編譯運行容器
#這里把docker-compose.yml放在該目錄下
[root@MiWiFi-R3L-srv wwwroot]# ll
total 8740
-rw-r--r--. 1 root root 1428 Nov 22 05:13 docker-compose.yml
-rw-r--r--. 1 root root 143 Nov 22 04:04 Dockerfile
drwxrwxrwx. 5 root root 90 Nov 22 03:49 ginGorm
-rw-r--r--. 1 root root 8940056 Nov 22 04:00 ginGorm.tar.gz#docker compose up 啟動容器
[root@MiWiFi-R3L-srv wwwroot]# docker compose up
[+] Building 7.4s (10/10) FINISHED docker:default=> [goweb01 internal] load .dockerignore 0.5s=> => transferring context: 2B 0.1s=> [goweb01 internal] load build definition from Dockerfile 0.6s=> => transferring dockerfile: 242B 0.2s=> [goweb01 internal] load....#查看通過docker compose 是否啟動了mysql,goweb,nginx容器
[root@MiWiFi-R3L-srv wwwroot]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2df006c60407 nginx "/docker-entrypoint.…" 3 minutes ago Restarting (1) 24 seconds ago nginx
1e374c641de3 wwwroot-goweb01 "./goweb" 3 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp goweb01
868ba8ad9178 mysql "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp myMysql
docker compose up
(3).后臺運行
docker compose up -d
(4).一些問題
在 docker 運維的過程中經常會遇到一個問題,啟動一個 docker - compose.yml 文件時,雖然使用 depends_on 屬性用依賴關系定義了兩個容器的啟動順序,但這個順序僅僅是 docker 創建啟動的順序,而并不是在上一個容器完全啟動成功的情況下啟動下一個容器。depends_on 在啟動 web 這個容器前,并不會等待db 和 redis 這個兩個容器進入 ready狀態,而只是等到它們被啟動狀態了,這里可以再次 重新啟動相關容器,就可以解決(docker compose restart 容器名) ,也可以通過借助 wait-for-it.sh 配置 nginx+mysql+goWeb 項目配置容器啟動順序
wait-for-it.sh是GitHub中開源一個腳本,很輕量也很實用注意 : wait-for-it.sh 需要放在 ginGorm 文件中這時需在docker-compose.yml中的goweb01下加入一下代碼即可
command: ["./wait-for-it.sh","myMysql:3306","--","./goweb"]
3.docker compose 常用命令
(1).docker compose build命令
(重新)構建 docker - compose.yml 文件中的服務,生成鏡像。 如果一個服務是使用 build 元素構建的,那么一旦你更改了這個服務的 Dockerfile ,就需要運行 docker compose build 重新構建它,以保證之后 up 時運行的服務容器是最新的
docker compose build
?選項:
????????–force-rm:總是刪除構建過程中的臨時容器????????–no-cache:鏡像構建過程中不使用 cache????????–pull:始終先嘗試通過 pull 來獲取最新版本的鏡像
(2).docker compose up命令
這是最重要且最常用的一個命令,大部分時候都可以直接通過該命令來啟動一個項目,它將自動完成 構建鏡像、(重新)創建服務、按依賴順序啟動任何關聯的服務 等一系列操作
docker compose up
?
默認情況下, docker compose up 啟動的容器都在前臺,控制臺將實時打印所有容器的輸出信息(以不同的顏色標識不同的服務),可以很方便進行調試。當按下 Ctrl+C 時,所有容器都會被停止。如果使用 docker compose up -d ,則所有服務將在后臺啟動.一般生產環境下推薦使用該選項
docker compose up -d
?需要注意的是,如果某個服務容器是通過build元素進行構建的,并且該服務對應的鏡像已經存在,那 么即使Dockerfile文件內容已經變更,docker compose up也不會重新構建該服務,此時你需要先執行 docker compose build構建鏡像,再執行docker compose up
docker compose build && docker compose up
?–scale:設置某個服務要啟動的容器數量
提示:
????????需要在docker-compose.yml 中去掉container_name,去掉goweb01綁定的端口
docker compose up --scale='goweb01=3'
docker compose up --scale='goweb01=3' -d
?選項:
????????-d:在后臺運行服務容器? ? ? ? -no-deps:不啟動服務所依賴的其他服務(由 depends_on 元素指定)? ? ? ? -no-color:不使用顏色來區分不同服務的控制臺輸出? ? ? ? -force-recreate:總是重新創建容器,不能與 --no-recreate 同時使用? ? ? ? -no-recreate:如果容器已經存在了,則不重新創建,不能與 --force-recreate 同時使用? ? ? ? -no-build:不進行服務鏡像的構建,即使該服務鏡像不存在????????-t, --timeout TIMEOUT:停止容器時的超時時間(默認為 10 秒)? ? ? ? -scale:設置某個服務要啟動的容器數量,用于快速擴容 / 縮容,例如 --scale='web=3' 將為 web 服務啟動3 個容器副本,并且會覆蓋 docker-compose.yml 中原有的 scales 設置
(3).docker compose stop命令
停止項目中的所有服務容器,稍后可以通過 docker compose start 再次啟動
docker compose stop
(4).docker compose start命令
啟動項目中的所有服務容器
docker compose start
?(5).docker compose restart命令
重啟項目中的所有服務容器,只是重啟不會重新構建項目
docker compose restart
?(6).docker compose convert
可以借助這個命令來驗證 docker-compose.yml 文件格式是否正確,若錯誤則會顯示錯誤原因
[root@localhost ~]# docker compose convert
yaml: line 9: did not find expected key
?(7).docker compose exec
進入/退出容器類似,只不過它針對的是服務,可在指定的服務容器中執行命令
docker compose exec goweb01 /bin/bash
(8).docker compose images
列出所有已創建的服務容器的鏡像信息
docker compose images
?(9).docker compose ls
列出 Docker 上正在運行的所有項目,該信息與當前所在的項目無關選項:????????–all , -a:同時顯示已停止的項目
[root@MiWiFi-R3L-srv wwwroot]# docker compose ls
NAME STATUS CONFIG FILES
wwwroot restarting(1), running(2) /root/wwwroot/docker-compose.yml
[root@MiWiFi-R3L-srv wwwroot]# docker compose ls -a
NAME STATUS CONFIG FILES
wwwroot restarting(1), running(2) /root/wwwroot/docker-compose.yml
[root@MiWiFi-R3L-srv wwwroot]#
(10).docker compose ps
查看docker compose運行的容器信息,類似于docker ps
docker compose ps
[root@MiWiFi-R3L-srv wwwroot]# docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
goweb01 wwwroot-goweb01 "./goweb" goweb01 25 minutes ago Up 21 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
myMysql mysql "docker-entrypoint.sh mysqld" myMysql 25 minutes ago Up 22 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint.sh nginx -g 'daemon off;'" nginx 25 minutes ago Restarting (1) 50 seconds ago
-a 查看 docker compose 運行的所有容器信息
docker compose ps -a
?(11).docker compose logs
查看當前項目下所有服務容器的日志輸出。默認情況下, docker compose logs 將對不同的服務輸出使用不同的顏色來區分,可以通過 -- no - color 來關閉顏色,該命令在調試問題的時候十分有用。
docker compose logs
(12).docker compose port
打印某個服務容器的內部端口所映射的公共端口(宿主機端口)選項:????????–protocol=proto:指定端口協議, tcp (默認值)或者 udp????????–index=index:如果同一服務存在多個容器副本,可用此選項指定容器的序號(默認為 1)
$ docker compose port mysql 3306
0.0.0.0:3307
$ docker compose port redis 6379
0.0.0.0:6380
(13).docker compose rm
刪除所有已停止的服務容器,正式項目推薦先執行 docker compose stop 命令來停止容器,刪除所有docker compose 容器
docker compose rm -f
?(14).docker compose version
打印 Docker Compose 版本信息,該信息與當前所在的項目無關
docker compose version
(15).docker compose run
格式:docker compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] SERVICE [COMMAND] [ARGS...]
????????此命令的行為和創建并啟動容器相似,它總是為某個服務創建并啟動一個全新的容器,例如,以下命令為web 服務創建并啟動一個容器,然后執行 /bin/bash 命令:
docker compose run goweb01 /bin/bash
?此命令一定會創建一個新的容器,其配置由docker-compose.yml中的web服務所定義,包括數據卷、 網絡、依賴關系、環境變量等詳細信息
此命令和 docker compose up 有兩個重要區別:????????此命令可以重寫服務的啟動命令(docker-compose.yml 中定義的 command 元素)????????例如,如果 web 服務的啟動命令是 /bin/bash (由 command 元素指定),那么
docker compose run goweb01 /bin/sh 將會把啟動命令重寫為/bin/sh
?注意:
????????此命令不會自動創建docker-compose.yml中配置的任何端口映射,以避免端口沖突
如果確實想為服務創建端口并將其映射到宿主機,請指定端口:?
docker compose run -d --name ginweb02 -p 8082:8080 goweb01
?默認情況下,如果存在依賴關系(由depends_on元素指定),則所有被依賴的服務將會被自動啟動, 除非這些服務已經在運行中,如果不希望 run 命令啟動依賴的其他容器,請使用 --no-deps 選項
docker compose run --no-deps -d --name ginweb03 -p 8083:8080 goweb01
?如果只想創建一次的容器,在容器停止后自動刪除它,可以使用 --rm選項:
docker compose run --rm updateDb
?選項:
????????-d: 在后臺運行容器? ? ? ? -name NAME: 為容器指定一個名字,默認為項目名 - 服務名 -uuid? ? ? ? -entrypoint CMD: 覆蓋默認的容器啟動命令????????-e KEY=VAL: 設置環境變量,可以多次指定此選項來設置多個環境變量????????-u, --user=“”: 指定運行容器的用戶名或者 uid? ? ? ? -no-deps: 不啟動所其他的其他服務容器? ? ? ? -rm: 容器運行完成時自動刪除容器????????-p, --publish=[]: 手動映射容器端口到宿主機,和 3.1 創建并啟動容器一樣? ? ? ? -service-ports: 使 docker-compose.yml 中配置的端口映射生效,默認忽略
?4.docker-compose 動態擴展容器
實現動態擴容,就是在啟動容器的額時候多增加幾個相關的容器,以便實現負載均衡等操作
(1).docker compose up --scale 實現 容器擴容
需要刪除docker-compose.yml中對應容器的掉container_name,去掉綁定的端口,如:
#指定docker-compose 版本
version: "3"#services下就是容器的編寫
services:#容器,myMysql:#來自哪個鏡像image: mysql#容器名,如果不指定,則使用myMysql這個容器默認名稱container_name: myMysql#環境變量:配置用戶名,密碼等environment:MYSQL_ROOT_PASSWORD: 123456#restart: 表示容器掛掉后是否重啟, always 一直重啟restart: always#映射的端口ports:- 3306:3306#數據卷的掛載volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01項目容器goweb01:#build編譯成鏡像,可以使用上面的/root/wwwroot/Dockerfile里面的build:context: ./dockerfile: Dockerfile#當然,也可以使用已經編譯號的gowebimg鏡像#image: gowebimg#container_name: goweb01restart: always#ports:# - 8080:8080#depends_on表示創建好myMysql這個容器后,再來創建goweb01這個容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d
?然后執行:
docker compose up --scale='goweb01=3' -d
[root@MiWiFi-R3L-srv wwwroot]# docker compose up --scale='goweb01=3' -d
[+] Running 5/5? Container myMysql Started 0.9s ? Container wwwroot-goweb01-3 Started 2.0s ? Container wwwroot-goweb01-1 Started 2.0s ? Container wwwroot-goweb01-2 Started 1.9s ? Container nginx Started 0.8s
[root@MiWiFi-R3L-srv wwwroot]#
[root@MiWiFi-R3L-srv wwwroot]# docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
myMysql mysql "docker-entrypoint.sh mysqld" myMysql 3 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint.sh nginx -g 'daemon off;'" nginx 3 minutes ago Restarting (1) 4 seconds ago
wwwroot-goweb01-1 wwwroot-goweb01 "./goweb" goweb01 3 minutes ago Up About a minute 8080/tcp
wwwroot-goweb01-2 wwwroot-goweb01 "./goweb" goweb01 3 minutes ago Up About a minute 8080/tcp
wwwroot-goweb01-3 wwwroot-goweb01 "./goweb" goweb01 3 minutes ago Up About a minute 8080/tcp
(2).通過docker-compose.yml配置容器副本以及占用的cpu
#指定docker-compose 版本
version: "3"#services下就是容器的編寫
services:#容器,myMysql:#來自哪個鏡像image: mysql#容器名,如果不指定,則使用myMysql這個容器默認名稱container_name: myMysql#環境變量:配置用戶名,密碼等environment:MYSQL_ROOT_PASSWORD: 123456#restart: 表示容器掛掉后是否重啟, always 一直重啟restart: always#映射的端口ports:- 3306:3306#數據卷的掛載volumes:- /root/mysql/conf.d:/etc/mysql/conf.d- /root/mysql/data:/var/lib/mysql#配置goweb01項目容器goweb01:#build編譯成鏡像,可以使用上面的/root/wwwroot/Dockerfile里面的build:context: ./dockerfile: Dockerfile#當然,也可以使用已經編譯號的gowebimg鏡像#image: gowebimg#container_name: goweb01restart: always#ports:# - 8080:8080deploy:replicas: 3 #副本數量resources: #資源limits: #配置cpucpus: "0.5" # 設置該容器最多只能使用 50% 的 CPUmemory: 500M # 設置該容器最多只能使用 500M內存restart_policy: #定義容器重啟策略, 用于代替 restart 參數condition: on-failure #只有當容器內部應用程序出現問題才會重啟#depends_on表示創建好myMysql這個容器后,再來創建goweb01這個容器depends_on:- myMysql#配置nginx容器nginx:image: nginxcontainer_name: nginxrestart: alwaysports:- 80:80depends_on:- goweb01volumes:- /root/nginx/conf.d/:/etc/nginx/conf.d
然后執行docker compose up -d,同樣可以創建多個容器,當某個容器掛掉后,就回去訪問另一個容器,這樣就到了負載均衡操作,好了,docker compose 講解完畢,下一節講解Docker Swarm
[上一節][Docker]八.Docker 容器跨主機通訊