核心概念
Docker
Docker
docker --version含义
一个用于打包和在隔离容器中运行应用程序的工具。
使用场景
当您希望应用程序在不同机器上使用相同的 OS 包、运行时和依赖项时,请使用它。
示例
docker --version请求示例
解释这个项目是否可以使用 Docker 运行。
编程
整理 Docker 镜像、容器、Dockerfile、Compose、端口、卷、日志与常见问题的搜索型指南。
33 个项目
核心概念
Docker
docker --version一个用于打包和在隔离容器中运行应用程序的工具。
当您希望应用程序在不同机器上使用相同的 OS 包、运行时和依赖项时,请使用它。
docker --version解释这个项目是否可以使用 Docker 运行。
核心概念
Docker daemon
无法连接到 Docker 守护进程构建镜像并运行容器的后台服务。
如果 Docker 命令无法连接,可能是 Docker Desktop 或 Docker 服务未运行。
无法连接到 Docker 守护进程检查为什么 Docker 命令无法连接到守护进程。
核心概念
Image
node:20-alpine可重用的模板,用于创建容器。
镜像定义了容器启动时使用的 OS、运行时、库和应用程序文件。
node:20-alpine请告诉我,这个 Dockerfile 使用哪个基础镜像。
核心概念
Container
docker ps从镜像创建的正在运行或已停止的实例。
使用容器来运行应用程序、数据库、缓存或工作进程,以在隔离的环境中运行。
docker ps列出正在运行的容器,并解释每个容器的作用。
核心概念
Registry
docker pull postgres:16存储和下载 Docker 镜像的服务器。
Docker Hub and private registries are used to share base images or deployable app images.
docker pull postgres:16解释这个镜像将从哪里下载。
Dockerfile
Dockerfile
Dockerfile一个定义如何构建 Docker 镜像的文件。
用于安装依赖项、复制应用程序文件,并定义启动应用程序的命令。
Dockerfile阅读此 Dockerfile 并总结构建步骤。
Dockerfile
FROM
FROM node:20-alpineDockerfile 指令,用于选择基础镜像。
它决定了启动的 OS 层,并且通常是运行时版本。
更改基本镜像可能会影响可用的命令、安全更新和图像大小。
FROM node:20-alpine解释此 FROM 镜像包含的内容。
Dockerfile
WORKDIR
WORKDIR /app设置图像内部的文件夹,后续命令将在该文件夹中运行。
确保 COPY、RUN 和 CMD 命令从可预测的应用程序文件夹运行。
WORKDIR /app解释这个 Dockerfile 使用哪个文件夹作为应用程序目录。
Dockerfile
COPY
COPY package.json package-lock.json ./将文件从构建上下文复制到镜像中。
用于将依赖文件、源代码和静态资源添加到镜像中。
COPY package.json package-lock.json ./请告诉我,这个 COPY 步骤将哪些文件添加到镜像中。
Dockerfile
RUN
RUN npm ci在构建镜像时运行命令。
用于安装 OS 包、安装依赖项或构建应用程序文件。
RUN 在镜像构建时发生,而不是在容器启动时。
RUN npm ci将 Dockerfile 的构建时命令与容器启动命令分开。
Dockerfile
CMD
CMD ["npm", "run", "start"]定义容器启动时运行的默认命令。
使用它来启动 Web 服务器、API 服务器、工作进程或脚本。
CMD ["npm", "run", "start"]告诉我此容器启动时使用的命令。
Dockerfile
EXPOSE
EXPOSE 3000记录容器化应用程序预期的监听端口。
将其用作一个提示,然后使用 `docker run -p` 或 Compose 端口发布端口。
仅使用 EXPOSE 并不能使应用程序从您的浏览器访问。
EXPOSE 3000解释这个暴露的端口是否实际被发布。
Dockerfile
.dockerignore
node_modules一个从 Docker 构建上下文中排除路径的文件。
用于将本地依赖项、构建输出、密钥和临时文件排除在镜像构建之外。
node_modules检查此 .dockerignore 是否排除不安全或不必要的文件。
Dockerfile
Build context
docker build -t my-app .在图像构建期间发送到 Docker 的文件夹。
在 docker 构建中的最后一个点通常意味着当前文件夹是构建上下文。
较大的上下文会减慢构建速度,并可能意外包含私有文件。
docker build -t my-app .解释此 Docker 构建可用的文件。
Docker Compose
Docker Compose
docker compose up一个用于从一个 YAML 文件运行多个 Docker 服务的工具。
用于应用程序、数据库、缓存、工作进程或本地开发堆栈。
docker compose up解释此 compose 文件启动的服务。
Docker Compose
services
services: web: db:在 compose 文件中定义的命名应用组件。
一个 Web 服务可能运行应用程序,而一个数据库服务运行 PostgreSQL。
services: web: db:列出此 compose 文件中的服务以及每个服务的作用。
Docker Compose
docker compose up
docker compose up -d启动 compose 文件中定义的服务。
使用 -d 选项,以便服务在后台运行。
docker compose up -d启动 compose 服务,并显示哪些服务正在运行。
Docker Compose
docker compose down
docker compose down停止并删除由 compose 创建的容器。
当您完成本地开发堆栈时使用。
命名卷通常会保留,除非您明确地删除它们。
docker compose down停止此 compose 堆栈,而无需删除持久性数据。
命令
docker build
docker build -t my-app .从 Dockerfile 和上下文构建 Docker 镜像。
在编写 Dockerfile 或更改应用程序依赖项后,使用它。
docker build -t my-app .构建此 Docker 镜像,并总结任何构建错误。
命令
docker run
docker run --name my-app -p 3000:3000 my-app从镜像创建并启动一个容器。
当您希望直接启动一个容器,而无需使用 compose 时使用。
docker run --name my-app -p 3000:3000 my-app运行此图像,并解释浏览器 URL。
命令
docker ps
docker ps列出正在运行的容器。
使用 `docker ps -a` 命令,以便同时查看已停止的容器。
docker ps显示正在运行的容器及其已发布的端口。
命令
docker stop
docker stop my-app停止正在运行的容器。
在删除容器或释放端口之前,使用它。
docker stop my-app使用端口 3000 停止容器。
命令
docker logs
docker logs my-app打印容器中的日志。
使用它,当容器退出、崩溃或应用程序没有响应时。
docker logs my-app阅读此容器的日志,并找到第一个错误。
命令
docker exec
docker exec -it my-app sh运行容器内部的命令。
用于检查容器内部的文件、环境变量或已安装的工具。
在容器内部手动进行的更改可能会在容器重新创建时消失。
docker exec -it my-app sh在此容器中打开一个 shell,并检查其环境变量。
端口与网络
ports
3000:3000将您机器上的一个端口映射到容器内的端口。
确保浏览器可以访问运行在容器内部的 Web 应用程序。
左侧是主机端口,右侧是容器端口。
3000:3000解释我应该打开哪个 URL 来配置这些端口设置。
端口与网络
localhost in Docker
host.docker.internal在 Docker 中,localhost 可以指容器本身,而不是您的主机。
在 compose 网络中使用服务名称,或者在容器需要访问主机机器时,使用 host.docker.internal。
host.docker.internal解释为什么 localhost 无法从这个容器访问数据库。
文件与数据
Volume
db-data:/var/lib/postgresql/dataDocker-managed storage that can persist data outside a container's lifecycle.
使用卷(volumes)来存储数据库数据或其他应在容器重新创建后仍然存在的文件。
删除卷可能会删除持久性数据。
db-data:/var/lib/postgresql/data请告诉我,哪些 compose volumes 用于存储持久数据。
文件与数据
Bind mount
./src:/app/src将一个主机文件夹直接连接到容器路径。
在开发过程中使用它,以便主机上的代码更改出现在容器内部。
一个绑定挂载可以将复制到镜像中的文件隐藏在相同的路径下。
./src:/app/src解释这个卷是命名卷还是绑定挂载。
文件与数据
environment
DATABASE_URL=postgres://db:5432/app传递到容器的配置值。
使用环境变量来配置数据库 URL、端口、模式、功能标志和运行时设置。
不要将密钥信息嵌入到公共图像中,也不要提交真实的密钥值。
DATABASE_URL=postgres://db:5432/app检查此容器需要哪些环境变量。
故障排查
port is already allocated
绑定到 0.0.0.0:3000 失败:端口已被占用Docker cannot publish a host port because another process or container is already using it.
找到使用该端口的进程或容器,然后停止它或选择不同的主机端口。
绑定到 0.0.0.0:3000 失败:端口已被占用找到正在使用此 Docker 端口的内容,并提供一个安全的解决方案。
故障排查
container name is already in use
冲突。容器名称 "/my-app" 已被使用。已经存在同名的容器。
列出现有容器,然后重用、删除或重命名旧容器。
冲突。容器名称 "/my-app" 已被使用。在不意外删除数据的情况下,解决此容器名称冲突。
故障排查
Build cache
docker build --no-cache -t my-app .Docker can reuse previous build layers to make builds faster.
如果更改似乎被忽略,请检查 Dockerfile 的顺序,或者尝试在不使用缓存的情况下重新构建,以进行诊断。
--no-cache 禁用缓存,可能会使构建变慢,请谨慎使用。
docker build --no-cache -t my-app .解释 Docker 构建缓存是否可能隐藏了我的更改。
安全操作
docker system prune
docker system prune删除未使用的 Docker 数据,例如已停止的容器、未使用的网络和悬空的镜像。
使用它,当 Docker 使用过多的磁盘空间,并且您了解将要删除的内容时。
使用额外的标志,prune 可以删除您仍然关心的图像或卷。
docker system prune在清理 Docker 之前,请显示将删除的内容以及哪些数据是安全的。