缺失的 Docker 备忘单

2025-05-24

缺失的 Docker 备忘单

Docker 作为容器平台,在软件开发者中越来越受欢迎。容器将软件打包成可在主机操作系统上独立运行的格式。Docker 仅捆绑了必要的库和设置,可以构建轻量级、高效、独立的系统,无论部署在哪里都能以相同的方式运行。在本指南中,我们将采用面向用例的方法:构建镜像、启动镜像,以及最终停止镜像并进行清理。

创建容器

为了遵循这些命令,我​​从我的存储库中借用了一个带有 Dockerfile 的应用程序,它代表了一个理想的 Node.js Docker 工作流程

# Dockerfile.short
FROM node:12-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .

EXPOSE 3000

CMD npm start
Enter fullscreen mode Exit fullscreen mode

该应用程序是一个响应传入的 HTTP 请求的 Express Web 服务器。

const express = require('express');
const port = process.env.PORT || 3000;
const app = express();

app.get('/', (req, res) => res.send('Hello World!'));

app.listen(port, () => console.log(`App listening on port ${port}!`));
Enter fullscreen mode Exit fullscreen mode

我们将使用即将到来的命令构建并运行此文件。

docker build -f <docker 文件名> -t <镜像名称> <构建上下文>

拉取基础镜像,在 中构建镜像Dockerfile.short,并将其命名为express。我们可以在运行镜像时使用此名称。名称可以包含标签 ( express:1):默认情况下,它会获取该标签。仅当它从 推迟时才需要指定latest的名称。末尾的点表示构建上下文是当前目录。DockerfileDockerfile

docker build -f Dockerfile.short -t express .
Enter fullscreen mode Exit fullscreen mode
Sending build context to Docker daemon  180.7kB
Step 1/7 : FROM node:12-alpine
12-alpine: Pulling from library/node
c9b1b535fdd9: Pull complete 
750cdd924064: Pull complete 
2078ab7cf9df: Pull complete 
02f523899354: Pull complete 
Digest: sha256:e280e51eaa6e626e4df58a5c1f141e453807c30596179330992c55a0bf4114ca
Status: Downloaded newer image for node:12-alpine
 ---> afd897e3184b
Step 2/7 : WORKDIR /app
 ---> Running in c8f379e36c32
Removing intermediate container c8f379e36c32
 ---> a11ced1bd480
Step 3/7 : COPY package*.json ./
 ---> e811deacf584
Step 4/7 : RUN npm ci --only=production
 ---> Running in 401bdc088d44
added 50 packages in 1.395s
Removing intermediate container 401bdc088d44
 ---> 644c8661eff7
Step 5/7 : COPY . .
 ---> 270057bb701a
Step 6/7 : EXPOSE 3000
 ---> Running in cd9d70daad58
Removing intermediate container cd9d70daad58
 ---> 4c6eb54071d1
Step 7/7 : CMD npm start
 ---> Running in fc2a7b3e7e11
Removing intermediate container fc2a7b3e7e11
 ---> d85b87f880e3
Successfully built d85b87f880e3
Successfully tagged express:latest
Enter fullscreen mode Exit fullscreen mode

Docker 镜像

显示主机上所有可运行的镜像。我们将看到名为 的应用程序express

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
express             latest              d85b87f880e3        3 minutes ago       87.6MB
node                12-alpine           afd897e3184b        3 days ago          85.2MB
Enter fullscreen mode Exit fullscreen mode

docker run -p <主机端口>:<容器端口> <镜像名称>

运行构建的镜像,并将容器端口连接到主机端口(-p 3000:3000)。这样应用程序就可以在 上使用http://localhost:3000。如果我们不想阻塞终端,可以在 分离模式下运行镜像-d。如果我们要在文件更改时进行实时重新加载,例如使用 Nodemon,我们可以将本地文件夹作为卷附加-v $(pwd):/app

docker run -p 3000:3000 -v $(pwd):/app express
Enter fullscreen mode Exit fullscreen mode

