一、搭建docker registry

1、安装docker

由于使用docker容器安装docker registry:

yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-selinux

2、下载docker registry镜像

docker pull registry

3、添加用户验证,启动docker-registry

使用htpasswd,生成用户名对应的密码加密文件:

yum  install httpd
htpasswd -Bbn username passwd > /usr/local/auth/passwd

启动docker registry:

docker run -d \
  -p 5000:5000 \
  -v /data/registry:/var/lib/registry \
  -v /usr/local/auth:/auth \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/passwd \
  -v /usr/local/nginx/conf/cert:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.pem \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  --restart=always \
  --name registry \
  registry

参数解析:

-p 5000:5000,指定registry的端口是5000并映射成主机的5000端口。
-v /data/registry:/var/lib/registry,将本地的/data/registr挂载到镜像默认存储路径 /var/lib/registry。
-v /usr/local/auth:/auth,第一步生成的auth文件挂载到/auth。
-e REGISTRY_AUTH=htpasswd, -e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm,这两个参数组合启动基本身份验证。
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/passwd,指定使用的密码认证文件是/auth/passwd。
-v /usr/local/nginx/conf/cert:/certs,如果有https认证,将宿主机保存的认证文件挂到容器里。
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.pem,-e REGISTRY_HTTP_TLS_KEY=/certs/server.key 指定https证书和key。
–restart=always,重启方式为always。
–name registry,指定容器名称。
registry,镜像名称。

4、安装配置nginx

> yum -y install pcre pcre-devel openssl openssl-devel
> ./configure  --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module --with-pcre --with-stream --with-http_v2_module --with-threads --with-http_ssl_module
> make && make install

配置文件如下:

upstream registry {
    server 127.0.0.1:5000;
  }

server {
    listen 443;
    server_name  -;
    charset   UTF-8;
    ssl on;
    ssl_certificate   /usr/local/nginx/conf/cert/server.pem;
    ssl_certificate_key  /usr/local/nginx/conf/cert/server.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    access_log  /var/log/nginx/registry/access.log;
    error_log  /var/log/nginx/registry/error.log;
    root   html;
    index  index.html index.htm index.php;

    ## send request back to apache ##
    location / {
        proxy_pass  https://registry/;
        charset   UTF-8;
        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
  }
}

5、创建registry前端 docker-registry-frontend

docker run \
  -d \
  -e ENV_DOCKER_REGISTRY_HOST=10.244.1.3 \
  -e ENV_DOCKER_REGISTRY_PORT=443 \
  -e ENV_DOCKER_REGISTRY_USE_SSL=1\
  -p 8082:80 \
  konradkleine/docker-registry-frontend:v2

参数解析:

-e ENV_DOCKER_REGISTRY_HOST=10.244.1.3,指定docker registry的host ip,由于前端配置了nginx所以直接连接nginx的IP。
-e ENV_DOCKER_REGISTRY_PORT=443,指定docker registry的host port ,由于前端配置了nginx所以直接连接nginx的端口。
-e ENV_DOCKER_REGISTRY_USE_SSL=1,开启SSL认证。
-p 8082:80 ,映射主机端口为8082。

至此docker registry 就搭建完成了 。

二、docker使用镜像仓库

1、登陆docker registry

docker login -uusername -ppassword 10.244.1.3:5000

如果没有开启https认证,登陆有时会报错如下:

The push refers to a repository [10.244.1.3:5000/registry]
Get https://:10.244.1.3:5000/v1/ping: http: server gave HTTP response to HTTPS client

解决办法如下:
在”/etc/docker/“目录下,创建”daemon.json“文件,内容如下:

{ "insecure-registries":["10.244.1.3:5000"] }

重启docker即可。

systemctl restart docker

2、push/pull镜像

假如本地有一个java:8的镜像,想要推到仓库里,需要先打tag成registryip:port的形式,再推。具体如下:

> docker tag java:8 10.244.1.3:5000/java:8
> docker push 10.244.1.3:5000/java:8

pull镜像也需要带上ip port,如下:

docker pull 10.244.1.3:5000/java:8

3、登出仓库

docker logout 10.244.1.3:5000

三、在k8s中使用镜像仓库

想要在k8s中拉取私有镜像仓库的镜像,需要先配置一个secret。secret有命名空间属性,需要指定命名空间。具体如下:

kubectl create secret docker-registry registry-secret-name --docker-server=10.244.1.3:5000 --docker-username=username --docker-password=password  -n namespace

其中registry为创建的secretname,通过命令可以看到创建的secret。

> kubectl get secret
NAME                                       TYPE                                                      DATA   AGE
registry-secret-name           kubernetes.io/dockerconfigjson        1      3d11h

在创建deployment的yaml文件需要在spec.template.spec中增加 imagePullSecrets,name值为刚刚创建的secret名称:registry-secret-name ,具体yaml文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: accessmanage-center-deployment
  namespace: dev
  labels:
    app: accessmanage-center
spec:
  replicas: 1
  selector:
    matchLabels:
      app: accessmanage-center
  template:
    metadata:
      labels:
        app: accessmanage-center
    spec:
      imagePullSecrets:
      - name: registry-secret-name
      containers:
      - name: accessmanage-center
        image: 10.244.1.3:5000/tomcat:7

原文链接:https://blog.csdn.net/weixin_44723434/article/details/97397091

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