前摘
在內網(不能聯網)的某臺機器上,需要通過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