,
- 1. 需要探讨的内容
- 2. 常用指令(可略過)
- 2.1. Linux開防火牆端口
- 2.2. docker服務沒有啟動
- 3. 使用IDEA在vm docker中快速部署eureka-server
- 3.1. 虛拟機,2個
- 3.2. docker環境,配置遠端通路
- 3.3. idea,安裝docker插件
- 3.4. idea,編寫eureka-server代碼
- 3.5. idea,改寫pom複制jar包到指定目錄
- 3.6. idea,配置docker
- 3.7. idea,運作,在目标機器建構容器
- 4. 在兩個vm docker上部署sc叢集
- 4.1. docker網絡知識
- 4.2. 避坑指令 - 開docker端口
- 4.3. 建立swarm叢集
- 4.4. 建立overlay網絡
- 4.5. 部署sc服務
- 4.5.1. 部署eureka-server
- 4.5.2. 部署service-provider
- 4.5.3. 确認vm2 docker中的service-provider是否可以注冊到vm1 docker中的eureka-server
- 4.5.4. 考慮在vm1上部署一個service-consumer
- 4.6. 部署sc服務結論,swarm與overlay
1. 需要探讨的内容
- 如何在vm中部署一個springboot jar包應用
- 在vm1中部署注冊中心eureka,在vm2中部署service-provider
- 分在2個vm中的服務是否可以互相通路?
- 在vm1中部署service-consumer,來通路vm2中的service-provider
2. 常用指令(可略過)
2.1. Linux開防火牆端口
firewall-cmd --permanent --zone=public --add-port=8888/tcp
systemctl restart firewalld.service
過程中不要關閉防火牆,不然有些場景驗證不出來,待生産配置的時候會各種報錯。
2.2. docker服務沒有啟動
[[email protected] ~]# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
[[email protected] ~]# systemctl restart docker
3. 使用IDEA在vm docker中快速部署eureka-server
考慮的場景是在做原型,不是生産部署,是以暫時沒有內建工具如Jenkins。
傳統的思路,在idea裡編寫eureka server,打jar包,上傳到vm,制作鏡像、容器、啟動容器。
缺點:修改代碼、打包、上傳、制作、啟動比較繁瑣,不适合原型測試。
考慮:使用idea,一鍵将代碼打包、制作鏡像、上傳并啟動。
參考:為了解決這個問題,參考了https://www.jianshu.com/p/0dcc2e43963b 下文也會一步步來搭建環境
3.1. 虛拟機,2個
我這裡安裝的2個vm,ip位址分别是172.18.100.129和172.18.100.66,centos7
3.2. docker環境,配置遠端通路
開啟docker服務,開啟tcp端口,操作如下:
sudo vim /lib/systemd/system/docker.service
找到如下配置
ExecStart=/usr/bin/dockerd
修改為
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
重新開機docker網絡
sudo systemctl daemon-reload
sudo systemctl restart docker
測試
[[email protected] ~]# curl http://localhost:2375/verion
{"message":"page not found"}
能夠看到這個也是OK的,有的是可以看到具體的版本資訊
記得開2375端口防火牆,2個vm都要開
3.3. idea,安裝docker插件

