在上一篇文章里面我們構(gòu)建了一個(gè)eureka服務(wù)注冊(cè)中心組件坚嗜,已經(jīng)放在Docker容器中運(yùn)行践宴。
但是我們?cè)谶@里在構(gòu)建一個(gè)config配置中心服務(wù)組件哨查!
在架構(gòu)中陨囊,所有的子服務(wù)都往注冊(cè)中心進(jìn)行服務(wù)注冊(cè)弦疮。以前直接在服務(wù)器部署的時(shí)候,通過服務(wù)器地址直接進(jìn)行注冊(cè)蜘醋,比較方便胁塞。
但是放到docker容器中后,每個(gè)子服務(wù)都是一個(gè)容器堂湖,那么就涉及到了容器與容器之間的互相訪問闲先!
有兩個(gè)方法:
1.每個(gè)容器都映射宿主機(jī)器的一個(gè)端口,在部署在容器中的子服務(wù)在通過這個(gè)映射的端口進(jìn)行訪問注冊(cè)无蜂!但是不友好,因?yàn)椴⒉皇敲總€(gè)服務(wù)都需要對(duì)外暴露端口蒙谓!
2.容器與容器之間進(jìn)行關(guān)聯(lián)斥季,關(guān)聯(lián)后就可以進(jìn)行互相訪問!
這里采用第二種方式累驮,構(gòu)建一個(gè)config配置中心容器酣倾,在往容器中的eureka上進(jìn)行注冊(cè)!
查看docker容器中正在運(yùn)行的eureka
// 查詢正在運(yùn)行的容器
docker ps
輸出
C:\Users\szc>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
721961e5d932 eureka_image:0.0.1 "nohup java -jar /yu…" 3 days ago Up 33 minutes 0.0.0.0:9000->8080/tcp eureka
找打最后面的NAMES字樣谤专,值是 eureka
現(xiàn)在首先修改config配置中心項(xiàng)目中的application.yml中eureka注冊(cè)地址:
...... 省略一段配置.........
eureka:
client:
service-url:
defaultZone: http://eureka:8080/eureka/
重點(diǎn)在最后的 defaultZone: http://eureka:8080/eureka/ 中 eureka 字樣躁锡,代替了之前的服務(wù)器IP地址
然后打包config配置中心項(xiàng)目!打包成jar
構(gòu)建清單
構(gòu)建config配置中心的Dockerfile文件:
# 基礎(chǔ)鏡像
FROM java
# 鏡像構(gòu)建作者
LABEL maintainer docker_user<907147608@qq.com>
# 設(shè)置環(huán)境變量
# ENV JAVA_HOME=/xxx/xxx/jdk8
# 復(fù)制文件到目錄 <本地目錄> <容器目錄>
COPY config-server-0.0.1.jar /yunpan/smart-community/
# RUN 運(yùn)行命令, 這個(gè)命令一般用戶鏡像安裝的初始化操作置侍,就是你這個(gè)進(jìn)行需要的依賴設(shè)置
# RUN wget=http://xxx/xxx/jdk8
# CMD 命令, 如果 docker run [image] 后面沒有追加命令映之,則執(zhí)行CMD命令
# CMD nohup java -jar config-server-0.0.1.jar > eureka-sever.log &
# ENTRYPOINT 命令拦焚,此命令無論 docker run [image] 后面是否追加命令都執(zhí)行,如果有追加的命令杠输,則拼接在 ENTRYPOINT 命令的后面
ENTRYPOINT ["nohup","java", "-jar","/yunpan/smart-community/config-server-0.0.1.jar",">","config-server.log","&"]
開始構(gòu)建(在windows上構(gòu)建)
docker build -t config:0.0.1 E:\docker_worker\config
啟動(dòng)構(gòu)建成功的config
docker run -d --name config --link eureka config:0.0.1
--link 參數(shù)就是指定需要關(guān)聯(lián)哪一個(gè)容器赎败,指定的就是容器的名稱(取的是容器中的NAMES字段的值)
參數(shù)的格式為--link name: alias, 其中name是要鏈接的容器的名稱 ,alias是別名蠢甲。別名可以省略!
然后訪問eureka
http://localhost:9000/
發(fā)現(xiàn)已經(jīng)注冊(cè)成功僵刮!
探究docker可以容器之間互聯(lián)的原因:
進(jìn)入容器config配置中心容器
docker exec -it f8a1aa11f3fa bash
C:\Users\szc>docker exec -it f8a1aa11f3fa bash
root@f8a1aa11f3fa:~# tail /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
172.17.0.2 eureka 721961e5d932
172.17.0.3 f8a1aa11f3fa
root@f8a1aa11f3fa:~#
發(fā)現(xiàn)在容器中 /etc/hosts
中最后兩行:
172.17.0.2 eureka 721961e5d932
172.17.0.3 f8a1aa11f3fa
看到這個(gè)發(fā)現(xiàn)只是在/etc/hosts
中做個(gè)轉(zhuǎn)發(fā)操作!
也就是把上面在config配置中心項(xiàng)目中的application.yml文件的defaultZone: http://eureka:8080/eureka/ 中 eureka 字樣進(jìn)行了解析鹦牛!解析成defaultZone: http://172.17.0.2:8080/eureka/搞糕,這個(gè)地址也就是eureka的容器地址!