使用Docker Registry快速搭建私有镜像仓库

转自: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下来了
使用Docker Registry快速搭建私有镜像仓库

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"]}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值