听说最近大家都不用虚拟机,开始用Docker进行微服务部署了,所以稍微学习了一下,下面是使用Docker进行微服务部署的一个简单的例子。
一. 环境准备
1. centOS7安装
如果是windows下需要用VMWare搭建centOS7的环境。
过程略
2. jdk安装
我下载的是jdk1.8.0_172,放在 /usr/lib/java/jdk1.8.0_172 目录下。
过程略
3. docker安装
(1)更新yum包到最新
# sudo yum update
(2)设置yum源
# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
(3)安装docker
# sudo yum install docker-ce
(4)启动并加入开机启动
# sudo systemctl start docker
# sudo systemctl enable docker
(5)验证是否安装成功
# docker version
二. 微服务部署
1. 在windows下编译出可运行的jar包
我这里生成的jar包在 D:\workspace\JavaBasicStudy\target\ 下
2. 复制到centos,并编译成docker可运行的镜像
(1)通过SSH直接将jar包复制到centos的/usr/local/springbootService目录下,目录自己建
(2)在centos中运行下面的命令,将jdk复制到springbootService目录下
#cd /usr/local/springbootService
#cp -r /usr/lib/java/jdk1.8.0_172 /usr/local/springbootService
(3)创建Dockerfile,用来将jar包编译成docker可运行的镜像
#vi Dockerfile
Dockerfile的内容如下:
# Enviroment
FROM centos
# Copy JDK
COPY jdk1.8.0_172 jdk1.8.0_172
# Set JDK
ENV JAVA_HOME=./jdk1.8.0_172
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# Copy jar
COPY JavaBasicStudy-1.0-SNAPSHOT.jar .
ADD JavaBasicStudy-1.0-SNAPSHOT.jar app.jar
# Port
EXPOSE 6001
# Command
ENTRYPOINT ["java","-jar","/app.jar"]
(4)构建镜像
docker build -t mystudy:1.0 .
(5)查看镜像
[root@hadoop1 springbootService]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mystudy 1.0 4c1ade2235eb 27 seconds ago 677MB
centos latest 0f3e07c0138f 8 weeks ago 220MB
3. 启动镜像
# docker run -p 5001:6001 mystudy:1.0
这里没有用-d,因为想要看一下服务是否真的能启动。
如果加上-d,容器就会在后台运行,返回一串ID就表示成功了:
[root@hadoop1 springbootService]# docker run -d -p 5001:6001 mystudy:1.0
61ccdef3cd5a57e715800bf0e2661959020b33fe3dc1b4c98639e566e449202b
通过docker ps -a 命令可以看到所有容器(加上-a可以看到已经退出[STATUS=Exited]的容器,不加就只能看到正在运行[STATUS=Up]的容器):
[root@hadoop1 springbootService]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61ccdef3cd5a mystudy:1.0 "java -jar /app.jar" 3 minutes ago Up 3 minutes 0.0.0.0:5001->6001/tcp exciting_knuth
b5b67e37c30d mystudy:1.0 "java -jar /app.jar" 10 minutes ago Exited (130) 4 minutes ago awesome_morse
使用下面的命令可以进入容器:
docker attach NAMES或者用CONTAINER ID
比如:
#docker attach exciting_knuth
或者
#docker attach 61ccdef3cd5a
或者用:
docker exec -it ContainerName /bin/bash
进入容器后,按ctrl+P+Q可退出
重要:这里一共用到了3个端口:
微服务的application.yml中用到了6001
Dockerfile中用的是EXPOSE 6001
启动的时候又写了5001:6001
那么这三个端口分别是什么意思呢?
首先,application.yml中的6001端口必须和Dockerfile中EXPOSE的6001一致,表示docker容器对外暴露6001端口。
docker run的时候的5001:6001,表示宿主机的5001端口对应docker容器的6001端口
如果是多个docker容器就是5001:6001,5002:6001,5003:6001...
容器中的端口不必每个都修改,只要修改宿主机对应的端口即可。
三. 测试
在postman中调用:192.168.3.101:5001/service/hello?token=1