用于本地开发的 Docker
原文发布于Ashraful 的博客
❓ 为什么在本地开发中应该使用 Docker?
你喜欢花更多时间布置环境吗?如果是,那就关掉窗口吧。也许你来错地方了。好了,闲话少说。让我给你讲个真实的故事。
最近我买了一台MacBook用于个人开发。我兴奋地想用它写代码。但在此之前,我必须先搭建好开发环境。于是,我迫不及待地从GitHub克隆仓库,然后安装它们的开发依赖项。说真的,一天下来,我累得筋疲力尽。我的一个个人项目使用了Node(v8.10.*)、MongoDB和React。其他项目则使用了最新版本的Node和其他依赖项。由于我对Mac OS不太熟悉,搭建开发环境的过程十分艰难。最终,我决定把Dockerfile所有服务都写出来,然后Docker Compose一起运行。
❓ 什么是 Docker Compose?
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,只需一条命令,即可根据配置创建并启动所有服务。更多详情请点击此处。
💫 架构示例
假设我们有两个不同的服务和一个数据库服务。
- NodeJS 应用(端口:5000)
- React 应用(端口:5001)
- MongoDB(端口:27017)
我们将编写docker-compose.yml文件,并随时随地使用单个命令运行它们。由于我不会详细解释代码部分,docker所以docker-compose我已经有一个基于这种架构的应用程序。您可以从GitHub上 fork 并克隆该应用程序,然后自行修改。
正如您所见,我们将使用不同的端口运行所有这些服务/应用程序。因此,我们需要在容器和物理机(您的机器)上启用这些端口。例如,如果您已经在计算机上安装了 MongoDB,那么您可能不会将27017新 MongoDB 容器使用的端口用于其他用途。所以,我们可以将端口从 Docker 容器转发到物理机。这很简单,正如您所想。
🚀 让我们开始设置吧
- 克隆仓库,
git clone https://github.com/iashraful/graphql-mongo-todo.git cd graphql-mongo-todo- 用你最喜欢的编辑器打开
docker-compose.yml。(别担心,我会解释的。😎)你会看到类似下面的界面。
docker-compose.yml
version: '3.5'
services:
react_client:
build: ./client
command: sh -c "yarn install && yarn start"
environment:
- NODE_ENV=development
- PORT=5001
ports:
- '5001:5001'
working_dir: /app/client
volumes:
- ./client:/app/client:cached
node_server:
build: ./server
command: sh -c "yarn install && yarn dev"
environment:
- NODE_ENV=development
- PORT=5000
ports:
- '5000:5000'
working_dir: /app/server
volumes:
- ./server:/app/server:cached
depends_on:
- mongodb
mongodb:
image: mongo
expose:
- '27017'
environment:
- MONGO_INIT_DB_DATABASE_NAME='graphql-todo'
volumes:
- ./db:/data/db
ports:
- '27019:27017'
版本:'3.5'
此版本号指示您正在使用的 Docker 引擎版本。就我而言,我使用的是最新的 Docker 引擎 19.*.* 版本,因此我使用的是 3.7 版本。请参阅完整的版本控制指南。
服务
很简单。你想用这个 Compose 文件运行多少个服务?我这里运行了三个:Node、React 和 Mongo。
react_client、node_server、mongodb
各项服务的名称。您需要在每项服务下指定配置。
构建:[目录路径]
您将使用哪个目录来存放这些特定服务?您可以在此处指定相对路径。
命令:[任何 shell 命令]
命令的使用完全取决于你选择的镜像。如果你选择基于 Linux 的镜像,那么你应该知道 bash 是默认 shell。所以,你可以放心使用 bash 命令。如果你对我选择的镜像感到困惑?别担心,我会解释的。
环境
你可以通过environment.传递任何类型的环境变量。
端口
了解如何为容器启用端口并映射物理机端口非常重要。这里5000:5000指的是Container port:Physical machine port……
工作目录
这是代码将被复制到的容器的直接路径。
卷
在本地开发环境中,了解卷的概念至关重要。因为你肯定不希望每次修改后都重新构建并运行容器。卷的作用是在物理机器代码和容器工作目录代码之间建立映射关系。
依赖于
这是我们拥有的一个很棒的功能。假设你有五个服务,其中一个服务依赖于其他服务。例如,我们的 Node.js 服务依赖于 MongoDB。所以,我放depends_on: mongodb
图像
镜像指的是我们用作基础镜像的 Docker 镜像。正如我们在之前的文章中提到的,每个 Docker 容器都必须有一个基础镜像。这是我们可以用来定义镜像的镜像标签。仔细观察,你会发现我没有在 `<image>`react_client和 `<image> ` 中定义镜像node_server。但在 MongoDB 中我定义了 ` <image> image: mongo`。你知道为什么吗?让我们来看看原因。
❓我们不能用吗Dockerfile?
是的,可以。打开客户端和服务端目录,你会看到 Dockerfile 文件。即使你命令计算机运行 docker compose 文件,计算机也会找到构建目录,并在其中找到 Dockerfile 文件。然后直接执行即可。
🐶 够了💣 让我们开始这个项目吧。
- 打开终端/控制台。
$ docker-compose up- 稍等片刻,尽情享用。
⛄ 基本docker-compose命令。
docker-compose up➡️ 运行 docker compose 文件。docker-compose up --build➡️ 重新构建并运行 docker compose 文件。docker-compose up <service name>➡️ 特定服务已启动并运行。docker-compose start➡️启动最后构建的容器。docker-compose stop➡️停止最后运行的容器。docker-compose restart➡️ 重启最后运行的容器。docker-compose logs -f <service name>➡️ 从特定服务登录。docker-compose exec <service name> bash➡️ 通过 SSH 连接到特定容器的 bash。
🚩 就这些啦。谢谢阅读!😆
文章来源:https://dev.to/ashraful/docker-for-local-development-6ak