docker ps -a

列出正在运行的容器。之后docker run,我们将在这里看到应用程序。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ec40c8347a43        express             "docker-entrypoint.s…"   6 seconds ago       Up 5 seconds        0.0.0.0:3000->3000/tcp   hardcore_vaughan
Enter fullscreen mode Exit fullscreen mode

-a标志显示所有容器,而不仅仅是正在运行的容器。

docker logs -f -t <镜像ID>

显示正在运行的容器的带有时间戳的标准输出。

docker logs -f -t ec40c8347a43
Enter fullscreen mode Exit fullscreen mode
2020-02-10T18:22:07.672710300Z
2020-02-10T18:22:07.672788300Z > node-docker-workflow@1.0.0 start /app
2020-02-10T18:22:07.672825700Z > node src/index.js
2020-02-10T18:22:07.672850600Z
2020-02-10T18:22:07.917358100Z App listening on port 3000!
Enter fullscreen mode Exit fullscreen mode

-f标志告诉命令监听新的日志。如果记录太多,可以限制为仅显示部分行--tail 100

发布图像

我们的应用程序在本地计算机上运行良好,但无法将其部署到任何地方。为了进行部署,我们必须将其发布到仓库。为了演示,我们将使用默认的DockerHub仓库。

docker 登录

登录到仓库,默认登录 Dockerhub。我们需要一个 Dockerhub 账户才能运行此操作。您可以在这里注册

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: blacksonic
Password: 
Login Succeeded
Enter fullscreen mode Exit fullscreen mode

docker tag <源镜像名称>:<目标标签名称> <目标镜像名称>:<目标标签名称>

使用我们在上传图像时将使用的标签来命名图像。

docker tag express:latest blacksonic/express:latest
Enter fullscreen mode Exit fullscreen mode

在将图像上传到 Dockerhub 之前,我们必须在图像名称前添加前缀(blacksonic 是我的用户名)。

docker push <镜像名称>:<标签名称>

将镜像上传到仓库。您现在可以在https://hub.docker.com/r/blacksonic/express网站上看到上传的镜像。

docker push blacksonic/express:latest
Enter fullscreen mode Exit fullscreen mode
The push refers to repository [docker.io/blacksonic/express]
d93ac2ab321f: Pushed 
5216338b40a7: Pushed 
latest: digest: sha256:8b418f814535e24906fcb412f8e564ced393e4976586d710bbff60b5fdb2d11c size: 1993
Enter fullscreen mode Exit fullscreen mode

清理

我们已经成功启动并推送了容器。现在该清理一下了。

docker stop <容器ID>

停止正在运行的容器。该容器不会被删除。

docker stop ec40c8347a43
Enter fullscreen mode Exit fullscreen mode

docker rm <容器ID>

删除容器后,您将无法再次启动它。

docker rm ec40c8347a43
Enter fullscreen mode Exit fullscreen mode

docker rmi <镜像ID>

删除图像:您必须再次构建它才能将其作为容器启动。

docker rmi d85b87f880e3
Enter fullscreen mode Exit fullscreen mode

docker 停止 $(docker ps -a -q)

停止正在运行的容器的所有进程。停止后将docker ps -a返回空结果。

docker rm $(docker ps -a -q)

移除所有容器。

docker rmi $(docker 镜像 -q)

删除所有图片。删除后将docker images返回空结果。

docker 镜像 prune --all

删除所有未使用的镜像。“未使用”表示不存在基于该镜像的正在运行的容器。

概括

初次接触容器化可能会很困难,但只要掌握一些能够了解具体情况的命令,就能轻松上手。您可以参考示例配置,尝试一下,就会发现使用容器进行开发其实和在本地机器上一样简单。

文章来源:https://dev.to/emarsys/the-missing-docker-cheatsheet-4dbg
PREV
Web 开发人员安全检查表 V1
NEXT
React 测试速成课程