离线部署docker

首先下载离线安装包:Index of linux/static/stable/

将安装包拷贝到目标服务器上

在主机上解压文件:

tar -xvzf docker-26.1.4.tgz
#解压完之后的文件会放到当前目录中的docker目录中
#递归的赋予docker目录中文件可执行权限
sudo chmod 755 -R docker 
sudo cp docker/* /usr/bin/

配置docker服务:

[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 -H unix:///var/run/docker.sock --selinux-enabled=false --default-ulimit nofile=65536:65536
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
​

赋予docker服务配置文件docker.service执行权限

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

启动docker服务:

#加载systemctl配置
sudo systemctl daemon-reload
#设置开机自启动
sudo systemctl enable docker.service 
#启动docker服务
sudo systemctl start docker 
#检查docker状态
sudo systemctl status docker
#查看docker版本
docker -v

自定义docker运行目录:

#配置docker服务自定义设置
sudo mkdir -p /etc/docker
sudo mkdir -p /data/app/dockerWork
sudo vim /etc/docker/daemon.json

在文件中添加下述内容:

{
  "data-root": "/data/dockerData",#填入自己的目录
}

更改后执行:

sudo systemctl daemon-reload
sudo systemctl restart docker 
docker info #输出查看Root Dir

出现的问题:exec: "fuse-overlayfs": executable file not found in $PATH

解决办法:安装fuse-overlayfs

#安装yun-utils
sudo yum install -y yum-utils
#在联网的机器中下载rpm
mkdir -p /tmp/fuse-overlayfs && cd /tmp/fuse-overlayfs
yumdownloader --resolve --destdir=. fuse-overlayfs
#将下载好的包拷贝到目标服务器,并在目录下执行
sudo rpm -Uvh --force *.rpm
#验证安装
fuse-overlayfs --version
​
#过程可能出现错误:依赖检测失败:
    libfuse3.so.3()(64bit) 被 fuse-overlayfs-0.7.2-6.el7_8.x86_64 需要
    libfuse3.so.3(FUSE_3.0)(64bit) 被 fuse-overlayfs-0.7.2-6.el7_8.x86_64 需要
    libfuse3.so.3(FUSE_3.2)(64bit) 被 fuse-overlayfs-0.7.2-6.el7_8.x86_64 需要
#使用下述命令继续下载缺失包
yumdownloader --resolve fuse3 fuse3-libs
​

离线安装docker compose

#下载安装包
https://github.com/docker/compose/releases
#或者
wget https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-linux-x86_64
#复制到离线服务器上
chmod +x docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 docker-compose
#将文件放到Docker CLI插件默认目录中
mkdir -p ~/.docker/cli-plugins
mv docker-compose ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
#或者放到系统级插件目录
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo mv docker-compose /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
#验证安装
docker compose version

部署docker出现问题:当前用户无法访问docker守护进程的Unix socker文件

docker ps -a
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json?all=1": dial unix /var/run/docker.sock: connect: permission denied 

解决方案:

#查看 socket 文件的权限:
ls -l /var/run/docker.sock
#正常情况是
srw-rw---- 1 root docker 0 Jul 25 22:13 /var/run/docker.sock
#如果组不是 docker,或没有 rw- 权限,执行:
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock
#将当前用户添加到docker组
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

离线部署Judge

首先在联网机器上准备好judge0的镜像和代码

#克隆judge0项目
git clone https://github.com/judge0/judge0.git
cd judge0
#下载镜像
docker compose -f docker-compose.yml pull
#导出镜像
docker save -o judge0_images.tar judge0/judge0:latest postgres:16.2 redis:7.2.4
#拷贝镜像到离线机器 导入
docker load -i judge0_images.tar

在judge目录中执行

docker-compose up -d

然后就能看到启动的容器,不出意外的话就能访问judge0的api了

测试

curl http://localhost:2358/languages

部署遇到的问题

[ghips@cugsat11 DZ01]$ docker load -i judge0_images.tar
dd5242c2dc8a: Loading layer  119.2MB/119.2MB
6f1c84e6ec59: Loading layer  17.11MB/17.11MB
b52c1c103fae: Loading layer  17.85MB/17.85MB
e6d60910d056: Loading layer  149.9MB/149.9MB
f63773c65620: Loading layer  520.2MB/520.2MB
c8e492f75d96: Loading layer  502.4MB/502.4MB
c0b285f105a3: Loading layer  139.1MB/139.1MB
94f42f282973: Loading layer  355.6MB/355.6MB
a01174846de8: Loading layer  839.9MB/839.9MB
93ef8e607237: Loading layer  330.6MB/330.6MB
96bdb92d8d86: Loading layer  14.15MB/14.15MB
a977fbf9c987: Loading layer  225.9MB/225.9MB
74fd0441fe80: Loading layer  2.084GB/2.084GB
706af213e51e: Loading layer  669.6MB/669.6MB
2dc66f1cc28d: Loading layer  76.08MB/76.08MB
write /var/lib/docker/vfs/dir/c001c39b7e4fb4d7b256da603489645fb69c5da681836004af90e325c5c9bd22/usr/local/ghc-8.8.1/lib/ghc-8.8.1/Cabal-3.0.0.0/HSCabal-3.0.0.0.o: no space left on device

上述没空间了,可以切换docker运行目录。

问题2:

[ghips@cugsat11 DZ01]$ sudo docker load -i judge0_images.tar
dd5242c2dc8a: Loading layer  119.2MB/119.2MB
6f1c84e6ec59: Loading layer  17.11MB/17.11MB
b52c1c103fae: Loading layer  17.85MB/17.85MB
e6d60910d056: Loading layer  149.9MB/149.9MB
f63773c65620: Loading layer  520.2MB/520.2MB
c8e492f75d96: Loading layer  502.4MB/502.4MB
c0b285f105a3: Loading layer  139.1MB/139.1MB
94f42f282973: Loading layer  355.6MB/355.6MB
a01174846de8: Loading layer  839.9MB/839.9MB
93ef8e607237: Loading layer  330.6MB/330.6MB
96bdb92d8d86: Loading layer  14.15MB/14.15MB
a977fbf9c987: Loading layer  225.9MB/225.9MB
74fd0441fe80: Loading layer  2.084GB/2.084GB
706af213e51e: Loading layer  669.6MB/669.6MB
2dc66f1cc28d: Loading layer  76.08MB/76.08MB
d4b5a090f908: Loading layer  138.3MB/138.3MB
6abc0d38bb19: Loading layer  9.417MB/9.417MB
c3cba357858f: Loading layer  354.5MB/354.5MB
1f8a2cdb429f: Loading layer  335.2MB/335.2MB
8e405162993d: Loading layer  40.47MB/40.47MB
ddc736983f7e: Loading layer  352.2MB/352.2MB
7265bf73ba48: Loading layer    152MB/152MB
363040cff96d: Loading layer  216.9MB/216.9MB
597b3b3b8563: Loading layer  434.7kB/434.7kB
8323279740f2: Loading layer  152.2MB/152.2MB
beb324aeeb51: Loading layer  2.868MB/2.868MB
19f87ad64a26: Loading layer  13.05MB/13.05MB
0e9bb4586e45: Loading layer  41.63MB/41.63MB
5fae1865d171: Loading layer  2.953MB/2.953MB
d85c09b6bff0: Loading layer  1.228GB/1.228GB
b040914a6c33: Loading layer  61.36MB/61.36MB
e546454d5a85: Loading layer  56.46MB/56.46MB
unlinkat /etc/logcheck/ignore.d.server: invalid argument

将 Docker 存储驱动切换成 vfs可以解决上述问题

"storage-driver": "vfs"

问题3:

[ghips@cugsat11 judge0]$ curl http://localhost:2358/languages
curl: (56) Recv failure: Connection reset by peer

这个问题暂时不知道如何解决,可能是系统内核版本太低又或者是其他问题。

但是我采取曲线救国策略,利用下述命令可以执行:

docker exec judge0-server-1 curl http://localhost:2358/languages

更多推荐