具體的docker配置在後面,不着急配
3.4. idea,編寫eureka-server代碼
在建立eureka-server之前,有必要了解一下你要做demo的springcloud與springboot版本的關系
這裡測試,我們用的SpringCloud是Hoxton.SR5,Springboot是2.3.1.RELEASE
有一個系列文章寫的還行,比較簡潔,當比較熟練的就直接照抄:https://my.oschina.net/mdxlcj/blog/2995192
至此,相當于是普通的eureka-server工程就建立好了,下面是跟idea的docker插件結合,來實作一鍵從idea部署到vm的過程
3.5. idea,改寫pom複制jar包到指定目錄
在項目的
pom.xml
檔案中加入以下代碼:
<!--複制jar包到指定目錄-->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>gen-webadmin</id>
<phase>package</phase>
<configuration>
<tasks>
<copy todir="docker" file="target/${project.artifactId}-${project.version}.${project.packaging}" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
在項目根目錄下建立一個
docker
檔案夾,在
docker
檔案夾下建立一個
Dockerfile
檔案,寫入一下内容:
FROM java:8u111
VOLUME /tmp
ADD *.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# Ubuntu 時區
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
上面兩步的作用,就是在項目根目錄的docker檔案夾下,建立了一個Dockerfile,并且maven打包的時候會把對應的jar包複制到這個目錄下。
3.6. idea,配置docker
我們打開
settings
可以看到
docker
點選
+
,添加一個連接配接。上圖已經添加好了,如果有2台vm可以添加兩個,比如我的是Docker66和Docker129,分别對應2個vm帶上的docker服務。
然後配置
docker
啟動項
選擇編輯:
添加一個啟動項:
填寫
docker
相關的參數:
3.7. idea,運作,在目标機器建構容器
直接運作就是了,可以看到開始建構了(上一步配置docker的時候,server選到“Docker129”,代表目标容器要在129上)
去129上看一下,docker ps
[[email protected] ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f032e353cd8 d16121b844eb "java -jar /app.jar" 2 hours ago Up 2 hours 0.0.0.0:8761->8761/tcp eureka-server
至此,就可以在本地idea改代碼,直接點選debug,就可以重新生成鏡像并啟動容器~
4. 在兩個vm docker上部署sc叢集
目标:在vm1中部署注冊中心eureka,在vm2中部署service-provider
4.1. docker網絡知識
由于我們是想在vm1裡面部署eureka-server,在vm2裡面部署service-provider,那麼問題來了,service-provider是否可以注冊到eureka-server?通過什麼ip注冊?更進一步,當我們再啟動service-consumer之後,service-consumer用什麼調用service-provider?
- 這裡就是需要我們把兩個vm連接配接起來,這種連接配接的方式,簡單的說就是建構一個swarm叢集,叢集内,可以建立overlay網絡。
- swarm網絡需要選擇一個vm做manager,比如我選擇的是vm1,在上面執行建立swarm叢集的指令,并得到加入swarm網絡的指令
- 将上一步得到的“加入swarm網絡的指令”,在vm2上執行,那麼vm2就加到swarm網絡了,這樣vm1和vm2組成了一個叢集
- overlay網絡是在swarm叢集的基礎上建立出來的虛拟網絡,可以有自己的網段、網關等。
- 我們在swarm manager節點(vm1)執行建立overlay網絡的指令,那麼vm2上通過docker network ls是可以看到在vm1上建立的overlay網絡的。
建立swarm叢集,參考:https://blog.csdn.net/wangxw1803/article/details/90782463 下面也會一步步建立swarm和overlay
4.2. 避坑指令 - 開docker端口
為了下面的操作不踩坑,建議先在2個vm上執行下面的開啟防火牆端口的指令
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=4789/tcp --permanent
firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --zone=public --add-port=2375/udp --permanent
firewall-cmd --zone=public --add-port=2377/udp --permanent
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --reload
4.3. 建立swarm叢集
建立swarm叢集,參考:https://www.cnblogs.com/xiangsikai/p/9938374.html
我們選擇vm1位manager節點,在manager節點上執行
docker swarm init --advertise-addr 172.18.100.129
可以得到一串加入此swarm叢集的指令。
在worker節點上執行上述操作獲得指令。
docker swarm join --token SWMTKN-1-3emp34nuyoo2imoeh0z4n3ukgpa62l31qlmf9d2r27lol24rr9-1me1d6hjif1f3695l2ioi46ir 172.18.100.129:2377
在manager節點上檢視swarm節點情況
[[email protected] ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
dbqfnbvywasa6gl4s1nr1q921 localhost.localdomain Ready Active 19.03.5
mg5zdsuqeuo9bvh4z2q2i6tpg * localhost.localdomain Ready Active Leader 19.03.1
至此,swarm叢集就建立好了,非常簡單。
4.4. 建立overlay網絡
大白話,overlay網絡要解決的問題就是,分布在兩個vm裡的docker容器,怎麼樣可以互相通路。
舉個栗子:
在vm1裡docker容器ip是10.0.1.5,在vm2裡docker容器ip是10.0.1.6。但是vm1的ip是172.18.100.129,vm2是172.18.100.66,如果我們從10.0.1.5這個容器裡直接ping 10.0.1.6,是不通的,怎麼樣才可以通路?那就是建立overlay網絡。
建立overlay網絡,參考:https://www.cnblogs.com/xiangsikai/p/9938374.html
具體建立overlay網絡操作指令如下:
- 在swarm manager節點,執行建立指令
docker network create -d overlay --attachable my-network2
- 在vm2上,執行docker network ls,可以看到my-network2網絡
[[email protected] ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 1f722f207cac bridge bridge local 3aadcb52b3df docker_gwbridge bridge local 3744ee928016 host host local 587fwg44wbnk ingress overlay swarm sqi2konhybf9 my-network2 overlay swarm a184e66697b0 none null local
至此,overlay網絡也建構好了。可以通過idea來建構服務看看eureka-server和service-provider的連通性。見下面内容。
4.5. 部署sc服務
有一個系列文章寫的還行,比較簡潔,當比較熟練的就直接照抄:https://my.oschina.net/mdxlcj/blog/2995192
4.5.1. 部署eureka-server
要驗證eureka-server和service-provider的連通性,其實就是在idea裡面的docker運作配置裡,加上–network=my-network2這個運作配置加上即可,如下:
确認eureka-server使用了my-network2這個overlay網絡,可以執行指令
docker network inspect my-network2
可以看到eureka-server是加入了overlay網絡,并且其ip位址是10.0.1.13,如下圖。那麼後面一步要做的,就是把service-provider部署在vm2,也加入my-network2這個overlay網絡,其注冊中心位址就是10.0.1.13,如果可以注冊上,那代表兩個容器是互通了。
4.5.2. 部署service-provider
注意:eureka-client的pom中要加web子產品,否則啟動之後會直接退出unregistered
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.5.3. 确認vm2 docker中的service-provider是否可以注冊到vm1 docker中的eureka-server
4.5.4. 考慮在vm1上部署一個service-consumer
在vm1上部署一個service-consumer,注冊中eureka-server,并調用service-provider的接口
-
建立一個springboot的service-consumer工程
具體service-consumer代碼上的改造,參考:https://my.oschina.net/mdxlcj/blog/3139142
同樣建構好容器,并加入my-network2網絡,通過 docker network inspect my-network2檢視此網絡上的容器及ipidea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集
此時從10.0.1.12 ping 10.0.1.10不通,懷疑是昨天重新開機vm後,119機器的ip變到了223,是以重建立swarm和overlay再試一下。(劇透一下ping不同的确跟vm ip漂移有關,重建swarm和overlay網絡之後就可以了)
這裡有個小插曲:在建立swarm叢集後,建立的overlay網絡可能沒那麼快在vm2上顯示出來,就是說在vm2上執行docker network ls看不到my-network2網絡,為了确定情況,可以執行下面的指令來嘗試網絡是否OK
docker service create --replicas 1 --name mytest --network my-network2 --constraint 'node.hostname == vm2' alpine ping baidu.com
- 把service-provider的注冊中心改到docker ip,看是否可以注冊上
結果可以注冊上,并且調用http://172.18.100.223:8076/test1也是可以看到頁面輸出Hello world!
此時,service-provider和service-consumer注冊的eureka位址都是其docker容器的内部ip,為10.0.0.5,從service-consumer調用service-provider是OK的。
- 再嘗試一下把service-provider和service-consumer使用eureka的虛拟機ip來注冊,看是否可以,即把eureka-server的位址改到。這麼做的意義是生産上可以在應用裡隻指定eureka的位址,其他的服務,都是通過docker ip互相調用,不需要指定确定ip
eureka.client.serviceUrl.defaultZone=http://172.18.100.223:8761/eureka/
注冊沒有問題的,互相調用也是OK的
4.6. 部署sc服務結論,swarm與overlay
- 各vm情況:
vm1: 171.18.100.223。其上docker:eureka-server(10.0.0.5),eureka-consumer(10.0.0.10)
vm2:172.18.100.66。其上docker:service-provider(10.0.0.9)
- sc配置:
eureka-server不需要配置ip
service-provider的注冊中心,可以是vm1的171.18.100.223,也可以是docker的10.0.0.5
service-consumer的注冊中心,可以是vm1的171.18.100.223,也可以是docker的10.0.0.5
通路service-consumer,http://172.18.100.223:8076/test1,都可以拿到結果
-
建立swarm叢集指令
docker swarm init --advertise-addr 172.18.100.223
172.18.100.223是vm的ip,要注意修改,然後擷取類似下面的指令,在swarm work節點上去執行
docker swarm join --token SWMTKN-1-51p9uylvwzfzwt7qqu9e1mlcfyt60py8icg1tvoqtm5pz6f0nh-e1lkiunldyrt7o0eany0sa4yx 172.18.100.223:2377
-
建立overlay網絡
docker network create -d overlay --attachable my-network2
–attachable比較重要,不然容器可能加入不了網絡
在manager節點建立overlay網絡後,可能沒有那麼快同步到work節點上,就是說在work節點上執行docker network ls看不到my-network2,可以通過執行下面的指令,再次确認網絡是否建好了
docker service create --replicas 1 --name mytest --network my-network2 --constraint 'node.hostname == vm2' alpine ping baidu.com
- 避坑指令,最好在vm上都執行一遍
firewall-cmd --zone=public --add-port=7946/tcp --permanent firewall-cmd --zone=public --add-port=7946/udp --permanent firewall-cmd --zone=public --add-port=4789/udp --permanent firewall-cmd --zone=public --add-port=4789/tcp --permanent firewall-cmd --zone=public --add-port=2375/tcp --permanent firewall-cmd --zone=public --add-port=2375/udp --permanent firewall-cmd --zone=public --add-port=2377/udp --permanent firewall-cmd --zone=public --add-port=2377/tcp --permanent firewall-cmd --reload