本篇文章主要講述筆者使用Docker+微服務的經歷,包括docker的常用命令,定義Dockerfile文件,使用docker build,docker run等命令,以及使用docker compose管理運行容器。
1.安裝docker的幾個命令:
$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ yum install docker-ce
$ systemctl start docker
$ systemctl enable docker
$ docker version
2.docker操作容器的常用命令:
#搜索docker鏡像:
docker search 名稱(svn)
#拉取鏡像
docker pull 鏡像名(docker.io/garethflowers/svn-server)
#刪除鏡像
docker rmi 鏡像id
#查看本地docker鏡像
docker images
#查看docker本地運行進程
docker ps -a
#運行docker鏡像容器:
docker run -d
--name jenkins
-p 61081:8080 -p 50000:50000
-v /data/jenkins/var:/var/jenkins_home
jenkins/jenkins
#進入docker
docker exec -it (服務名) /bin/bash
#退出docker容器:
exit
#重啓docker
docker restart (服務名)svn-server
#關閉容器
docker stop 容器ID
#刪除容器
docker rm 容器ID (運行中的容器加-f參數)
#啓動一個已經停止的容器實例
docker start 容器ID或容器名
3.構建微服務docker鏡像
在spring cloud應用中服務都註冊在eureka中:
接下來首先構建一個spring cloud eureka docker鏡像:
3.1 創建 Dockerfile文件
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD eureka-1.0.0.jar eureka-1.0.0.jar
RUN sh -c 'touch /eureka-1.0.0.jar'
ENV JAVA_OPTS=""
#Djava.security.egd
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /eureka-1.0.0.jar" ]
將Dockerfile文件放在和jar同一個目錄下。
3.2 構造docker鏡像
docker build -t eureka-1.0.0.jar .
到此使用docker images命令可以看到生成了一個eureka docker鏡像。
接下來同理3.1和3.2步驟創建其餘微服務Dockerfile文件,構造服務鏡像。
4.運行docker鏡像
docker run --name eureka-server -p 8761:8761 -t 2d9ac70a4a98
由於服務運行在docker上面,所以需要爲docker容器指定一個主機名--name eureka-server。
在微服務的pom上配置:
# 註冊中心配置
eureka:
client:
service-url:
defaultZone: http://eureka-server:8761/eureka/
當容器之間存在相互引用的情況下,可以配合使用--links運行容器:
docker run --link eureka-server:8761 --name config -p 8888:8888 -t a37dca32a2e9
使用docker ps -a可以查看容器運行狀態。
5.使用docker compose管理運行容器
微服務架構的應用系統一般包含若干個微服務,每個微服務一般都會部署多個實例,從上面的示例中可以看出,如果每個微服務都要手動啓停,那麼效率很低,維護量會越來越大。因此,接下來改造成使用docker compose來管理容器。
5.1 docker compose安裝
# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
安裝完成之後使用docker-compose version檢測安裝是否成功,如果拋出下面錯誤:
Cannot open self /usr/local/bin/docker-compose or archive /usr/local/bin/docker-compose.pkg
可以參考以下鏈接:http://www.mamicode.com/info-detail-1863233.html
5.2 使用docker創建一個外部網絡
docker network create arcloud_net
5.3 創建docker-compose.yml文件
關於docker-compose啓動容器的加載順利,可以參考https://docs.docker.com/compose/startup-order/
解決的辦法有以下幾種:
-
1、足夠的容錯和重試機制,比如連接數據庫,在初次連接不上的時候,服務消費者可以不斷重試,直到連接上
-
2、docker-compose拆分,分成兩部分部署,將要先啓動的服務放在一個docker-compose中,後啓動的服務放在兩一個docker-compose中,啓動兩次,兩者使用同一個網絡。
-
3、同步等待,使用
wait-for-it.sh
或者其他shell
腳本將當前服務啓動阻塞,直到被依賴的服務加載完畢wait-for-it
的github地址爲:wait-for-it
本文使用第二種方式,創建兩個docker-compose,並且兩者使用同一個外部網絡。
version: "3"
services:
eureka:
build: ./eureka/
ports:
- "8762:8761"
volumes:
- ./eureka:/eureka
networks:
- default
- arcloud_net
config:
build: ./config/
ports:
- "8889:8888"
links:
- "eureka:eureka-server"
networks:
- default
- arcloud_net
networks:
arcloud_net:
external: true
version: "3"
services:
auth:
build: ./auth/
ports:
- "3000:3001"
external_links:
- "eureka:eureka-server"
- config
networks:
- default
- arcloud_net
networks:
arcloud_net:
external: true
這裏兩個容器的定義裏都使用了同一個外部網絡 arcloud_net。然後分別到這兩個docker-compose.yml文件的目錄下通過 docker-compose up 命令啓動這兩個容器即可。
其他容器需要加入該網絡中的話,可以使用如下命令:
docker network connect arcloud_net 容器id