前摘
在内网(不能联网)的某台机器上,需要通过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