开发人员的Docker指南 - Docker Compose

优秀的开发人员关心效率和编写干净代码一样多。容器化可以提高工作流程和应用程序的效率,因此在现代开发中变得风靡一时。而且,作为一名优秀的开发人员,您知道使用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

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

原文链接:https://dzone.com/articles/a-developers-guide-to-docker-docker-compose

原文作者:Lee Brandt

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大魏分享(微信公众号:david-share)

Look,容器中应用的构建方法!

S2I增量构建重用以前构建的image中的工件 要创建增量构建,请修改BuildConfig策略定义:

18030
来自专栏搜云库

Ubuntu 17.04 x64 安装 Docker CE

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测...

367100
来自专栏吴伟祥

Linux中ctrl-c, ctrl-z, ctrl-d 区别

1、Ctrl+C比较暴力,就是发送Terminal到当前的程序,比如你正在运行一个查找功能,文件正在查找中,Ctrl+C就会强制结束当前的这个进程。

10210
来自专栏清晨我上码

docker运行容器远程挂载卷

60220
来自专栏编程坑太多

『中级篇』Docker Compose到底是什么(38)

PS:上节通过image 和container的方式创建wordpress,一般麻烦吧还不算特别麻烦,但是相比今天的docker-compose.yml来说,还...

18240
来自专栏数据和云

YH12:一篇文章读懂SCAN

单客户端访问名称(SCAN)是Oracle RAC环境中使用的功能,为客户端提供访问集群中运行的任何Oracle数据库的单一名称。 用户可以将SCAN视为RAC...

36360
来自专栏云计算教程系列

现代化Kubernetes的应用程序

现代无状态应用程序的构建和设计可在Docker等软件容器中运行,并由Kubernetes等容器集群管理。它们使用Cloud Native和Twelve Fact...

16800
来自专栏写代码的海盗

Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像

  因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试代码。在没有Docker之前,windows基本就是一个IDE平台。在wind...

33860

Docker – 清理磁盘占用

最近,我们开始对一些应用进行 docker 化,不得不说,我已经爱上 Docker 了!这是一个非常棒的工程,在 AWS EC2 上,它让我们的生活变得更加轻松...

51790
来自专栏linux驱动个人学习

Linux的命名空间详解--Linux进程的管理与调度(二)【转】

PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。要...

22510

扫码关注云+社区

领取腾讯云代金券