Docker之镜像仓库
镜像仓库
-
镜像从仓库下载下来,镜像保存在仓库中,而仓库存在于Registry中,一个Registry可以存放多个仓库,仓库可以被认为是一个具体的项目或目录。默认的Registry是由Docker公司运营的公共Registry服务,即Docker Hub
-
Docker运行容器前需要本地存在对应的镜像。如果镜像不存在,Docker会尝试从默认镜像仓库中下载(Docker Hub 公共注册服务器中的仓库),用户也可以通过配置使用自定义的镜像仓库
-
常见的仓库
-
docker镜像生命周期
命令操作
-
获取镜像。下载的过程中可以看出,镜像文件一般由若干层组成,行首的
a330b6cecb98:
这样的数字代表各层的ID。下载过程中会获取并输出镜像的各层信息。层(Layer)其是AUFS(联合文件系统)中的重要概念,是实现增量保存与更新的基础。1. 如果不指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像(仓库中最新的) $ docker pull name[:TAG] 2. 案例 $ docker pull redis 3. docker pull redis 相当于以下命令 $ docker pull registry.hub.docker.com/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
-
列出镜像
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=http://download.redis.io/releases/redis-6.2.5.tar.gz", "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=http://download.redis.io/releases/redis-6.2.5.tar.gz", "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/8e81b7565c1bc82df23db2120104b3d6186762dc2bf7a451afdb81d6588c3656/diff:/var/lib/docker/overlay2/43b3859fd03894353c96c258a263418e52b01f4a6c521575a8565d34b3943782/diff:/var/lib/docker/overlay2/36f941dcdf39c34844ddeae3792d832255d8cd6f534e318e4d01c258e6cf262d/diff:/var/lib/docker/overlay2/a9915ad9e4ec11e3bd59ea066b4a48702d324e43f840f9629afe5f44ae5898bc/diff", "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]
-
搜索镜像
-
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]
-
-
删除镜像
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
:强制删除镜像,而不进行提示确认
-
上传镜像
docker push name:tag (docker push <hub-user>/<repo-name>:<tag>)
1. 登录docker hub(https://hub.docker.com) $ docker login 登录成功后的用户名和密码会保存~/.docker/config.json $ cat ~/.docker/config.json { "auths": { "https://index.docker.io/v1/": { "auth": "amFubmFsOjEyM3F3ZTEyMw==" }, "registry.cn-beijing.aliyuncs.com": { "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
-
Docker Registry也叫Docker仓库,仓库主要用来下载和上传镜像的,仓库分为公有仓库和私有仓库,Registry是注册服务器,一个注册服务器存放多个仓库,每个仓库下又有多个镜像。
-
Docker已经将Registry开源了,同时在Docker Hub上也有官方的镜像registry
-
搭建步骤
$ 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 访问http://192.168.6.107:5000/v2
-
测试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
Harbor简介与安装
-
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
-
Harbor特性
-
基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
-
镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
-
图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
-
AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
-
审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
-
国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
-
RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
-
部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
-
-
组件
-
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,供日后进行分析。
-
安装
-
下载并解压
$ yum install -y docker-compose $ wget https://github.com/goharbor/harbor/releases/download/v2.3.2/harbor-offline-installer-v2.3.2.tgz $ tar -zxvf harbor-offline-installer-v2.3.2.tgz -C /usr/local/ $ cd /usr/local/harbor/
-
修改配置文件
$ cp harbor.yml.tmpl harbor.yml $ vim harbor.yml #修改以下配置 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/harbor/ca.crt private_key: /usr/local/harbor/ca.key
-
创建自签名证书key文件
openssl genrsa -out /usr/local/harbor/ca.key 2048
-
创建自签名证书crt文件,
/CN=harbor
修改为自己的域名,这里是harboropenssl req -x509 -new -nodes -key /usr/local/harbor/ca.key \ -subj "/CN=harbor" -days 500000 -out /usr/local/harbor/ca.crt
-
安装
$ /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.----
-
卸载
$ docker-compose down $ rm -rf /usr/local/harbor $ rm -rf /data/
客户端配置
-
客户端需要创建证书文件存放的位置,并且把服务端创建的证书拷贝到该目录下,然后重启客户端docker。我们这里创建目录为:
/etc/docker/certs.d/harbor
$ mkdir -p /etc/docker/certs.d/harbor
-
把服务端crt证书文件拷贝到客户端,例如我这的客户端主机名为:master
$ scp /usr/local/harbor/ca.crt root@master:/etc/docker/certs.d/harbor/
-
重启客户端docker
$ systemctl daemon-reload && systemctl restart docker
-
可以也可以使用http方式访问
$ cat > /etc/docker/daemon.json << EOF { "insecure-registries":["harbor"] } EOF $ systemctl daemon-reload && systemctl restart docker
-
登录测试
$ docker login harbor -u admin -p Harbor12345 浏览器访问,默认是80端口 https://harbor/
-
查看错误日志
$ cd /var/log/harbor $ grep "ERROR" *