优秀的开发人员关心效率和编写干净代码一样多。容器化可以提高工作流程和应用程序的效率,因此在现代开发中变得风靡一时。而且,作为一名优秀的开发人员,您知道使用docker run …
甚至使用Dockerfile
l来创建容器从图像手动创建容器并不理想。您希望如何使用一个命令告诉Docker为UI,API,数据库和缓存服务器构建容器?让我告诉你如何使用Docker Compose!
在本教程中,您将从Github获取基本应用程序并完成其中的docker-compose.yml
文件。该应用程序使用Node,NPM和MongoDB。不要担心安装所有这些东西; 你只需要安装Docker!
就像Dockerfile
一样,docker-compose.yml
文件告诉Docker如何构建容器所需的内容。与Dockerfile
不同的是,它是使用YAML文件规范编写的,它不仅仅构建一个图像。
任何docker-compose.yml
文件的第一行都是version
设置。在这种情况下,您将使用3.3版本,所以告诉Docker Compose。
version: ‘3.3’
您可以在https://docs.docker.com/compose/compose-file/上查看docker-compose
版本3 的文档,您可以看到版本之间的差异。
服务是Docker如何引用您要在docker-compose文件中构建的每个容器。在这种情况下,您将创建两个服务:一个用于NodeJS应用程序,另一个用于MongoDB数据库。
services:
app:
db:
请记住,缩进是YAML文件格式化组信息的方式,因此缩进很重要。在这里,您已经缩进了services
标签下的服务app
和db
服务。这些可以任意命名。在这种情况下app
和 db
只是最容易引用。现在,你将在这两项服务上加点实质。
首先,通过指定您将从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
为使应用程序服务能够实际访问示例数据库,它需要位于同一网络上。要将这两个服务放在同一个网络上,请使用顶层的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
现在应用程序服务已准备就绪,但如果没有数据库服务,它将不会很好。因此,在下一节中为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”网络上的其他服务通过其别名引用它。这很重要,因为如果没有它,应用服务将更难以与之交谈。(我不知道它不能,它可能只需要使用容器的完整哈希!)
您还需要在数据库服务中创建卷装入。卷允许您将主机上的文件夹装载到容器中的文件夹。这意味着,当容器内的某些东西引用文件夹时,它实际上将访问主机上的文件夹。这对数据库容器特别有用,因为容器是一次性的。通过安装到主机上的物理文件夹,您将能够销毁容器并重建它,并且容器的数据文件仍将存在于主机上。因此,在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-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 Compose和Docker的更多信息。如果您想了解有关Dockerfile
此项目中使用的更多信息,请查看本系列的第二部分Dockerfile
。
原文标题《A Developer's Guide To Docker — Docker Compose》
作者: Lee Brandt
译者:February
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。