podman 3.0 的时候增加了对 docker-compose 的支持,平时简单用用好像问题不大,今天打算在本地启动一组 cloudtube 服务时发现坑还是不少,特此记录。
Gentoo with openrc 限定
podman service & rootless
podman 对 docker-compose 的支持大概就是模拟了一个 docker.sock,所以也需要启用一个服务来管理,官方当然是用 systemd, 不过好在 gentoo 还是提供了 openrc 的服务文件。但是,需要一些手动的配置,才能让 docker-compose 跑起来。
默认的 podman service 会使用 user root:root
, sock 文件在 /var/run/podman/podman.sock
, 可以通过 /etc/conf.d/podman
来自定义,可以将 sock 文件移动到 docker 的默认位置 /var/run/docker.sock
, 也可以让 docker-compose 使用 rootless container.
为了避免需要塞 DOCKER_HOST
到 shell init file, 我选择了将 sock 改成 docker 的默认位置。
# Config file for /etc/init.d/podman # Sets the API service daemon log level # valid levels: debug, info, warn, error, fatal or panic #LOG_LEVEL="info" # Sets the API service daemon socket SOCKET="unix:/var/run/docker.sock" # Configure the user[:group] the API service daemon will run as #RUN_AS_USER="root:root"
dnsname plugin
在使用 docker 作为 docker-compose 的后端时,默认创建的 network 中,services 之间可以通过名字相互访问。但是在使用 podman 作为后端时,默认无法实现这个功能,而是需要用到 dnsname 这个 cni plugin。
由于 gentoo 没有提供 podman 相关插件的 package, 所以需要手动安装一下。 Update 2022-04-01: added to my overlay.
git clone https://github.com/containers/dnsname cd dnsname make make install PREFIX=/usr/local
NOTE: 如果安装前尝试过 docker-compose up,需要清理旧的 container 和 network, 否则
- container 无法获取 dnsname plugin 给到的 resolv.conf.
- 创建的 network 没有正确配置 dnsname plugin.
# after docker-compose down sudo podman network rm xx_default # it should be removed, but just in case sudo podman container prune
NOTE 2: 默认的 dnsname 配置,在同一 network 中访问其他 service 的域名为 [service name].dns.podman
, 作为比较,使用 docker 时只需要用 service name 就行。
cloudtube
附上使用的 docker-compose.yml
以供参考。
version: "3" services: nginx: image: nginx:stable-alpine ports: - "80:80" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/sites-available:/etc/nginx/sites-available:ro - ./nginx/sites-enabled:/etc/nginx/sites-enabled:ro - ./nginx/nginxconfig.io:/etc/nginx/nginxconfig.io:ro depends_on: - tube tube: build: ./cloudtube ports: - "10412:10412" volumes: - ./config.js:/workdir/config/config.js:ro newleaf: build: ./NewLeaf volumes: - ./configuration.py:/workdir/configuration.py:ro