转自:https://www.linuxidc.com/Linux/2018-03/151308.htm 根据实际操作,修改部分遇到的问题
1、背景
在 Docker 中,当我们执行 docker pull xxx 的时候,可能会比较好奇,Docker 会去哪儿查找并下载镜像呢?
它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。
如果要在公司中使用 Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?
正因为这种需要,所以私有仓库也就有用武之地了。
所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。
下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。
2、环境
准备两台安装好docker的服务器:
服务端机器 (主机名为registry):docker私有仓库服务器,运行registry容器;
测试端机器 (主机名为node):普通的docker服务器,在这台服务器上下载一个测试镜像busybox,然后上传到registry服务器进行测试;
3、部署(服务端操作)
3.1 下载镜像registry
[root@registry ~]# docker pull registry
3.2 查看镜下是否pull下来了
3.3 运行registry容器
[root@registry ~]# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
06a972de6218b1f1c3bf9b53eb9068dc66d147d14e18a89ab51db13e339d3dc9
参数说明
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
--name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像;
3.4 测试镜像仓库中所有的镜像
[root@registry ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
现在是空的,因为才刚运行,里面没有任何镜像内容。
4、测试镜像仓库(测试端操作)
4.1 修改测试端下镜像源并重启docker服务(MAC系统安装版本可直接在 Preferences-》Daemon设置)
[root@node ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
[root@node ~]# systemctl restart docker
4.1 配置SrpingBoot应用
4.1.1新增maven插件配置
<properties>
<docker.image.prefix>bsmind</docker.image.prefix><!--前缀可修改-->
</properties>
<build>
<finalName>eureka-server</finalName>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version><!--打包时报错,修改对应版本,一般最新docker对应最新插件即可-->
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
4.1.2 新建Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
参数讲解:
FROM <image>:<tag> 需要一个基础镜像,可以是公共的或者是私有的, 后续构建会基于此镜像,如果同一个Dockerfile中建立多个镜像时,可以使用多个FROM指令
VOLUME 配置一个具有持久化功能的目录,主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp。改步骤是可选的,如果涉及到文件系统的应用就很有必要了。/tmp目录用来持久化到 Docker 数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用/tmp作为工作目录
ARG 设置编译镜像时加入的参数, ENV 是设置容器的环境变量
COPY : 只支持将本地文件复制到容器 ,还有个ADD更强大但复杂点
ENTRYPOINT 容器启动时执行的命令。
EXPOSE 8080 暴露镜像端口
4.1.3 打包
1.mvn install dockerfile:build
2.mvn install -Dmaven.test.skip=true dockerfile:build (跳过单元测试)
[root@node ~]# mvn install -Dmaven.test.skip=true dockerfile:build
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
eureka-server latest f6e427c148a7 36 hours ago 1.15MB
4.2 为镜像打标签
[root@node ~]# docker tag f6e427c148a7 39.118.91.98:5000/eureka-server:v20190427
格式说明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
f6e427c148a7 这是源镜像,也是刚才打包生成的镜像文件;
39.118.91.98:5000/eureka-server:v20190427:这是目标镜像,也是registry私有镜像服务器的IP地址和端口;
4.3 上传到镜像服务器
[root@node ~]# docker push 39.118.91.98:5000/eureka-server:v20190427
The push refers to repository [39.118.91.98:5000/eureka-server]
Get https://39.118.91.98:5000/v2/: http: server gave HTTP response to HTTPS client
注意了,这是报错了,需要https的方法才能上传,我们可以修改测试端下daemon.json来解决(MAC系统安装版本可直接在 Preferences-》Daemon设置):
[root@node ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "39.118.91.98:5000"]
}
添加私有镜像服务器的地址,注意书写格式为json,有严格的书写要求,然后重启docker服务:
[root@node ~]# systemctl restart docker
在次上传可以看到没问题 了:
[root@node ~]# docker push 39.118.91.98:5000/eureka-server:v20190427
The push refers to repository [39.118.91.98:5000/eureka-server]
c5183829c43c: Pushed
v1: digest: sha256:c7b0a24019b0e6eda714ec0fa137ad42bc44a754d9cea17d14fba3a80ccc1ee4 size: 527
4.4 测试下载镜像
上传测试没问题了,我们接下来测试一下从registry服务器上下载刚才上传的busybox镜像,先删除node主机上的镜像:
[root@node ~]# docker rmi -f $(docker images -aq)
查看一下node主机上的镜像全部删除了:
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
然后,从registry服务器上下载busybox镜像:
[root@node ~]# docker pull 39.118.91.98:5000/eureka-server:v20190427
[root@node ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
39.118.91.98:5000/eureka-server v20190427 f6e427c148a7 36 hours ago 1.15MB
列出所有镜像:
[root@node ~]# curl http://39.118.91.98:5000/v2/_catalog
{"repositories":["busybox"]}
列出busybox镜像有哪些tag:
[root@node ~]# curl http://39.118.91.98:5000/v2/busybox/tags/list
{"name":"busybox","tags":["v1"]}