Docker Compose使用

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 的主要優勢包括:

  1. 簡化容器編排: Compose 允許你在單個配置文件中定義整個應用程序棧,包括不同的服務、網絡和存儲卷等。這大大簡化了容器編排的復雜性。
  2. 一致的開發環境: Compose 確保開發、測試和生產環境的一致性,因為所有環境都使用相同的 Compose 文件。
  3. 快速部署: Compose 可以一次性啟動應用程序的所有服務,大大加快了部署速度。
  4. 擴展性: Compose 允許你輕松地擴展應用程序的任何服務。

使用 Docker Compose 的一般流程如下:

  1. 創建一個 docker-compose.yml 文件,定義應用程序的服務。
  2. 在終端中運行 docker-compose up 命令來啟動應用程序。
  3. 運行 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

這個命令會:

  1. 使用 curl 命令從 GitHub 上下載最新版本的 Docker Compose 文件。
  2. 將文件保存到 /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)

  1. 服務 (Services): Docker Compose 的基本構建塊是服務。一個服務代表一個 Docker 容器,可以包含應用程序、數據庫、消息隊列等組件。每個服務都有自己的配置,如鏡像、端口映射、環境變量等。
  2. 配置文件 (docker-compose.yml): 所有的 Compose 配置都定義在一個 YAML 格式的配置文件中,通常命名為 docker-compose.yml。該文件描述了整個應用程序的結構,包括各個服務、網絡和卷的定義。
  3. 工程 (project):在 Docker Compose 中,Project 表示一組相關的服務,它們會被一起管理和部署。docker-compose.yml 文件定義了 Project 中的所有服務、網絡和卷,同一個 Project 可以包含多個 docker-compose.yml 文件,比如一個用于開發環境、一個用于生產環境。
  4. 網絡 (Networks): Docker Compose 可以自動創建并管理容器之間的網絡連接。你可以為不同的服務指定不同的網絡,實現容器之間的隔離和通信。
  5. 卷 (Volumes): Compose 可以管理持久化數據存儲,包括創建和掛載卷。這樣可以確保數據在容器重啟或刪除后不會丟失。
  6. 命令行工具 (docker-compose): Compose 提供了一個命令行工具 docker-compose,可用于管理整個應用程序的生命周期,包括構建、啟動、停止、查看日志等操作。
  7. 擴展性 (Scaling): Compose 支持輕松地水平擴展服務實例的數量,可以根據需求動態增加或減少容器的數量。
  8. 依賴管理: Compose 會自動處理服務之間的依賴關系,確保先啟動依賴服務再啟動被依賴服務。

總的來說,Docker Compose 提供了一種聲明式的方式來定義和管理整個應用程序的基礎設施,使得應用程序的部署和擴展變得更加簡單和高效。


使用步驟

  1. 編寫Dockerfile定義各個微服務應用并構建出對應的鏡像文件。
  2. 使用docker-compose.yml定義一個完整業務單元,安排好整體應用中的各個容器服務。
  3. 最后,執行docker-compose up命令來啟動并運行整個應用程序,完成一鍵部署上線。

常用的命令

Docker Compose 提供了一系列常用的命令,下面是一些常用的命令及其用途:

  1. docker-compose up

    • 啟動并運行整個應用程序
    • 可以使用 -d 參數在后臺運行
    • 如果鏡像不存在,會自動構建

  2. docker-compose down

    • 停止并刪除整個應用程序
    • 包括容器、網絡和卷


  3. docker-compose ps

    列出當前 Project 中正在運行的容器


  4. docker-compose build

    構建或重新構建服務的鏡像


  1. docker-compose start/stop/restart

    分別啟動、停止或重啟整個應用程序

  2. docker-compose logs 服務id

    查看應用程序的日志輸出,可以使用 -f 參數實時查看日志



  3. docker-compose exec 服務id

    進入正在運行的容器內部,可以在容器內部執行命令


  4. docker-compose config

    驗證并查看 docker-compose.yml 文件的配置

    docker-compose config -q: 檢查配置,只是在出現問題時才會輸出信息


  5. docker-compose pull

    拉取服務所需的鏡像


  6. 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

