前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开发人员的Docker指南 - Docker Compose

开发人员的Docker指南 - Docker Compose

作者头像
February
修改2018-11-14 16:50:05
1.5K0
修改2018-11-14 16:50:05
举报
文章被收录于专栏:技术翻译技术翻译技术翻译

优秀的开发人员关心效率和编写干净代码一样多。容器化可以提高工作流程和应用程序的效率,因此在现代开发中变得风靡一时。而且,作为一名优秀的开发人员,您知道使用docker run …甚至使用Dockerfilel来创建容器从图像手动创建容器并不理想。您希望如何使用一个命令告诉Docker为UI,API,数据库和缓存服务器构建容器?让我告诉你如何使用Docker Compose!

在本教程中,您将从Github获取基本应用程序并完成其中的docker-compose.yml文件。该应用程序使用NodeNPMMongoDB。不要担心安装所有这些东西; 你只需要安装Docker!

就像Dockerfile一样,docker-compose.yml文件告诉Docker如何构建容器所需的内容。与Dockerfile不同的是,它是使用YAML文件规范编写的,它不仅仅构建一个图像。

选择您的Docker撰写版本

任何docker-compose.yml文件的第一行都是version设置。在这种情况下,您将使用3.3版本,所以告诉Docker Compose。

version: ‘3.3’

您可以在https://docs.docker.com/compose/compose-file/上查看docker-compose版本3 的文档,您可以看到版本之间的差异。

定义节点和Mongo服务

服务是Docker如何引用您要在docker-compose文件中构建的每个容器。在这种情况下,您将创建两个服务:一个用于NodeJS应用程序,另一个用于MongoDB数据库。

services:
  app:
  db:

请记住,缩进是YAML文件格式化组信息的方式,因此缩进很重要。在这里,您已经缩进了services标签下的服务appdb服务。这些可以任意命名。在这种情况下appdb 只是最容易引用。现在,你将在这两项服务上加点实质。

首先,通过指定您将从sample:1.0图像构建,告诉Docker您要构建app服务的图像。因此,您将指定在app标记下缩进。

app:
  image: sample:1.0  图像:样本:1.0

当然,该图像不存在,因此您需要通过设置构建上下文让Docker知道在哪里找到Dockerfile。如果不这样做,Docker将尝试从Docker Hub中提取图像,当它失败时,它将有完全失败的docker-compose命令。

app:
  image: sample:1.0
  build: .

在这里,您已指定构建上下文是当前目录,因此当Docker无法在本地找到sample:1.0图像时,它将使用当前目录中的Dockerfile构建它。

接下来,一旦构建了用于创建容器的映像,您将告诉Docker容器名称应该是什么。

 app:
  image: sample:1.0
  container_name: sample_app
  build: .

现在,当Docker构建映像时,它将立即创建一个以该映像命名的sample_app容器。

默认情况下,NodeJS应用程序在端口3000上运行,因此您需要将该端口映射到80,因为这是“生产” docker-compose文件。您可以使用YAML中的ports标记执行此操作。

app:
  image: sample:1.0
  container_name: sample_app
  build: .
  ports: 
    - 80:3000

在这里,您已将主机操作系统上的端口80映射到容器中的端口3000。这样,当您将此容器移动到生产主机时,应用程序的用户可以转到主机端口80,并在端口3000上从容器中回答这些请求。

您的应用程序将从MongoDB数据库获取数据,为此,应用程序将需要一个连接字符串,它将从名为“MONGO_URI”的环境变量中获取。要在容器构建后在容器中设置环境变量,请使用YAML文件中的environment标记。

app:
  image: sample:1.0
  container_name: sample_app
  build: .
  ports: 
    - 80:3000
  environment:
    - MONGO_URI=mongodb://sampledb/sample

创建一个Docker网络

为使应用程序服务能够实际访问示例数据库,它需要位于同一网络上。要将这两个服务放在同一个网络上,请使用顶层的networks标记(与services标记相同的缩进级别)在docker-compose文件中创建一个。

version: '3.3'
services:
  app:...
  db:...
networks:
  samplenet:
    driver: bridge

这将使用桥接类型网络创建一个名为“samplenet”的网络。这将允许两个容器通过它们之间的虚拟网络进行通信。

返回文件的app部分,将app服务加入“samplenet”网络:

app:
  image: sample:1.0
  container_name: sample_app
  build: .
  ports: 
    - 80:3000
  environment:
    - MONGO_URI=mongodb://sampledb/sample
  networks: 
    - samplenet

创建MongoDB服务

现在应用程序服务已准备就绪,但如果没有数据库服务,它将不会很好。因此,在下一节中为db服务添加相同类型的内容。

 db:
  image: mongo:3.0.15
  container_name: sample_db
  networks:
    samplenet:
      aliases:
        - "sampledb"

此服务从官方MongoDB 3.0.15映像构建,并创建名为“sample_db”的容器。它还使用别名“sampledb”加入“samplenet”网络。这就像物理网络上的DNS名称,它允许“samplenet”网络上的其他服务通过其别名引用它。这很重要,因为如果没有它,应用服务将更难以与之交谈。(我不知道它不能,它可能只需要使用容器的完整哈希!)

使用Docker卷

您还需要在数据库服务中创建卷装入。卷允许您将主机上的文件夹装载到容器中的文件夹。这意味着,当容器内的某些东西引用文件夹时,它实际上将访问主机上的文件夹。这对数据库容器特别有用,因为容器是一次性的。通过安装到主机上的物理文件夹,您将能够销毁容器并重建它,并且容器的数据文件仍将存在于主机上。因此,在db部分中添加一个卷标记,将/data/db容器中的文件夹(Mongo存储其数据)添加到db应用程序根文件夹中的文件夹,以便最终的db部分如下所示。

db:
  image: mongo:3.0.15
  container_name: sample_db
  volumes:
    - ./db:/data/db
  networks:
    samplenet:
      aliases:
        - "sampledb"

查看您的Docker撰写文件

完成所有这些后,您的最终docker-compose.yml文件应如下所示:

version: '3.3'
services:
  app:
    image: sample:1.0
    container_name: sample_app
    build: .
    ports: 
      - 80:3000
    environment:
      - MONGO_URI=mongodb://sampledb/sample
    depends_on: 
      - db
    networks: 
      - samplenet
  db:
    image: mongo:3.0.15
    container_name: sample_db
    volumes:
      - ./db:/data/db
    networks:
      samplenet:
        aliases:
          - "sampledb"
networks:
  samplenet:
    driver: bridge

完成所有操作后,您应该能够保存文件并在docker-compose.yml文件所在的文件夹中运行docker-compose up -d,并观察Docker构建并为您启动环境。

如果一切顺利完成,您可以转到http://localhost/users并查看如下图所示的内容。

恭喜!您有一个在源代码中定义的完整环境。它可以进行版本控制并签入源控件。这就是人们称之为“基础设施作为代码”。它还意味着在测试,登台和生产环境中重建这个环境就像在相应的机器上运行docker-compose up -d一样简单!我告诉过 你好开发者很懒!

更多信息

您可以从各自的文档中了解有关Docker ComposeDocker的更多信息。如果您想了解有关Dockerfile此项目中使用的更多信息,请查看本系列的第二部分Dockerfile

原文标题《A Developer's Guide To Docker — Docker Compose》

作者: Lee Brandt

译者:February

不代表云加社区观点,更多详情请查看原文链接

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 选择您的Docker撰写版本
  • 定义节点和Mongo服务
  • 创建一个Docker网络
  • 创建MongoDB服务
  • 使用Docker卷
  • 查看您的Docker撰写文件
  • 更多信息
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档