文章首发于公众号《程序员果果》
创新互联公司专注于建宁企业网站建设,自适应网站建设,商城网站定制开发。建宁网站建设公司,为建宁等地区提供建站服务。全流程按需网站设计,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务
地址:https://mp.weixin.qq.com/s/nWpbqAheuTh55dWsgszieA
之前《服务Docker化》中,使用 docker-compose.yml 来一次配置启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。
在《DockerSwarm集群环境搭建》中,我们使用docker service create 来部署服务时,一次只能部署一个服务,这一节就讲解 DockerSwarm 集群环境中, 使用 docker-compose.yml 一次启动多个关联的服务。
创建一个springcloud项目 ,包含eureka-server、service-hi、service-ribbon。
4.0.0
com.gf
eureka-server
0.0.1-SNAPSHOT
jar
eureka-server
Demo project for Spring Boot
com.gf
chapter02
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
repackage
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);
}
}
4.0.0
com.gf
service-hi
0.0.1-SNAPSHOT
jar
service-hi
Demo project for Spring Boot
com.gf
chapter02
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
repackage
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;
}
}
4.0.0
com.gf
service-ribbon
0.0.1-SNAPSHOT
jar
service-ribbon
Demo project for Spring Boot
com.gf
chapter02
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.cloud
spring-cloud-starter-netflix-ribbon
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
repackage
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 ,把项目构建成镜像,需要把 项目jar包 复制到 镜像中,而且镜像中要有java的运行环境,所以现在给每个项目都创建一个Dockerfile,内容如下:
eureka-server 项目的 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 项目的 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 项目的 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
为了方便,三个项目根目录下创建 build.sh 脚本,来一键执行项目的打jar包、构建镜像、推送到私有仓库。
eureka-server 项目的 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 项目的 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 项目的 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
分别执行三个 build.sh 脚本,这样私有仓库就有三个项目的镜像了,如图:
启动之前搭建好的 docker swarm 集群环境:
docker-machine start myvm-1 myvm-2 myvm-3
要在管理节点下部署服务,所以需要知道哪台是管理节点,随便连接一台机器,通过 docker node 命令查看节点信息:
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 就是管理节点,不需要切换节点了。
之后用 docker stack 部署服务,所以需要编写服务编排文件,内容如下:
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
文件详细说明,这里就不说了,可以网上查一下。
通过 docker stack deploy 命令 启动服务:
docker stack deploy -c services.yml ms
通过 docker service ls 查看服务启动状态:
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
服务启动后 ,访问 192.168.99.100:8761 , 192.168.99.100:8763/hi , 192.168.99.100:8764/hi ,都可以正常访问,说明已经部署成功了。
欢迎关注我的公众号《程序员果果》,关注有惊喜~~
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。