聽說最近大家都不用虛擬機,開始用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