容器创建与启动

 Docker   打工人   2024-11-17 15:46   24
  Docker

Docker 是当前最流行的容器化平台之一,它通过将应用及其依赖打包成独立的容器,极大地提高了应用的可移植性和一致性。在 Docker 中,容器是通过执行 docker run 命令来创建和启动的,docker run 是 Docker 最常用的命令之一,它能够帮助我们启动新的容器实例并定义容器的各种配置选项。

本文将详细解析 docker run 命令的基本用法,并讲解容器创建与启动过程中常用的选项,如端口映射、环境变量、资源限制等。通过实际的代码示例,我们将更好地理解这些选项的使用场景。


一、docker run 命令概述

docker run 是 Docker 中最基本的命令之一,用于创建和启动容器。基本语法如下:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • OPTIONS:启动容器时使用的各种配置选项(如端口映射、环境变量等)。
  • IMAGE:要运行的镜像,可以是本地已有的镜像或从 Docker Hub 拉取的镜像。
  • COMMANDARG...:容器启动时执行的命令及其参数(可选)。

通过 docker run 命令,您不仅可以创建并启动容器,还可以配置容器的环境、网络、存储等各种参数。


二、docker run 常用选项

2.1 端口映射(-p

容器通常在其内部网络中运行,默认情况下,容器的端口无法直接从主机访问。为了让外界能够访问容器的服务,我们需要通过端口映射将容器的端口与主机的端口进行绑定。使用 -p 选项可以实现端口映射。

语法

docker run -p <host_port>:<container_port> <image_name>
  • host_port:主机上的端口。
  • container_port:容器内的端口。

示例

docker run -p 8080:80 nginx

上述命令会启动一个 Nginx 容器,并将容器的 80 端口映射到主机的 8080 端口。此时,访问 http://localhost:8080 就可以访问容器内运行的 Nginx 服务。

如果需要将多个端口映射到主机,可以使用多个 -p 选项:

docker run -p 8080:80 -p 443:443 nginx

2.2 环境变量(-e

容器中的应用程序通常需要某些环境变量来配置运行时参数。通过 -e 选项,我们可以在运行容器时设置环境变量。

语法

docker run -e <env_var_name>=<env_var_value> <image_name>

示例

docker run -e MY_ENV_VAR=value nginx

在上述命令中,MY_ENV_VAR 被设置为 value,该环境变量将在容器内的 Nginx 服务中生效。

环境变量也可以通过 .env 文件来批量传递:

docker run --env-file ./env.list nginx

env.list 文件内容:

MY_ENV_VAR=value
ANOTHER_VAR=another_value

2.3 资源限制(--memory--cpus

Docker 允许为容器分配特定的资源(如内存、CPU),以确保容器不会消耗过多的系统资源。使用 --memory--cpus 选项可以限制容器使用的内存和 CPU。

语法

docker run --memory=<memory_limit> --cpus=<cpu_limit> <image_name>

示例

docker run --memory=512m --cpus=1 nginx

上述命令限制容器使用最多 512MB 内存和 1 个 CPU 核心。

如果不设置这些限制,容器将使用主机所有可用的资源,这可能会导致资源争用和性能问题。


2.4 容器自启动(--restart

在某些情况下,我们希望容器在 Docker 守护进程启动时自动重启,或者在容器崩溃时自动重启。--restart 选项可以帮助实现这一功能。

语法

docker run --restart <policy> <image_name>

可用的重启策略:

  • no:不重启容器(默认值)。
  • always:无论容器退出状态如何,都始终重启容器。
  • on-failure:仅在容器非正常退出时重启容器。
  • unless-stopped:类似 always,但如果容器被手动停止,则不再重启。

示例

docker run --restart always nginx

上述命令将在容器退出时自动重启 Nginx 服务。


2.5 后台运行(-d

容器通常是在交互式模式下启动的,这意味着命令行会被容器占用。然而,在大多数情况下,我们希望容器在后台运行,这样就可以继续执行其他命令。

使用 -d 选项可以让容器在后台运行,并返回容器的 ID。

示例

docker run -d nginx

此命令将启动 Nginx 容器并将其放入后台,您可以使用 docker ps 查看正在运行的容器。


2.6 映射宿主机目录到容器(-v

容器的数据存储是临时的,当容器删除时,所有数据都会丢失。为了持久化数据,Docker 提供了卷(Volumes)和绑定挂载(Bind Mounts)。使用 -v 选项,可以将宿主机的目录挂载到容器中。

语法

docker run -v <host_dir>:<container_dir> <image_name>

示例

docker run -v /host/data:/container/data nginx

这将把宿主机的 /host/data 目录挂载到容器内的 /container/data 目录。这样,即使容器删除,数据依然保存在宿主机上。


三、容器创建与启动的综合示例

假设我们有一个 Node.js 应用,它需要连接到一个 MongoDB 数据库。我们希望启动两个容器,一个容器运行 Node.js 应用,另一个容器运行 MongoDB 数据库,且它们通过网络互通。

示例

# 启动 MongoDB 容器
docker run -d --name mongodb -p 27017:27017 mongo

# 启动 Node.js 容器,连接到 MongoDB
docker run -d --name node-app -p 8080:8080 --link mongodb:mongodb -e DB_HOST=mongodb node-app
  • 第一个命令启动 MongoDB 容器,并将 MongoDB 的端口 27017 映射到主机的 27017 端口。
  • 第二个命令启动 Node.js 应用容器,--link 选项让 Node.js 容器能够通过 mongodb 访问 MongoDB 容器,同时设置了环境变量 DB_HOST

在此示例中,容器之间通过 Docker 的网络链接进行通信,Node.js 应用可以通过 mongodb 主机名访问 MongoDB 服务。


四、总结

通过本文的学习,我们深入了解了 Docker 容器的创建与启动过程,特别是 docker run 命令的各种常用选项。无论是端口映射、环境变量、资源限制,还是后台运行、容器自启动、数据挂载,这些选项在实际使用中都非常有用,能够帮助我们灵活地配置和管理 Docker 容器。

掌握这些容器创建与启动的技巧,不仅可以提高容器化应用的部署效率,还能优化容器的性能和资源使用,提升系统的稳定性。