一.Docker 简介
Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理
。使用Docker,可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
图:
1.Docker daemon(Docker守护进程)
Docker daemon是一个运行在宿主机(DOCKER-HOST)的后台进程。可通过Docker客户端与之通信。
2.Client(Docker客户端)
Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。
3.Images(Docker镜像)
Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像一使用系统安装光盘可以安装系统,同理,使用Docker
镜像可以运行Docker 镜像中的程序。
4.Container(容器)
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过Docker API或者CLI命令来启停、移动、删除容器。
5.Registry
Docker Registry是一个集中存储与分发镜像的服务。构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,
就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。一个Docker Registry可包含多个Docker仓库,每个仓库可包含多个镜像标签,
每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果扌巴Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,
而镜像标签则可理解为jar包的版本号。
二。docker安装及常用命令
安装:
1.移除旧版本 sudo yum -y remove docker
2.安装yum-utils,这样就能使用yum-config-manager工具设置Yum源。
sudo yum install -y yum-utils
3.更新Yum包的索引。
sud0 yum makecache fast
4.安装最新版本的Dockero
sudo yum -y install docker-engine 这样,经过一段时间的等待后,Docker就安装完成了。
5.安装指定版本的docker
yum list docker-engine.x86-64 --showduplicates }sort -r (其中,sort一r命令表示对结果由高到低排序)
安装指定版本:sudo yum -y install docker-engine-<VERSION-STRING> 例如: sudo yum -y install docker-engine-1.13.0
6.启动Dokcero
sudo systemctl start docker
7.执行以下命令,验证安装是否正确。
sudo docker run hello-world
8.查看版本:docker version
9.删除docker :sudo yum -y remove docker-engine
10.移除所有信息:sudo rm -r f /var/lib/docker
常用命令:
搜索镜像可使用docker search xx 命令
下载docker pull xx命令
删除指定名称的镜像:docker rmi hello-world
使用以下docker run命令即可新建并启动一个容器。
该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。
-d选项:表示后台运行
-P选项:随机端口映射
-p选项:指定端口映射,有以下四种格式。
ip:hostPort:containerPort
ip:containerPort
hostPort:containerPort
containerPort
-network选项:指定网络模式,该选项有以下可选参数:-network=bridge:默认选项,表示连接到默认的网桥。
-network=host:容器使用宿主机的网络。
-network=container:NAME-or-1D:告诉Docker让新建的容器使用已有容器的网络配置。
-network=none:不配置该容器的网络,用户可自定义网络配置。
docker run java /bin/echo 'Hello World' 这样终端会打印HelloWorld的字样,跟在本地直接执行/bin/echo 'Hello'一样。
列出容器使用docker ps命令即可列出运行中的容器,如需列出所有容器(包括已停止的容器),可使用一a参数。
停止容器docker stop 容器id,强行停止docker kill 容器id,启动已停止的容器使用docker run 容器id,使用docker restart命令来重启容器。
docker remove 删除容器。
三.将微服务运行在Docker上。
三.一 使用Dockerfile构建Docker镜像(不推荐,麻烦):
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节。
使用Dockerfile构建服务镜像:
1.先构建jar包:mvn clean package #使用Maven打包项目(或编译器直接导出)
2.在jar包所在路径创建docker file(touch Dockerfile)
3.在docker file添加以下内容(FROM java :8)基于什么镜像
4.将本地文件挂载到当前容器:VOLUME /tmp
5.复制文件到jar包路径 add src dest(.jar)
6.声明暴露端口
7.配置容器启动后执行的命令 ENTRYPOINT ["java" , "-Djava.security. egd=file:/dev/./urandom","-jar","/app.jar"]
8.使用docker build 构建镜像:docker build -t itmuch/microservice-discovery-eureka:0.0.1 .
10.启动镜像:docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1
11.访问http://Docker宿主机IP:8761/
私有仓库的管理:
Docker Registry2.0搭建一个私有仓库:
执行命令:docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
修改标签、推送镜像到私有仓库:docker tag itmuch/microservice-discovery-eureka:0.0.1 localhost:5000/itmuch/microservice-discovery-eureka:0.0.1;
docker push itmuch/microservice-discovery-eureka:0.0.1
三.二 使用maven插件构建镜像(推荐,相对简单):
1.<plugin>
<groupId>com.spotify</groupId>
<artifactld>docker-maven-plugin</artifactld>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.1</imageName>
<baselmage>java</baselmage>
<entryPoint>["java","-jar",/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.directory.directory}<directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
Maven
</configuration>
</plugin>
说明:
imageName:指定镜像名称,其中itmuch指定仓库名称;
microservice-discovery-eureka:0.0.1:镜像名称/标签名称
baselmage:用于指定基础镜像
entryPoint:类似dockerfile的entryPoint指令。
resources.resource.directory:用于指定根目录
${project.directory.directory}:表示target根目录
resources.resource.include:用于指定需要复制的文件
2.执行命令,构建docker镜像:
mvn clean package docker:build
3.docker images查看刚刚构建的镜像
4.启动镜像
5.启动镜像:docker run -d -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1
三.三 插件读取dockerfile进行构建
很多时候希望使用dockerFile更精确的构建
1.创建dockerfile文件
2.修改pom.xml
<plugin>
<groupId>com.spotify</groupId>
<artifactld>docker-maven-plugin</artifactld>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.directory.directory}<directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
注不再指定dockerimage和entrypoint
将插件绑定在某个phase 执行 maven clean package 就会自动构建镜像。
使用maven插件推送镜像:
1.修改maven的全局配置settings.xml
<server>
<id>docker-hub<id>
<username>用户名</username>
<password>密码</password>
<configuration>
<email>dockerhub邮箱</email>
</configuration>
</server>
2.修改pom.xml
<plugin>
<groupId>com.spotify</groupId>
<artifactld>docker-maven-plugin</artifactld>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.2</imageName>
<baselmage>java</baselmage>
<entryPoint>["java","-jar",/${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}<directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<serverId>settings.xml id一致<serverId>
</configuration>
</plugin>
3.执行以下命令添加pushImage的标识,标识推送镜像
mvn clean package docker:build -DpushImage
同理也可推送致私有仓库,将imageName指定类似如下形式即可
<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>
以上示例中,是通过imageName指定镜像名称和标签的,例如:
<imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
也可借助imageTags元素更为灵活地指定镜像名称和标签,例如:
<configuration>
<imageName>itmuch/microservice-discovery-eureka</imageName>
<imageTags>
<imageTag>0.0.5</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<configuration> 这样就可为同一个
四容器管理
1.dockercpmpose安装(略)
2.安装dockercompose 命令补全工具
3工程、服务、容器
Docker Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker Compose运行目录下的所有文件
(docker-compose.yml、extends 文件或环境变量文件等)组成一个工程(默认为docker-compose.yml所在目录的目录名称)。一个工程可包含多个服务,每个
服务中定义了容器运行的镜像、参数和依赖,个服务可包括多个容器实例。
基本步骤:
1.使用Dockerfile(或其他方式)定义应用程序环境,以便在任何地方重现该环境。
2.在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行。
3.运行docker-compose up命令,启动并运行整个应用程序。
使用示例:
1.使用mvn clean package命令打包项目,获得jar包microservice-discovery-eureka-0.0.1SNAPSHOT,jar
2·在microservice-discovery-eureka-0.0.I-SNAPSHOT.jar所在路径(默认是项目的target目录)创建Dockerfile文件,并在其中添加如下内容。
FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 9000
ENTRYPOINT ["java",“-Djava.security.egd=file:/dev/./urandom",'/app.jar"]
3.在microservice-discovery-eureka-0.0.1-SNAPSHOT,jar所在路径创建文件docker.compose.yml,在其中添加如下内容。
version:'2' #表示该docker-compose.yml文件使用的是Version 2 file
format
servers:
eureka: #指定服务名称
build: . #指定Dockerfile所在路径
ports:
- "8761:8761" 形式 #指定端口映射,类似docker run的-p选项,注意使用字符串
4.生在docker-compose.yml所在路径执行以下命令:docker-compose up
5.访问http://宿主机IP:8761/ 即可访问EurekaServer首页。
五.其他
1.docker-compose.yml常用命令
image:java 指定镜像名称或者镜像id,如果该镜像在本地不存在,Compose会尝试pull下来。
build:./dir 指定Dockerfile⽂件的路径。可以是⼀个路径。
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno:1
也可以是个对象,⽤以指定Dockerfile和参数。
expose:
- "3000"
- "8000"
暴露端口,只将端⼝暴露给连接的服务,⽽不暴露给宿主机。
2.docker-compose常用命令
docker-compose run
更新容器 docker-compose up 旧容器关闭所有服务指向新容器
六 使用docker-compose编排微服务
1.微服务:各个微服务
2.使用docker插件构建docker镜像,在各个pom.xml中添加
<plugin>
<groupld>com.spotify</groupld>
<artifactld>docker-maven-plugin</artifactld>
<configuration>
<imageName>itmuch/$(project.artifactld):${project.version}</imageName>
<forceTags>true</forceTags>
<baselmage>java</baselmage>
<entryPoint>["java,"-jar"," /${project.build.finalName}.jar"]</entryPoint>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.finalName}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
由配置可知构建的镜像itmuch/下名格式如:microservice-discovery-eureka:0.0.l-SNAPSHOT
3.由于docker默认模式bridge各个服务ip不同,为eureka server 配置一个主机名:
eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/
4.在每个项目的根目录执行命令构建镜像:
mvn clean package docker:build
5.编写docker-compose.yml:
# 表示该docker-compose.yml使用的是version 2 file format(固定写法)
version:'2'
services:
#指定服务名称
microservice-discovery-eureka:
#指定服务所用镜像
image: itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT
#暴露端口信息
ports:
-"8761:8761"
microservice-provider-user:
image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT
#连接到microservice-discovery-eureka,
links :
-microservice-discovery-eureka:discovery
microservice-consumer-movie-ribbon-hystrix:
image: itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
links :
-microservice-discovery-eureka : discovery
microservice-gateway-zuul:
image:
links :
-microservice-discovery-eureka:discovery
microservice-hystrix-dashboard:
image: itmuch/microservice-hystrix-dashboard:0.0.1-SNAPSHOT
links :
-microservice-discovery-eureka:discovery
microservice-hystrix-turbine:
image: itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT
links :
-microservice-discovery-eureka:discovery
6.启动测试:
docker-compose up
7.简化compose编写
用服务名称作为主机名称来发现其他服务:
version:'2'
services:
discovery:
image:itmuch/microservice-discovery-eureka:0.0.1-SNAPSHOT
ports:
-"8761:8761"
microservice-provider-user:
image: itmuch/microservice-provider-user:0.0.1-SNAPSHOT
......(其他服务类似)
七。编排高可用eureka server(构建一个双节点集群)
1.执行命令构建镜像
mvn clean package docker:build
2.编写docker-compose.yml
version:"2"
services:
microservice-discovery-eureka-hal:
hostname: peerl # 指定hostname
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
links :
-microservice-discovery-eureka-ha2
ports :
-"8761:8761"
environment :
-spring.profiles.active-peerl
microservice-discovery-eureka-ha2:
hostname: peer2
image: itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
links :
-microservice-discovery-eureka-hal
ports :
-"8762 :8762"
environment:
-spring.profiles.active=peer2
3.执行命令启动
docker-compose up
以上会出现循环依赖,解决(其他服务科通过服务名连接服务):
version:"2"
services:
peerl:
image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
ports :
-"8761"
environment:
-spring.profiles.active=peerl
peer2:
image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
ports :
-"8762"
environment:
-spring.profiles.active=peer2
八。编排高可用服务集群及动态伸缩
1.服务列表
2.将所有microservice-discovery-eureka-ha设置:
eureka:
client:
service-url:
defaultZone:http://peerl:8761/eureka/,http://peer2:8762/eureka/
3.在每个项目的根目录执行命令构建镜像:maven clean package docker:build
4.编写docker-compose.yml
version:"2"
services:
peerl:
image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
ports :
-"8761 :8761 "
environment:
-spring.profiles.active=peerl
peer2:
image:itmuch/microservice-discovery-eureka-ha:0.0.1-SNAPSHOT
hostname:peer2
ports :
-"8762: 8762
environment:
-spring.profiles.active=peer2
microservice-provider-user:
image:itmuch/microservice-provider-user:0.0.1-SNAPSHOT
microservice-consumer-movie-ribbon-hystrix:
image:itmuch/microservice-consumer-movie-ribbon-hystrix:0.0.1-SNAPSHOT
microservice-gateway-zuul:
image:itmuch/microservice-gateway-zuul:0.0.1-SNAPSHOT
microservice-hystrix-turbine:
image:itmuch/microservice-hystrix-turbine:0.0.1-SNAPSHOT
5.启动测试 docker-compose up
6.执行命令,为各个微服(除eureka server)务实现动态扩容:
docker-compose scale microservice-provider-user=3
microservice-consumer-movieribbon-hystrix=3
microservice-gateway-zuul=3
microservice-hystrix-turbine=3