一、入门
1、使用docker,可更快打包、测试、部署,并可缩短从编写到部署运行代码的周期。
2、registry:一个registry包含多个docker仓库,每个库可包含多个镜像标签。
唯一的image=docker库+标签
(一)、docker 安装
1、卸载旧版本docker:
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
注:该命令只会删除docker本身,不会删除docker存储的文件,如:images, containers, volumes, and networks。这些文件保存在/var/lib/docker中
2、安装仓库:
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3、安装最新版本的docker-engine:sudo yum install docker-ce docker-ce-cli containerd.io
注:列出当前可用的docker版本:yum list docker-ce.x86_64 --showduplicates | sort -r
4、启动docker:sudo systemctl start docker
5、升级docker:sudo yum makecache fast--->然后按照安装docker的步骤,即可完成升级
6、卸载docker:sudo yum remove docker-ce---->sudo rm -rf /var/lib/docker
(二)、docker常用命令
1、image常用命令
a、搜索image:docker search java
b、下载image:docker pull java
c、列出image:docker images
d、删除指定image:docker rmi java
删除所有image:docker rmi -f $(docker images)
e、保存image(将java保存为java.tar):docker save --output java.tar java
f、加载image(从java.tar中加载java):docker load --input java.tar
g、通过dockerFile构建image:docker build -t 镜像名(a:b) dockerFile
2、docker常用命令
a、创建并启动container:docker run -d --name 容器名 -p 宿主机端口:容器端口 镜像名
b、列出容器:docker ps
c、停止容器:docker stop 容器id
d、强制停止容器:docker kill 容器id
e、启动停止的容器:docker start 容器id
f、进入容器:docker exec -it 容器id /bin/bash
g、退出容器:exit
二、将服务运行在docker上
(一)、dockerFile常用指令
1、文件复制:ADD src dest
注:a、从src目录复制文件到容器的dest。其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包。
b、如果src是一个url。dest以斜杠结尾,dest将被视为目录;dest不以斜杠结尾,dest将被视为文件。
c、如果src是一个目录,name整个目录下内容将被复制
2、设置构建参数:ARG user=sunxj
住:ARG指令用于设置构建参数,类似于ENV。和ENV不同的是,ARG设置的是构建时的环境变量,在容器运行时是不会存在这些变量的。
3、容器启动命令:CMD
注:CMD指令用于为执行容器提供默认值,每个Dockerfile只有一个CMD命令,如果执行了多个CMD命令,那么只有最后一条会被执行,
格式1:CMD ["executable" "param1" "param2"]
格式2:CMD ["param1" "param2"] (为entrypoint指令提供预设参数)
格式3:CMD command param1 param2 (在shall中执行)
4、文件复制:COPY src dest
注:与ADD类似,COPY不支持URL和压缩包
5、ENTRYPOINT入口点
格式1:CMD ["executable" "param1" "param2"]
格式2:CMD command param1 param2 (在shall中执行)
注:entrypoint和cmd指令的目的一样,都是指定Docker容器启动时执行的命令,可以多次设置,只有最后一个有效
6、设置容器环境变量:ENV
注:ENV JAVA_HOME /path/to/java
7、生命暴露的端口:EXPOSE
注:用于声明在运行时容器提供服务的端口
8、指定基础镜像:FROM image
9、为镜像添加元数据:LABEL key=value
10、执行命令:RUN
格式1:RUN <command>
格式2:RUN ["executable" "param1" "param2"]
注:RUN <command> 在shell终端运行,在Linux中默认是/bin/sh -c,在windows中cmd /s /c,使用这种格式就行在命令行中输入命令一样,
RUN ["/bin/bash" "-c" "echo hello"]
11、指定挂载点:VOLUME
注:该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可供其他容器使用。
例:VOLUME /data
12、指定工作目录
例:WORKDIR /path/to/workdir
切换目录指令,类似于cd命令,写在该指令后的RUN、CMD以及ENTRYPOINT指令都将该目录视为当前目录,并执行相应的命令。
(二)、使用Dockerfile构建镜像
1、构建jar包:microservice-discovery-eureka-0.0.1-SNAPSHOT.jar
2、创建Dockerfile
[root@A01-R06-I169-67 eureka]# cat Dockerfile
FROM java:8
VOLUME /tmp
ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3、利用Dockerfile构建image:docker build -t itmuch/microservice-discovery-eureka:0.0.1 .
4、利用image构建container:docker run -d --name my-eureka -p 8761:8761 itmuch/microservice-discovery-eureka:0.0.1(仓库名称/镜像名称:标签)
(三)、使用docker-registry管理docker镜像
1、在hub.docker.com上创建repository:test-repository
登录私有仓库:docker login
2、将image推送到dockerHub:docker push itmuch/microservice-discovery-eureka:0.0.1
3、使用docker registry2.0搭建一个私有仓库
a、搭建docker registry-2.0:docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
b、修改image-tag:docker tag itmuch/microservice-discovery-eureka:0.0.1 localhost:5000/itmuch/microservice-discovery-eureka:0.0.1
因为docker-hub是默认的docker-registry,所以,itmuch/microservice-discovery-eureka:0.0.1相当于docker.io/itmuch/microservice-discovery-eureka:0.0.1
c、将image推送到私有仓库(只需指定私有仓库地址):docker push localhost:5000/itmuch/microservice-discovery-eureka:0.0.1
三、使用maven插件构建docker镜像
(一)、快速入门
1、插件名称:docker-maven-plugin
官方地址:https://github.com/spotify/docker-maven-plugin
2、插件配置
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/${project.artifactId}:${project.version}</imageName>
<baseImage>java</baseImage>
<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>
</configuration>
</plugin>
说明:
resources.resource.directory:用于指定需要复制的根目录。${project.build.directory}表示target目录
resources.resource.include:用于指定需要复制的文件。${project.build.finalName}.jar指的是打包后的jar文件
3、构建docker镜像:mvn clean docker:build
(二)、插件读取Dockerfile进行构建
1、在项目中创建src/main/docker/Dockerfile文件,如上
2、插件内容:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/${project.artifactId}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
说明:使用dockerDirectory指定Dockerfile所在路径
(三)将插件绑定到某个phase执行
执行mvn clean package时,插件就自动构建docker镜像。要想实现这一点,就要将插件的goal绑定到某个phase
注:phase和goal的理解:maven 命令的格式是mvn phase:goal,例如mvn package docker:build。那么,package和docker都是phase,build就是goal。
1、插件内容:将docker的build绑定到了package
也就是说只要执行mvn package就会执行mvn docker:build
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<executions>
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.3</imageName>
<baseImage>java</baseImage>
<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>
</configuration>
</plugin>
(四)、推送镜像
使用mvn插件实现docker push到docker-hub
1、修改maven-settings.xml,添加docker-hub的用户信息
<server>
<id>docker-hub</id>
<username>docker-hub用户名</username>
<password>docker-hub密码</password>
<configuration>
<email>docker-hub邮箱</email>
</configuration>
</server>
2、插件内容
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
<baseImage>java</baseImage>
<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>
<!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
<serverId>docker-hub</serverId>
</configuration>
</plugin>
3、mvn命令:mvn clean package docker:build -DpushImage
注:也可推送到私有仓库:<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>
(五)、常用技巧
1、以上是通过imageName指定镜像名称和标签的
例如:<imageName>localhost:5000/itmuch/microservice-discovery-eureka:0.0.4</imageName>
也可以借助imageTags指定标签
例如:
<configuration>
<imageName>itmuch/microservice-discovery-eureka:0.0.4</imageName>
<imageTags>
<imageTag>0.0.5</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<baseImage>java</baseImage>
<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>
<!-- 与maven配置文件settings.xml中配置的server.id一致,用于推送镜像 -->
<serverId>docker-hub</serverId>
</configuration>
这样就可以为同一个镜像指定两个标签
2、也可以在执行构建命令时,使用dockerImageTags参数执行标签名称,例如:mvn clean package docker:build -DpushImageTags -DdockerImageTags=latest -DdockerImageTags=anther-tag
3、如果重复构建相同标签名的镜像,可将forceTags设置为true,这样就会覆盖相同标签的镜像
<configuration>
<forceTags>true</forceTags>
</configuration>