您好,登錄后才能下訂單哦!
文章首發(fā)于公眾號(hào)《程序員果果》
地址:https://mp.weixin.qq.com/s/nWpbqAheuTh55dWsgszieA
之前《服務(wù)Docker化》中,使用 docker-compose.yml 來(lái)一次配置啟動(dòng)多個(gè)容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 來(lái)配置、啟動(dòng)多個(gè)服務(wù)。
在《DockerSwarm集群環(huán)境搭建》中,我們使用docker service create 來(lái)部署服務(wù)時(shí),一次只能部署一個(gè)服務(wù),這一節(jié)就講解 DockerSwarm 集群環(huán)境中, 使用 docker-compose.yml 一次啟動(dòng)多個(gè)關(guān)聯(lián)的服務(wù)。
創(chuàng)建一個(gè)springcloud項(xiàng)目 ,包含eureka-server、service-hi、service-ribbon。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gf</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gf</groupId>
<artifactId>chapter02</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka-server:8761/eureka/
instance:
prefer-ip-address: true
instance-id: eureka-server:8761
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gf</groupId>
<artifactId>service-hi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-hi</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gf</groupId>
<artifactId>chapter02</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
server:
port: 8763
spring:
application:
name: service-hi
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
instance:
prefer-ip-address: true
instance-id: service-hi:8763
@EnableEurekaClient
@SpringBootApplication
@RestController
public class ServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceHiApplication.class, args);
}
@Value( "${server.port}" )
private String port;
@GetMapping("/hi")
public String hi() {
return "hello , port is " + port;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gf</groupId>
<artifactId>service-ribbon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-ribbon</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.gf</groupId>
<artifactId>chapter02</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
server:
port: 8764
spring:
application:
name: service-ribbon
eureka:
client:
serviceUrl:
defaultZone: http://eureka-server:8761/eureka/
instance:
prefer-ip-address: true
instance-id: eureka-server:8764
@Service
public class HelloService {
@Autowired
private RestTemplate restTemplate;
public String hiService() {
return restTemplate.getForObject( "http://service-hi:8763/hi" , String.class );
}
}
@RestController
public class HelloControler {
@Autowired
private HelloService helloService;
@GetMapping(value = "/hi")
public String hi() {
return helloService.hiService();
}
}
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class ServiceRibbonApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceRibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
編寫Dockerfile ,把項(xiàng)目構(gòu)建成鏡像,需要把 項(xiàng)目jar包 復(fù)制到 鏡像中,而且鏡像中要有java的運(yùn)行環(huán)境,所以現(xiàn)在給每個(gè)項(xiàng)目都創(chuàng)建一個(gè)Dockerfile,內(nèi)容如下:
eureka-server 項(xiàng)目的 Dockerfile
FROM hub.gf.com:9090/jdk/openjdk:8-jre
MAINTAINER gf gf@163.com
COPY target/eureka-server-0.0.1-SNAPSHOT.jar /eureka-server-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java" , "-jar" , "/eureka-server-0.0.1-SNAPSHOT.jar"]
service-hi 項(xiàng)目的 Dockerfile
FROM hub.gf.com:9090/jdk/openjdk:8-jre
MAINTAINER gf gf@163.com
COPY target/service-hi-0.0.1-SNAPSHOT.jar /service-hi-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java" , "-jar" , "/service-hi-0.0.1-SNAPSHOT.jar"]
service-ribbon 項(xiàng)目的 Dockerfile
#!/usr/bin/env bash
mvn package -Dmaven.test.skip=true
docker build -t hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest .
docker login -u admin -p Harbor12345 hub.gf.com:9090
docker push hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest
為了方便,三個(gè)項(xiàng)目根目錄下創(chuàng)建 build.sh 腳本,來(lái)一鍵執(zhí)行項(xiàng)目的打jar包、構(gòu)建鏡像、推送到私有倉(cāng)庫(kù)。
eureka-server 項(xiàng)目的 build.sh
#!/usr/bin/env bash
mvn package -Dmaven.test.skip=true
docker build -t hub.gf.com:9090/springboot-ribbon/eureka-server:latest .
docker login -u admin -p Harbor12345 hub.gf.com:9090
docker push hub.gf.com:9090/springboot-ribbon/eureka-server:latest
service-hi 項(xiàng)目的 build.sh
#!/usr/bin/env bash
mvn package -Dmaven.test.skip=true
docker build -t hub.gf.com:9090/springboot-ribbon/service-hi:latest .
docker login -u admin -p Harbor12345 hub.gf.com:9090
docker push hub.gf.com:9090/springboot-ribbon/service-hi:latest
service-ribbon 項(xiàng)目的 build.sh
#!/usr/bin/env bash
mvn package -Dmaven.test.skip=true
docker build -t hub.gf.com:9090/springboot-ribbon/service-ribbon:latest .
docker login -u admin -p Harbor12345 hub.gf.com:9090
docker push hub.gf.com:9090/springboot-ribbon/service-ribbon:latest
分別執(zhí)行三個(gè) build.sh 腳本,這樣私有倉(cāng)庫(kù)就有三個(gè)項(xiàng)目的鏡像了,如圖:
啟動(dòng)之前搭建好的 docker swarm 集群環(huán)境:
docker-machine start myvm-1 myvm-2 myvm-3
要在管理節(jié)點(diǎn)下部署服務(wù),所以需要知道哪臺(tái)是管理節(jié)點(diǎn),隨便連接一臺(tái)機(jī)器,通過(guò) docker node 命令查看節(jié)點(diǎn)信息:
docker-machine ssh myvm-1
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ib1498ex2q18i7gznb2zgicqq * myvm-1 Ready Active Leader 18.09.1-beta2
vels0fe3eh6s5cxj1s573v9wx myvm-2 Ready Active Reachable 18.09.1-beta2
obxnnqelh5p16wajrwvyn6j8v myvm-3 Ready Active Reachable 18.09.1-beta2
myvm-1 就是管理節(jié)點(diǎn),不需要切換節(jié)點(diǎn)了。
之后用 docker stack 部署服務(wù),所以需要編寫服務(wù)編排文件,內(nèi)容如下:
version: "3.4"
services:
eureka-server:
image: hub.gf.com:9090/springcloud-ribbon/eureka-server:latest
deploy:
endpoint_mode: vip
resources:
limits:
cpus: "0.5"
memory: "1024M"
ports:
- "8761:8761"
service-hi:
image: hub.gf.com:9090/springcloud-ribbon/service-hi:latest
deploy:
endpoint_mode: vip
resources:
limits:
cpus: "0.5"
memory: "1024M"
ports:
- "8763:8763"
depends_on:
- eureka-server
service-ribbon:
image: hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest
deploy:
endpoint_mode: vip
resources:
limits:
cpus: "0.5"
memory: "1024M"
ports:
- "8764:8764"
depends_on:
- eureka-server
- service-hi
networks:
default:
external:
name: my-overlay
文件詳細(xì)說(shuō)明,這里就不說(shuō)了,可以網(wǎng)上查一下。
通過(guò) docker stack deploy 命令 啟動(dòng)服務(wù):
docker stack deploy -c services.yml ms
通過(guò) docker service ls 查看服務(wù)啟動(dòng)狀態(tài):
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
q99gd5rquv3f ms_eureka-server replicated 1/1 hub.gf.com:9090/springcloud-ribbon/eureka-server:latest *:8761->8761/tcp
wjsv5s6fce6k ms_service-hi replicated 1/1 hub.gf.com:9090/springcloud-ribbon/service-hi:latest *:8763->8763/tcp
zjwe7cnpn42y ms_service-ribbon replicated 1/1 hub.gf.com:9090/springcloud-ribbon/service-ribbon:latest *:8764->8764/tcp
服務(wù)啟動(dòng)后 ,訪問(wèn) 192.168.99.100:8761 , 192.168.99.100:8763/hi , 192.168.99.100:8764/hi ,都可以正常訪問(wèn),說(shuō)明已經(jīng)部署成功了。
歡迎關(guān)注我的公眾號(hào)《程序員果果》,關(guān)注有驚喜~~
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。