将现有Docker容器迁移到Docker Compose

时间:2016-02-09 16:49:10

标签: docker docker-compose

我有几个由经典Docker命令启动的运行容器。这些容器使用的是Docker网络,也是手工创建的#34;

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

3 个答案:

答案 0 :(得分:5)

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

networks:
  default:
    external:
      name: simple-network

要重新使用卷,它取决于它们的卷类型。如果它们是命名卷,您可以执行类似的操作:

volumes:
  data:
    external:
      name: the_name_of_the_volume

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

如果它们是主机卷,那么它非常简单,只需使用相同的配置。

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

不可能重新使用容器。您可以让Compose接管由docker创建的容器,但是他们需要在它们上面使用正确的labels。查找标签的最简单方法是docker inspect通过撰写创建的容器来查看键/值。由于您无论如何都必须重新创建容器以应用标签,因此可能更容易阻止它们并up撰写。

答案 1 :(得分:1)

我相信撰写的目的是运行多容器应用程序。虽然你可能会得到类似外观的设置,但你似乎不太可能在docker compose环境中拉出正在运行的docker容器。

答案 2 :(得分:1)

更新为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是让我使用

引用我的应用程序数据库的

app-db:27017

因为compose包括列出的服务的名称解析器,并且端口已暴露给此compose启动的所有服务。

See 'external' section