Docker-Compose是什么
docker建議我們每一個容器中只運行一個服務,因為doker容器本身占用資源極少,所以最好是將每個服務單獨分割開來,但是這樣我們又面臨了一個問題:
如果我需要同時部署好多個服務,難道要每個服務單獨寫Dockerfile然后在構建鏡像,構建容器,這樣累都累死了,所以docker官方給我們提供了docker-compose多服務部署的工具。
例如要實現一個Web微服務項目,除了Web服務容器本身,往往還需要再加上后端的數據庫mysqI服務容器,redis服務容器,注冊中心naocs,甚至還包括負載均衡容器等等。。。
Compose允許用戶通過一個單獨的docker-compose.yml
模板文件(YAML 格式)來定義一組相關聯的應用容器為一個項目(project),
可以很容易地用一個配置文件定義一個多容器的應用,然后使用一條指令安裝這個應用的所有依賴,完成構建。Docker-Compose
解決了容器與容器之間如何管理編排的問題。
Docker Compose 是一個用于定義和運行多容器 Docker 應用程序的工具。它使用一個 YAML 文件來配置應用程序的服務,然后使用一個單一的命令部署和啟動應用程序的全部服務。
使用 Docker Compose
的主要優勢包括:
- 簡化容器編排: Compose 允許你在單個配置文件中定義整個應用程序棧,包括不同的服務、網絡和存儲卷等。這大大簡化了容器編排的復雜性。
- 一致的開發環境: Compose 確保開發、測試和生產環境的一致性,因為所有環境都使用相同的 Compose 文件。
- 快速部署: Compose 可以一次性啟動應用程序的所有服務,大大加快了部署速度。
- 擴展性: Compose 允許你輕松地擴展應用程序的任何服務。
使用 Docker Compose 的一般流程如下:
- 創建一個
docker-compose.yml
文件,定義應用程序的服務。 - 在終端中運行
docker-compose up
命令來啟動應用程序。 - 運行
docker-compose down
命令來停止并刪除容器。
Compose 支持多種配置選項,例如指定服務的鏡像、端口映射、環境變量、依賴關系等。這使得管理復雜的多容器應用程序變得更加簡單和高效。
下載安裝
如果你的網很慢,訪問不了外網,可以去這里的百度盤直接下載,也包括下面微服務用到的jar包
鏈接:https://pan.baidu.com/s/1LcwN-LbfKt10ul8d9_-sCA
提取碼:wzyy
官網地址
https://docs.docker.com/compose/
在 CentOS 下下載最新版本的 Docker Compose 文件,可以使用以下命令:
curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
這個命令會:
- 使用
curl
命令從 GitHub 上下載最新版本的 Docker Compose 文件。 - 將文件保存到
/usr/local/bin/docker-compose
目錄下。
下載完成后,還需要執行以下命令來賦予可執行權限:
chmod +x /usr/local/bin/docker-compose
這樣就可以在 CentOS 系統上使用 docker-compose
命令了。
如果你想確認當前安裝的 Docker Compose 版本,可以執行以下命令:
docker-compose --version
這將顯示已安裝的 Docker Compose 版本信息。
需要注意的是,這個命令下載的是最新版本的 Docker Compose。如果你需要使用特定版本,可以在下載鏈接中指定版本號,例如:
curl -L https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
這將下載 v2.17.3 版本的 Docker Compose。
執行上述命令
[root@localhost ~]# curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 00 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
100 60.0M 100 60.0M 0 0 156k 0 0:06:33 0:06:33 --:--:-- 570k
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose --version
Docker Compose version v2.27.0
[root@localhost ~]#
如果想要卸載,執行
rm /usr/local/bin/docker-compose
核心概念
Docker Compose 的核心概念包括以下幾點,其中最重要的是
服務
、配置文件
和工程
。可以理解為:通過配置文件 (
docker-compose.yml
),將多個服務 (Services
),組合成一個工程 (project
) 。
- 服務 (
Services
): Docker Compose 的基本構建塊是服務。一個服務代表一個 Docker 容器,可以包含應用程序、數據庫、消息隊列等組件。每個服務都有自己的配置,如鏡像、端口映射、環境變量等。 - 配置文件 (
docker-compose.yml
): 所有的 Compose 配置都定義在一個 YAML 格式的配置文件中,通常命名為docker-compose.yml
。該文件描述了整個應用程序的結構,包括各個服務、網絡和卷的定義。 - 工程 (
project
):在 Docker Compose 中,Project 表示一組相關的服務,它們會被一起管理和部署。docker-compose.yml
文件定義了 Project 中的所有服務、網絡和卷,同一個 Project 可以包含多個 docker-compose.yml 文件,比如一個用于開發環境、一個用于生產環境。 - 網絡 (Networks): Docker Compose 可以自動創建并管理容器之間的網絡連接。你可以為不同的服務指定不同的網絡,實現容器之間的隔離和通信。
- 卷 (Volumes): Compose 可以管理持久化數據存儲,包括創建和掛載卷。這樣可以確保數據在容器重啟或刪除后不會丟失。
- 命令行工具 (docker-compose): Compose 提供了一個命令行工具
docker-compose
,可用于管理整個應用程序的生命周期,包括構建、啟動、停止、查看日志等操作。 - 擴展性 (Scaling): Compose 支持輕松地水平擴展服務實例的數量,可以根據需求動態增加或減少容器的數量。
- 依賴管理: Compose 會自動處理服務之間的依賴關系,確保先啟動依賴服務再啟動被依賴服務。
總的來說,Docker Compose 提供了一種聲明式的方式來定義和管理整個應用程序的基礎設施,使得應用程序的部署和擴展變得更加簡單和高效。
使用步驟
- 編寫
Dockerfile
定義各個微服務應用并構建出對應的鏡像文件。 - 使用
docker-compose.yml
定義一個完整業務單元,安排好整體應用中的各個容器服務。 - 最后,執行
docker-compose up
命令來啟動并運行整個應用程序,完成一鍵部署上線。
常用的命令
Docker Compose 提供了一系列常用的命令,下面是一些常用的命令及其用途:
-
docker-compose up
- 啟動并運行整個應用程序
- 可以使用
-d
參數在后臺運行 - 如果鏡像不存在,會自動構建
-
docker-compose down
- 停止并刪除整個應用程序
- 包括容器、網絡和卷
-
docker-compose ps
列出當前 Project 中正在運行的容器
-
docker-compose build
構建或重新構建服務的鏡像
-
docker-compose start/stop/restart
分別啟動、停止或重啟整個應用程序
-
docker-compose logs 服務id
查看應用程序的日志輸出,可以使用
-f
參數實時查看日志
-
docker-compose exec 服務id
進入正在運行的容器內部,可以在容器內部執行命令
-
docker-compose config
驗證并查看
docker-compose.yml
文件的配置docker-compose config -q: 檢查配置,只是在出現問題時才會輸出信息
-
docker-compose pull:
拉取服務所需的鏡像
-
docker-compose scale
動態調整某個服務的容器數量
這些只是 Docker Compose 最常用的一些命令,實際上 Compose 還有更多功能和命令可供使用。
編寫配置文件
寫一個docker-compose.yml,并進行服務編排
要確保下面配置中,所有的volumes:
下面的掛載點目錄已存在,不存在要先創建
(注意:目前新版的docker-compose默認可以不用寫version
了)
services:#自定義的服務名,必須小寫eureka7001:#指定dockerfile來構建鏡像并運行實例,context用來指定Dockerfile所在的目錄build:context: /wzy/cloud-images/eurekadockerfile: Dockerfile#image: eureka_docker:1.0 #如果有現成的鏡像,可以在這里指定,直接用來運行容器,使用此項要注釋掉build及其內容#container_name: eureka01 指定容器的名字,如果不指定,會由docker自動生成ports:- "7001:7001"#掛載容器卷 volumes:- /wzy/eurekaService:/data #指定使用的網絡,所有服務的網絡一致,即可以使用服務名通信忽略ip地址 networks:- wzy_net#自定義的服務名,必須小寫payment8001:build:context: /wzy/cloud-images/pay8001dockerfile: Dockerfile #image: payment01_docker:1.0#container_name: payment01ports:- "8001:8001"volumes:- /wzy/paymentMysqlService:/data networks:- wzy_net#指定本服務依賴的服務,會等依賴的服務運行后在運行本服務 depends_on:- eureka7001 - mysql #自定義的服務名,必須小寫 payment8002:build:context: /wzy/cloud-images/pay8002dockerfile: Dockerfile #image: payment02_docker:1.0#container_name: payment02ports:- "8002:8002"volumes:- /wzy/paymentRedisService:/data networks:- wzy_netdepends_on:- eureka7001- redis #自定義的服務名,必須小寫,也可以叫別的,springboot服務可以在yaml中將redis的ip換成這個名字 redis:image: redis:6.2.6ports:- "6379:6379"volumes:- /wzy/redis/redis.conf:/etc/redis/redis.conf- /wzy/redis/data:/data networks:- wzy_net#運行指令 command: redis-server /etc/redis/redis.conf #自定義的服務名,必須小寫,也可以叫別的,springboot服務可以在yaml中將redis的ip換成這個名字 mysql:image: mysql:latest#環境參數配置environment:#注意這里的密碼要和微服務連接mysql的配置對應上MYSQL_ROOT_PASSWORD: '123456'MYSQL_ALLOW_EMPTY_PASSWORD: 'NO'MYSQL_DATABASE: 'mybatis-plus'MYSQL_USER: 'wzy'MYSQL_PASSWORD: '123456'ports:- "3306:3306"volumes: - /wzy/mysql/log:/var/log/mysql- /wzy/mysql/data:/var/lib/mysql- /wzy/mysql/conf:/etc/mysql/conf.dnetworks:- wzy_netcommand: --default-authentication-plugin=mysql_native_password #解決外部無法訪問#創建網絡
networks:wzy_net:
微服務展示
除了docker中的redis及mysql之外,這里還用了三個springcloud服務做演示:
- mysql的微服務實現向mysql數據庫插入數據
- redis的微服務實現向redis插入數據
- eureka中會注冊上面兩個微服務
eureka的服務
主要展示配置文件,代碼就不展示了,需要的話去上面的下載安裝標題處提取
主要是hostname
,這里寫成了eureka7001
,就是上面編排文件的eureka的服務名,因為配置網絡后可以直接忽略ip使用服務名,可以解決網絡ip變動服務通信失敗問題
server:port: 7001eureka:instance:#用docker服務名,不用iphostname: eureka7001client:#表示是否將自己注冊進eureka,本moudle本身就是注冊中心,不需要注冊register-with-eureka: false#表示自己就是注冊中心,維護服務實例,其他服務要注冊到本moudle中fetch-registry: false#設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址service-url:#defaultZone: http://erueka7002.com:7002/eureka #集群配置指向另一個服務注冊中心defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #單機配置#Eureka自我保護模式:當微服務在默認90秒內不發送心跳給eureka注冊中心后,不會立刻抹除微服務得信息server:enable-self-preservation: false #禁用自我保護eviction-interval-timer-in-ms: 5000 #毫秒,設置多少毫秒微服務不可用就剔除
mysql的微服務
sql
代碼中要用到的表
CREATE TABLE `number_test` (`one` int NOT NULL,`two` varchar(255) DEFAULT NULL,`three` varchar(255) DEFAULT NULL,`four` varchar(255) DEFAULT NULL,PRIMARY KEY (`one`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
ymal
數據庫
datasource
的url
處使用編排文件的服務名,eureka
的service-url
的defaultZone
用編排文件中erueka注冊中心的服務名
server:port: 8001spring:application:name: cloud-payment-servicedatasource:driver-class-name: com.mysql.cj.jdbc.Driver#mysql:3306,使用docker服務名,不用ipurl: jdbc:mysql://mysql:3306/mybatis-plus?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8username: wzypassword: 123456mybatis-plus:mapper-locations: classpath:/mapper/*Mapper.xmleureka:client:#表示是否將自己注冊進eurekaregister-with-eureka: true#是否從eurekaServer抓取已有注冊信息,默認為true。單點無所謂,集群必須設置true才能配合Ribbon使用負載均衡fetchRegistry: true#入駐的eureka服務地址service-url:#############使用docker服務名,不用ip#############defaultZone: http://eureka7001:7001/eureka #單機版#defaultZone: http://erueka7001.com:7001/eureka,http://erueka7002.com:7002/eureka #集群版#配置eureka前臺界面服務名字的status名字顯示instance:instance-id: payment8001prefer-ip-address: true #訪問路徑可以顯示ip地址#Eureka客戶端向服務端發送心跳的時間間隔,單位秒lease-renewal-interval-in-seconds: 10#Eureka服務端在收到最后一次心跳后等待時間上限,單位秒(默認是90秒),超時將認為服務不可用lease-expiration-duration-in-seconds: 20
Controller
@RestController
@RequestMapping("ntest")
public class NumberTestController {@Autowiredprivate NumberTestService numberTestService;@GetMapping("save")public boolean insertTest(){NumberTest test = new NumberTest();test.setOne(1);test.setTwo("2");test.setThree("3");test.setFour("4");return numberTestService.save(test);}}
訪問地址
http://localhost:8001/ntest/save
redis的微服務
yaml
host
處使用編排redis的服務名,因為本微服務要連接docker的redis容器
server:port: 8002spring:application:name: cloud-payment-serviceredis:#使用docker服務名,不用iphost: redisport: 6379lettuce:shutdown-timeout: 0 # 連接超時時間(毫秒)pool:max-active: 8max-wait: -1max-idle: 500min-idle: 0eureka:client:#表示是否將自己注冊進eurekaregister-with-eureka: true#是否從eurekaServer抓取已有注冊信息,默認為true。單點無所謂,集群必須設置true才能配合Ribbon使用負載均衡fetchRegistry: true#入駐的eureka服務地址service-url:#############使用docker服務名,不用ip#############defaultZone: http://eureka7001:7001/eureka #單機版#defaultZone: http://erueka7001.com:7001/eureka,http://erueka7002.com:7002/eureka #集群版#配置eureka前臺界面服務名字的status名字顯示instance:instance-id: payment8002prefer-ip-address: true #訪問路徑可以顯示ip地址
config
/*** SpringBoot自動幫我們在容器中生成了一個RedisTemplate和一個StringRedisTemplate。* 但是,這個RedisTemplate的泛型是<Object,Object>,寫代碼不方便,需要寫好多類型轉換的代碼;* 我們需要一個泛型為<String,Object>形式的RedisTemplate。* 并且,這個默認的RedisTemplate沒有設置數據存在Redis時,key及value的序列化方式。如果不序列化,寫入redis會報錯** */
@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式,此處為除hash外其他的類型全部做設置template.setKeySerializer(stringRedisSerializer);// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);// value序列化方式采用jacksontemplate.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}
}
controller
@RestController
@RequestMapping("payment")
public class payment {@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("/redis")public void setCacheObject() {redisTemplate.opsForValue().set("test-key", "test-value");}
}
訪問地址
http://localhost:8002/payment/redis
編寫Dockerfile
沒有寫mysql與redis的Dockerfile,因為如果本地沒有鏡像會自動拉取,我這里復用了以前的鏡像,詳細安裝請參考本專欄的docker安裝應用部分:
https://blog.csdn.net/onePlus5T/article/details/139102535
構建eureka的Dockerfile,連同jar包放入編排文件指定的/wzy/cloud-images/eureka目錄中
#基礎鏡像使用java
FROM java:8#作者
MAINTAINER wzy#VOLUME指定臨時文件目錄為/tmp,在主機/var/lib/docker目錄下創建了一個臨時文件并鏈接到容器的/tmp
VOLUME /tmp#將jar包添加到容器中并更名為wzy_eureka.jar
ADD cloud-eureka-server-1.0-SNAPSHOT.jar wzy_eureka.jar# 運行jar包
RUN bash -c 'touch /wzy_eureka.jar'
ENTRYPOINT ["java","-jar","/wzy_eureka.jar"]#暴露7001端口,因為上面的代碼的端口也是7001
EXPOSE 7001
構建mysql微服務-8001的Dockerfile,連同jar包放入編排文件指定的/wzy/cloud-images/pay8001目錄中
#基礎鏡像使用java
FROM java:8#作者
MAINTAINER wzy#VOLUME指定臨時文件目錄為/tmp,在主機/var/lib/docker目錄下創建了一個臨時文件并鏈接到容器的/tmp
VOLUME /tmp#將jar包添加到容器中并更名為wzy_payment8001.jar
ADD cloud-provider-payment8001-1.0-SNAPSHOT.jar wzy_payment8001.jar# 運行jar包
RUN bash -c 'touch /wzy_payment8001.jar'
ENTRYPOINT ["java","-jar","/wzy_payment8001.jar"]#暴露8001端口,因為上面的代碼的端口也是8001
EXPOSE 8001
構建redis微服務-8002的Dockerfile,連同jar包放入編排文件指定的/wzy/cloud-images/pay8002目錄中
#基礎鏡像使用java
FROM java:8#作者
MAINTAINER wzy#VOLUME指定臨時文件目錄為/tmp,在主機/var/lib/docker目錄下創建了一個臨時文件并鏈接到容器的/tmp
VOLUME /tmp#將jar包添加到容器中并更名為wzy_payment8002.jar
ADD cloud-provider-payment8002-1.0-SNAPSHOT.jar wzy_payment8002.jar# 運行jar包
RUN bash -c 'touch /wzy_payment8002.jar'
ENTRYPOINT ["java","-jar","/wzy_payment8002.jar"]#暴露8002端口,因為上面的代碼的端口也是8002
EXPOSE 8002
運行編排
無論將 docker-compose.yml 文件放在哪里,只要確保在執行 Docker Compose 命令時,能正確地指定 Compose 文件的路徑即可。比如:
docker-compose -f /wzy/docker-compose.yml up -d
再執行前,可以檢查編排配置文件是否有問題,如果執行如下命令沒有如何輸出,就是沒問題 (這里建議先去yaml在線格式化網站校驗一下):
docker-compose config -q
這里建議將docker相關內容進行統一存放,我就是存放在了wzy的路徑,直接運行:
[root@localhost wzy]# docker-compose config -q
[root@localhost wzy]# docker-compose -f /wzy/docker-compose.yml up -d
[+] Building 35.9s (20/20) FINISHED docker:default=> [eureka7001 internal] load build definition from Dockerfile 0.1s=> => transferring dockerfile: 579B 0.0s=> [payment8002 internal] load metadata for docker.io/library/java:8 30.8s=> [eureka7001 internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [eureka7001 internal] load build context 0.3s=> => transferring context: 48.86MB 0.3s=> CACHED [payment8002 1/3] FROM docker.io/library/java:8@sha256:c1ff613e8ba258 0.0s=> [eureka7001 2/3] ADD cloud-eureka-server-1.0-SNAPSHOT.jar wzy_eureka.jar 0.3s=> [eureka7001 3/3] RUN bash -c 'touch /wzy_eureka.jar' 1.0s=> [eureka7001] exporting to image 0.2s=> => exporting layers 0.2s=> => writing image sha256:7927120cce252cd5db9ac32eca62c814f6f9005029a9585b9927 0.0s=> => naming to docker.io/library/wzy-eureka7001 0.0s=> [payment8001 internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 606B 0.0s=> [payment8002 internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 606B 0.0s=> [payment8002 internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [payment8001 internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [payment8001 internal] load build context 0.5s=> => transferring context: 66.18MB 0.5s=> [payment8002 internal] load build context 0.5s=> => transferring context: 60.94MB 0.5s=> [payment8001 2/3] ADD cloud-provider-payment8001-1.0-SNAPSHOT.jar wzy_paymen 0.5s=> [payment8002 2/3] ADD cloud-provider-payment8002-1.0-SNAPSHOT.jar wzy_paymen 0.6s=> [payment8001 3/3] RUN bash -c 'touch /wzy_payment8001.jar' 0.9s=> [payment8002 3/3] RUN bash -c 'touch /wzy_payment8002.jar' 0.7s=> [payment8001] exporting to image 0.3s=> => exporting layers 0.3s=> => writing image sha256:983970a54834e6e04ad037f12e5623fd43fc270d5358173ab8a9 0.0s=> => naming to docker.io/library/wzy-payment8001 0.0s=> [payment8002] exporting to image 0.3s=> => exporting layers 0.3s=> => writing image sha256:f9ba7c533f0efb7138d0906c10c26a66b4bd3bb73d79317dbd8d 0.0s=> => naming to docker.io/library/wzy-payment8002 0.0s
[+] Running 6/6? Network wzy_wzy_net Created 0.9s ? Container wzy-eureka7001-1 Started 1.2s ? Container wzy-redis-1 Started 1.5s ? Container wzy-mysql-1 Started 1.6s ? Container wzy-payment8001-1 Started 4.7s ? Container wzy-payment8002-1 Started
[root@localhost wzy]#
以上全部Started就是成功。
注意:上面編排后生成的名字有一些變化,比如redis服務名變成了wzy-redis-1,這是在沒有指定名字的情況下docker自己加的,并不影響使用
建表
這時,mysql會根據編排文件自動建立mybatis-plus庫,但并不會自動建表:
[root@localhost wzy]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afe3ca78cc28 wzy-payment8002 "java -jar /wzy_paym…" 8 seconds ago Up 4 seconds 0.0.0.0:8002->8002/tcp, :::8002->8002/tcp wzy-payment8002-1
6e169d6e50de wzy-payment8001 "java -jar /wzy_paym…" 8 seconds ago Up 4 seconds 0.0.0.0:8001->8001/tcp, :::8001->8001/tcp wzy-payment8001-1
490549ec53e8 wzy-eureka7001 "java -jar /wzy_eure…" 8 seconds ago Up 6 seconds 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp wzy-eureka7001-1
2d9e86240ee2 mysql:latest "docker-entrypoint.s…" 20 hours ago Up 6 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp wzy-mysql-1
d8f5e56fde6d redis:6.2.6 "docker-entrypoint.s…" 20 hours ago Up 6 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp wzy-redis-1
[root@localhost wzy]# docker exec -it 2d9e86240ee2 /bin/bash
root@2d9e86240ee2:/# mysql -u wzy -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mybatis-plus |
+--------------------+
2 rows in set (0.01 sec)mysql> use mybatis-plus;
Database changed
mysql> select * from number_test;
ERROR 1146 (42S02): Table 'mybatis-plus.number_test' doesn't exist
mysql>
我們需要手動建表,不然8001服務執行新增會報錯:
mysql> CREATE TABLE `number_test` (-> `one` int NOT NULL,-> `two` varchar(255) DEFAULT NULL,-> `three` varchar(255) DEFAULT NULL,-> `four` varchar(255) DEFAULT NULL,-> PRIMARY KEY (`one`)-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Query OK, 0 rows affected (0.05 sec)mysql> select * from number_test;
Empty set (0.10 sec)mysql>
驗證
宿主機直接訪問我的虛擬機erueka,可以看到有應用列表有8001與8002,二者成功注冊到eureka中
或者直接虛擬機里看:
執行8001的controller,插入數據
驗證8002-redis服務
先看所有的key,這是沒有:
[root@localhost wzy]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0bb97a880a91 wzy-payment8001 "java -jar /wzy_paym…" 22 minutes ago Up 22 minutes 0.0.0.0:8001->8001/tcp, :::8001->8001/tcp wzy-payment8001-1
918f761ead06 wzy-payment8002 "java -jar /wzy_paym…" 22 minutes ago Up 22 minutes 0.0.0.0:8002->8002/tcp, :::8002->8002/tcp wzy-payment8002-1
2d9e86240ee2 mysql:latest "docker-entrypoint.s…" 22 minutes ago Up 22 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp wzy-mysql-1
d8f5e56fde6d redis:6.2.6 "docker-entrypoint.s…" 22 minutes ago Up 22 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp wzy-redis-1
240276cd95f1 wzy-eureka7001 "java -jar /wzy_eure…" 22 minutes ago Up 22 minutes 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp wzy-eureka7001-1[root@localhost wzy]# docker exec -it d8f5e56fde6d /bin/bash
root@d8f5e56fde6d:/data# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
然后虛擬機中請求:
再查看redis:
注意點
如果遇到問題需要重新編排,或者修改了微服務的yaml配置或代碼,要記得將鏡像與容器一并刪除,在重新編排。