1、Docker是什么?
Docker是Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。
Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
2、Docker概念
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台。使用Linux容器来部署应用程序称为集装箱化。使用docker轻松部署应用程序。
集装箱化的优点:
- 灵活:即使是复杂的应用程序也可封装。
- 轻量级:容器利用并共享主机内核。
- 便携式:您可以在本地构建,部署到云上并在任何地方运行。
- 可扩展性:您可以增加和自动分发容器副本。
- 可堆叠:您可以垂直堆叠服务并及时并及时堆叠服务。
3、背景
在 Docker 中,当我们执行 docker pull xxx 的时候,可能会比较好奇,Docker 会去哪儿查找并下载镜像呢?
它实际上是从 registry.hub.docker.com 这个地址去查找,这就是Docker公司为我们提供的公共仓库,上面的镜像,大家都可以看到,也可以使用。所以,我们也可以带上仓库地址去拉取镜像,如:docker pull registry.hub.docker.com/library/alpine,不过要注意,这种方式下载的镜像的默认名称就会长一些。
如果要在公司中使用 Docker,我们基本不可能把商业项目上传到公共仓库中,那如果要多个机器共享,又能怎么办呢?
正因为这种需要,所以私有仓库也就有用武之地了。
所谓私有仓库,也就是在本地(局域网)搭建的一个类似公共仓库的东西,搭建好之后,我们可以将镜像提交到私有仓库中。这样我们既能使用 Docker 来运行我们的项目镜像,也避免了商业项目暴露出去的风险。
下面我们用官方提供的registry镜像来搭建私有镜像仓库,当然还有其它很多方法。
4、环境准备
准备两台安装好docker的服务器:
服务端:docker私有仓库服务器,运行registry容器;
测试端:普通的docker服务器,在这台服务器上下载一个测试镜像nginx,然后上传到registry服务器进行测试;
IP地址 | 操作系统 | 备注 |
192.168.1.77 | CentOS 7.4.1708 (Core) | 服务端 |
192.168.1.79 | CentOS 7.4.1708 (Core) | 测试端 |
5、registry部署(服务端操作)
1)下载镜像registry
[root@localhost ~]# docker pull registry
Using default tag: latest
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/library/registry
486039affc0a: Pull complete
ba51a3b098e6: Pull complete
8bb4c43d6c8e: Pull complete
6f5f453e5f2d: Pull complete
42bc10b72f42: Pull complete
Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7
Status: Downloaded newer image for docker.io/registry:latest
2)查看镜下是否pull下来
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest 708bc6af7e5e 3 months ago 25.8 MB
3)运行registry容器
[root@localhost ~]# docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
2cba2cc0ca18d22686b05de30a80ae461c5f29cc10c15d3a5ea47e65238a5941
参数说明
-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
-v:把宿主机的/data/registry目录绑定 到 容器/var/lib/registry目录(这个目录是registry容器中存放镜像文件的目录),来实现数据的持久化;
-p:映射端口;访问宿主机的5000端口就访问到registry容器的服务了;
--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
--name registry:创建容器命名为registry,你可以随便命名;
registry:latest:这个是刚才pull下来的镜像;
4)测试镜像仓库中所有的镜像
[root@localhost ~]# curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}
6、测试镜像仓库(测试端操作)
1)修改下镜像源并重启docker服务
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
# 以下是镜像源地址,选择合适的镜像地址
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
中国科技大学
https://docker.mirrors.ustc.edu.cn
阿里云容器服务
https://cr.console.aliyun.com
2)下载nginx镜像
[root@localhost ~]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
54fec2fa59d0: Pull complete
4ede6f09aefe: Pull complete
f9dc69acb465: Pull complete
Digest: sha256:86ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12
Status: Downloaded newer image for docker.io/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 602e111c06b6 5 days ago 127 MB
3)镜像打标签
[root@localhost ~]# docker tag nginx:latest 192.168.1.77:5000/nginx:v1
格式说明:Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
nginx:lastest 这是源镜像,也是刚才pull下来的镜像文件;
192.168.1.77:5000/nginx:v1:这是目标镜像,也是registry私有镜像服务器的IP地址和端口;
4)查看已打好的标签镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.77:5000/nginx v1 602e111c06b6 5 days ago 127 MB
docker.io/nginx latest 602e111c06b6 5 days ago 127 MB
5)上传到镜像服务器
[root@localhost ~]# docker push 192.168.1.77:5000/nginx:v1
The push refers to a repository [192.168.1.77:5000/nginx]
Get https://192.168.1.77:5000/v1/_ping: http: server gave HTTP response to HTTPS client
注意了,这是报错了,需要https的方法才能上传,我们可以修改下daemon.json来解决:
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries": [ "192.168.1.77:5000"]
}
# 重启Docker服务
[root@localhost ~]# systemctl restart docker
# 再次上传镜像
[root@localhost ~]# docker push 192.168.1.77:5000/nginx:v1
The push refers to a repository [192.168.1.77:5000/nginx]
b3003aac411c: Pushed
216cf33c0a28: Pushed
c2adabaecedb: Pushed
v1: digest: sha256:cccef6d6bdea671c394956e24b0d0c44cd82dbe83f543a47fdc790fadea48422 size: 948
6)测试下载镜像
# 上传测试没问题了,我们接下来测试一下从registry服务器上下载刚才上传的nginx镜像,先删除测试端主机上的镜像:
[root@localhost ~]# docker rmi -f $(docker images -aq)
Untagged: 192.168.1.77:5000/nginx:v1
Untagged: 192.168.1.77:5000/nginx@sha256:cccef6d6bdea671c394956e24b0d0c44cd82dbe83f543a47fdc790fadea48422
Untagged: docker.io/nginx:latest
Untagged: docker.io/nginx@sha256:86ae264c3f4acb99b2dee4d0098c40cb8c46dcf9e1148f05d3a51c4df6758c12
Deleted: sha256:602e111c06b6934013578ad80554a074049c59441d9bcd963cb4a7feccede7a5
Deleted: sha256:81eaddad75aaa517b4a597912da28c2f5b905f6e9789dce3aea874b040aad201
Deleted: sha256:73cafa8418003ecfaa02360f181c132b2cf4b61433e1bd5c84012941105865c8
Deleted: sha256:c2adabaecedbda0af72b153c6499a0555f3a769d52370469d8f6bd6328af9b13
# 查看一下测试端主机上的镜像删除情况
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
7)从registry服务器上下载nginx镜像
[root@localhost ~]# docker pull 192.168.1.77:5000/nginx:v1
Trying to pull repository 192.168.1.77:5000/nginx ...
v1: Pulling from 192.168.1.77:5000/nginx
54fec2fa59d0: Pull complete
4ede6f09aefe: Pull complete
f9dc69acb465: Pull complete
Digest: sha256:cccef6d6bdea671c394956e24b0d0c44cd82dbe83f543a47fdc790fadea48422
Status: Downloaded newer image for 192.168.1.77:5000/nginx:v1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.77:5000/nginx v1 602e111c06b6 5 days ago 127 MB
# 列出所有镜像
[root@localhost ~]# curl http://192.168.1.77:5000/v2/_catalog
{"repositories":["nginx"]}
# 列出nginx镜像tag标签
[root@localhost ~]# curl http://192.168.1.77:5000/v2/nginx/tags/list
{"name":"nginx","tags":["v1"]}
至此,Docker搭建私有仓库完毕。
- 输入编号:6893,直达文章
- 输入m|M,直达目录列表