官方入门一直在用Python的例子,是时候试试自己的java项目了。
去spring官网找一个soringboot docker的例子https://spring.io/guides/gs/spring-boot-docker/
按照例子一路跑下来,顺利看到Hello Docker World!
docker run -p 8080:8080 -t springio/gs-spring-boot-docker
接下来把它按照入门3里那样改造下,变成一个运行2个replicas的服务。
1. 改一下Application.java, 增加显示计算机主机名。
package hello;
import java.net.InetAddress;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.net.UnknownHostException;
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
InetAddress ia;
String host = "";
try {
ia = InetAddress.getLocalHost();
host = ia.getHostName(); //获取计算机主机名
} catch (UnknownHostException e) {
e.printStackTrace();
}
return "Hello Docker World! 主机名:"+host;
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
打包镜像
./mvnw install dockerfile:build
2. 写一个 docker-compose.yml
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: springio/gs-spring-boot-docker
deploy:
replicas: 2
resources:
limits:
cpus: "0.2"
memory: 500M
restart_policy:
condition: on-failure
ports:
- "8081:8080"
networks:
- webnet
networks:
webnet:
- 运行
docker stack deploy -c docker-compose.yml springboot-docker
用 docker service ls
查看, 隔了2分钟2个replicas才启动起来。
用8081访问一下,有显示,但是哪里不对呢? 没有显示主机名。
跟
docker run -p 8080:8080 -t springio/gs-spring-boot-docker
看到的是不一样的,看到的是我没加主机名之前的效果。
怀疑它不是运行的本地镜像,而是从docker hub pull了一个镜像。
于是给我本地的镜像打个tag:
docker tag springio/gs-spring-boot-docker springio/gs-spring-boot-docker:my
然后改一下docker-compose.yml
image: springio/gs-spring-boot-docker:my
再次运行
docker stack deploy -c docker-compose.yml springboot-docker
终于正常了, 启动速度也快了很多。
总结教训:网上的一些教程的demo已经发布到docker hub了,一不小心你运行的不是本地的,而是从hub上下载下来的镜像。