千家信息网

如何搭建私有镜像仓库

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,这篇文章主要介绍"如何搭建私有镜像仓库",在日常操作中,相信很多人在如何搭建私有镜像仓库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何搭建私有镜像仓库"的疑惑有所帮
千家信息网最后更新 2024年11月17日如何搭建私有镜像仓库

这篇文章主要介绍"如何搭建私有镜像仓库",在日常操作中,相信很多人在如何搭建私有镜像仓库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何搭建私有镜像仓库"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Docker容器

什么是docker

docker是一个的容器实现,包括三个基本概念:

  • 镜像(Image): Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

  • 容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

  • 仓库(Repository): 仓库可看成一个代码控制中心,用来保存镜像。

开启远程访问

docker开启远程访问有两种方式:

Configuring remote access with systemd unit file

编辑docker.service,添加-H fd:// -H tcp://127.0.0.1:2375启动参数,然后重新加载配置并重启

 $ sudo systemctl daemon-reload $ sudo systemctl restart docker.service
Configuring remote access with daemon.json

修改docker进程配置文件,添加hosts。(本文采用的方式)

  1. Set the hosts array in the /etc/docker/daemon.json to connect to the UNIX socket and an IP address, as follows:

{  "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]}
  1. Restart Docker.

  2. Check to see whether the change was honored by reviewing the output of netstat to confirm dockerd is listening on the configured port.

$ sudo netstat -lntp | grep dockerdtcp        0      0 127.0.0.1:2375          0.0.0.0:*               LISTEN      3758/dockerd

systemd vs daemon.json Configuring Docker to listen for connections using both the systemd unit file and the daemon.json file causes a conflict that prevents Docker from starting.

客户端访问远程docker进程需要配置环境变量:
DOCKER_HOST=tcp://172.31.0.250:2375

搭建私有镜像仓库

镜像仓库是集中存放docker镜像的地方,Docker Hub就是一个公共的镜像仓库。而在公司内使用,我们需要一个私有的仓库。 可以参照https://github.com/Quiq/docker-registry-ui中的example方案进行部署。该部署方案使用docker-compose,共包含三部分:

  1. register 最重要的镜像仓库服务

  2. register-ui 仓库的web ui

  3. httpd 前置http服务

docker-compose.yml文件如下:

version: "2.3"services:  httpd:    image: httpd:2.4    ports:      - "80:80"    volumes:      - "./config/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro"  registry:    image: registry:2    ports:      - "5000"    volumes:      - "./data/registry:/var/lib/registry"    healthcheck:      test: ["CMD", "wget", "-S", "localhost:5000/v2/"]      interval: 5s      timeout: 10s  registry-ui:    image: quiq/docker-registry-ui:latest    ports:      - "8000"    volumes:      - "./data/registry-ui:/opt/data"      - "./config/registry-ui.yml:/opt/config.yml:ro"    depends_on:      registry:        condition: service_healthy

从配置文件可以看到,该方案使用volumes把需要保存的数据映射到宿主机,配置文件放在./config下,数据文件放到./data下。

如果没有特殊要求,可以直接使用示例中的registry-ui.yml和httpd.conf配置文件,无需任何修改。使用docker-compose命令启动。

$ docker-compose up -d

启动后可以访问80端口的/ui进入web界面(本例中因为服务运行在本地,所以使用localhost)。

80端口的/v2请求,将被转发到镜像服务(http://registry:5000/v2)上。通过打上tag,就可以push到私服仓库了。

docker tag getting-started localhost/getting-started

如果是远程服务器,需要在客户端修改docker配置文件,增加私服的insecure配置:

$ cat /etc/docker/daemon.json{     "insecure-registries":["docker-hub.jc.com"] }

否则会遇到x509异常:

x509: certificate is valid for ingress.local, not docker-hub.jc.com

踩坑记

因为我使用rancher的ingress进行转发,结果在push的时候遇到

error parsing HTTP 413 response body: invalid character '<' looking for beginning of value: "\r\n413 Request Entity Too Large\r\n\r\n

413 Request Entity Too Large

\r\n
nginx/1.19.2
\r\n\r\n\r\n"

解决办法是在ingress的annotations中设置大小,我这里设置了1g:

annotations:    nginx.ingress.kubernetes.io/proxy-body-size: "1g"

制作docker镜像文件

制作docker镜像文件有两种方式:

  1. 使用dockerfile进行构建

$ docker build -f /path/to/a/Dockerfile .

dockerfile示例:

FROM tomcat:8-jdk8COPY target/pop-seller.war /usr/local/tomcat/webapps/ROOT.war
  1. 使用docker commit命令进行构建

$ docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS              NAMESc3f279d17e0a        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            desperate_dubinsky197387f1b436        ubuntu:12.04        /bin/bash           7 days ago          Up 25 hours                            focused_hamilton$ docker commit c3f279d17e0a  svendowideit/testimage:version3f5283438590d$ docker imagesREPOSITORY                        TAG                 ID                  CREATED             SIZEsvendowideit/testimage            version3            f5283438590d        16 seconds ago      335.7 MB

Generally, it is better to use Dockerfiles to manage your images in a documented and maintainable way.

实践

POP项目中的实践:

docker run -p 8080:3001 --add-host=pop-seller:172.31.98.102 -v /host/path/logs:/data/logs --name pop-seller-web -d docker-hub.jc.com/pop-web:v2.2
  • -d: 让容器在后台运行。

  • -p: 将容器内部使用的网络端口随机映射到我们使用的主机上。

  • -v: 主机的目录 /host/path/logs 映射到容器的 /data/logs。 以日志为例,我们是不希望容器重启后日志丢失的,对于这样的场景,就可以将日志目录挂到主机上。

  • -e: 配置环境变量。比如接了apollo配置中心的的工程需要配置env和key,那么就需要添加环境变量:"JAVA_OPTS=-Denv=fat -Dapollo.key=12345678"

  • --add-host: 增加hosts配置,容器的hosts文件中会增加一条配置,在没有配置dns的开发环境就经常需要这样配置。

到此,关于"如何搭建私有镜像仓库"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0