Docker Compose快速部署多容器服務實戰(zhàn)的實例詳解
1 什么是Docker Compose
前面我們使用 Docker 的時候,定義 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服務架構的應用系統(tǒng)一般包含若干個微服務,每個微服務一般都會部署多個實例,如果每個微服務都要手動啟停,那么效率之低,維護量之大可想而知。
使用 Docker Compose 可以輕松、高效的管理容器,它是一個用于定義和運行多容器 Docker 的應用程序工具
2 安裝Docker Compose
安裝命令:
[root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose [root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# chmod +x /usr/local/bin/docker-compose
檢查是否安裝成功:
[root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# docker-compose -v
3 Docker Compose文件格式的簡單介紹
Docker Compose文件一般命名為docker-compose.yml,并且執(zhí)行Docker-compose命令時在該文件所在目錄下執(zhí)行。
Docker Compose 分為三層,分別是工程(project)、服務(service)/引用標簽、容器(container)
例如:
docker-compose.yml # 一個文件代表一個project
serveices: # 服務
container-name: # 容器
build:
- xxx:xxx
network: # 引用標簽
xxx:下面是一個標準的docker-compose.yml文件
version: "3" # 指定版本
services: # services
proxy: # 自定義容器名稱
build: ./proxy # Dockerfile所在目錄,用于構建容器
networks: # 自定義容器網(wǎng)絡
- frontend
app:
build: ./app
networks:
- frontend
- backend
db:
image: postgres
networks:
- backend
networks:
frontend:
driver: custom-driver-1
backend:
driver: custom-driver-2
driver_opts:
foo: "1"
bar: "2"4 Docker Compose常用命令
ps:列出所有運行容器
docker-compose ps
logs:查看服務日志輸出
docker-compose logs
port:打印綁定的公共端口,下面命令可以輸出 eureka 服務 8761 端口所綁定的公共端口
docker-compose port eureka 8761
build:構建或者重新構建服務
docker-compose build
start:啟動指定服務已存在的容器
docker-compose start eureka
stop:停止已運行的服務的容器
docker-compose stop eureka
rm:刪除指定服務的容器
docker-compose rm eureka
up:構建、啟動容器
docker-compose up
kill:通過發(fā)送 SIGKILL 信號來停止指定服務的容器
docker-compose kill eureka
pull:下載服務鏡像
docker-compose pull eureka
scale:設置指定服務運氣容器的個數(shù),以 service=num 形式指定
docker-compose scale user=3 movie=3
run:在一個服務上執(zhí)行一個命令
docker-compose run web bash
5 使用Docker Compose一鍵部署Spring Boot+Redis實戰(zhàn)
5.1 構建應用
5.1.1 Spring Boot項目
依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>配置文件:
spring:
redis:
#host: 127.0.0.1
host: ymx.redis
port: 6379
password:
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 500
min-idle: 0
lettuce:
shutdown-timeout: 0controller代碼:
@RestController
public class HelloController {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@RequestMapping("/hello/{id}")
public String hello(@PathVariable("id") Integer id) {
return redisTemplate.opsForValue().get(String.valueOf(id));
}
@RequestMapping("/save/{id}/{name}")
public String save(@PathVariable("id") Integer id, @PathVariable("name") String name) {
try {
redisTemplate.opsForValue().set(String.valueOf(id), "Hello " + name + "!");
} catch (Exception e) {
return "false";
}
return "success";
}5.1.2 Redis配置文件
只是將redis自帶的redis.conf做了一點修改
#注釋掉bind 127.0.0.1 # bind 127.0.0.1 -::1 #修改protected-mode yes->no protected-mode no
5.2 打包應用并構建目錄
5.2.1 打包Spring Boot項目

5.2.2 上傳redis.conf配置文件
5.2.3 目錄結構
- mycompose
- docker-compose.yml
- rd
- Dockerfile
- redis.conf
- sp
- Dockerfile
- sp_redis-0.0.1-SNAPSHOT.jar5.3 編寫Dockerfile
5.3.1 Spring Boot容器的Dockerfile
FROM java:8 MAINTAINER YMX "1712229564@qq.com" COPY sp_redis-0.0.1-SNAPSHOT.jar /root/sp_redis-0.0.1-SNAPSHOT.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar","/root/sp_redis-0.0.1-SNAPSHOT.jar"]
5.3.2 redis容器的Dockerfile
FROM redis MAINTAINER ymx 1712229564@qq.com COPY redis.conf /usr/local/etc/redis/redis.conf EXPOSE 6379 CMD ["redis-server","/usr/local/etc/redis/redis.conf" ]
5.4 編寫docker-compose.yml
version: "2.8" # 表示該 Docker-Compose 文件使用的是 Version 2 file
services:
sp-demo: # 指定服務名稱
build: ./sp # 指定 Dockerfile 所在路徑
ports: # 指定端口映射
- "9001:8080"
links:
- re-demo:ymx.redis # 進行容器鏈接
re-demo:
build: ./rd5.5 運行并測試部署結果
運行:
[root@iZ2ze4m2ri7i mycompose]# docker-compose up Creating network "mycompose_default" with the default driver Building re-demo Sending build context to Docker daemon 96.77kB Step 1/5 : FROM redis latest: Pulling from library/redis ......
測試:
[root@iZ2ze4m2ri7i mycompose]# curl http://localhost:9001/save/2/Ymx success [root@iZ2ze4m2ri7i mycompose]# curl http://localhost:9001/hello/2 Hello Ymx!
6 小總結
在Spring Boot配置文件中,redis的host沒有使用localhost或者127.0.0.1,而是使用了域名ymx.redis,這一域名在docker-compose.yml文件中進行了映射,進而Spring Boot的容器能夠鏈接到redis容器,但是這一情況依賴于一個默認條件,就是docker的網(wǎng)絡默認是橋接模式,兩個容器都在同一子網(wǎng)中,因此才能夠互相訪問。
因此,links并不是唯一的容器網(wǎng)絡解決方案,在容器較多時,需要使用networks進行網(wǎng)絡的管理。
參考文章:
https://www.jianshu.com/p/658911a8cff3
https://www.jianshu.com/p/3004fbce4d37
https://blog.csdn.net/luo15242208310/article/details/88642187
https://blog.csdn.net/qq_36781505/article/details/86612988
到此這篇關于Docker Compose快速部署多容器服務實戰(zhàn)的文章就介紹到這了,更多相關Docker Compose多容器實戰(zhàn)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
docker容器間互相訪問(docker bridge網(wǎng)絡)
本文主要介紹了docker容器間互相訪問(docker bridge網(wǎng)絡),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
docker compose自定義網(wǎng)絡實現(xiàn)固定容器ip地址
這篇文章主要介紹了docker compose自定義網(wǎng)絡實現(xiàn)固定容器ip地址,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
docker-compose集成Jenkins部署,打包,發(fā)布方式
在Docker環(huán)境中安裝配置Jenkins,需掛載JDK、Maven等至容器指定路徑,設置國內鏡像提升下載速度,并添加插件與憑據(jù)完成環(huán)境配置2024-10-10