數據庫datasourceurl處使用編排文件的服務名,eurekaservice-urldefaultZone用編排文件中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中

image-20240518223908364

或者直接虛擬機里看:

image-20240518224000097

執行8001的controller,插入數據

image-20240518224101215

image-20240518224139541

驗證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> 

然后虛擬機中請求:

image-20240518224358216

再查看redis:

image-20240518224509531



注意點

如果遇到問題需要重新編排,或者修改了微服務的yaml配置或代碼,要記得將鏡像與容器一并刪除,在重新編排。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15869.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15869.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15869.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

P4097 【模板】李超線段樹 / [HEOI2013] Segment 題解

題意 有一個平面直角坐標系&#xff0c;總共 n n n 個操作&#xff0c;每個操作有兩種&#xff1a; 給定正整數 x 0 , y 0 , x 1 , y 1 x_0,y_0,x_1,y_1 x0?,y0?,x1?,y1? 表示一條線段的兩個端點。你需要在平面上加入這一條線段&#xff0c;第 i i i 條被插入的線段的標…

Photoshop插件(UXP)編寫過程中,如何更新sp-checkbox的選中狀態

?問題說明 sp-checkbox是uxpSpectrum UXP Widgets下的一個小組件&#xff0c;內置樣式大概是這樣&#xff1a; 那么&#xff0c;如果用js動態的改變選中的狀態&#xff0c;應該如何做呢&#xff1f; 如果直接是html來寫&#xff1a; <sp-checkbox checked>Checked<…

特斯拉FSD的「端到端」到底能不能成?

引言 近年來&#xff0c;特斯拉的全自動駕駛&#xff08;Full Self-Driving&#xff0c;FSD&#xff09;技術備受關注&#xff0c;尤其是其「端到端」的AI軟件框架更是引發了廣泛討論。端到端技術到底是一條正確的路徑嗎&#xff1f;它能否真正實現完全自動駕駛&#xff1f;本…

LangChain 0.2 - 矢量存儲和檢索器

本文翻譯整理自&#xff1a;Vector stores and retrievers https://python.langchain.com/v0.2/docs/tutorials/retrievers/ 文章目錄 一、說明概念 二、文件三、Vector stores示例 四、Retrievers五、了解更多 一、說明 本教程將讓您熟悉 LangChain 的向量存儲和檢索器抽象。…

大語言模型LLM 相關知識匯總

大型語言模型&#xff08;LLM&#xff09;在設計和應用時需要遵守一系列的道德和法律標準&#xff0c;以確保不會輸出不當內容。以下是一些LLM通常不應該對外輸出的內容類型&#xff1a; 個人隱私信息&#xff1a;包括但不限于個人身份信息&#xff08;PII&#xff09;&#x…

Echarts 實現將X軸放在圖表頂部并且自動播放展示提示信息內容

文章目錄 需求分析效果預覽需求 如下圖所示,實現柱狀圖中反轉倒著繪制 分析 使用 ECharts 來實現對 Y 軸的倒序排序時,可以通過設置 yAxis 的 inverse 屬性為 true 來實現。以下是一個簡單的示例,演示了如何使用 ECharts 來創建一個柱狀圖,并將 Y 軸進行倒序排序:并且…

前綴和算法:提升編程效率的秘密武器(Java版)

本篇會加入個人的所謂魚式瘋言 ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 小編會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能說的不是那么嚴謹.但小編初心是能讓更多人能接…

代碼審計--一道簡單的文件包含題目的多種利用方式

NO.1 傳統方法 首先來看下代碼 <?php error_reporting(0); if(isset($_GET["file"])){include($_GET["file"]); }else{highlight_file(__FILE__);phpinfo(); } ?>看完代碼后再來學習學習函數吧&#xff0c;畢竟菜啊&#xff01;&#xff01;&…

IronPython和C#交互

在C#環境中動態調用IronPython腳本&#xff0c;可以通過以下步驟實現&#xff1a; 安裝IronPython: 首先&#xff0c;確保你的項目中已經安裝了IronPython。可以通過NuGet包管理器來安裝IronPython。 創建IronPython運行環境: 在C#代碼中&#xff0c;你需要創建一個ScriptEngi…

