Docker仓库

前言

镜像构建完成后,可以很容易的在当前机器上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务Docker Registry就是这样的服务。

Docker Registry

一个 Docker Registry 中可以包含多个仓库Repository;每个仓库可以包含多个标签Tag;每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版
本的镜像。如果不给出标签,将以 latest 作为默认标签。

Ubuntu 镜像 为例, ubuntu是仓库的名字,其内包含有不同的版本标签,如, 14.04 , 16.04 。我们可以通过 ubuntu:14.04 或者 ubuntu:16.04来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu那将视为
ubuntu:latest

仓库名经常以两段式路径 形式出现,比如 jwilder/nginx-proxy ,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这
并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

DockerHub

简介

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

注册

Docker HubDocker官方维护的公共镜像注册中心,用户可以将自己的镜像推送到Docker Hub免费的仓库中,要想使用Docker Hub得先注册一个Docker Hub账号.
账号注册地址:https://hub.docker.com/ (注意要想成功注册账号得先科学上网)

登录

可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。

1
docker login -u 用户名 -p 密码

查找镜像

用户无需登录即可通过 docker search 命令来查找官方仓库中的镜像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker@default:~$ docker search appium
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
appium/appium Docker Image for Appium Android 31 [OK]
aluedeke/appium-android Appium Server setup for automated android te… 15 [OK]
appium/appium-emulator Docker image for Appium Android Emulator 9 [OK]
davidbaena/appium Appium server up to date with the last versi… 6 [OK]
edulopes/appiumemulator Appium with android emulator 4
muicoder/appium Automation for Apps 3 [OK]
cristopherdcb/appium-android Image containing appium and android 3
rgonalo/appium-emulator Appium server to run tests on Android emulat… 3 [OK]
rgonalo/appium Appium server to run tests on Android devices 2 [OK]
rgonalo/appium-emulator-debug Appium server to run tests on Android emulat… 1 [OK]
vbanthia/appium-docker-test Sample appium test running over real devices… 1 [OK]
isonic1/appium-and-emulator 1 [OK]
softsam/appium

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该
镜像的受欢迎程度)、是否官方创建、是否自动创建。 官方的镜像说明是官方项目
组创建和维护的。

拉取镜像

使用docker pull命令可以从DockerHub拉取镜像。

1
2
3
4
5
6
7
8
9
docker@default:~$ docker  pull ubuntu 
Using default tag: latest
latest: Pulling from library/ubuntu
7413c47ba209: Pull complete
0fe7e7cbb2e8: Pull complete
1d425c982345: Pull complete
344da5c95cec: Pull complete
Digest: sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a
Status: Downloaded newer image for ubuntu:latest

私有仓库

为何使用私有仓库

我们在使用Docker的时候,经常需要使用到docker pull命令从DockerHub拉取我们需要的镜像,进行操作。这样其实有利也有弊,docker hub是官方维护的公用仓库,也是最大、最全的docker镜像仓库。每个人有一个DockerHub hub的账号即可将自己的上传到DockerHub上,方便随时拉取使用。

但是DockerHub有个弊端就是受网络带宽影响,有时候下载速度稍微有些不好。docker官方呢,在DockerHub上提供了一个registry镜像,我们使用这个镜像就可以搭建一个私有的注册服务器。我们可以通过把常用的镜像都放到私有的registry上,这样就避免了经常去DockerHub上拉取的操作,效率可以得到一定的提高。此外,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

搭建步骤

  1. 首先拉取registry镜像
1
2
3
4
5
6
7
8
9
10
docker@default:~$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
  1. 启动容器
1
sudo docker run -d -p 5000:5000 registry

默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,如下:

1
sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry

-v 参数来将镜像文件存放在本地的指定路径

启动之后我们可以看到启动之后的容器。

1
2
3
docker@default:/$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b042cc1bb19a registry "/entrypoint.sh /etc…" 5 seconds ago Up 4 seconds 0.0.0.0:5000->5000/tcp cranky_kirch

上传镜像

搭建好私有仓库,那么我们可以开始测试上传镜像到私有仓库。首先我们拉取hello-world镜像做为上传对象。

1
sudo docker pull hello-world

tag标记

下载完镜像之后,我们可以使用docker tag命令将该镜像归入到我们本地的仓库。

1
2
3
4
5
6
docker@default:/$ docker tag hello-world 192.168.99.101:5000/hello-world  
docker@default:/$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 4 months ago 25.8MB
192.168.99.101:5000/hello-world latest fce289e99eb9 6 months ago 1.84kB
hello-world latest fce289e99eb9 6 months ago 1.84kB
  • 192.168.99.101:5000:iP地址为docker私有仓库的机器ip地址,端口号是前面registry服务指定的端口号。
  • 创建tag之后我们可以看到多了一个192.168.99.101:5000/hello-world镜像,192.168.99.101:5000是仓库名称,hello-world是镜像名称。

push镜像

然后我们使用docker push将镜像上传到私有仓库

1
2
3
docker@default:/$ docker push 192.168.99.101:5000/hello-world
The push refers to repository [192.168.99.101:5000/hello-world]
Get https://192.168.99.101:5000/v2/: http: server gave HTTP response to HTTPS client

从上面的提示内容可以看出,镜像并没有上传成功。这个问题可能是由于客户端采用httpsDockerRegistry 未采用https服务所致。

解决方法:在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入如下内容,然后保存退出后重启docker,问题解决。

1
{ "insecure-registries":["192.168.1.100:5000"] }

再次上传镜像成功。

1
2
3
4
docker@default:~$ docker push 192.168.99.101:5000/hello-world 
The push refers to repository [192.168.99.101:5000/hello-world]
af0b15c8625b: Pushed
latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524

Tips:目前很多文章都是通过修改docker的配置文件“etc/systemconfig/docker”,重启docker来解决这个问题。但发现在docker18.06.1版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。

验证pull镜像

镜像上传成功后,我们可以使用docker pull命令验证镜像是否真的上传成功,首先先将本地的镜像192.168.99.101:5000/hello-world删除。

1
2
3
4
5
6
7
docker@default:/$ docker rmi 192.168.99.101:5000/hello-world
Untagged: 192.168.99.101:5000/hello-world:latest
Untagged: 192.168.99.101:5000/hello-world@sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
docker@default:/$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 4 months ago 25.8MB
hello-world latest fce289e99eb9 6 months ago 1.84kB

然后再从私有仓库pull我们上传的镜像。

1
2
3
4
5
6
7
8
9
10
docker@default:/$ docker pull 192.168.99.101:5000/hello-world
Using default tag: latest
latest: Pulling from hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for 192.168.99.101:5000/hello-world:latest
docker@default:/$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest f32a97de94e1 4 months ago 25.8MB
192.168.99.101:5000/hello-world latest fce289e99eb9 6 months ago 1.84kB
hello-world latest fce289e99eb9 6 months ago 1.84kB

从上面执行的结果我们可以看到,我们已经从私有仓库成功下载了镜像。

参考资料