如何为VisualStudioCode使用Docker插件
介绍
在本文中,我们将使用 Visual Studio Code 的 Docker 插件 。 Docker 允许我们将应用程序打包成镜像,并在任何安装了 Docker 的平台上将它们作为容器运行。 我们将在两个开发人员堆栈中使用这个插件:Node.js 和 Go。
安装
您需要在工作站上安装 docker。 有关如何安装和运行 docker 的说明在 此处 可用,它应该特定于您正在运行的特定操作系统。
您还需要安装 Visual Studio Code。
安装 Visual Studio Code 后,单击最左侧窗格的扩展部分打开它,然后搜索 Docker。
安装后,您应该会注意到 Visual Studio Code 实例中的一些新内容。 在最左侧的窗格中,有一个带有 Docker 徽标的新 Docker 部分,单击该部分会打开包含三个部分的 Docker Explorer。 图像,容器,注册表
命令面板中还添加了一些命令,您可以通过打开命令面板并输入 docker
来查看这些命令。
节点.js
我们将使用 Node.js 应用程序来演示 Docker 插件添加到 VSCode 的功能。
让我们创建一个 Express 服务器。
mkdir docker-node cd docker-node npm init -y npm install --save express touch index.js
我们应该有一个这样的目录树:
. ├── index.js ├── node_modules ├── package-lock.json └── package.json 1 directory, 3 files
这是index.js
的内容
index.js
const express = require('express') const app = express() app.listen(3000) app.get('/', (req, res) => { res.send('hello world') })
更新 package.json
以获得启动脚本。
包.json
"scripts": { "start": "node index.js" },
现在,我们可以简单地使用 npm start
运行这个应用程序,然后转到端口 3000
并查看应用程序是否正常工作。
传统上,要添加 Docker,我们将遵循以下步骤。
- 创建 Dockerfile(或 docker-compose.yaml)
- 向文件中添加 docker 指令(FROM、WORKDIR、ADD、EXPOSE、CMD)
- 在终端运行
docker build...
构建镜像 - 在终端运行
docker run...
运行容器
但是,使用插件,我们需要做的就是以下内容。 打开命令面板,输入 docker
,然后选择 Docker: Add Docker files to Workspace
。 它应该是第一选择。 按 Enter
您将被要求选择平台/堆栈,选择 Node.js 并按 Enter
。 然后将要求您选择一个端口。 写 3000
因为它是我们的应用程序将监听的端口。 以下文件将添加到您的工作区:.dockerignore
、docker-compose.debug.yml
、docker-compose.yml
和 Dockerfile
。
.dockerignore
告诉 docker 在将文件添加到构建映像时忽略列出的文件。
docker-compose.debug.yml
将允许您使用检查运行 docker-compose
,并附加调试器。
version: '2.1' services: docker-node: image: docker-node build: . environment: NODE_ENV: development ports: - 3000:3000 - 9229:9229 command: node --inspect=0.0.0.0:9229 index.js
但是,如果您在开发期间进行调试,则可能需要附加一个卷,以便您在本地计算机上所做的更改保留在容器中。
docker-compose.yml
文件是用于运行 docker-services 的标准 docker-compose 文件。 当您添加其他资源/服务(例如数据库连接和负载平衡器)时,您将编辑此文件。
version: '2.1' services: docker-node: image: docker-node build: . environment: NODE_ENV: production ports: - 3000:3000
Dockerfile
是这里最重要的,因为它必须被构建,它包含了如果我们没有安装插件,我们必须手动编写的指令。
FROM node:8.9-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 npm start
接下来,要构建图像,打开 VS Code 命令面板,输入 docker
然后选择 Docker: Build Image
并按 Enter
。 系统将提示您选择 Dockerfile,选择它并按 Enter
。 接下来,系统将提示您选择标签。 选择默认的 docker-node
,然后按 Enter
。 集成终端将打开,并显示构建日志。
最后,我们需要运行容器。 再次打开命令面板并输入 docker run
,选择 Docker: Run
将显示系统中所有容器的列表,选择我们标记的 docker-node:latest
,并按 Enter
。 终端将显示运行命令的日志。 请注意,它添加了 -p 3000:3000
将端口暴露给我们的主机,以便我们可以通过访问 localhost:3000
来运行应用程序。
我们也可以通过转到左侧窗格,选择 Docker 部分来运行容器,然后在 Images 下,选择 docker-node
图像,右键单击并单击运行. 相同的日志将在终端上运行。
您还会注意到,上面的图像部分包含系统中的图像列表。 一旦 docker-node 容器正在运行,我们可以检查同一部分中正在运行的容器,甚至停止它们。 上面选择了Attach Shell
,相当于下面的docker命令。
docker exec -it <container> sh
这显示了以下终端日志输出。
你可以看到我们在容器中,我们可以列出容器中的文件。
停止容器,然后尝试使用 docker-compose 运行应用程序。 打开命令面板,找到 docker-compose 并查看输出。
去
如果对 Golang 不熟悉,可以跳到下一个话题。
Docker 也是 用 Go 构建的
让我们创建一个 Go 应用程序。
mkdir docker-go cd docker-go touch main.go
您的目录树将有一个文件。
. └── main.go 0 directories, 1 file
这是 main.go
文件的内容。
main.go
package main import ( "log" "net/http" ) func helloHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World")) } func main() { http.HandleFunc("/", helloHandler) if err := http.ListenAndServe(":9000", nil); err != nil { log.Fatalln("ListenAndServer Error", err) } }
您可以使用以下方式运行应用程序:
go run main.go
然而,让我们使用 VSCode Docker 插件来构建镜像并运行容器。
通过打开命令面板、输入 Docker 并选择 Docker: Add Dockerfile to Workspace
创建 Dockerfile。
系统会提示您选择平台,选择 Go
并按 Enter
。
然后会提示您选择一个端口,输入端口 9000
,因为它是我们在应用程序中选择的端口,然后按 Enter
。
将创建以下 4 个文件。 .dockerignore
、docker-compose.debug.yml
、docker-compose.yml
和 Dockerfile
。
.dockerignore
文件告诉 Docker 在向镜像添加文件时忽略某些文件。
Docker Compose 使用 docker-compose.debug.yml
和 docker-compose.yml
来运行应用程序。 它们并没有太大的不同,因为调试文件需要额外的输入,因为调试 Go 更复杂。
然而,这里的 Dockerfile
是最有趣的部分。 build stage
的最后两行被注释掉并添加了RUN go install -v ./...
# RUN go-wrapper download # "go get -d -v ./..." # RUN go-wrapper install # "go install -v ./..." RUN go install -v ./...
这是最终的 docker 文件。
#build stage FROM golang:alpine AS builder WORKDIR /go/src/app COPY . . RUN apk add --no-cache git # RUN go-wrapper download # "go get -d -v ./..." # RUN go-wrapper install # "go install -v ./..." RUN go install -v ./... #final stage FROM alpine:latest RUN apk --no-cache add ca-certificates COPY --from=builder /go/bin/app /app ENTRYPOINT ./app LABEL Name=docker-go Version=0.0.1 EXPOSE 9000
这种 Dockerfile 模式被称为 多阶段构建 ,它的主要优点是 Docker 镜像的优化。 它主要用于编译语言,在大多数情况下不需要编译工具来运行编译的应用程序。 围棋就是一个很好的例子。
简而言之,我们使用 Docker 构建的一部分来编译应用程序,然后将编译后的二进制文件复制到更轻量的 Docker 映像中,然后从那里运行它。
接下来我们需要构建图像。 打开命令面板,输入 docker-build
,选择 Docker: Build Image
并按 Enter
。
系统将提示您选择 Dockerfile,保留默认选择并按 Enter
。
最后,您将被要求选择一个图像标签。 保留默认的 docker-go:latest
并按 Enter
。 您将在集成终端中看到构建日志。
最后,我们需要运行容器。 打开命令面板并输入 docker run
。 选择 Docker: Run
并按 Enter
。 系统将提示您选择图像。 选择 docker-go:latest
。 您将在集成终端中看到日志。 和之前一样,您也可以通过选择左侧窗格中的 Docker 部分来运行容器,然后在容器下选择 docker-go
,右键单击 Run。 然后,您将看到相同的 docker run
日志。
由于我们正在运行的 Docker 容器只有二进制文件,因此我们可以在容器部分附加 shell。 我们可以在集成终端的附加shell中输入ls
,我们会看到一个名为app
的二进制文件,它对应于Dockerfile。
其他特性
最后,我们将看看 VSCode Docker 插件附带的其他有用功能。
Docker 检查图像:这允许您检查构建的图像并查看 JSON 文件中的详细信息。
选择您想要的图像并打开上下文菜单,然后选择检查图像。 将打开一个带有详细信息的 JSON 文件。
显示容器日志:这也可以在运行容器的上下文菜单中找到。 我们将使用正在运行的 Node.js 容器。日志将显示在集成终端中。
注册表:您可以登录到您的 Docker 注册表并查看您构建和推送的镜像。
System Prune:此选项允许您运行 docker system prune
,它会清除系统中未使用的图像。 它可以通过带有窗口的按钮和 Docker 资源管理器中的十字来使用。
Intellisense:如果您必须自己编写 Docker 文件(Dockerfile、docker-compose.yml),您将在键入时获得有用的 Intellisense。 它甚至会为您提供可用的图像标签。 这是通过输入图像名称、完整的冒号和 CMD
+ Space
来触发的。
Dockerfile Linting:当你的 Dockerfiles 中有错误时,VS Code 中会出现一条波浪线,当你将鼠标悬停在它上面时,你会看到错误是什么。
VS Code 下面的问题选项卡也会显示它。
结论
VS Code 的 Docker 插件可以帮助您快速设置和创建 Dockerfile,构建并运行它们,而无需自己输入许多命令。