[Short] podman + docker-compose 的一些坑

  1. docker
  2. podman
  3. linux

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, 否则

  1. container 无法获取 dnsname plugin 给到的 resolv.conf.
  2. 创建的 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