Docker 指南
本指南的目的是解释与 Docker 相关的最重要的概念,以便能够有效地使用 Docker 进行应用程序开发。
什么是 Docker?
Docker是一种帮助在隔离环境中运行应用程序的工具。
一直以来,我们都需要确保应用程序能够在隔离的环境中运行,以便它们能够在不同的计算机/服务器上按预期运行。这对于能够在本地计算机上开发应用程序并使其在部署环境中按预期运行至关重要。对于开发人员来说,能够在任何计算机上按预期运行应用程序也同样重要,这样无论他们的计算机配置如何,都能快速启动并运行应用程序,并与其他开发人员协作。
在不同机器上运行应用程序之所以如此困难,是因为必须安装所有正确版本的应用程序依赖项才能使其按预期运行。例如,如果尝试运行一个使用 Node.js 构建的 API,并且该 API 是在 Node.js 12.8 版本的机器上开发和测试的,那么在安装了 Node.js 10.18 版本的机器上,它可能无法正常运行。应用程序中使用的任何其他依赖项(例如 python、ruby、php、typescript、nginx、apache、mysql、postgres 等)也是如此。Docker 可以构建包含所有依赖项正确版本的容器化应用程序,并使其能够在不同的机器上按预期运行。
Docker 有四种类型的“对象”来创建这些隔离的环境:镜像、容器、卷和网络。用户最常直接使用的对象是 Docker镜像和 Docker容器。
Docker 镜像包含运行应用程序所需的代码,而Docker 容器是运行 Docker 镜像中代码的隔离环境。Docker镜像可以被视为 Docker容器使用的蓝图和代码。Docker 镜像可以保存到镜像仓库中,以供其他人下载。最流行的 Docker 镜像仓库是Docker Hub。您可以将镜像仓库视为 Docker 镜像的 NPM 版本。
请分别阅读指南中的Docker 镜像和Docker 容器部分,了解有关Docker 镜像和容器的更多信息。
Docker 卷用于持久化运行 Docker 容器生成的数据。通过将数据保存到 Docker 卷,即使 Docker 容器已被移除、重建或重启,应用程序也能拥有相同的数据。如果两个不同的容器需要访问相同的数据,Docker 卷也非常有用,因为这两个容器可以指向同一个卷。
Docker 网络用于确保容器彼此隔离,并且还用于允许容器相互通信。
请分别阅读指南中的Docker 卷和Docker 网络部分,了解有关Docker 卷和网络的更多信息。
相关资源
- 来自 Docker 官方文档的“Docker 概述”
那么虚拟机呢?
虚拟机(VM) 经常与 Docker 出现在同一个对话中,因为它们都用于创建隔离环境。
使用 Docker,应用程序可以在称为容器的隔离环境中运行,并且每个容器都共享同一台机器上的操作系统内核。另一方面,在虚拟机上运行的应用程序则在其自己的操作系统中运行,并且不共享底层内核。虚拟机在虚拟机管理程序的帮助下运行,虚拟机管理程序负责管理要运行的操作系统。
类型 1 虚拟机管理程序(半虚拟化):虚拟机管理程序位于裸机硬件上,每个操作系统都位于虚拟机管理程序上。例如VMware ESXi、Oracle VM Server、Microsoft Hyper-V
类型 2 虚拟机管理程序(仿真):虚拟机管理程序位于主机操作系统之上。例如Oracle VirtualBox、Parallels、VMware Workstation
附注:Linux 内核基本上是用来
要运行 Linux Docker 容器,计算机上需要安装 Linux 内核。如果您安装了适用于 Mac OS 或 Windows 的 Docker Desktop 应用程序,Docker 会为您处理此问题。该应用程序附带LinuxKit :一个轻量级的 Linux 内核,可在 Mac OS 或 Windows 操作系统上运行,并由 Docker 引擎使用。该轻量级 Linux 内核位于 Windows(参考)和 Mac OS(参考)原生附带的虚拟机管理程序上。
Docker 相较于虚拟机的优势压倒性地体现在诸多方面,这让 Docker 成为首选。与虚拟机相比,Docker 容器可以在几秒钟内(而非几分钟)启动运行,体积轻巧(MB 级而非 GB 级),易于配置,并且占用的资源较少。或许,唯一需要高级别隔离性的原因在于,Docker 容器在主机操作系统上使用共享内核可能会带来安全漏洞,因此选择使用虚拟机而非 Docker。
相关资源
- 极客大学对虚拟机管理程序类型的解释
- Geekflare解释 Docker 和虚拟机的优缺点
- Docker 文档中对 Docker 容器的解释以及容器和虚拟机之间的区别
- Stack Overflow 上有一个问题“Docker 与虚拟机有何不同?”,其中有很多有用的答案,包括这个定义半虚拟化和仿真的答案。
Docker 引擎
任何需要执行与 Docker 相关的操作的机器都需要安装并运行 Docker 引擎。启动引擎意味着会dockerd
启动一个长期运行的后台进程(Docker 守护进程,该命令也与之对应),以创建一个可通过 REST API 交互的服务器。大多数人使用 Docker CLI 与 REST API 交互来管理 Docker 对象,但第三方应用程序也可以直接与 REST API交互,或者通过Docker 引擎 SDK进行交互。
相关资源
- Docker 文档中的“Docker Engine 概述”
安装 Docker
安装所有 Docker 相关依赖项的最简单方法是安装Docker Desktop。Docker Desktop 附带几个 Docker 相关工具,包括 Docker Engine、Docker CLI 和 Docker Compose CLI(点击此处了解 Docker Compose )。
Docker Desktop 可在Mac和Windows上下载:
安装完成后,请确保 Docker Desktop 正在运行。如果 Docker Desktop 正在运行,则表示 Docker 引擎正在运行,并且本指南中提到的 Docker CLI 命令将能够执行。
Mac OS 菜单栏中指示 Docker Desktop 正在运行。
对于Linux用户,没有 Docker Desktop,因此必须单独安装每个组件:
在 Linux 上,必须使用以下命令启动 Docker 守护程序:
sudo systemctl start docker
上述命令应该可以正常工作,因为大多数systemctl
Linux 发行版都附带该命令,但如果不行,请使用。还有一种方法可以让 Linux 在系统启动时自动启动 Docker。sudo service docker start
相关资源
- Docker 文档中的“Docker Desktop 概述”
Dockerfile
ADockerfile
是一个包含如何构建镜像指令的文件。该文件通常首先指定一个基础镜像,该镜像将用作待构建 Docker 镜像的基础。例如,如果要构建基于 Python 的 API,则可以使用由安装了 Python 的 Linux 操作系统构成的基础镜像。指定基础镜像后,可以使用其他指令,这些指令可以指定有关如何构建 Docker 镜像的以下详细信息:
- 容器中设置的环境变量
- 镜像暴露的端口
- 哪些文件应该复制到镜像中
- 应该安装哪些依赖项
- 启动容器时执行的命令(例如
yarn start
,启动 Node.js API) - 还有更多...
例如,Node.js API 的图像可能类似于Dockerfile
以下内容:
# Base image that has Node version 12.16.1 installed on a Linux OS.
# This is an alpine Linux image that is smaller than the non-alpine Linux equivalent images.
FROM node:12.16.1-alpine3.11
# Installs some dependencies required for the Node.js API
RUN apk add --no-cache make g++
# Indicates that the API exposes port 3000
EXPOSE 3000
# Specifies the working directory. All the paths referenced after this point will be relative to this directory.
WORKDIR /usr/src/app
# Copy all local source files into the Docker container's working directory
COPY . .
# Installs NPM dependencies using yarn
RUN yarn install
# Command to start the API which will get executed when a Docker container using this image is started.
CMD [ "yarn", "start" ]
下表列出了常用的指令。完整的指令列表请参阅Dockerfile 参考文档。
操作说明 | 描述 |
---|---|
FROM |
定义基础镜像 |
RUN |
在新的图像层中执行命令 |
CMD |
运行容器时执行的命令 |
EXPOSE |
记录哪些端口是公开的(除了文档之外不用于任何其他用途) |
ENV |
设置环境变量 |
COPY |
将文件/目录复制到图像中 |
ADD |
功能更丰富的版本COPY 指令。比 更COPY 受欢迎ADD 。 |
ENTRYPOINT |
定义容器的可执行文件。请参阅此处的CMD 指令区别。 |
VOLUME |
定义镜像中哪个目录应被视为卷。该卷将被赋予一个随机名称,可以使用docker inspect 命令找到。 |
WORKDIR |
定义后续指令的工作目录Dockerfile |
ARG |
定义可由docker build --build-arg 命令传递并在中使用的变量Dockerfile 。 |
如果要阻止某些文件复制到 Docker 镜像中,可以在与指定不应复制到 Docker 镜像的文件.dockerignore
的同一级别添加一个文件。这意味着,如果在 a 中使用或指令指定要添加到 Docker 镜像中的文件,则文件中指定的任何文件都将被忽略,而不会添加到 Docker 镜像中。这可能有助于防止包含敏感信息(例如,保存 API 密钥的文件)或不必要的大型文件被添加到 Docker 镜像中。在文件中指定要忽略的文件时,请确保了解正确的语法。Dockerfile
COPY
ADD
Dockerfile
.dockerignore
.env
.dockerignore
专业提示:使用 Alpine Linux 基础镜像
许多基础镜像都有一个Alpine Linux版本,其体积比非 apline 版本小得多。构建较小的 Docker 镜像非常有利,因为您可以节省与 Docker 镜像相关的数据传输/存储成本。例如,亚马逊的容器镜像仓库服务 ECR 会按从其镜像仓库拉取的 Docker 镜像的GB 数额向用户收费。较小的 Docker 镜像也意味着从镜像仓库拉取 Docker 镜像的速度会更快,这会显著缩短您的持续集成 (CI) 时间和本地开发等待时间。
通过阅读“使用 Alpine 作为基础 Docker 镜像的 3 大优势”了解有关 Alpine Linux 镜像的优势的更多信息。
专业提示:多阶段构建
由于将 Docker 镜像大小保持在最低限度有很多好处,因此从 Docker 镜像中删除所有不必要的编译时依赖项将有助于缩减整体大小。避免在 Docker 镜像中包含不必要文件的最佳方法是使用多阶段构建。
Dockerfile
多阶段构建允许构建“中间”镜像,其中可以安装任何必要的编译时依赖项,然后只需将从这些中间镜像生成的必要文件复制到优化的运行时镜像中。阅读Greg Schier的这篇文章,详细了解多阶段构建的工作原理。
相关资源
- Docker 文档中的“Dockerfile 参考”列出了所有可用的指令
Dockerfile
以及如何使用它们 - Docker 文档中的“编写 Dockerfile 的最佳实践”
- “Docker CMD 与入口点命令:有什么区别?”
- Stack Overflow 回答“ Dockerfile 中的‘COPY’和‘ADD’命令有什么区别?”
Docker 镜像
Docker 镜像包含 Docker 容器使用的代码和指令,以了解如何设置应用程序的环境。
构建和标记图像
Docker 镜像是使用docker build
命令创建的。构建 Docker 镜像时,会根据--tag
选项指定一个标签。标记镜像是为了给 Docker 镜像指定名称/版本,以便确定从镜像仓库中拉取哪个镜像,以及在运行容器时应该使用哪个镜像。
这是构建和标记图像的示例。
docker build --tag my-app:1.0 .
分解上述命令:
docker build
指定正在创建 Docker 镜像--tag my-app:1:0
指定应为图像分配一个存储库名称my-app
和一个标签1.0
.
表示 Docker 镜像应该从Dockerfile
当前目录中找到的
该docker images
命令可用于列出所有可用的 Docker 镜像来验证镜像是否已创建:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-app 1.0 964baf4833d3 8 minutes ago 322MB
图像也只能使用选项指定存储库名称,在这种情况下将使用--tag
默认标签。latest
docker build --tag my-app .
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-app latest 964baf4833d3 8 minutes ago 322MB
除了可以使用命令--tag
中的选项标记镜像之外docker build
,Docker 镜像还可以使用命令标记docker tag
。由于同一镜像可以有多个标签,因此该docker tag
命令允许将新标签应用于已通过docker build --tag
命令标记的镜像。docker tag
通过使用正确标记镜像,可以避免使用命令docker build --tag
,但如果镜像需要使用不同的标签,则可以使用docker tag
命令来完成。
以下是一个例子:
docker tag my-app:1.0 robertcooper/my-app:1.0
上述命令将为具有名称robertcooper/my-app
和标签的本地镜像提供存储库名称和标签。1.0
my-app
1.0
列出图像将产生以下结果:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
robertcooper/my-app 1.0 964baf4833d3 46 minutes ago 322MB
my-app 1.0 964baf4833d3 46 minutes ago 322MB
请注意,两个镜像共享相同的镜像 ID,唯一的区别在于仓库名称。镜像关联的仓库名称决定了运行命令时该镜像将被推送到哪个 Docker 镜像仓库/仓库。Docker 镜像仓库以及如何推送和拉取镜像将在“镜像仓库和拉取/推送镜像”docker push
部分讨论。
专业提示:警惕可变的 Docker 标签行为
Docker 镜像标签是可变的,这意味着如果将镜像推送到具有特定标签(例如 1.0.0)的镜像存储库,则可以使用包含不同代码的不同镜像覆盖该标记镜像。对于那些更熟悉像npm这样的不可变依赖项存储库的人来说,这可能会令人惊讶。可变镜像标签有其好处(例如确保以前发布的镜像版本包含安全修复程序),但这也意味着用户可能不会拉取他们期望的精确镜像,这可能导致不确定的部署。为了确保每次都拉取完全相同的镜像,可以指定镜像的摘要,它是指向镜像的“内容可寻址标识符”。如果通过摘要而不是引用镜像,则
docker pull node@8.10.0
命令将如下所示docker pull node@sha256:06ebd9b1879057e24c1e87db508ba9fd0dd7f766bbf55665652d31487ca194eb
。“突变标签的攻击!或者为什么标签可变性是一个真正的安全威胁”解释了 Docker 环境中可变标签系统的优点/缺点以及如何引用图像摘要。
“克服 Docker 的可变镜像标签”解释了如何引用镜像摘要,以及如何使用Renovate检测是否已为特定镜像标签发布了新的镜像摘要,以便在有可用的更新镜像时提醒用户。
相关资源
- Shubheksha Jalan撰写的“Docker 标签简介”很好地解释了如何标记镜像以及 Docker 标签代表什么
docker build
Docker 文档中的命令docker tag
Docker 文档中的命令
列出图像
使用docker images
(或docker image ls
) 命令列出 Docker 主机上可用的 Docker 镜像。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
robertcooper/my-app 1.0 964baf4833d3 46 minutes ago 322MB
my-app 1.0 964baf4833d3 46 minutes ago 322MB
相关资源
docker images
Docker 文档中的命令
镜像注册表和拉取/推送镜像
Docker 镜像远程保存在 Docker镜像仓库中,默认的 Docker 镜像仓库是Docker Hub。Docker镜像仓库允许将 Docker 镜像存储并拉取(即下载)到 Docker 主机上,以供 Docker 容器使用。
要从 Docker Hub 拉取镜像,请使用以下docker pull
命令:
docker pull nginx:1.18.0
上述命令将从Docker Hub下载nginx
已标记的 Docker 镜像。运行该命令后,使用 列出镜像时应该会显示该镜像。1.18.0
docker pull
docker images
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.18.0 20ade3ba43bf 6 days ago 133MB
如果拉取时没有明确指定标签,latest
则拉取带有标签的镜像。
docker pull nginx
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 992e3b7be046 6 days ago 133MB
以上示例使用了nginx 镜像,它是 Docker Hub 官方镜像。Docker Hub 官方镜像是经 Docker Hub 正式批准的镜像,并且会定期进行安全漏洞测试。点击此处了解更多关于 Docker 官方镜像的信息。
任何人都可以在 Docker Hub 上创建自己的帐户和仓库,并将镜像推送到仓库。将镜像推送到 Docker Hub 意味着镜像将保存在 Docker Hub 中使用该docker push
命令指定的仓库中。该docker push
命令的格式如下:
docker push <hub-user>/<repo-name>:<tag>
其使用示例如下:
docker push robertcooper/my-app:1.0
在上面的示例中,这会将存储库名称为robertcooper/my-app
、标签为的本地镜像推送到1.0
Docker Hub。
要获得将图像推送到图像注册表的权限,用户必须首先使用以下命令登录docker login
:
docker login --username robertcooper
上述命令将尝试对robertcooper
Docker Hub 帐户进行身份验证。执行该命令时,将提示用户输入密码,如果成功,即可将镜像推送到与 Docker Hub 帐户关联的 Docker Hub 仓库。从私有仓库拉取镜像时,也需要使用 用户robertcooper
名 登录。docker login
Docker Hub 并不是唯一可供用户使用的镜像注册中心,还有其他流行的镜像注册中心产品,例如:
每个 Docker 镜像仓库都有各自的定价。Docker Hub 的免费计划允许无限数量的公共存储库和 1 个私有存储库,但如果需要更多私有存储库,则需要升级到其 Pro 计划,费用为每年 60 美元或每月 7 美元。另一方面,Amazon ECR 对镜像占用的存储空间每月每 GB 收费 0.10 美元,此外,拉取的镜像每 GB 还需额外收费 0.05 至 0.09 美元(即,数据传出收费,但数据传入免费)。
如果从 Docker Hub 以外的存储库拉取镜像,则docker push
和docker pull
命令中的存储库名称需要以与镜像存储库对应的主机名作为前缀。未指定主机名的docker push
和docker pull
命令将默认使用 Docker Hub 作为镜像仓库。例如,如果拉取托管在 Amazon ECR 上的镜像,则可能类似于以下命令:
docker pull 183746294028.dkr.ecr.us-east-1.amazonaws.com/robertcooper/my-app:1.0
在上面的例子中,183746294028.dkr.ecr.us-east-1.amazonaws.com
是镜像仓库的主机名,robertcooper/my-app
是仓库的名称,1.0
是标签。
docker login
请记住,无论使用哪个注册表,都需要使用身份验证来推送图像。
相关资源
- Docker 文档中的“Docker Hub 快速入门”介绍了如何在 Docker Hub 上创建镜像存储库
docker pull
Docker 文档中的命令docker push
Docker 文档中的命令docker login
Docker 文档中的命令
删除图像
要删除 docker 镜像,请使用docker rmi
或docker image rm
命令。
docker rmi my-app:1.0
容器正在使用的图像需要先删除容器,然后再尝试删除图像,或者--force
可以将选项传递给docker rmi
命令。
docker rmi --force my-app:1.0
这里有两个有用的命令可以一次性清除所有图像:
docker rmi $(docker images -a -q) # remove all images
docker rmi $(docker images -a -q) -f # same as above, but forces the images associated with running containers to also be removed
相关资源
docker rmi
Docker 文档中的命令
保存和加载图像
在某些情况下,将 Docker 镜像保存到文件中,然后通过该文件将镜像加载到 Docker 主机上可能会很有用。例如,构建 Docker 镜像的 CI 检查可能会在另一个 CI 检查中使用同一个镜像。与其将镜像推送到镜像仓库,然后再拉取下来用于另一个 CI 检查,不如将镜像保存到 CI 服务器上持久存储的文件中,然后从应该使用相同构建镜像的另一个 CI 检查中加载该镜像,这样可能更有利。
要保存 Docker 镜像,请使用以下docker save
命令:
docker save --output my-app.tar my-app:1.0
上述命令将 Docker 镜像保存my-app:1.0
到名为 的tarballmy-app.tar
文件中。
可以使用以下命令将新保存的 tarball 文件作为 Docker 镜像加载到 Docker 主机中docker load
:
docker load --input my-app.tar
Loaded image: my-app:1.0
相关资源
docker save
文档中的命令docker load
文档中的命令
Docker 容器
Docker 容器是用于运行应用程序的隔离环境。Docker 容器由其对应的 Docker 镜像描述。
运行容器
Docker 容器是通过运行 Docker 镜像指定的环境来创建的。Docker 容器使用docker run
命令启动。
docker run my-app:1.0
上述命令将使用my-app:1.0
镜像创建一个容器。执行该docker run
命令将启动容器,并执行镜像中指定的CMD
指令Dockerfile
所指定的命令。
要验证 docker 容器是否正在运行,请执行docker ps
列出正在运行的容器。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ec488b832e0a my-app:1.0 "docker-entrypoint.s…" 13 minutes ago Up 13 minutes practical_buck
请注意,上述命令的输出显示有一个正在运行的容器,其容器 ID 为ec488b832e0a
,名称为。容器 ID 和容器名称均为随机生成的,可用于其他需要识别容器名称/ID 的 Docker CLI 命令。您也可以通过向命令的选项practical_buck
传递值来为容器指定更合适、更易记的名称。--name
docker run
docker run --name my-app my-app:1.0
现在,的名称my-app
已分配给正在运行的docker容器。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6cf7fd48703e my-app:1.0 "docker-entrypoint.s…" 13 minutes ago Up 13 minutes my-app
相关资源
docker run
文档中的命令docker ps
文档中的命令
分离模式和查看日志
默认情况下,使用 运行 Docker 容器docker run
会将容器的进程输出附加到docker run
执行命令的控制台。这意味着容器的所有日志都会实时显示在控制台中。但是,也可以使用 选项以分离模式-d
运行容器,这样控制台就可以在 Docker 容器运行时自由地执行其他命令。
docker run -d my-app:1.0 # Runs a docker container in detached mode
如果容器以分离模式运行,则可以使用docker logs
命令查看日志。
docker logs ec488b832e0a
上述命令获取 ID 为 的容器的日志ec488b832e0a
。该命令也可以使用容器名称docker logs
来获取相同的结果。
docker logs my-app
相关资源
docker logs
文档中的命令
暴露端口
如果正在运行的容器公开端口(例如端口 3000),则需要在 Docker 主机和 Docker 容器之间进行端口映射才能访问 Docker 外部的应用程序(例如,在 Chrome 浏览器中通过http://localhost:3000查看在 Docker 中运行的 Web 应用程序)。
docker run -p 3000:3000 my-app:1.0
上述命令将运行一个容器,该容器可通过主机上的http://localhost:3000访问。在浏览器中访问http://localhost:3000应该会显示正在运行的应用程序(假设该应用程序是一个 Web 应用程序)。
通常,Docker 主机和 Docker 容器之间的端口号最终是相同的值,但也可以映射到主机上的不同端口,如果主机上的端口已被占用,这可能是可取的。
docker run -p 8000:3000 my-app:1.0
上述命令将运行一个可通过http://localhost:8000访问的容器。
停止和删除容器
要停止运行 docker 容器,请使用docker stop
(或docker container stop
)命令。
docker stop my-app
docker stop
将在容器中发送一个SIGTERM
信号,尝试优雅地终止正在运行的进程。如果 10 秒后容器仍未停止,SIGKILL
则会发送一个信号,以更强制的方式终止正在运行的进程。
还有docker kill
(或docker container kill
)命令,它将立即SIGKILL
向容器发送信号,强制终止容器的进程。
docker kill my-app
可以使用docker start
(或docker container start
)命令重新启动已停止的容器。
docker start my-app
要删除不再使用的容器,请使用docker rm
命令。
docker rm my-app
默认情况下,该docker rm
命令仅允许删除已停止的-f
容器。要删除正在运行的容器,请使用( --force
) 选项。
docker rm -f my-app
使用该-f
选项将向SIGKILL
正在运行的容器发送信号以停止它,然后该容器将被删除。
相关资源
docker stop
文档中的命令docker kill
文档中的命令docker start
文档中的命令docker rm
文档中的命令
列出容器
要查看正在运行的容器列表,请使用docker ps
(或docker container ls
)命令。默认情况下,带 的容器表示docker ps
正在运行的容器。要包含已停止的容器,请将-a
( --all
) 选项传递给命令。
docker ps
docker ps -a # includes stopped containers
相关资源
在正在运行的容器中执行命令
要在正在运行的容器内运行命令,请使用该docker exec
命令。
docker exec my-app ls
Dockerfile
README.md
node_modules
package.json
pages
public
styles
yarn.lock
一个有用的 exec 命令是允许连接到容器的 shell 的命令:
docker exec -it my-app sh
运行上述命令会将命令行连接到 Docker 容器的 shell,从而可以执行其他命令,例如cd
、ls
、cat
、echo
等。-it
要将命令行 shell 连接到 Docker 容器的 shell,必须使用 选项。有关该命令功能的更多详细信息-it
,请阅读本文。
附注: bash != sh
在上面的命令中,
sh
使用 而不是 ,bash
因为bash
可能未安装在 Docker 镜像上。例如,Alpine Linux Docker 镜像bash
默认没有安装,因此bash
需要通过 中的指令进行安装Dockerfile
(请参阅此 Stack Overflow 答案以了解如何安装),或者sh
可以使用 ,因为它已安装在 Alpine Linux 上。sh
应该在大多数/所有 Linux 发行版上可用,而bash
可能不是本机安装的。bash
是 的超集sh
(就像 TypeScript 是 JavaScript 的超集一样),这意味着bash
比 有一些额外的功能sh
,但对于 上下文中的典型用法docker exec -it my-app sh
,不需要 提供的额外功能bash
。有关更多详细信息,请阅读 Stack Overflow 上的这个优秀资源,它回答了以下问题:“sh 和 bash 之间的区别”。
该docker run
命令也可用于在 Docker 容器中运行命令。docker run
和的区别docker exec
在于需要在已运行的docker exec
容器上使用,而会创建一个新容器来运行指定的命令。docker run
docker run my-app:1.0 ls
上述命令将使用my-app:1.0
镜像启动一个容器并执行命令。在执行命令前后ls
列出 Docker 容器( )将显示已创建的新容器。docker ps --all
docker run
docker run
请记住,正如 Docker 容器部分开头所述,该命令也用于创建 Docker 容器,并运行容器关联镜像中指定的任何命令。这可能是该docker run
命令最常用的方式,但是,它也可以用于运行前面段落中解释过的一次性命令。
相关资源
- “Docker Exec 命令及示例”
docker exec
文档中的命令docker run
文档中的命令
获取容器的详细信息
要获取有关 docker 容器的详细信息,docker inspect
可以使用该命令。
docker inspect my-app
该命令的输出相当长,docker inspect
因为它包含大量与 Docker 容器相关的信息,例如其完整 ID、容器的创建时间、容器启动时运行的命令、网络设置等等。
该docker inspect
命令并非 Docker 容器独有,还可以用于其他 Docker 对象,例如 Docker 镜像。
docker inspect my-app:1.0 # inspect a Docker image
要获取 Docker 容器的资源消耗情况(例如 CPU、内存和 I/O)的实时数据,请使用该docker stats
命令。
docker stats my-app
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
4eef7af61c6f my-app 0.03% 46.73MiB / 1.944GiB 2.35% 906B / 0B 0B / 0B 18
附注: Docker 主机上的资源限制
CPU %
用于计算和值的总 CPU 和内存MEM %
不一定与物理机器上可用的 CPU 和内存总量相对应,因为 Docker 主机可以配置为只使用机器上可用 CPU/RAM 的一小部分。可以使用 Docker Desktop 轻松配置 CPU、内存和磁盘空间限制,以确保 Docker 主机无法访问机器上过多的资源。Docker Desktop 配置 Docker 主机上的资源限制。
相关资源
docker inspect
文档中的命令docker stats
文档中的命令
Docker 卷
Docker 卷用于在 Docker 容器中持久保存数据。这意味着容器可以停止和重启,同时应用程序的数据/状态可以得到维护。Docker 卷还可以通过让所有容器指向同一个卷,允许多个不同的容器共享数据。
Docker 卷保存在主机文件系统的 Docker 存储目录中。Docker 存储目录位于/var/lib/docker/volumes
Linux 上,但用户无需关心 Docker 将这些卷保存在何处,因为用户将依赖 Docker CLI 与卷进行交互。
可以通过在启动容器时向命令传递-v
(--volume
)选项来将卷安装到容器。docker run
docker run -d --name my-app -v my-volume:/usr/src/app my-app:1.0
上述命令将映射一个以 Docker 容器中的目录my-volume
中的代码命名的卷。/usr/src/app
使用列出所有可用的 Docker 卷docker volume ls
。
docker volume ls
DRIVER VOLUME NAME
local my-volume
也可以使用docker volume create
命令创建卷。
docker volume create my-volume
由于卷很可能通过命令或 Docker Composedocker volume create
创建/指定,因此不需要太多命令的用例。docker run -v
创建卷时不需要明确传递卷名称,因为 Docker 会为该卷生成一个随机名称。
docker run -d --name my-app -v /usr/src/app my-app:1.0
要找出分配给上述命令创建的 Docker 卷的名称,请运行该docker inspect
命令以获取有关容器的详细信息。
docker inspect my-app
输出将包含一个名为“Mounts”的部分,其中包含有关卷的信息。
...
"Mounts": [
{
"Type": "volume",
"Name": "7ce1df6e218cda9c64917c51c1035e7291791043f9722db2fe38156cb9dc98f3",
"Source": "/var/lib/docker/volumes/7ce1df6e218cda9c64917c51c1035e7291791043f9722db2fe38156cb9dc98f3/_data",
"Destination": "/usr/src/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
在上面的输出中,7ce1df6e218cda9c64917c51c1035e7291791043f9722db2fe38156cb9dc98f3
是卷的名称。
通常,应该明确定义卷的名称,以确保每次启动容器时使用相同的卷。
Docker 还提供了使用所谓的绑定挂载 (bind mounts) 的选项,其行为与 Docker 卷非常相似。绑定挂载是指主机上将要挂载到 Docker 容器中的目录。绑定挂载和 Docker 卷之间的主要区别在于,Docker 卷由 Docker 引擎管理,因此docker volume
可以使用命令与卷进行交互,并且所有卷都保存在 Docker 的存储目录中。
例如,用户桌面上的目录可以用作容器的绑定挂载。
docker run -d --name my-app -v ~/Desktop/my-app:/usr/src/app my-app:1.0
运行命令时不会显示绑定挂载,docker volume ls
因为绑定挂载不由 Docker“管理”。
专业提示:实时重新加载
使用 Docker 开发应用程序时,可以利用 Docker 卷来实现实时重新加载功能。本免费 Code Camp 教程讲解了如何设置 Docker 应用,以允许实时重新加载用 TypeScript 编写的 Node.js 应用程序。本教程还讲解了如何使用 Docker 卷在本地文件系统和 Docker 容器之间镜像文件。此外,本教程还讲解了如何通过 Docker CLI 覆盖 Dockerfile 中指定的默认命令,让 Docker 容器运行一个监视进程,该进程监视 TypeScript 文件是否被更改,并将其转换为 JavaScript,从而触发应用程序进行实时重新加载。
相关资源
- Docker 文档中的“在 Docker 中管理数据”
- Docker 文档中的“使用绑定挂载”
- YouTube:TechWorld 与 Nana 合作的“ 6 分钟讲解 Docker Volumes”
- YouTube:Raghav Pal的“什么是 Docker Volume | 如何创建卷 | 什么是绑定挂载 | Docker 存储”
Docker 网络
Docker 网络用于允许容器彼此很好地隔离,并且如果容器需要能够相互通信,也可以使用它们。
Docker 网络有不同的驱动程序,支持不同类型的网络。默认的驱动程序称为“bridge”驱动程序,当启动容器时未指定特定网络,容器将在名为“bridge”的桥接网络上运行。但是,如果不同的容器需要相互通信,Docker 建议使用用户定义的桥接网络。
docker run -d --name my-app my-app:1.0
使用上述命令运行容器会将容器连接到默认桥接网络。您可以使用以下docker inspect
命令进行验证。
docker inspect my-app
...
"NetworkSettings": {
"Bridge": "",
"SandboxID": "33bf53f6badba3f19e4bcdb18e55d198a48672f23187be8934e20f31e6aad18f",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/33bf53f6badb",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "94c91e903283f9686d2d6f16bb10e28e95b004d81f81415d04f0cf710af006f9",
"EndpointID": "",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
}
...
要创建用户定义网络,请使用docker network create
命令。
docker network create my-network
--network
使用以下选项连接到用户定义的网络docker run
:
docker run -d --name my-app --network my-network my-app:1.0
选择使用以下方法将网络连接到正在运行的容器docker network connect
:
docker network connect my-network my-app
到目前为止,我们只提到了网桥网络驱动程序,因为大多数人在使用 Docker 时只需要它。然而,Docker 还附带了另外 3 个网络驱动程序,可用于容器网络:
- host:主机驱动程序是 Docker 主机使用的网络。如果使用桥接网络时可用端口数量太有限,则可能需要让容器使用 Docker 的主机网络。
- none:不需要连接网络的容器可以不使用网络。这意味着输入和输出将通过
STDIN
或STDOUT
通过 Docker 卷中的镜像文件完成。 - overlay :用于连接位于不同 Docker 主机上的 Docker 容器。这在以Swarm 模式运行 Docker 时最常用。
- maclan:用于为容器分配 MAC 地址。
要查看 Docker 主机上的 Docker 网络列表,请运行该docker network ls
命令。
docker network ls
NETWORK ID NAME DRIVER SCOPE
e538e11182fd my-network bridge local
409d0b996c9d bridge bridge local
39a73b1d3dc1 host host local
8616053c1b28 none null local
以上输出显示当前Docker主机上有4个网络:
- 用户定义的桥接网络名为“my-network”
- 默认桥接网络名为“bridge”
- 名为“host”的主机网络
- 名为“none”的网络,用于不应连接到网络的容器
相关资源
删除未使用的镜像、容器和卷
随着用户使用 Docker,计算机硬盘很快就会因积累旧的和未使用的 Docker 对象(即图像、容器和卷)而变得臃肿。
以下是一些用于清除旧图像、容器和卷的有用命令的列表:
docker system prune # cleans images, containers, volumes, and networks that are not associated with a container
docker system prune -a # same as above, but includes stopped containers and unused images
docker volume prune # removes volumes that are not connected to containers (aka "dangling" volumes)
docker rmi $(docker images -a -q) # removes all images that are not associated with existing containers
docker image prune -a # same as the above command
docker rmi $(docker images -a -q) -f # same as above, but forces the images associated with existing containers (running or stopped) to also be removed
docker rm $(docker ps -a -q) # removes all containers
docker rm $(docker ps -a -q) -f # same as above, but forces running containers to also be removed
相关资源
Docker Compose
Docker Compose 是一款简化与 Docker 引擎通信的工具。所有与 Docker 引擎的交互都可以通过常规的 Docker CLI 完成,但 Docker Compose 允许docker-compose.yml
使用docker-compose
CLI 命令在文件中定义容器,以便与 Docker 引擎交互。这样一来,你就可以将容器配置详细信息从常规的docker
CLI 命令转移到 Docker Compose 文件中。
在使用 运行任何命令之前docker-compose
,需要在文件中指定服务docker-compose.yml
。服务描述了正在运行的容器应该使用哪个镜像,以及与容器相关的任何其他配置,例如环境变量、要公开的端口、要使用的卷等等。
附注:为什么是“服务”?
如上所述,
docker-compose.yml
文件中描述 Docker 容器的块称为服务。“服务”一词通常用于指代构成某个大型应用程序的各个部分。整个微服务架构都基于此理念。
这是一个docker-compose.yml
描述三种服务的示例文件:一个 Web 应用程序、一个 API 和一个数据库。
version: "3.8"
services:
web-app:
container_name: web-app
build: ./web-app
ports:
- "3000:80"
api:
container_name: api
build: ./api
ports:
- "5000:5000"
db:
container_name: db
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: password
volumes:
- db-volume:/var/lib/postgresql/data
volumes:
db-volume:
分解上述内容docker-compose.yml
,我们可以看到,我们首先定义应该使用的 Docker Compose 版本(3.8
在撰写本文时是最新版本)。
接下来,描述了 3 个服务:web-app
、api
和db
。每个服务都有一个container_name
定义,当使用 Docker Compose 运行服务时,它将与 Docker 容器的名称相对应。要启动服务,docker-compose up
可以使用该命令。如果指定服务名称,它将启动该特定服务。如果未指定服务,则将启动所有服务。
docker-compose up api # Will only start the api service
docker-compose up # Will start all the services
服务可以在分离模式下运行以保持对命令行的控制。
docker-compose up api -d
可以使用docker ps
命令验证容器是否正在运行。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
4c33deed7688 my-app_web-app "/docker-entrypoint.…" 3 days ago Up 7 hours 0.0.0.0:3000->80/tcp web-app
7c3fc92ad1c4 my-app_api "docker-entrypoint.s…" 4 days ago Up 7 hours 0.0.0.0:5000->5000/tcp api
acc4dcd27a2b postgres "docker-entrypoint.s…" 4 days ago Up 7 hours 0.0.0.0:5432->5432/tcp db
web-app
和服务api
都有一个build
选项,指向与每个服务对应的 的位置。Docker Compose 需要知道Dockerfile
的位置才能知道如何构建与这些服务相关的镜像。Dockerfile
要使用 Docker Compose 构建图像,请使用docker-compose build
命令。
docker-compose build api
上述命令将为服务构建一个镜像api
,其默认名称遵循 的格式[folder name]_[service name]
。因此,如果文件所在的文件夹docker-compose.yml
名为my-app
,则构建的镜像也将被命名为my-app_api
。该镜像还将被赋予一个 的标签latest
。
大多数情况下,使用 构建镜像docker-compose build
并非必需,因为运行该命令会自动构建所有缺失的镜像。但是,如果标记为 的镜像比较旧,需要使用新代码进行更新,docker-compose up
则可能需要重新构建镜像。latest
请注意,在上面的docker-compose.yml
文件中,db
服务没有build
选项。这是因为数据库服务使用的是 Docker Hub 上的官方 PostgreSQL 镜像,因此无需构建镜像。
每个服务都使用选项指定要向 Docker 主机公开的端口ports
,其中第一个端口号是 Docker 主机上的端口,第二个端口号是 Docker 容器中的端口。以 Web 应用为例,我们将 Docker 主机端口 3000 映射到 Docker 容器的端口 80,因为 Web 应用服务运行着一个 NGINX 服务器,该服务器将 HTML 服务发送到端口 80。
另请注意,正在为该db
服务设置环境变量。该POSTGRES_PASSWORD
环境变量的值被设置为“password”(强制免责声明:使用“password”作为密码并不安全)。使用environment
Docker Compose 中的 选项指定的环境变量使环境变量在关联的 Docker 容器中可用,但在构建期间不可用Dockerfile
。因此,环境变量在 中不可访问。要在 构建时使变量在 中可访问Dockerfile
,请在文件中使用选项args
的子build
选项docker-compose.yml
。
该db
服务还使用了一个命名卷。命名卷db-volume
在文件底部指定,并通过服务上的选项docker-compose.yml
将卷映射到 Docker 容器中的目录。请注意,该文件将卷映射到Docker 容器中的目录,以便在重启服务时保留数据库数据。volumes
db
docker-compose.yml
db-volume
/var/lib/postgresql/data
db
以下是文件中常用的 Docker Compose 选项列表docker-compose.yml
:
选项 | 描述 |
---|---|
build |
关于如何构建图像的配置 |
build.args |
用于指定构建时变量 |
command |
覆盖图像定义的默认 CMDDockerfile |
container_name |
服务容器应使用的名称 |
depends_on |
用于确定容器的启动顺序 |
env_file |
从文件添加环境变量 |
environment |
指定环境变量 |
image |
指定容器要使用的图像 |
networks |
指定容器使用的网络 |
ports |
主机与容器的端口映射 |
volumes |
指定主机和容器之间的命名卷或绑定挂载映射 |
在官方文档中查看所有可能的 Docker Compose 选项。
docker-compose
以下是常用CLI 命令的列表:
命令 | 描述 |
---|---|
docker-compose build |
构建或重建服务的图像 |
docker-compose up |
创建并启动服务容器 |
docker-compose down |
停止容器并删除与服务关联的容器、镜像和网络 |
docker-compose exec |
在容器中执行命令 |
docker-compose images |
列出与服务关联的图像 |
docker-compose kill |
杀死容器 |
docker-compose logs |
查看服务日志 |
docker-compose ps |
列出所有服务容器及其状态 |
docker-compose pull |
拉取服务镜像 |
docker-compose push |
推送服务镜像 |
docker-compose rm |
删除已停止的容器 |
docker-compose run |
在服务中运行单个命令 |
docker-compose start |
启动服务 |
docker-compose stop |
停止服务 |
docker-compose
使用docker-compose help
或查看官方文档中的所有命令。
docker-compose
按照本指南操作,可以实现命令行补全。它有助于快速输入命令并避免拼写错误。
相关资源
- Docker 文档中的Docker Compose 文件参考
- Docker 文档中的Docker Compose CLI 参考
管理环境变量
由于 Docker 中环境变量的工作原理并不直观,因此值得另起一节来探讨。我们所说的环境变量是指 Docker 容器中任何 shell 进程均可全局访问的变量,并且可以使用env
或printenv
shell 命令列出这些变量。
要验证 Docker 容器的 shell 中是否设置了环境变量,最方便的方法是运行打开一个交互式 shell,其中可以使用或docker-compose exec container-name sh
列出所有环境变量。env
printenv
设置环境变量的第一种方法是Dockerfile
使用ENV
指令。
ENV <key>=<value> ...
ENV TEST="value"
使用指令设置的变量不仅可以ENV
作为 Docker 容器中的环境变量,还可以通过在Dockerfile
变量名称前加上前缀,在其他指令中使用$
。
设置环境变量的下一种方法是通过docker run
使用-e
(--env
)选项的命令。
docker run -d -e TEST="value" my-app:1.0
环境变量也可以通过 Docker Compose 设置,并且有一个很棒的指南介绍了所有不同的设置方法。总结一下链接的指南,可以docker-compose.yml
使用environment
选项为 Docker Compose 文件中的每项服务设置环境变量。
services:
web-app:
environment:
- TEST="value"
CLIdocker-compose
还会自动加载.env
Docker Compose 选项所指定目录中文件的环境变量build
。但是,如果环境变量文件的名称不是.env
,则应使用--env-file
CLI 选项或文件env_file
中的 选项来指定文件名docker-compose.yml
。
docker-compose --env-file .env.dev up
services:
web-app:
env_file: .env.dev
如果使用该docker-compose run
命令,请使用该选项传递环境变量-e
。
docker-compose run -e TEST="value" web-app echo "Hello world"
相关资源
- Docker 文档中的“Docker Compose 中的环境变量”
ENV
Dockerfile
Docker 文档中的说明- Digital Ocean 环境变量教程
部署和运行 Docker 应用程序
市面上有很多工具,旨在简化将 Docker 化应用程序部署到服务器上并使其向公众开放的管理。选择哪种工具部署 Docker 化应用程序取决于应用程序的规模、所需的控制能力、可接受的管理复杂度以及预算。本指南将列出三种部署 Docker 化应用程序的可行方法。
多库
适合对象:业余项目和早期创业公司
对于低成本、无需考虑可扩展性且只需少量手动服务器配置即可的解决方案,Dokku是一个不错的选择。Dokku 的工作方式是将其安装在云服务器(例如Digital Ocean或Linode)上,然后配置为运行 Docker 应用程序。基本步骤如下:
- 在服务器上安装 Dokku(Digital Ocean 已在某些服务器上预装了 Dokku)
- 通过 SSH 进入服务器并下载应用程序的镜像
- 在 Dokku 中创建一个将使用一个图像的“应用程序”(创建多个应用程序以在单个服务器上运行多个容器)
- 使用域名、SSL、数据库等配置 Dokku。
- 使用 Dokku 运行应用程序
- 通过拉取新镜像并运行 Dokku 命令来更新应用程序(请参阅此代码,了解在 CI 中使用 GitHub 操作完成此操作的示例)
要获得有关如何执行此操作的更详细的分步概述,请参阅Dokku 文档或有关使用 Digital Ocean设置 Dokku 的这篇文章
如果预算是一个问题并且需要高水平的控制,那么 Dokku 是一个不错的选择,但是,这并不是像使用 Heroku 或 Digital Ocean App Platform 那样简单的解决方案。
相关资源
Heroku 和 Digital Ocean 应用平台
适合:中小型初创企业/公司
Heroku和Digital Ocean 应用平台是处理在服务器上设置和部署应用程序的大量复杂性的解决方案,同时还能自动动态扩展应用程序。这两个平台都允许在 Docker 容器中部署应用程序,并可轻松设置域、SSL 和数据库。由于 Heroku 和 Digital Ocean 应用平台负责实现部分配置,因此在更高级的服务器设置中可能会遇到一些限制。
相关资源
Kubernetes
适合:中大型初创企业/规模较大的公司
在部署 Docker 化应用程序领域,Kubernetes 或许是最流行的名称,它可以被称为“容器编排系统”,负责部署、扩展和管理 Docker 化应用程序。Kubernetes 可以通过添加更多服务器/虚拟机来自动扩展应用程序,并在这些服务器之间分配流量。三大云提供商(亚马逊、微软、谷歌)都提供了与 Kubernetes 集成的产品:
- 亚马逊弹性 Kubernetes 服务 (EKS) ( https://aws.amazon.com/eks/ )
- Azure Kubernetes 服务 (AKS)(https://azure.microsoft.com/en-us/services/kubernetes-service/)
- Google 容器引擎 (GKE)(https://cloud.google.com/kubernetes-engine)
上述产品被称为“托管 Kubernetes”服务,因为每个云提供商都管理 Kubernetes 问题的某些部分,例如在 AWS、Microsoft 或 Google 特定基础架构上创建 Kubernetes 集群。
Kubernetes 非常适合大规模和复杂的应用程序,但小型应用程序应尽量避免使用 Kubernetes,因为它配置繁琐,复杂度较高。除非用户对服务器和部署相关知识有深入的了解,否则 Kubernetes 的学习曲线会非常陡峭,无法占用大量时间,而这些时间本可以更好地用于应用程序开发。Kubernetes 本身有很多工具(例如Helm和kubectl),需要花费大量时间学习和熟练使用。
关于是否应该使用 Kubernetes 的详细信息,我推荐阅读这篇文章“ “让我们使用 Kubernetes!”现在你有 8 个问题”。不要等到扩展问题真正成为问题时才开始着手解决。当问题真正成为问题时,这里有一篇关于如何将应用程序从 1 个用户扩展到 10 万个用户的好文章。
相关资源
避免使用 Docker 命令行
可以理解,有些人不太喜欢在命令行中工作。不过,幸运的是,有一些很棒的选项可以将图形用户界面 (GUI) 与 Docker 结合使用。
Docker 桌面
Docker Desktop附带一个 GUI,可与 Docker Engine 交互以执行一些与 Docker 相关的任务,例如停止容器、删除容器以及在容器内打开 shell。
Visual Studio 代码
VS Code是最流行的文本编辑器之一(尤其是在 JavaScript 开发人员中),它有一个很棒的Docker 扩展,可以完成许多与 Docker 相关的任务,而无需离开编辑器。
除了能够查看 Docker 镜像、容器、网络和卷之外,Dockerfile
s 和 Docker Compose 配置文件中还提供了 IntelliSense 自动完成功能。此外,大多数常用的 Docker 命令都可以通过命令面板使用。
相关资源
基座
Dockstation 是一款功能齐全的桌面应用程序,专门用作 Docker GUI。它提供了一种可视化 Docker 相关信息以及执行大多数 Docker 相关任务的好方法。
调试docker化的应用程序
开发人员通常会选择在 Docker 之外本地运行部分应用程序服务,以便能够通过编辑器的调试器运行这些服务,从而获得更好的调试体验。然而,编辑器已经开始添加在正在运行的 Docker 容器内附加调试器的功能,因此无需在 Docker 之外运行服务即可利用编辑器的调试功能。
Visual Studio 代码
要在 Visual Studio Code 中调试容器化应用,需要Docker 扩展。Docker 扩展目前仅支持在 Docker 容器内调试 Node.js、Python 和 .NET Core 应用程序。
相关资源
JetBrains IDE
JetBrains IDE 有很多,其中大多数都有运行具有调试功能的 dockerized 应用程序的方法。
相关资源
浏览 Docker 文档
Docker 文档网站内容丰富,包括入门指南、发行说明、Docker 产品使用手册等等。因此,您可能不太清楚在哪里可以找到本文中讨论的一些 Docker 相关内容的相关文档。
我在这里要告诉你,你可能需要查看“参考文档”。更具体地说,参考文档页面如下:
- Dockerfile 参考(列出可在 Dockerfile 中使用的所有可用指令)
- Docker Compose 文件参考(列出 Docker Compose 文件中所有可能的配置参数)
- Docker CLI 参考
docker help
(所有 Docker CLI 命令。请注意,在命令行中运行也非常有用) - Docker Compose CLI 参考(所有 docker-compose CLI 命令。
docker-compose help
来自命令行的命令也很有帮助)
其他资源
- “玩转 Docker”是一个在线互动游乐场,您可以在其中尝试在浏览器中运行 Docker 命令
- YouTube 上的 Docker 和 Kubernetes 课程是一门 4 小时以上的课程,讲解了如何使用 Docker 和 Kubernetes
- YouTube - “你需要立即学习 Docker!!//Docker 容器 101”