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

12

我有几个正在运行的容器,这些容器是通过传统的Docker命令启动的。这些容器正在使用一个手动创建的Docker网络:

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中,或者只能使用全新的容器?

我希望在此迁移过程中使用相同的卷!停机时间不是问题。

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: 
    - [...]

有趣的问题。请注意,如果您执行“docker kill container1 container2 ...; docker-compose up -d”,则停机时间将最小化。然而,使用这种方法容器将不会完全相同。 - michaelbahr
3个回答

7

如果要重复使用现有的网络,您可以使用

networks:
  default:
    external:
      name: simple-network

要重新使用卷,这取决于它们是什么类型的卷。如果它们是命名卷,您可以执行类似的操作:
volumes:
  data:
    external:
      name: the_name_of_the_volume

如果它们是数据卷,你需要在服务中使用volumes: [data]

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

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

不能重复使用容器。您可以让Compose接管Docker创建的容器,但是它们必须带有正确的标签。找到标签最简单的方法是docker inspect一个由Compose创建的容器以查看键/值。由于必须重新创建容器才能应用标签,因此最好停止它们并使用up compose。


2

更新dnephin的重用命名卷示例,以帮助下一个人:

看起来在docker-compose.yml文件的volumes部分中,您不再应该使用name:name_of_the_volume,只需使用名称定义它们即可,例如:

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

然后在你的服务中引用它们,例如在这个例子中使用 app-mongo-data 或者 app-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文件,让我可以使用app-db:27017引用我的应用程序数据库,因为compose包含一个名称解析器来列出服务,并且该端口已经对由此compose启动的所有服务公开。请参见“外部”部分

1
我认为compose的目的是运行多容器应用程序。虽然你可能会得到一个类似的设置,但很难在docker compose环境中实际拉取正在运行的docker容器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接