天天看點

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

  • 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插件

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

具體的docker配置在後面,不着急配

3.4. idea,編寫eureka-server代碼

在建立eureka-server之前,有必要了解一下你要做demo的springcloud與springboot版本的關系

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

這裡測試,我們用的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

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

點選

+

,添加一個連接配接。上圖已經添加好了,如果有2台vm可以添加兩個,比如我的是Docker66和Docker129,分别對應2個vm帶上的docker服務。

然後配置

docker

啟動項

選擇編輯:

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

添加一個啟動項:

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

填寫

docker

相關的參數:

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

3.7. idea,運作,在目标機器建構容器

直接運作就是了,可以看到開始建構了(上一步配置docker的時候,server選到“Docker129”,代表目标容器要在129上)

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

去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這個運作配置加上即可,如下:

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

确認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,如果可以注冊上,那代表兩個容器是互通了。

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

4.5.2. 部署service-provider

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

注意: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

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

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

    idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集
    同樣建構好容器,并加入my-network2網絡,通過 docker network inspect my-network2檢視此網絡上的容器及ip
idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集
idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集
idea使用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,看是否可以注冊上
idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

結果可以注冊上,并且調用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的

idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集
idea使用docker建構Springboot服務swarm+overlay1. 需要探讨的内容2. 常用指令(可略過)3. 使用IDEA在vm docker中快速部署eureka-server4. 在兩個vm docker上部署sc叢集

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
               

繼續閱讀