Kubernetes Cookbook 编程指南 中文版教程
创建时间:2018-12-07  访问量:8413  7  0

Kubernetes Cookbook 编程指南 中文版教程

私有Docker Registry的使用

一旦开始维护自己的Docker镜像,您可能需要使用一些私有Docker Registry来将一些敏感信息放入镜像或组织策略中。 Docker Hub提供私有存储库,只有经过身份验证的用户才能推送和提取图像,并且其他用户不可见。 但是,免费的Docker Hub帐户只有一个配额。 您可能需要付费才能增加私有存储库配额,但如果采用微服务架构,则需要大量私有存储库:

有一些方法可设置你自己的私有Docker Registry,可以在你的内部网络中Docker镜像的配置是没有限制的。

开始

设置Docker Registry最简单的方法就是使一个官方的Docker Registry镜像(https://docs.docker.com/registry/ )。运行docker pull命令来下载Docker registry镜像,如下所示:

$ docker pull registry:2
2: Pulling from library/registry
f32095d4ba8a: Pull complete
9b607719a62a: Pull complete
973de4038269: Pull complete
2867140211c1: Pull complete
8da16446f5ca: Pull complete
fd8c38b8b68d: Pull complete
136640b01f02: Pull complete
e039ba1c0008: Pull complete
c457c689c328: Pull complete
Digest: sha256:339d702cf9a4b0aa665269cc36255ee7ce424412d56bee9ad8a247afe8
c49ef1
Status: Downloaded newer image for registry:2

//create Docker image datastore under /mnt/docker/images
$ sudo mkdir /mnt/docker/images

//launch registry that expose the 5000/tcp to 8888/tcp on host
$ sudo docker run -p 8888:5000 -v /mnt/docker/images:/var/lib/registry
registry:2

它将将镜像存到主机的/mnt/docker/images目录下。强烈建议考虚创建一个网络数据卷,如NFS或者使用Docker卷。

如何去做...

让我们创建一个简单的基于nginx的Docker镜像:

  1. 首先,准备index.html,如下所示:

$ cat index.html
<html>
<head><title>My Image</title></head>
<body>
<h1>Hello Docker !</h1>
</body>
</html>
  1. 还要准备Dockerfile来构建你的Docker镜像,如下所示:

$ cat Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html
  1. 然后,构建一个名为<your name>/mynginx的镜像,如下所示:

$ ls
Dockerfile index.html

$ docker build -t hidetosaito/mynginx .
Sending build context to Docker daemon 3.072 kB
Step 1 : FROM nginx
---> 9737f81306ee
Step 2 : COPY index.html /usr/share/nginx/html
---> 74dd7902a931
Removing intermediate container eefc2bb17e24
Successfully built 74dd7902a931

此时,mynginx镜像仅仅存储在主机上。

  1. 现在,是时候将镜像上传到私有registry。总之,它需要将镜像名称改为<private_registry:port number>/<your name>/mynginx,如下所示:

$ docker tag hidetosaito/mynginx ip-10-96-219-25:8888/hidetosaito/mynginx

$ docker images
REPOSITORY TAG
IMAGE ID CREATED VIRTUAL SIZE
ip-10-96-219-25:8888/hidetosaito/mynginx latest
b69b2ab1f31b 7 minutes ago 134.6 MB
hidetosaito/mynginx latest
b69b2ab1f31b 7 minutes ago 134.6 MB

你可能看到IMAGE ID是相同的,因为它们是同一个镜像。

  1. 然后,使用docker push命令将镜像上传到私有registry中,如下所示:

$ docker push ip-10-96-219-25:8888/hidetosaito/mynginx
The push refers to a repository [ip-10-96-219-25:8888/hidetosaito/
mynginx] (len: 1)
b69b2ab1f31b: Pushed
ae8e1e9c54b3: Pushed
18de280c0e54: Pushed
cd0794b5fd94: Pushed
f32095d4ba8a: Pushed
latest: digest: sha256:7ac04fdaedad1cbcc8c92fb2ff099a6509f4f29b0f6
94ae044a0cffc8ffe58b4 size: 15087

现在,你的mynginx镜像已经存到你的私有registry中了。让我们使用Kubernetes来部署这个镜像。

  1. 准备YAML文件,它包含了从私有registry使用nginx的命令并使用Kubernetes服务来暴露TCP端口30080:

# cat my-nginx-with-service.yaml
apiVersion: v1
kind: ReplicationController
metadata:
	name: mynginx
spec:
    replicas: 2
    selector:
    	app: mynginx
    template:
        metadata:
            labels:
                app: mynginx
        spec:
            containers:
            - name: mynginx
            	image: ip-10-96-219-25:8888/hidetosaito/mynginx
        ---
        apiVersion: v1
        kind: Service
        metadata:
        	name: mynginx-service
        
        spec:
            ports:
                - protocol: TCP
                    port: 80
                    nodePort: 30080
        type: NodePort
        selector:
        	app: mynginx
  1. 然后,使用kubectl create命令加载这个YAML文件:

# kubectl create -f my-nginx-with-service.yaml
replicationcontroller "mynginx" created

你已经将你集群中所有节点上的服务暴露到外部端口。如果你想到这个服务暴露到外部因特网,你可能需要为服务端口(TCP端口30080)设置防火墙规则来服务请求。更多 详细信息请参考:http://releases.k8s.io/release-1.1/docs/user-guide/services-firewalls.md

service "mynginx-service" created

然后,在TCP端口30080上访问Kubernetes节点;你可以访问index.html,如下所示:

它是如何工作的...

在docker push命令运行过程中,它会将Docker镜像上传到私有registry。然后,当运行kubectl create命令时,Kubernetes节点会从私有registry执行docker pull。

使用私有registry是将你的Docker镜像传递到所有Kubernetes节点上是一个非常简单的方法:

替代选择

官方的Docker registry镜像是设置你的私有registry的标准方式。然而,从管理到维护观点来看,你可能需要更多的努力。有另一个方法可以构建你自己的Docker私有registry。

Docker Trusted Registry

Docker Trusted Registry是Docker Registry的企业版本。它自带Web控制台、LDAP集成等等。为了了解更多关于Docker Trusted Registry,请参考以下链接:

https://www.docker.com/products/docker-trusted-registry

Nexus仓库管理器

Nexus Repository Manager是流行的仓库管理器之一;它支持Java Maven,Linux apt/yum,Docker等等。你可以在Nexus仓库管理器中集成所有的软件仓库。阅读更多关于Nexus仓库:

http://www.sonatype.com/nexus/solution-overview/nexus-repository

Amazon EC2容器Registry

Amazon Web Service(AWS)也提供了一个管理DockerRegistry的服务。它集成了Identity Access Management(IAM)并且费用是根据存储使用量和数据流量而不是镜像的个数进行计算的。为了了解更多,请参考下面链接:

https://aws.amazon.com/ecr/

还可以参考

本节描述了如何建立你自己的Docker Registry。私有的Registry给你的镜像带来更多的灵活性和安全性。下面的章节帮助你理解私有registry的需求:

  • 从整体到微服务

  • 第2章理解Kubernetes相关概念,卷的使用