此类文章网上很多,但是自己按着做也会出各种各样的错误。记录我踩的坑
目标是在centos7中部署springboot项目,在外部能访问。
先上springboot代码简单的一批
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@RequestMapping("/docker")
public String test(){
System.out.println("hello docker");
return "hello docker!";
}
}
安装centos7就不介绍了,直接看安装docker运行。运行下面命令
yum -y install docker
然后开启docker
service docker start
就这么简单,当然前提是centos7,6.x版本不要这样。
接下来把springboot项目打成jar,在本地运行没问题的情况下留作备用。
然后开始写Dockerfile
#基础镜像jdk8,不需要tomcat因为springboot内置
FROM java:8
#挂载,把主机的/var/lib/docker/volumes目录下的内容挂在到容器的/tmp下
VOLUME /tmp
#资源复制,把本机的某个内容复制到容器的指定位置
ADD docker-spring-boot-0.0.1-SNAPSHOT.jar /docker/app.jar
#容器启动时运行的命令,java -jar /docker/app.jar 是不是很熟?
ENTRYPOINT [ "java", "-jar", "/docker/app.jar" ]
保存好,然后Dockerfile和打成的jar放到 centos7的某个目录下
然后开始生成镜像,-t 后面跟镜像的tag,符号. 根据当前目录的Dockerfile生成
docker build -t springboot .
结果如下,我这里已经下载好了jdk8的镜像,所以这里不进行下载,如果严格按照步骤来,这里会有下载进度
[root@localhost volumes]# cd /docker/
[root@localhost docker]# ls
Dockerfile docker-spring-boot-0.0.1-SNAPSHOT.jar
[root@localhost docker]# docker build -t springboot .
Sending build context to Docker daemon 14.5 MB
Step 1/4 : FROM java:8
---> d23bdf5b1b1b
Step 2/4 : VOLUME /tmp
---> Running in 8533b6e2260e
---> e87fe636335a
Removing intermediate container 8533b6e2260e
Step 3/4 : ADD docker-spring-boot-0.0.1-SNAPSHOT.jar /docker/app.jar
---> 829ea006cdf3
Removing intermediate container fec8599cd945
Step 4/4 : ENTRYPOINT java -jar /docker/app.jar
---> Running in a8dba92f6e18
---> 80f2876c32db
Removing intermediate container a8dba92f6e18
Successfully built 80f2876c32db
当然如果你是用的公共仓库会很慢很慢,甚至报错下不下jdk8来。我这里用了加速器,阿里云的。
直接把下面这段复制到你的虚拟机运行就可以:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://c6n8vys4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
然后你就会发现下载速度很快了。好的,接下来继续。创建并且运行容器
docker run -d -p 8080:8080 --name boooc springboot
解释下:run乍一看是运行,其实不是run=create+start ,-d 表示后台运行, -p是映射端口前面是宿主机端口,后者是容器端口,因为我们jar的端口是8080所以后者必须是8080,前面可以随意。--name表示创建容器的名字,springboot表示镜像tag
运行完会返回一个id,通过docker ps可以查看运行的容器
[root@localhost docker]# docker run -d -p 8080:8080 --name boooc springboot
b0a49bfb661f1c48d3a1f3f0e6c06272ed6d59649a86867206c463b5abd1160a
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0a49bfb661f springboot "java -jar /docker..." 8 seconds ago Up 7 seconds 0.0.0.0:8080->8080/tcp boooc
然后再自己为win下访问http://宿主机IP:映射宿主机端口/docker就能访问到了。宿主机这里为虚拟机。当然要确保防火墙关闭。
我的坑:我是按上面步骤来的但是!但是!最后访问不到!!都能ping通,win和虚拟机,虚拟机和容器都能ping的通但是就是访问不到。一开始我以为端口的问题,telnet ip 8080,但是能进去,又netstat -nlpt查看端口情况,8080也确实在列。后来用curl 宿主机可以访问,win也同样可以。然后换了个浏览器。。。好了。ie不好用,win10自带浏览器也不好用。。。完。
注:以后只用谷歌,在此谢谢师傅