将现有 Docker 个容器迁移到 Docker Compose

Migrating existing Docker containers to Docker Compose

我有几个由经典 Docker 命令启动的 运行ning 容器。这些容器正在使用 Docker 网络,该网络也是 "by hand":

创建的
docker network create simple-network

docker run -d \
  --name docker-registry \
  --net=simple-network \
  -p 5000:5000 \
  -v [...] \
  registry:2.3.0

docker run -d \
  --name docker-registry-web \
  --net=simple-network \
  -p 8080 \
  -v [...] \
  hyper/docker-registry-web

docker run -d \
  --name nginx \
  --net=simple-network \
  -p 80:80 \
  -p 443:443 \
  -v [...] \
  nginx:1.9.8

我想使用 Docker Compose 来 运行 这些容器,因为它更易于管理。

是否可以将这些容器迁移到 Docker Compose 中,或者只能将 Compose 与全新的容器一起使用?

我想在这次迁移过程中使用相同的卷!停机不是问题。

docker-compose.yml

version: '2'

docker-registry:
  image: registry:2.3.0
  ports:
    - "5000:5000"
  volumes: 
    - [...]

docker-registry-web:
  image: hyper/docker-registry-web
  expose:
    - "8080"
  volumes: 
    - [...]

nginx:
  image: nginx:1.9.8
  ports:
    - "80:80"
    - "443:443"
  volumes: 
    - [...]

我相信 compose 的目的是 运行 多容器应用程序。虽然您可能会得到类似的设置,但您似乎不太可能真正将 运行ning docker 容器拉入 docker 组合环境。

要重新使用现有网络,您可以使用

networks:
  default:
    external:
      name: simple-network

要重新使用这些卷,这取决于它们是什么类型的卷。如果它们是命名卷,你可以做类似的事情:

volumes:
  data:
    external:
      name: the_name_of_the_volume

然后您将在服务中使用 volumes: [data] 来使用它。

如果它们是主机卷,那真的很简单,只需使用相同的配置即可。

如果它们是未命名的卷,您可以将卷 ID 用作外部卷(与使用命名卷的方式相同)。

重新使用容器是不可能的。您可以让 Compose 接管由 docker 创建的容器,但它们需要具有正确的 labels。找到标签的最简单方法是 docker inspect 通过 compose 创建的容器查看 key/values。由于您无论如何都必须重新创建一个容器来应用标签,因此停止它们并 up 组合可能更容易。

更新 dnephin's 重用命名卷示例的一部分,以防对下一个人有所帮助:

在 docker-compose.yml 的卷部分中,您不应该再使用 name: name_of_the_volume,只需使用名称定义它们,例如

volumes:
  app-mongo-data:
    external: true
  app-mongo-config:
    external: true

然后通过(在此示例中)app-mongo-dataapp-mongo-config 在您的服务中引用它们,如下所示:

version:'3'
services:
    app-db:
        image: mongo:latest
        expose:
          - "27017"
        volumes:
          - app-mongo-data:/data/db
          - app-mongo-config:/data/configdb

可能对问题的网络方面有所帮助(尽管不是所问的内容):docker-compose.yml 以上几行来自让我使用 [=18= 引用我的应用程序的数据库]

app-db:27017

因为 compose 包含一个用于列出的服务的名称解析器,并且端口公开给由此 compose 启动的所有服务。

See 'external' section