简易docker仓库
docker.io提供了简易的docker仓库实现,可以从docker.hub上拉取。
1
docker pull registry
registry支持本地模式和远程模式。其中,本地模式仅限于本地访问,无需配置网络服务地址。
1 本地模式
本地模式启动方式如下,
1
docker run -d -v Your_local_registry:/var/lib/registry/ -p 5000:5000 --name registry registry
如果,本地存在镜像localhost:5000/say:latest
,可以直接使用docker push
命令推送之registry
服务。
1
docker push localhost:5000/say:latest
假使,本地删除了该镜像,还是可以再次从registry
服务拉取镜像。
1
2
3
4
5
6
7
8
docker rmi localhost:5000/say:latest
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker pull localhost:5000/say:latest
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:50000/say latest 8b196f4277c4 12 minutes ago 923kB
2 远程模式
在远程模式下,镜像的存取可以通过网络跨主机进行。在远程模式下,需要为registry
服务配置https
所需要的证书、密钥、网络地址等。
cfssl
、openssl
等工具可以方便地签发证书,相关操作可以参考cfssl.md。
(1)证书
建立CA证书签发请求文件和CA配置文件,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
./ca-csr.json
{
"CN": "cheney.io",
"hosts": [
"cheney.io"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "JS",
"L": "Wu Xi"
}
]
}
./ca.config
{
"signing": {
"default": {
"expiry": "43800h"
},
"profiles": {
"server": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
},
"peer": {
"expiry": "43800h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
创建CA自签证书,的证书ca.pem
、密钥ca-key.pem
和签发请求ca.csr
。
1
cfssl gencert --initca ./ca-csr.json | cfssljson -bare ca
将ca.pem
转为ca.crt
格式。
1
openssl x509 --outform der -in ./ca.pem -out ./ca.crt
ca.crt
证书需要安装在参与认证的设备上。
1
2
sudo cp ./ca.crt /etc/ca-certificates/trust-source/anchors/ca.crt
sudo update-ca-trust
CA证书更新仅对执行命令的进程和新的进程生效。
接下来,为registry
签发证书。
首先,定义签发请求,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
./server-csr.json
{
"CN": "registry.cheney.io",
"hosts": [
"172.17.0.1",
"172.17.0.2",
"172.17.0.3",
"172.17.0.4"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "JS",
"L": "Wu Xi"
}
]
}
1
cfssl gencert -ca ../ca.pem -ca-key ../ca-key.pem --config ../ca.config --profile server ./server-csr.json| cfssljson -bare server
得到证书server.pem
、server-key.pem
和server.csr
。
(2)启动容器
1
2
3
4
5
6
7
8
9
docker run -d \
-v /home/cheney/docker-registry:/var/lib/register \
-v /home/cheney/expr/CA/server:/certs \
-p 443:443 \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/server-key.pem \
--name registry \
registry
/home/cheney/expr/CA/server
目录下放置了registry
的证书和私钥,需要映射之容器内/certs
。
(3)连接测试
推送:
1
docker push 172.17.0.2/say:latest
拉取:
1
docker pull 172.17.0.2/say:latest