NASA數據集——阿爾法噴氣式大氣實驗甲醛(HCHO)數據

Alpha Jet Atmospheric eXperiment Formaldehyde Data 簡介 阿爾法噴氣式大氣實驗甲醛數據 阿爾法噴氣式大氣實驗&#xff08;AJAX&#xff09;是美國國家航空航天局艾姆斯研究中心與 H211, L.L.C. 公司的合作項目&#xff0c;旨在促進對加利福尼亞、內華達和太平洋沿岸地區的…

【NOIP2014普及組復賽】題4:子矩陣

題3&#xff1a;子矩陣 【題目描述】 給出如下定義&#xff1a; 1.子矩陣&#xff1a;從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣&#xff08;保持行與列的相對順序&#xff09;被稱為原矩陣的一個子矩陣。 例如&#xff0c;下面左圖中選取第 2 、 4 2、4 2、…

vue項目中使用json編輯器

實現效果&#xff1a; 借助插件json-editor-vue3實現效果如圖一&#xff0c;如果嫌丑可以通過類名改一下樣式如圖二。 實現過程&#xff1a; 安裝插件&#xff1a;npm install json-editor-vue3 文檔鏈接&#xff1a;GitCode - 開發者的代碼家園 <script setup name&quo…

Golang發送POST請求并傳遞JSON數據

客戶端 package mainimport ("c02_get_param/common""fmt""zdpgo_resty" )func main() {// Create a Resty Clientclient : zdpgo_resty.New()// 設置字符串resp, err : client.R().SetHeader("Content-Type", "application/jso…

AcWing 3466. 清點代碼庫(STL:map,vector)

3466. 清點代碼庫 需要求有幾種不同數列&#xff0c;每種有多少個&#xff0c;可以想到用map。它的鍵是一個數列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要滿足要求的輸出序列&#xff0c;就要想把它放在其他容器&#xff0c;或數組里&…

mac清理緩存的命令

mac清理緩存的命令 在macOS中&#xff0c;你可以使用以下命令來清理緩存&#xff1a; 清理DNS緩存&#xff1a; sudo killall -HUP mDNSResponder 清理Metal緩存&#xff1a; mkdir ~/Library/Caches/com.apple.Metal 清理文件系統元數據緩存&#xff1a; sudo find /private/…

Vite + Vue3 部署 GitHub

因為靜態資源是可以部署到 GitHub 上&#xff0c;自己順便學習部署網站 因為我使用的是 Vite 工具&#xff0c;官方有提供相應 Demo 部署靜態站點 | Vite 官方中文文檔 新建文件夾 .github 然后再建一個文件夾 workflows 新建文件 main.yml 文件 直接使用官方文檔 demo #…

什么是spring 的組件掃描?

Spring的組件掃描&#xff08;Component Scanning&#xff09;是Spring框架提供的一種機制&#xff0c;用于自動尋找和注冊應用程序中的組件&#xff0c;進而減少顯式的配置。這些組件通常是標有特定注解&#xff08;如Component, Service, Repository, Controller等&#xff0…

如何處理時間序列的缺失數據

您是否應該刪除、插入或估算&#xff1f; 世界上沒有完美的數據集。每個數據科學家在數據探索過程中都會有這樣的感覺&#xff1a; df.info()看到類似這樣的內容&#xff1a; 大多數 ML 模型無法處理 NaN 或空值&#xff0c;因此如果您的特征或目標包含這些值&#xff0c;則在…

Java-MySql:JDBC

目錄 JDBC概述 JDBC搭建 1、導入mysql開發商提供的jar包 2、注冊驅動 3、與數據庫連接 注解&#xff1a; Statement&#xff1a; 代碼 運行 PreparedStatement&#xff1a; 代碼 運行 PreparedStatement和Statement Statement 增 代碼 運行 刪 代碼 運…

九、圖形化腳本

多年來&#xff0c; shell腳本一直都被認為是枯燥乏味的。但如果你準備在圖形化環境中運行腳本時&#xff0c;就未必如此了。有很多與腳本用戶交互的方式并不依賴read和echo語句。 9.1 創建文本菜單 創建交互式shell腳本最常用的方法是使用菜單。提供各種選項可以幫助腳本用戶…