1.镜像的备份和保存
1、先把容器变成镜像: docker commit 容器名称 新的镜像的名称
2、导出镜像: docker save -o 镜像保存的目录/镜像名称.tar 上一步保存的新的镜像的名称
3、导入镜像: docker load -i 镜像保存的目录/镜像名称.tar
2.Docker的registry私服
1、私有仓库搭建与配置
(1)拉取私有仓库镜像(此步省略)
docker pull registry
(2)启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
(3)打开浏览器 输入地址http://192.168.189.141:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
(4)修改daemon.json
(vi /etc/docker/daemon.json)
添加以下内容,保存退出。
{"insecure-registries":["192.168.13.111:5000"]}
此步用于让 docker信任私有仓库地址
(5)重启docker 服务
systemctl restart docker
2、镜像上传至私有仓库
(1)标记此镜像为私有仓库的镜像
docker tag jdk1.8 192.168.189.141:5000/jdk1.8
(2)再次启动私服容器
docker start registry
(3)上传标记的镜像
docker push 192.168.189.141:5000/jdk1.8
3.Dockerfile构建镜像
1、常用命令
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
2、案例:使用脚本创建镜像
步骤:
(1)创建目录
mkdir –p /usr/local/dockerjdk8
下载jdk-8u171-linux-x64.tar.gz并上传到服务器(虚拟机)中的/usr/local/dockerjdk8目录
(3)创建文件Dockerfile
vi Dockerfile
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER thh
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u211-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_211
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $JAVA_HOME/bin:$PATH
(4)执行命令构建镜像
docker build -t='jdk1.8' .
注意后边的空格和点,不要省略
(5)查看镜像是否建立完成
docker images
注意
1:创建文件Dockerfile 这里的D必须大写,不能有任何的偏差。
4、自动发布微服务:部署Eureka微服务
使用DockerMaven插件
核心步骤:
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- docker的maven插件,官网:
https://github.com/spotify/docker-maven-plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<!-- 镜像名称
有两种形式:
1)tensquare_eureka:1.0-SNAPSHOT : tensquare_eureka镜像名称,1.0-SNAPSHOT: 标签,只能在Docker本地仓库构建处理
2)192.168.207.111:5000/tensquare_eureka:1.0-SNAPSHOT: 192.168.207.111:5000是Docker的私服地址,既能在本地仓库构建,也能上传到私服
-->
<imageName>192.168.207.111:5000/${project.artifactId}:${project.version}</imageName>
<!-- FROM jdk1.8 -->
<baseImage>jdk1.8</baseImage>
<!-- ENTRYPOINT ["java","-jar","/app.jar"] -->
<entryPoint>["java", "-jar","/${project.build.finalName}.jar"]</entryPoint>
<resources>
<!-- ADD app.jar /app.jar -->
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- 2375: Docker专门为DockerMaven插件开放构建镜像的端口 -->
<dockerHost>http://192.168.207.111:2375</dockerHost>
</configuration>
</plugin>
</plugins>
</build>
mvn clean package docker:build -DpushImage 用maven命令直接打包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRIGUSpz-1581146119045)(docker.assets/1577928623650.png)]
<!--绑定Docker 命令到 Maven 各个阶段-->
<!--解释:我们可以把 Docker 分为 build、tag、push,然后分别绑定 Maven 的 package、deploy 阶段-->
<executions>
<execution>
<id>build-image</id>
<!--这里将插件绑定在package这个操作上。也就是说,用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
<!--<goal>push</goal> -->
</goals>
</execution>
</executions>
docker 开放2375端口
微服务部署有两种方法:
(1)手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。
(2)通过Maven插件自动部署。
对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易出错。所以我们这里学习如何自动部署,这也是企业实际开发中经常使用的方法。
Maven插件自动部署步骤:
(1)修改宿主机的docker配置,让其可以远程访问
vi /lib/systemd/system/docker.service
其中ExecStart=后添加配置
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改后如下
2)刷新配置,重启服务
systemctl daemon-reload
systemctl restart docker
docker start registry
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7cWaWbY-1581146119046)(docker.assets/1577870918965.png)]