通过 PVE LXC 搭建 docker 环境

  • 本文基于 PVE 7.4, LXC,理论上 PVE8 和其他版本也适用

  • 设置好 PVE 代理,否则一些包可能拉取会很慢或者直接失败

原先 docker 直接装在 PVE 宿主中,但经常性占满资源,导致其他虚机/LXC卡顿;后来装了个 istoreOS,用该 openwrt 自带的 docker 环境,但这个环境有点问题,如挂载磁盘失效、锁文件、一些第三方的镜像部署时候受限于 openwert/istoreOS 导致一些莫名其妙的错误,初步判断是虚拟化导致的,没深究。

趁容器还没那么多,整体调整到 LXC,方便控制资源,步骤如下:

PVE 中下载 debian11 的 CT 模板

PVE7 不支持 debian12,如果你是 PVE8,建议直接 debian12,对 docker 最新的 feature 支持更好以及权限设置也更友好。

image.png

创建 LXC 容器

image.png

  • 磁盘按需给,建议 20G 以上

  • CPU按需给,建议 2C 及以上

  • 内存按需,建议 2G,SWAP 4G(LXC 是动态的)

  • 创建好容器后,勾选以下 4 个特性以方便使用

    • image.png

LXC 设置

启动 LXC 实例后,可按需设置以下内容:

更新系统

1
2
apt update
apt upgrade -y

安装、配置 SMB

1
apt install cifs-utils -y

创建凭证 credentials(你也可以直接手动按需配置):

1
nano ~/.smbcredentials

image.png

  • 自行替换 <target目标机的用户名><target目标机的密码>

修改自动挂载配置文件:

1
nano /etc/fstab

根据你的实际需求来挂载即可,并非本文重点。

  • 在使用过程中,发现 debian11 中的 docker 容器,访问 PVE host中 samba server 的文件夹时,没法进行 操作,哪怕创建 container 的时候已经给了 --previleged 特权权限,或者显式在绑定文件夹映射的时候增加了 ‘:rw’,依然不行。尝试增加 file_mode,dir_mode gid,uid后,再次挂载,发现可以写入了。(你也可以尝试直接给共享文件夹允许匿名读写)。

  • 另外,在创建 docker 容器的时候,显式指定 user,如这里为 --user 1000:1000 或许对你有帮助。

1
2
//192.168.10.3/mypassport-5t/download /srv/download cifs credentials=/root/.smbcredentials,file_mode=0777,dir_mode=0777,uid=1000,gid=1000, iocharset=utf8 0 0
//192.168.10.3/pve-share /srv/share cifs credentials=/root/.smbcredentials,file_mode=0777,dir_mode=0777,uid=1000,gid=1000,iocharset=utf8 0 0

重启 LXC:

1
reboot

安装 docker

可见官方文档,或者参考如下步骤:

安装依赖包:

1
apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

添加 docker 的官方 GPG 密钥:

1
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

配置正式的 docker 存储库:

1
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

安装 docker:

1
2
3
apt docker.io # 你也可以直接安装 docker-ce
# 验证安装和版本
docker version

设置自启动:

1
2
3
4
systemctl enable docker

# 验证设置自启动
systemctl is-enabled docker

安装 portainer

创建一个 volume 以便于统一安装目录:

1
docker volume create portainer_data

安装 portainer:

1
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /opt/docker/portainer:/data portainer/portainer-ce:latest

给 portainer 添加 ghcr.io(有些镜像会在这个 registry 中):

  • image.png