Docker之镜像仓库
⽬录
镜像仓库
1. 镜像从仓库下载下来,镜像保存在仓库中,⽽仓库存在于Registry中,⼀个Registry可以存放多个仓库,仓库可以被认为是⼀个具体的项⽬或⽬录。默认的Registry是由Docker公司运
营的公共Registry服务,即Docker Hub
2. Docker运⾏容器前需要本地存在对应的镜像。如果镜像不存在,Docker会尝试从默认镜像仓库中下载(Docker Hub 公共注册服务器中的仓库),⽤户也可以通过配置使⽤⾃定义的镜像
仓库
3. 常见的仓库
www.daocloud.io
4. docker镜像⽣命周期
命令操作
1. 获取镜像。下载的过程中可以看出,镜像⽂件⼀般由若⼲层组成,⾏⾸的a330b6cecb98:这样的数字代表各层的ID。下载过程中会获取并输出镜像的各层信息。层(Layer)其是AUFS(联
合⽂件系统)中的重要概念,是实现增量保存与更新的基础。
1. 如果不指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像(仓库中最新的)
$ docker pull name[:TAG]
2. 案例
$ docker pull redis
3. docker pull redis 相当于以下命令
$ docker pull registry.hub.docker/redis:latest
docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a330b6cecb98: Pull complete
14bfbab96d75: Pull complete
8b3e2d14a955: Pull complete
5da5e1b21a2f: Pull complete
6af3a5ca4596: Pull complete
4f9efe5b47a5: Pull complete
Digest: sha256:e595e79c05c7690f50ef0136acc9d932d65d8b2ce7915d26a68ca3fb41a7db61
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
2. 列出镜像
1. 查看镜像列表
$ docker images
来⾃于哪个库镜像标签信息镜像ID 创建时间⼤⼩
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 02c7f2054405 11 days ago 105MB
2. 查看镜像详细信息,包括该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
$ docker inspect 02c7f2054405
[
{
"Id": "sha256:02c7f2054405dadaf295fac7281034e998646996e9768e65a78f90af62218be3",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:e595e79c05c7690f50ef0136acc9d932d65d8b2ce7915d26a68ca3fb41a7db61"
],
"Parent": "",
"Comment": "",
"Created": "2021-09-03T13:26:48.395038582Z",
"Container": "3627b30c1a4cf3ef703e0516beee6428efe1b08a5314f5f106b84250635809cb",
"ContainerConfig": {
"Hostname": "3627b30c1a4c",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.5",
"REDIS_DOWNLOAD_URL=dis.io/releases/redis-6.2.",
"REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"redis-server\"]"
],
"Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.5",
"REDIS_DOWNLOAD_URL=dis.io/releases/redis-6.2.",
"REDIS_DOWNLOAD_SHA=4b9a75709a1b74b3785e20a6c158cab94cf52298aa381eea947a678a60d551ae"
],
"Cmd": [
"redis-server"
],
"Image": "sha256:332cd8bceec776c2152877041d9e60cbaf4ba95504335e888311bcc1444155a7",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 105408201,
"VirtualSize": 105408201,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/f63351e421b4a4d9115edac8011bf02c16a5bef9b65e6abc17a0a798111212f2/diff:/var/lib/docker/overlay2/8e81b7565c1bc82df23db2120104b3d6186762dc2bf7a451afd "MergedDir": "/var/lib/docker/overlay2/0ed2a4da5492feb1a9c1d13db169bf5b56b1ea2b37235f82c5f0bc7d578efbb4/merged",
"UpperDir": "/var/lib/docker/overlay2/0ed2a4da5492feb1a9c1d13db169bf5b56b1ea2b37235f82c5f0bc7d578efbb4/diff",
"WorkDir": "/var/lib/docker/overlay2/0ed2a4da5492feb1a9c1d13db169bf5b56b1ea2b37235f82c5f0bc7d578efbb4/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:d000633a56813933cb0ac5ee3246cf7a4c0205db6290018a169d7cb096581046",
"sha256:bdad86443e47c5665683ac41c1f24f28479d830d7e3cc47d0a337ee5166c7714",
"sha256:6a7992ac480029d82b7dbb757d16fe5d023aa283ed32b52267cd1fe9e6b73c49",
"sha256:be43d2475cf809c0f2ec31950e849d0f888f3121970fd99196a11a903f8c3820",
"sha256:be5818ef2907adfe19be14bf66647b5fb5a2029143f9297f8ce1ff1fd1d35753",
"sha256:c54e0c16ea22fa873c12f6a7f3fb4e021bb58d67c292156a6ce6e08637458b7c"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
3. 只获取其中⼀部分信息
$. docker inspect -f {{".Architecture"}} cd645f5a4769
amd64
$ docker inspect -f {{".Config.Env"}} cd645f5a4769
[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
3. 搜索镜像
docker search 搜索远端仓库中共享的镜像,默认搜索Docker Hub官⽅仓库中的镜像。通过docker search --help
--automated=false 仅显⽰⾃动化构建的镜像
--help=false Print usage
--no-trunc=false 输出信息不截断显⽰
--s,--stars=0 指定仅显⽰评价为执⾏星级以上的镜像
显⽰信息:[名字] [描述] [星级] [是否官⽅创建] [是否⾃动创建]
$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11412 [OK]
mariadb MariaDB Server is a high performing open sou… 4336 [OK]
4. 删除镜像
docker rmi 镜像标签或者ID。如果⼀个镜像对应了多个tag,只有当最后⼀个tag被删除时,镜像才被真正删除
-f, -force:强制删除镜像,即使有容器依赖它
-no-prune:不要清理未带标签的⽗镜像
不能删除⼀个正在被使⽤的镜像(被容器占⽤) ,推荐先删除掉对应的容器 docker rm xxx,然后再删除镜像,⽽不是使⽤-f选项强制删除
批量删除none镜像docker images|grep none|awk '{print $3}'|xargs docker rmi
docker image prune删除遗留的临时镜像,以及没有被使⽤的镜像
-a, -all:删除所有⽆⽤镜像,不光是临时镜像;
-filter filter:只清理符合给定过滤器的镜像;
-f, -force:强制删除镜像,⽽不进⾏提⽰确认
5. 上传镜像docker push name:tag (docker push <hub-user>/<repo-name>:<tag>)
1. 登录docker hub(hub.docker)
$ docker login
登录成功后的⽤户名和密码会保存~/.docker/config.json
$ cat ~/.docker/config.json
mysql社区版国内镜像下载{
"auths": {
"index.docker.io/v1/": {
"auth": "amFubmFsOjEyM3F3ZTEyMw=="
},
"registry-beijing.aliyuncs": {
"auth": "dXNhZ29vbGU6ampmQDI1ODQxMjg="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.11 (linux)"
}
}
2. 登录其他镜像仓库
$ docker login k8s.harbor 或者docker login k8s.harbor -u admin -p Harbor12345
3. 添加⼀个标签,推送到⾃⼰的命名空间下,需要重命名
$ docker tag centos-sshd-base:6.6 jannal/centos6.6-sshd:latest
4. 推送镜像
$ docker push jannal/centos6.6-sshd:latest
搭建Registry
1. Docker Registry也叫Docker仓库,仓库主要⽤来下载和上传镜像的,仓库分为公有仓库和私有仓库,Registry是注册服务器,⼀个注册服务器存放多个仓库,每个仓库下⼜有多个镜
像。
2. Docker已经将Registry开源了,同时在Docker Hub上也有官⽅的镜像registry
3. 搭建步骤
$ docker pull registry:2.1.1
$ docker run -d -v /home/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2.1.1
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/home/registry⽬录挂载到该⽬录,即可实现将镜像保存到主机的/home/registry⽬录了。
$ docker ps -a
CONTAINER ID IMAGE COMMAND PORTS NAMES
b9ad37f6c17a registry:2.1.1 "/bin/registry /etc/ 0.0.0.0:5000->5000/tcp registry
访问192.168.6.107:5000/v2
4. 测试push⼀个镜像到私有仓库
$ docker tag c6f9e0e6b1e8 192.168.6.107:5000/centos-ssd-base
$ docker push 192.168.6.107:5000/centos-ssd-base
如果遇到https的错误
$ cat > /etc/docker/daemon.json << EOF
{ "insecure-registries":["192.168.6.107:5000"] }
EOF
$ systemctl daemon-reload && systemctl restart docker
5.
Harbor简介与安装
1. Harbor是⼀个⽤于存储和分发Docker镜像的企业级Registry服务器,通过添加⼀些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为⼀个企业级
私有Registry服务器,Harbor提供了更好的性能和安全。提升⽤户使⽤Registry构建和运⾏环境传输镜像的效率。Harbor⽀持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,确保数据和知识产权在公司内部⽹络中管控。另外,Harbor也提供了⾼级的安全特性,诸如⽤户管理,访问控制和活动审计等。
2. Harbor特性
基于⾓⾊的访问控制:⽤户与Docker镜像仓库通过“项⽬”进⾏组织管理,⼀个⽤户可以对多个镜像仓库在同⼀命名空间(project)⾥有不同的权限。
镜像复制:镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,⾼可⽤,混合云和多云的场景。
图形化⽤户界⾯:⽤户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项⽬和命名空间。
AD/LDAP ⽀持: Harbor可以集成企业内部已有的AD/LDAP,⽤于鉴权认证管理。
审计管理:所有针对镜像仓库的操作都可以被记录追溯,⽤于审计管理。
国际化:已拥有英⽂、中⽂、德⽂、⽇⽂和俄⽂的本地化版本。更多的语⾔将会添加进来。
RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
部署简单:提供在线和离线两种安装⼯具,也可以安装到vSphere平台(OVA⽅式)虚拟设备。
3. 组件
Proxy:Harbor的registry, UI, token等服务,通过⼀个前置的反向代理统⼀接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry:负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对⽤户进⾏访问控制,即不同⽤户对Docker image有不同的读写权限,Registry会指向⼀个token服务,强制⽤户的每次docker pull/push请求都要携带⼀个合法的token, Registry会通过公钥对token 进⾏解密验证。
Core services:这是Harbor的核⼼功能,主要提供以下服务:
UI:提供图形化界⾯,帮助⽤户管理registry上的镜像(image), 并对⽤户进⾏授权。
webhook:为了及时获取registry 上image状态变化的情况,在Registry上配置webhook,把状态变化传递给UI模块。
token 服务:负责根据⽤户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这⾥,获得token后再重新向Registry进⾏请求。
Database:为core services提供数据库服务,负责储存⽤户权限、审计⽇志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运⾏,负责收集其他组件的log,供⽇后进⾏分析。
安装
1. 下载并解压
$ yum install -y docker-compose
$ wget github/goharbor/harbor/releases/download/v2.3.2/harbor-offline-installer-v2.
$ tar -zxvf harbor-offline-installer-v2. -C /usr/local/
$ cd /usr/local/harbor/
2. 修改配置⽂件
$ l.l
$ l
#修改以下配置
hostname: harbor # 当前主机名
harbor_admin_password: Harbor12345 # 密码
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /usr/local/
private_key: /usr/local/harbor/ca.key
3. 创建⾃签名证书key⽂件
openssl genrsa -out /usr/local/harbor/ca.key 2048
4. 创建⾃签名证书crt⽂件,/CN=harbor修改为⾃⼰的域名,这⾥是harbor
openssl req -x509 -new -nodes -key /usr/local/harbor/ca.key \
-subj "/CN=harbor" -days 500000 -out /usr/local/
5. 安装
$ /usr/local/harbor/install.sh
...省略...
Creating harbor-db ... done
Creating harbor-core ... done
Creating network "harbor_harbor" with the default driver
Creating nginx ... done
Creating registry ...
Creating harbor-portal ...
Creating harbor-db ...
Creating redis ...
Creating registryctl ...
Creating harbor-core ...
Creating nginx ...
Creating harbor-jobservice ...
✔ ----Harbor has been installed and started successfully.----
6. 卸载
$ docker-compose down
$ rm -rf /usr/local/harbor
$ rm -rf /data/
客户端配置
1. 客户端需要创建证书⽂件存放的位置,并且把服务端创建的证书拷贝到该⽬录下,然后重启客户端docker。我们这⾥创建⽬录为:/etc/docker/certs.d/harbor
$ mkdir -p /etc/docker/certs.d/harbor
2. 把服务端crt证书⽂件拷贝到客户端,例如我这的客户端主机名为:master
$ scp /usr/local/ root@master:/etc/docker/certs.d/harbor/
3. 重启客户端docker
$ systemctl daemon-reload && systemctl restart docker
4. 可以也可以使⽤http⽅式访问
$ cat > /etc/docker/daemon.json << EOF
{ "insecure-registries":["harbor"] }
EOF
$ systemctl daemon-reload && systemctl restart docker
5. 登录测试
$ docker login harbor -u admin -p Harbor12345
浏览器访问,默认是80端⼝
harbor/
6. 查看错误⽇志
$ cd /var/log/harbor
$ grep "ERROR" *
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论