Docker搭建私有仓库并迁移

前摘

在内网(不能联网)的某台机器上,需要通过docker快速安装redis、mysql等容器,因为不能在线pull镜像,所以需要一种从本地pull的解决方案

 

解决方案

准备两台机器:A机器(可以连接外网),B机器(内网机器、不可联网)

步骤一:A机器安装docker、这里采用离线或在线安装都可以

步骤二:A机器使用docker搭建私有仓库registry

步骤三:A机器使用docker在线pull需要安装的镜像(redis、mysql等)

步骤四:A机器使用docker提交镜像到私有仓库registry

步骤五:等A机器镜像提交完毕,使用docker将私有仓库registry打包成tar包

步骤六:拷贝仓库tar包到B机器,在B机器离线安装docker

步骤七:B机器使用docker离线pull私有仓库中的镜像,完成需求

 

方案实现

下载docker离线安装包:https://download.docker.com/linux/static/stable/x86_64/

本次使用的docker版本是:19.03.0.tgz

 

▶▶  A、B机器安装docker

上传tgz安装包到/usr/local/下面并解压

cd /usr/local
tar -zxvf docker-19.03.0.tgz  #解压

将docker注册成服务

      将解压出来的docker文件内容移动到 /usr/bin/ 目录下

cd /usr/local
cp docker/* /usr/bin/

        新建服务配置文件

vim /etc/systemd/system/docker.service

       将如下内容粘贴进去(不需要改动)

[Unit]

Description=Docker Application Container Engine

Documentation=https://docs.docker.com

After=network-online.target firewalld.service

Wants=network-online.target

[Service]

Type=notify

# the default is not to use systemd for cgroups because the delegate issues still

# exists and systemd currently does not support the cgroup feature set required

# for containers run by docker

ExecStart=/usr/bin/dockerd

ExecReload=/bin/kill -s HUP $MAINPID

# Having non-zero Limit*s causes performance problems due to accounting overhead

# in the kernel. We recommend using cgroups to do container-local accounting.

LimitNOFILE=infinity

LimitNPROC=infinity

LimitCORE=infinity

# Uncomment TasksMax if your systemd version supports it.

# Only systemd 226 and above support this version.

#TasksMax=infinity

TimeoutStartSec=0

# set delegate yes so that systemd does not reset the cgroups of docker containers

Delegate=yes

# kill only the docker process, not all processes in the cgroup

KillMode=process

# restart the docker process if it exits prematurely

Restart=on-failure

StartLimitBurst=3

StartLimitInterval=60s

 

[Install]

WantedBy=multi-user.target

           添加文件权限

chmod +x /etc/systemd/system/docker.service

           加载、启动、设置开机启动

systemctl daemon-reload  # 重新加载单元

systemctl start docker   # 启动docker

systemctl enable docker.service   # 设置开机启动

         

▶▶  A机器准备数据

       下载docker registry仓库镜像

docker pull docker.io/registry

        创建仓库目录

mkdir -p /mnt/registry-data

        修改 /etc/docker/daemon.json文件、添加如下内容

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

         重启docker服务

systemctl restart docker

         运行registry镜像,并将/mnt/registry-data目录挂载到容器内的/var/lib/registry目录

docker run -d --name=registry -v /mnt/registry-data:/var/lib/registry -p 5000:5000 docker.io/registry

         下载redis镜像

docker pull redis

         修改redis镜像tag

docker tag redis  127.0.0.1:5000/redis

         将redis上传到仓库

docker push 127.0.0.1:5000/redis

         cd进入/mnt/registry-data/docker/registry/v2/repositories目录,查看redis是否被成功上传(mysql上传同上)

          使用docker将registry镜像打包成registry.tar,放到/mnt目录下

docker save -o /mnt/registry.tar docker.io/registry

          将registry-data仓库目录打包成registry-data.tar.gz,放到/mnt目录下

cd /mnt
tar czvf registry-data.tar.gz registry-data  # 打包

           

▶▶  拷贝数据

将A机器上的/mnt目录下面的registry.tar和registry-data.tar.gz拷贝到B机器的/mnt目录下

 

▶▶  B机器运行redis、mysql镜像

        修改 /etc/docker/daemon.json文件、添加如下内容

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

       重启docker服务

systemctl restart docker
 

      导入registry镜像

docker load -i /mnt/registry.tar

      解压registry-data仓库目录

tar xf /mnt/registry-data.tar.gz -C /mnt

      运行registry镜像,并将/mnt/registry-data目录挂载到容器内的/var/lib/registry目录

docker run -d --name=registry -v /mnt/registry-data:/var/lib/registry -p 5000:5000 docker.io/registry

      从本地仓库下载下载redis镜像

docker pull 127.0.0.1:5000/redis

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章