更好的阅读体验:点这里 ( www.doubibiji.com
)
8 镜像仓库
在安装 Docker 的时候,默认使用的是 DockerHub,后来为了提升速度,配置的镜像仓库是使用阿里云的镜像仓库,拉取的是别人制作的镜像,下面讲解一下制作我们自己的镜像,并将制作的镜像提交到远程镜像仓库。
8.1 制作镜像
制作镜像的方法主要有两种方式:
- 使用
docker commit
命令; - 使用
Dockerfile
文件。
Dockerfile
后面再讲解,下面先讲解使用 docker commit
命令制作镜像。
首先我们拉取别人的镜像,比如拉取一个 Ubuntu 镜像,但是 Ubuntu 镜像是一个精简版的 Linux 系统,很多东西都是没有的,例如 vim文本编辑器都没有,我们可以使用这个 Ubuntu 镜像来创建容器,然后在容器中安装 vim 文本编辑器(当然自己想要什么就自己安装),这样容器就变成我们自己定制化的了,我们可以将这个容器使用 docker commit
命令保存成我们自己的镜像。后面我们可以使用这个镜像来重新创建 Ubuntu 容器,创建的容器就自带 vim文本编辑器了。
话不多说,开整。
1 拉取镜像并创建Ubuntu容器
拉取镜像、创建容器和之前一样不多说:
# 拉取镜像
docker pull ubuntu
# 创建容器
docker run -it --name my-ubuntu ubuntu
可以看到原始 Ubuntu 镜像容器中没有 vim :
2 安装需要的程序
在容器中,安装 vim:
# 先更新一下apt
apt update
# 安装vim
apt install vim
3 保存为新镜像
容器修改好了,安装了需要的程序,可以将容器保存为镜像了。
命令:
docker commit -m="提交的描述信息" -a="作者" 容器ID 镜像名:[版本标签]
将 Ubuntu 容器保存为镜像:
使用 docker images
命令可以看到保存的新镜像。
4 使用新镜像创建容器
下面使用刚才保存的新镜像来创建容器,这样创建的容器就自带 vim 了。
# 使用新的镜像创建容器
docker run -it 新的镜像ID /bin/bash
可以看到新创建的容器自带vim文本编辑器,我们是就现有的镜像进行拓展,创建了新的镜像,相当于在镜像中又添加了一层。
8.2 上传镜像到阿里云远程仓库
在上面我们制作了我们自己的镜像,如何将这个镜像给其他的同事使用,或者在其他的服务器使用?
可以将镜像上传到镜像仓库,这样别的服务器就可以拉取镜像来使用了。其实和 Git 的原理是一样的。
使用 Git 的时候,我们的代码仓库是 Github 或 Gitee。
同样使用 Docker,我们可以使用 Dockerhub,但是 Dockerhub 是国外的,网络太慢了,上传和拉取都容易失败。所以我们使用阿里云的远程镜像仓库。
1 创建命名空间
在阿里云上创建 Docker 仓库命名空间。
搜索镜像服务
找到镜像服务:
创建个人实例
个人版不要钱,企业版要钱。
设置密码
需要设置密码,按照要求设置即可:
创建命名空间
创建一个自己的命名空间,和 gitee 基本是一样的。
2 创建镜像仓库
在镜像仓库页面,创建镜像仓库:
填写仓库信息:
选择本地仓库,并创建:
创建完成,显示仓库的使用命令:
在仓库列表页面,点击仓库也可以进到这个页面。
3 上传镜像到仓库
在前面我们使用了 docker commit
制作了我们自己的镜像,现在将这个镜像上传到阿里云的远程仓库。
使用上面将镜像推送到 Registry 中提供的命令:
# 登录
docker login --username=你的用户名 registry.cn-hangzhou.aliyuncs.com
# 给镜像打上标签
docker tag [本地镜像ID] registry.cn-hangzhou.aliyuncs.com/doubibiji/my-ubuntu:[镜像版本号]
# 将镜像推送到远程仓库
docker push registry.cn-hangzhou.aliyuncs.com/doubibiji/my-ubuntu:[镜像版本号]
执行:
给镜像打完标签会发现本地多了一个镜像,这是为什么呢?
这是因为标签是用来标识镜像的,当给一个已有的镜像打上新的标签时,Docker 会复制该镜像并创建一个新的镜像,带有新的标签。因此,打完标签后,会生成一个新的镜像,推送镜像到远程仓库的时候,就是推送的这个镜像。其实这两个镜像是一样的,ID都一样。
上传后,可以在镜像版本中看到:
4 将镜像拉取到本地使用
刚才是将本地的镜像上传到远程仓库,下面我们将远程仓库的镜像拉取到本地进行使用。
因为我们本地已经存在了这个镜像,所以先将本地的镜像删除,然后再从远程仓库拉取镜像。
也是使用上面提供的命令拉取:
docker pull registry.cn-hangzhou.aliyuncs.com/doubibiji/my-ubuntu:[镜像版本号]
拉取镜像
从阿里云仓库拉取镜像:
使用镜像创建容器
使用拉取的镜像创建容器:
整个流程演示完成。
8.3 私有仓库Docker Registry
前面我们使用的是阿里云镜像仓库,个人版只能自己用,企业版本是收费的。我们可以使用工具搭建我们自己的镜像仓库。类似于使用 GitLab 搭建私有的 Git 仓库,供公司内部使用。
Docker 官方提供了 Docker Registry
私有镜像仓库工具, Docker Registry
也是一个 Docker 镜像,所以使用起来比较简单。
1 准备要提交的镜像
和前面制作镜像的步骤一样,使用一个 Ubuntu 的镜像创建容器,在容器中安装想要的程序,例如vim,然后使用 docker commit
命令创建容器。
查看一下前面的笔记。
2 下载Docker Registry镜像
没什么好说的,执行命令:
# 下载registry镜像
docker pull registry
3 运行私有仓库Registry
使用 Docker Registry 镜像运行容器:
docker run -d --privileged=true -p 5000:5000 \
-v /home/doubi/docker/registry:/tmp/registry registry
解释一下:
docker run
: Docker 的命令来运行一个容器。-d
: 以后台模式运行容器。--privileged=true
: 以特权模式运行容器,赋予容器几乎所有与宿主机相同的权限。-p 5000:5000
: 端口映射设置,将宿主机的 5000 端口映射到容器的 5000 端口。-v /home/doubi/docker/registry/:/tmp/registry
: 卷映射设置,将宿主机上的/home/doubi/docker/registry/
目录映射到容器内的/tmp/registry
目录。registry
: 要运行的 Docker 镜像的名称,这里是 Docker 官方的 Registry 镜像。
将宿主机上的 /home/doubi/docker/registry/
目录映射到容器的 /tmp/registry
目录。这样配置后,就可以在宿主机的 /home/doubi/docker/registry/
目录中存储和推送 Docker 镜像,并通过宿主机的 5000 端口访问这些镜像。
4 查看私有仓库镜像
Docker Registry 容器已经运行了,可以查看仓库中有哪些镜像。
命令:
curl -XGET http://localhost:5000/v2/_catalog
因为 Registry 就是在当前机器上,所以使用 localhost。
不出意外,镜像仓库是空的,因为我们也没有推送镜像到仓库。
5 推送镜像到私有仓库
下面将安装了我们想要的程序的 Ubuntu 镜像,推送到我们的私有镜像仓库。
首先给镜像打上标签
命令:
# 命令
docker tag 本地镜像ID Host:Port/远程仓库名称:[版本tag]
# 例如
docker tag ad0b74b466f7 localhost:5000/myubuntu:1.0
这里注意区分,为了突出不同,这里打标签的时候指定的名称和本地镜像的名称是不同的(一个带 -
一个不带)。
当给一个已有的镜像打上新的标签时,Docker 会复制该镜像并创建一个新的镜像,带有新的标签。待会推送到远程仓库的是新生成的镜像。这两个镜像是一样的,ID都一样。
修改Docker Registry配置
Docker Registry
默认是不支持 http 的推送的,所以需要修改一下 Docker Registry
的配置,取消该限制。
修改 /etc/docker/daemon.json
文件,添加 insecure-registries
配置:
{
"registry-mirrors": ["https://01e3hiyl.mirror.aliyuncs.com"],
"insecure-registries":["localhost:5000"]
}
上面的 insecure-registries
配置表示信任这个地址的镜像仓库。
注意:上面的格式是 JSON 格式的,别漏掉第一行后面的逗号 ,
。
修改完成,如果不生效,重启一下 Docker。
sudo systemctl restart docker
将镜像推送到私有仓库
命令:
# 命令
docker push 镜像名称:[版本tag]
# 例如
docker push localhost:5000/myubuntu:1.0
6 查看私有仓库镜像
重新查看仓库中有哪些镜像:
命令:
curl -XGET http://localhost:5000/v2/_catalog
可以看到上传的镜像:
7 拉取镜像
镜像已经上传到我们的私有仓库中了,那么如何从私有仓库中拉取镜像呢?
首先将本地的仓库删除,因为我们上传的时候在本地已经存在这个镜像了。
然后从私有仓库中拉取刚才的镜像。
# 从私有仓库拉取镜像
docker pull localhost:5000/myubuntu:1.0
指定私有仓库的地址、端口、镜像,就可以拉取了:
镜像下载完成了,就可以使用这个镜像来运行容器了,上面我们配置的都是 localhost,如果在局域网内共享给大家使用,要配置为自己的 IP 地址,别人拉取的时候,指定 IP 地址即可。