Docker微服務初體驗之心路歷程

     本篇文章主要講述筆者使用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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章