缺失的 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
该应用程序是一个响应传入的 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}!`));
我们将使用即将到来的命令构建并运行此文件。
docker build -f <docker 文件名> -t <镜像名称> <构建上下文>
拉取基础镜像,在 中构建镜像Dockerfile.short
,并将其命名为express
。我们可以在运行镜像时使用此名称。名称可以包含标签 ( express:1
):默认情况下,它会获取该标签。仅当它从 推迟时才需要指定latest
的名称。末尾的点表示构建上下文是当前目录。Dockerfile
Dockerfile
docker build -f Dockerfile.short -t express .
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
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
docker run -p <主机端口>:<容器端口> <镜像名称>
运行构建的镜像,并将容器端口连接到主机端口(-p 3000:3000
)。这样应用程序就可以在 上使用http://localhost:3000
。如果我们不想阻塞终端,可以在 分离模式下运行镜像-d
。如果我们要在文件更改时进行实时重新加载,例如使用 Nodemon,我们可以将本地文件夹作为卷附加-v $(pwd):/app
。
docker run -p 3000:3000 -v $(pwd):/app express
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
该-a
标志显示所有容器,而不仅仅是正在运行的容器。
docker logs -f -t <镜像ID>
显示正在运行的容器的带有时间戳的标准输出。
docker logs -f -t ec40c8347a43
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!
该-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
docker tag <源镜像名称>:<目标标签名称> <目标镜像名称>:<目标标签名称>
使用我们在上传图像时将使用的标签来命名图像。
docker tag express:latest blacksonic/express:latest
在将图像上传到 Dockerhub 之前,我们必须在图像名称前添加前缀(blacksonic 是我的用户名)。
docker push <镜像名称>:<标签名称>
将镜像上传到仓库。您现在可以在https://hub.docker.com/r/blacksonic/express网站上看到上传的镜像。
docker push blacksonic/express:latest
The push refers to repository [docker.io/blacksonic/express]
d93ac2ab321f: Pushed
5216338b40a7: Pushed
latest: digest: sha256:8b418f814535e24906fcb412f8e564ced393e4976586d710bbff60b5fdb2d11c size: 1993
清理
我们已经成功启动并推送了容器。现在该清理一下了。
docker stop <容器ID>
停止正在运行的容器。该容器不会被删除。
docker stop ec40c8347a43
docker rm <容器ID>
删除容器后,您将无法再次启动它。
docker rm ec40c8347a43
docker rmi <镜像ID>
删除图像:您必须再次构建它才能将其作为容器启动。
docker rmi d85b87f880e3
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