Docker-Compose
概述
Docker Compose通過一個單獨的docker-compose.yml
模板文件來定義一組相關聯的應用容器,幫助我們實現多個相互關聯的Docker容器的快速部署
- 一般一個
docker-compose.yml
對應完整的項目,項目中的服務和中間件對應不同的容器
Compose文件實質就是集成了多個docker run
命令,只是語法變成通過指令定義集群中的每個容器運行時的參數信息
docker run 參數 | docker compose 指令 | 說明 |
---|---|---|
–name | container_name | 容器名稱 |
-p | ports | 端口映射 |
-e | environment | 環境變量 |
-v | volumes | 數據卷配置 |
–network | networks | 網絡 |
-d | 不需要指定, 默認就是后臺運行 | 運行方式 |
EXPOSE | 在微服務集群部署中,像MySQL和Reids等中間件僅僅是供給給集群內的服務使用的,所以不需要對外暴露端口 | 暴露端口 |
![]() |
安裝DockerCompose
在Linux中使用命令去github下載DockerCompose安裝包并修改文件權限(下載速度可能較慢),可以自己在瀏覽器中下載安裝包上傳到/usr/local/bin
目錄
# 安裝
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 修改文件權限
chmod +x /usr/local/bin/docker-compose
# 檢測docker-compose是否安裝成功
docker-compose
設置DockerCompose自動補全功能,如果出現錯誤Failed connect to raw.githubusercontent.com:443; Connection refused
就修改hosts文件
# 自動補全的命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
# 出現錯誤后需要修改自己的hosts文件(重啟一下網絡systemctl start network),再配置自動補全的命令
echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
# 如出現TCP connection reset by peer錯誤需要重復發起命令多試幾次
DockerCompose命令
docker compose [OPTIONS] [COMMAND]
: OPTIONS和COMMAND都是可選參數,常見命令參考官方文檔
類型 | 參數或指令 | 說明 |
---|---|---|
Options | -f | 指定compose文件的路徑和名稱,如果文件在當前目錄且名稱為docker-compose.yml 則不用指定 |
-p | 指定project名稱, project就是當前compose文件中設置的多個service的集合 | |
Commands | up | 創建并啟動所有service容器 |
down | 停止并移除所有容器、網絡 | |
ps | 列出所有啟動的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 啟動容器 | |
restart | 重啟容器 | |
top | 查看運行的進程 | |
exec | 在指定的運行中容器中執行命令 |
部署微服務集群
單體項目部署
基于docker-compose.yml
文件一鍵部署項目
# 1.進入root目錄
cd /root# 2.刪除舊容器
docker rm -f $(docker ps -qa)# 3.刪除hmall鏡像
docker rmi hmall# 4.清空MySQL數據
rm -rf mysql/data# 5.啟動所有, -d參數是后臺啟動
docker compose up -d
# 結果:
[+] Building 15.5s (8/8) FINISHED=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 358B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 15.4s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3 0.0s=> [internal] load build context 0.0s=> => transferring context: 98B 0.0s=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 0.0s=> CACHED [3/3] COPY hm-service.jar /app.jar 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71 0.0s=> => naming to docker.io/library/root-hmall 0.0s
[+] Running 4/4? Network hmall Created 0.2s? Container mysql Started 0.5s? Container hmall Started 0.9s? Container nginx Started 1.5s# 6.查看鏡像
docker compose images
# 結果
CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 32eebee16acd 362MB
mysql mysql latest 3218b38490ce 516MB
nginx nginx latest 605c77e624dd 141MB# 7.查看容器
docker compose ps
# 結果
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hmall root-hmall "java -jar /app.jar" hmall 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql mysql "docker-entrypoint.s…" mysql 54 seconds ago Up 53 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint.…" nginx 54 seconds ago Up 52 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
定義docker-compose.yml
文件指定要創建的容器
version: "3.8"services:mysql: # 創建mysql容器的參數信息image: mysql# 鏡像名稱container_name: mysql# 容器名稱ports:# 端口映射- "3306:3306"environment:# 環境變量TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:# 數據卷掛載- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall: # 創建Java應用容器的參數信息build: # 基于Dockerfile文件構建自定義鏡像context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on: # 依賴容器,創建容器時會先創建依賴的容器- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/etc/nginx/html"depends_on:- hmall # 前端依賴后端networks:- hm-net
networks: # 需要創建的網絡hm-net:name: hmall
微服務部署步驟
第一步: 在cloud-demo項目中編寫docker-compose文件構建鏡像并運行容器
version: "3.2"
services:nacos: # 注冊中心和配置中心image: nacos/nacos-server # 基于nacos/nacos-server鏡像構建environment: # 環境變量MDOE: standalone # 單點模式啟動ports: # 端口映射,暴露了8848端口- "8848:8848"mysql:image: mysql:5.7.25 # 基于5.7.25版本的MySQL鏡像構建environment:MYSQL_ROOT_PASSWORD: 123456 # 設置數據庫root賬戶的密碼volumes: # 數據卷掛載,這里掛載了mysql的data和conf目錄- "$PWD/mysql/data:/var/lib/mysql" # $PWD用于獲取當前文件所在的目錄- "$PWD/mysql/conf:/etc/mysql/conf.d"# 微服務不需要暴露端口,如果暴露了端口網關的身份認證和權限校驗就形同虛設了userservice: # 基于Dockerfile文件臨時構建build: ./user-service orderservice: # 基于Dockerfile文件臨時構建build: ./order-service# 網關需要暴露端口,它是其他微服務的入口gateway: # 基于Dockerfile文件臨時構建build: ./gatewayports:- "10010:10010"
第二步: 使用Docker Compose部署時, 所有的服務之間都可以用服務名互相訪問,那么就可以修改cloud-demo項目中所有服務的yml配置文件
- 將數據庫,nacos地址URL中的
localhost重命名為docker-compose中的服務名
spring:cloud:nacos:# server-addr: localhost:80 #Nacos地址server-addr: nacos:8848 # 使用compose中的服務名來互相訪問,用nacos替換localhostconfig:file-extension: yaml # 文件后綴名
第三步: 使用maven打包工具, 在每一個服務的pom.xml文件指定將微服務打包為app.jar(打包名需要與Dockerfile文件中一致)
<build><!--指定服務打包的最終名稱--><finalName>app</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
第四步: 將打包好的app.jar和Dockerfile構建鏡像文件拷貝到cloud-demo
目錄中對應的gateway, order-service, user-service
子目錄中
FROM openjdk:8
COPY ./app.jar /tmp/app.jar
ENTERPOINT java -jar /tmp/app.jar
第五步: 將cloud-demo項目文件夾上傳至虛擬機得到最終的目錄結構
cloud-demo
- gateway- app.jar- Dockerfile.yml
- order-service- app.jar- Dockerfile.yml
- user-service- app.jar- Dockerfile.yml
- mysql- data- conf
- docker-compose.yml
第六步: 執行docker-compose up -d
命令部署項目,docker-compose logs -f
查看日志
- nacos連接失敗是由于nacos啟動較慢,userservice在nacos之前啟動會導致userservice注冊失敗
# 后臺創建鏡像部署容器
docker-compose up -d# 查看日志發現阿里巴巴nacos連接失敗
docker-compose logs -f
com.alibaba.nacos.api.exception.NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([nacos:8848]) tried: java.net.ConnectException: Connection refused (Connection refused)# 建議nacos單獨先啟動其他服務后啟動,此時可以重啟gateway userservice orderservice服務
docker-compose restart gateway userservice orderserivce # 再次查看查看userservice啟動日志
docker-compose logs -f userservice
第七步: 打開瀏覽器訪問http://虛擬機IP地址/user/1?authorization=admin查看數據