如何为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,我们将遵循以下步骤。

  1. 创建 Dockerfile(或 docker-compose.yaml)
  2. 向文件中添加 docker 指令(FROM、WORKDIR、ADD、EXPOSE、CMD)
  3. 在终端运行docker build...构建镜像
  4. 在终端运行 docker run... 运行容器

但是,使用插件,我们需要做的就是以下内容。 打开命令面板,输入 docker,然后选择 Docker: Add Docker files to Workspace。 它应该是第一选择。 按 Enter 您将被要求选择平台/堆栈,选择 Node.js 并按 Enter。 然后将要求您选择一个端口。 写 3000 因为它是我们的应用程序将监听的端口。 以下文件将添加到您的工作区:.dockerignoredocker-compose.debug.ymldocker-compose.ymlDockerfile

.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 个文件。 .dockerignoredocker-compose.debug.ymldocker-compose.ymlDockerfile

.dockerignore 文件告诉 Docker 在向镜像添加文件时忽略某些文件。

Docker Compose 使用 docker-compose.debug.ymldocker-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,构建并运行它们,而无需自己输入许多命令。