通过 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 支持更好以及权限设置也更友好。
创建 LXC 容器
-
磁盘按需给,建议 20G 以上
-
CPU按需给,建议 2C 及以上
-
内存按需,建议 2G,SWAP 4G(LXC 是动态的)
-
创建好容器后,勾选以下 4 个特性以方便使用
LXC 设置
启动 LXC 实例后,可按需设置以下内容:
更新系统
1 | apt update |
安装、配置 SMB
1 | apt install cifs-utils -y |
创建凭证 credentials(你也可以直接手动按需配置):
1 | nano ~/.smbcredentials |
-
自行替换
<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 | //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 |
-
target://srv/download
-
对参数有不明白的,自行见文档
重启 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 | apt docker.io # 你也可以直接安装 docker-ce |
设置自启动:
1 | systemctl enable 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 中):