在VS代码中使用Docker
微服务和容器是当今软件发展的两大新趋势。
微服务是一种架构方法,在这种方法中,一个系统被划分为不同的服务,每个服务都有一个单一的、狭义的功能,可以被系统的其他部分以及外部各方(如Web和移动应用程序)通过API访问。
容器是一种很好的方法,可以将你的程序、它的依赖性和设置捆绑在一个单一的、可移植的镜像文件中。
容器镜像是一个小型的、不连续的可执行软件包,它包含运行所需的一切,包括代码、环境、工具、系统库和偏好。容器是一种架构,在应用层将代码和需求分组。
Docker是一种著名的容器技术,使打包、部署和消费服务变得简单。你可以通过在Dockerfile 中定义一步一步的命令来使用Docker生成镜像,这只是一个带有构建指令的文本文件。
前提条件
必须在你的电脑上安装Docker和Visual Studio Code,以便继续学习本教程。
你好,Docker
通过检查Docker版本,确认你的机器上有Docker安装。
打开一个终端,运行下面的命令。
$ docker --version
为了验证你的安装工作是否正常,请运行hello-world Docker镜像。
$ docker run hello-world
如果上述命令的执行没有错误,那么你就可以继续进行下一步,因为一切都已经正确安装。
Docker扩展
VS Code的Docker扩展用于提供对Docker的支持。要安装Docker扩展,请在扩展窗格中搜索并安装它。

让我们建立一个简单的Node.js服务器来演示我们如何使用VS Code来处理Docker容器和镜像。
创建示例项目
在你的机器上的某个位置建立一个文件夹,你要把你的项目放在那里。
$ mkdir dockervscode
$ cd dockervscode
为了保持简单,我将使用Express.js提供的Hello World示例服务器。
使用下面的命令来启动这个项目。
$ npm init -y
$ npm install express --save
然后,创建一个新的文件index.js ,我们将把我们的Express.js服务器代码放在那里。
$ touch index.js
现在用VS Code打开这个文件夹。
$ code .
然后将下面的代码粘贴在index.js 。
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
})
app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`);
})
手动编写Docker文件
正如我们前面所说,要构建Docker镜像,你需要一个Dockerfile 。
因为VS Code了解Dockerfiles的格式以及相关的指令集,创建这些文件应该很简单。
在你的工作目录中制作一个名为Dockerfile 的新文件。
在编辑器中打开这个新文件,在Mac上按^Space或在其他机器上按Control+Space ,以调出IntelliSense对话框。这个对话框显示了一个Dockerfile 片段的列表。
在手工创建和编辑Dockerfiles时,你可以使用VS Code提供的IntelliSense功能。
使用VS Code生成Dockerfiles
手动编写Docker和docker-compose文件是很困难的,可能会花费很多时间。VS Code认识到这一点,因此它有一个功能,可以为你的项目生成适当的Docker文件。
在Mac上按⇧⌘P或者在其他机器上按Control+Shift+P ,打开命令调板。为了给这个项目创建一个Dockerfile 、一个docker-compose.yml 和一个docker-compose.debug.yml ,运行Docker。向工作区添加Docker文件命令。为应用平台选择Node.js ,并填写所需的细节。

看一下Docker文件
VS Code通过从Docker中心获取最新的Node.js容器来创建Docker文件。
生成的Docker文件将类似于下面的文件。
FROM node:12.18-alpine
ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm install --production --silent && mv node_modules ../
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
上面的配置告诉Docker要。
- 使用来自Docker Hub的
node:12.18-alpine镜像。 - 将环境变量
NODE_ENV设置为production。 - 使3000端口可以从容器外部访问。
- 在为应用程序提供服务之前,运行命令
npm install --production --silent && mv node_modules ../。 - 使用命令
node index.js来运行该程序。
你可以使用.dockerignore 文件来保持你的构建范围尽可能的小。.dockerignore 是一个类似于.gitignore 的文本文件,用于包含在构建镜像时不应该被复制的文件和文件夹。
构建和运行Docker镜像
要构建Docker镜像,在导航面板中右击Docker文件,选择Build image 。或者,你也可以打开命令调色板,执行Docker Images: Build Image 。
要运行创建的镜像,在同一目录下打开终端并运行下面的命令。
$ docker run -d -p 3000:3000 dockerserver
上面的命令告诉Docker以分离模式运行该容器。这样,你就可以重复使用终端。容器在3000端口运行,并被本地映射到3000端口。
你可以通过'curling'http://localhost:3000,访问你现在运行的网络服务器。
$ curl http://127.0.0.1:3000
上面的命令应该打印一个简单的 "Hello World!"。
通过切换到Docker扩展窗格,你可以轻松地管理你现有的容器、容器注册表和图像。
常见的Docker命令
你可以在命令面板中使用大多数需要的命令来处理你的Docker镜像、容器。你可以通过输入Docker : 找到所有的Docker命令。

总结
通过使用VS Code Docker扩展,你可以完成大部分的Docker任务,如生成Docker文件和构建镜像,只需一次点击。