一、镜像版本管理
1、下载镜像
格式:docker pull NAME[:tag]
指定标签tag
docker pull ubuntu:12.04
docker pull dl.dockerpool.com:5000/ubuntu:12.04
不指定标签tag
docker pull ubuntu
将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像
[root@docker-centos ~]# docker pull ubuntu:12.04
12.04: Pulling from library/ubuntu
d8868e50ac4c: Pull complete
83251ac64627: Pull complete
589bba2f1b36: Pull complete
d62ecaceda39: Pull complete
6d93b41cfc6b: Pull complete
Digest: sha256:18305429afa14ea462f810146ba44d4363ae76e4c8dfc38288cf73aa07485005
Status: Downloaded newer image for ubuntu:12.04
docker.io/library/ubuntu:12.04
下载过程中,会输出获取镜像的每一层信息。
该命令实际上相当于:
docker pull registry.hub.docker.com/ubuntu:12.04 命令,即从注册服务器registry.hub.docker.com 中的 ubuntu 仓库来下载标记为 12.04 的镜像。
完成后,即可随时使用该镜像了,例如创建一个容器,让其中运行 bash 应用。
docker run -t -i ubuntu:12.04 /bin/bash
[root@docker-centos ~]# docker run -t -i ubuntu:12.04 /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
root@557fb25eb93d:/#
退出交互:exit
2、查看镜像信息
docker images
3、查看镜像详细信息
docker inspect 1cca79f8389d
[
{
"Id": "sha256:1cca79f8389d83e1a23fc811b451abdf7305e36c708eeb63b96575e61161b9a5",
"RepoTags": [
"centos-with-wget:latest"
],
"RepoDigests": [],
"Parent": "sha256:fe6ec852b0c91010eb14606003c4562120c809442ec0a61fb05bb3ad53a356a2",
"Comment": "",
"Created": "2020-05-07T09:30:07.23859234Z",
"Container": "7a07360617b62f7cb04aa5481da40366b9b5f5af436225fbe5d2f7e8051a90ff",
"ContainerConfig": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"yum install -y wget"
],
"Image": "sha256:fe6ec852b0c91010eb14606003c4562120c809442ec0a61fb05bb3ad53a356a2",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200114",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
},
"DockerVersion": "19.03.8",
"Author": "zola",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:fe6ec852b0c91010eb14606003c4562120c809442ec0a61fb05bb3ad53a356a2",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200114",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 271334279,
"VirtualSize": 271334279,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/90ae4fb35aa95461c7927d717f54ac21d6ce7f467d53544691181893e88f67a1/diff",
"MergedDir": "/var/lib/docker/overlay2/2d59c3c720e46ff47e4516b57236aedba4e0411cdecd7a4c37bbaf883befcb1b/merged",
"UpperDir": "/var/lib/docker/overlay2/2d59c3c720e46ff47e4516b57236aedba4e0411cdecd7a4c37bbaf883befcb1b/diff",
"WorkDir": "/var/lib/docker/overlay2/2d59c3c720e46ff47e4516b57236aedba4e0411cdecd7a4c37bbaf883befcb1b/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:0683de2821778aa9546bf3d3e6944df779daba1582631b7ea3517bb36f9e4007",
"sha256:daf6dae04785924d00f3b8f00d704e71f2943afdca9fbfa3911b073c4dacd02e"
]
},
"Metadata": {
"LastTagTime": "2020-05-07T17:30:07.270525487+08:00"
}
}
]
返回JSON格式的信息
查看镜像指定信息:
docker inspect -f {{."Architecture"}} 1cca79f8389d
"Id"
"RepoTags"
"RepoDigests"
"Parent"
"Comment"
"Created"
"Container"
"ContainerConfig"
"DockerVersion"
"Author"
"Config"
"Architecture"
"Os"
"Size"
"VirtualSize"
"GraphDriver"
"RootFS"
"Metadata"
4、搜寻镜像
搜索带mysql关键字的镜像
docker search mysql
5、删除镜像
使用镜像标签删除
使用镜像标签删除,IMAGE可以是镜像ID或者TAG
docker rmi IMAGE[;IMAGE...]
docker images
docker rmi 3de0e2c97e5c
docker images
注意:当镜像创建的容器是重载的,镜像文件默认是无法删除的
查看本机上所有存在的容器
docker ps -a
Exited表示后台退出状态的容器,是删除不掉对应的镜像
强制删除:不推荐使用强制删除有依赖的镜像,会造成一些遗留问题
docker rmi -f hello-world
推荐使用:先删除镜像所依赖的所有容器,然后再删除对应的镜像
docker rm CONTAINER ID
6、存出和载入镜像
存出本机镜像ubuntu:14.04为文件ubuntu_14.04.tar
docker save -o ubuntu_14.04.tar ubuntu:14.04
导入镜像从本机文件ubuntu_14.04.tar导入到镜像列表中
docker load --input ubuntu_14.04.tar
或
docker load < ubuntu_14.04.tar
7、docker run
8、给镜像打标签(tag)时需要注意命名的规范
一般为:系统名称+系统版本+服务名+服务版本:代码版本
如:centos7.6-nginx-1.47:2.0
需要注意的是:镜像的名称需要现限制为[a-z0-9],其中可以出现的符号为[-._],不能出现中文以及中文符号,包括镜像名称中的: 也必须是英文的冒号,不然创建容器的时候会失败
给镜像打 tag:
docker tag old-image[:old-tag] new-image[:new-tag]
-f 参数为强制重命名
使用docker tag使用镜像tag重命名
docker tag hello-world:latest hello-world:v1
docker镜像的版本控制
若需升级某个docker镜像:
1.给每个新生成的镜像都打上相应版本的tag。此时可能存在image:latest、image:v1、image:v2等。
2.我们要从v1升级到v2,首先我们将导入的v2镜像强制重命名为image:latest 命令为 docker tag -f image:v2 image:latest
3.docker stop之前正在运行的容器
4.启用docker run image,此时image的等价镜像image:latest就是最新的V2镜像。
使用repository:tag的组合来删除特殊的镜像(镜像ID一样)
docker rmi repository:tag
- Docker镜像公共Registry(仓库)
Docker镜像公共Registry:
Registry(注册服务器)实际是存放仓库的具体服务器,1个注册服务器上可以有N个仓库,1个仓库下可以有N个镜像。仓库可看成一个具体项目或目录。如:https://hub.docker.com/centos,可以这样理解:https://hub.docker.com是注册服务器地址,centos是仓库名。
1、Docker Hub
Docker官方维护的一个公共仓库
https://hub.docker.com
网速不好的话,特别慢!!!
https://hub.docker.com
在 Docker Hub 上注册一个账号
在 Docker Host 上登录
[root@docker-centos ~]# docker login -u zolazuomingshui
Password:
修改镜像的 repository 使之与 Docker Hub 账号匹配。Docker Hub 为了区分不同用户的同名镜像,镜像的 registry 中要包含用户名,完整格式为:[username]/xxx:tag
重命名镜像
docker tag
docker tag zolazuomingshui/centos-with-wget:v1
通过 docker push 将镜像上传到 Docker Hub
docker push zolazuomingshui/centos-with-wget:v1
登录 https://hub.docker.com,在Public Repository 中就可以看到上传的镜像
要删除上传的镜像,只能在 Docker Hub 界面上操作
该镜像为公有镜像可被其他 Docker host 下载使用了
2、Docker Pool
Docker Pool是国内专业的Docker技术社区,也提供官方镜像下载管理服务
http://dockerpool.com
http://www.dockerpool.com/downloads
同上操作
三、Docker镜像私有Registry(仓库)
由于受网络和安全等因素的限制,公有Registry的弊端显现,此时选用私有Registry管理自己的镜像
安装Docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:
1、运行registry容器
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
使用的镜像是: registry:2
-d 是后台启动容器
-p 将容器的 5000 端口映射到 Host 的 5000 端口。5000 是 registry 服务端口
-v 将容器 /var/lib/registry 目录映射到 Host 的 /myregistry,用于存放镜像数据
问题描述:
创建容器的时候报错WARNING: IPv4 forwarding is disabled. Networking will not work.
解决办法:
vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
systemctl restart network
systemctl status network
完成以后,删除错误的容器,再次创建新容器,就不再报错了
docker ps
docker stop 5d7181801db5
docker ps
[root@docker-centos ~]# docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
61ccf06cd7fd9f996a28bc3302b18ca9f8638226a7a275ccb927827e54531f4b
[root@docker-centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61ccf06cd7fd registry:2 "/entrypoint.sh /etc?? 20 seconds ago Up 19 seconds 0.0.0.0:5000->5000/tcp nifty_rubin
页面访问:
2、通过 docker tag 重命名镜像,使之与 registry 匹配
在镜像的前面加上了运行 registry 的主机名称和端口
镜像名称由 repository 和 tag 两部分组成。repository 的完整格式为:[registry-host]:[port]/[username]/xxx
只有 Docker Hub 上的镜像可以省略 [registry-host]:[port]
[root@docker-centos ~]# docker images
docker tag centos-with-wget:latest 192.168.233.143:5000/centos-with-wget/centos-with-wget:v1
[root@docker-centos ~]# docker images
3、上传镜像
docker push 192.168.233.143:5000/centos-with-wget/centos-with-wget:v1
注意:这里使用push来上传镜像!!!
[root@docker-centos ~]# docker push 192.168.233.143:5000/centos-with-wget/centos-with-wget:v1
The push refers to repository [192.168.233.143:5000/centos-with-wget/centos-with-wget]
Get https://192.168.233.143:5000/v2/: http: server gave HTTP response to HTTPS client
问题描述:
http: server gave HTTP response to HTTPS client
出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。
这个报错是在本地上传私有镜像的时候遇到的报错
解决办法:在docker server启动的时候,增加启动参数,默认使用HTTP访问:
vi /usr/lib/systemd/system/docker.service
在ExecStart=/usr/bin/dockerd这一行后面增加
--insecure-registry 192.168.233.143:5000
修改好后重启docker 服务
systemctl daemon-reload
systemctl restart docker
systemctl status docker
如果上述方法还是不能解决,还可以通过以下办法解决:
vi /etc/docker/daemon.json
{
"registry-mirrors":["https://49c47s26.mirror.aliyuncs.com","http://192.168.233.143:5000"]
}
systemctl restart docker
systemctl status docker
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
[root@docker-centos ~]# docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
188b391a9267928c78897a72db2150ca44c551c7c7f7106caca10e3ec6c03ef3
Docker 查询或获取私有仓库(registry)中的镜像
docker search 192.168.233.143:5000
不太好用
[root@docker-centos ~]# docker search 192.168.233.143:5000
Error response from daemon: Get https://index.docker.io/v1/search?q=192.168.233.143%3A5000&n=25: net/http: TLS handshake timeout
获取仓库类的镜像:
curl -XGET http://192.168.233.143:5000/v2/_catalog
[root@docker-centos ~]# curl -XGET http://192.168.233.143:5000/v2/_catalog
{"repositories":[]}
获取某个镜像的标签列表:
curl -XGET http://192.168.233.143:5000/v2/image_name/tags/list
重新尝试上传镜像到本地仓库:
docker push 192.168.233.143:5000/centos-with-wget/centos-with-wget:v1
curl -XGET http://192.168.233.143:5000/v2/centos-with-wget/centos-with-wget/tags/list
{"name":"centos-with-wget/centos-with-wget","tags":["v1"]}
4、从本地 registry 下载镜像
docker pull 192.168.233.143:5000/v2/centos-with-wget/centos-with-wget:v1
镜像的名称(包含 registry host 和 port)
docker images 192.168.233.143:5000/centos-with-wget/centos-with-wget
registry 也支持认证,https 安全传输等特性,参考链接:
https://docs.docker.com/registry/configuration/
详情请见,微信公众号