Docker容器启动命令`docker run`全解析 – wiki词典


Docker容器启动命令docker run全解析

引言

在 Docker 的世界里,docker run 是最核心、最强大的命令之一。无论是初学者还是经验丰富的开发者,每天都会与它打交道。它负责从一个 Docker 镜像(Image)创建一个新的容器(Container),并启动它。理解 docker run 的工作机制和常用选项,是精通 Docker 的关键第一步。

本文将全面、深入地解析 docker run 命令,从基础语法到高级选项,并通过丰富的示例帮助你理解如何在不同场景下使用它。

docker run 的基本工作流程

当你执行 docker run 命令时,Docker 在后台执行了一系列操作:

  1. 检查镜像:Docker 会检查本地是否存在指定的镜像。
  2. 拉取镜像:如果本地不存在该镜像,Docker 会默认从公共的 Docker Hub 仓库(或其他配置的仓库)中拉取(pull)这个镜像。
  3. 创建容器:Docker 使用这个镜像作为模板,创建一个新的容器。这本质上是在镜像的只读层之上添加一个可写的容器层。
  4. 分配资源:Docker 为容器分配文件系统、网络接口,并根据需要设置 IP 地址。
  5. 执行命令:Docker 启动容器,并执行镜像中 Dockerfile 定义的默认命令(CMDENTRYPOINT),或者执行你在 docker run 命令中指定的命令。

基本语法

docker run 的命令格式如下:

bash
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

  • [OPTIONS]:选项,用于配置容器的各种运行参数,如端口映射、后台运行、数据卷挂载等。这是 docker run 最灵活的部分。
  • IMAGE:必需参数,指定创建容器所基于的镜像名称。
  • [:TAG|@DIGEST]:可选参数,用于指定镜像的版本(标签)或摘要。如果省略,默认为 latest
  • [COMMAND]:可选参数,用于覆盖镜像中定义的默认启动命令。
  • [ARG...]:可选参数,传递给 [COMMAND] 的参数。

核心选项 (OPTIONS) 详解

docker run 的选项非常多,下面我们介绍一些最常用也最重要的选项。

1. -d--detach:后台运行

默认情况下,容器在前台运行,你的终端会连接到容器的标准输入、输出和错误流。使用 -d 选项可以让容器在后台(detached mode)运行,并返回容器 ID。

示例:在后台启动一个 Nginx 容器。

bash
docker run -d nginx

2. -it:交互式运行

这两个选项通常一起使用:
-i (--interactive):保持标准输入(STDIN)打开,即使没有附加到它。
-t (--tty):分配一个伪终端(pseudo-TTY)。

当你需要进入容器内部并执行命令时,-it 是必不可少的。

示例:启动一个 Ubuntu 容器并进入其 bash shell。

bash
docker run -it ubuntu bash

执行后,你将直接进入 Ubuntu 容器的命令行界面。输入 exit 即可退出并停止容器。

3. --name:指定容器名称

Docker 会为每个容器生成一个随机的、唯一的名称(如 vigilant_murdock)。使用 --name 可以为容器指定一个易于记忆的自定义名称。

示例:启动一个名为 my-web-server 的 Nginx 容器。

bash
docker run -d --name my-web-server nginx

4. --rm:自动清理

这是一个非常有用的选项。它会在容器停止后自动删除容器文件系统。这对于运行一次性任务或测试非常方便,可以避免产生大量无用的、已停止的容器。

示例:运行一个打印 “Hello World” 的临时容器,运行结束后自动删除。

bash
docker run --rm ubuntu echo "Hello World"

5. -p--publish:端口映射

这个选项用于将宿主机(Host)的端口映射到容器的端口,从而让外部可以访问容器内运行的服务。

格式为:-p <HOST_PORT>:<CONTAINER_PORT>

示例:启动一个 Nginx 容器,并将宿主机的 8080 端口映射到容器的 80 端口。

bash
docker run -d --name my-nginx -p 8080:80 nginx

现在,你可以通过访问 http://<你的宿主机IP>:8080 来访问 Nginx 的欢迎页面。

6. -v--volume:数据卷挂载

容器默认是无状态的,容器删除后,其内部的数据也会丢失。为了实现数据持久化,我们需要使用数据卷(Volume)或绑定挂载(Bind Mount)。

格式为:-v <HOST_PATH>:<CONTAINER_PATH>

示例:启动一个 MySQL 容器,并将宿主机的 /my/own/datadir 目录挂载到容器的 /var/lib/mysql 目录,以持久化数据库文件。

bash
docker run -d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /my/own/datadir:/var/lib/mysql \
--name my-mysql \
mysql:8.0

注意HOST_PATH 必须是绝对路径。

7. -e--env:设置环境变量

许多 Docker 镜像允许通过环境变量来配置其行为。-e 选项用于在容器内设置环境变量。

格式为:-e <KEY>=<VALUE>

示例:启动一个 PostgreSQL 容器,并通过环境变量设置默认用户名和密码。

bash
docker run -d -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword postgres

8. --network:连接到网络

Docker 允许你创建自定义的桥接网络,以便容器之间可以通过容器名称进行通信。--network 选项可以将容器连接到指定的网络。

示例
1. 创建一个名为 my-net 的网络:
bash
docker network create my-net

2. 将一个应用容器和一个数据库容器连接到同一个网络:
bash
docker run -d --network my-net --name my-db redis
docker run -d --network my-net --name my-app my-app-image

现在,my-app 容器可以直接通过主机名 my-db 来访问 Redis 服务。

9. --restart:重启策略

这个选项定义了当容器退出时 Docker 应采取的行动。这对于需要保证高可用的服务非常重要。

常用策略:
no:默认策略,不自动重启。
on-failure[:max-retries]:仅当容器以非零状态退出时才重启,可以指定最大重试次数。
unless-stopped:除非容器被手动停止(docker stop),否则总是重启。
always:无论退出状态如何,总是重启。

示例:让一个 Nginx 容器总是在退出后自动重启。

bash
docker run -d --restart always --name always-running-nginx nginx


覆盖默认命令

如前所述,你可以在镜像名称之后添加自定义命令来覆盖 Dockerfile 中的默认 CMD

示例:在一个 alpine 镜像的容器中执行 ping google.com 命令。

bash
docker run --rm alpine ping google.com

这个容器会一直运行 ping 命令,直到你手动停止它(Ctrl+Cdocker stop)。由于设置了 --rm,容器停止后会被自动删除。

综合示例:部署一个完整的 Web 应用栈

让我们结合以上多个选项,模拟部署一个简单的 WordPress 网站。这需要一个 WordPress 容器和一个 MySQL 数据库容器。

  1. 创建网络
    bash
    docker network create wordpress-net

  2. 启动 MySQL 数据库容器
    bash
    docker run -d \
    --network wordpress-net \
    --name wordpress-db \
    -v wordpress_db_data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=somewordpress \
    -e MYSQL_DATABASE=wordpress \
    mysql:5.7

    • --network: 连接到 wordpress-net 网络。
    • --name: 命名为 wordpress-db
    • -v: 创建一个名为 wordpress_db_data 的命名卷来持久化数据。
    • -e: 设置数据库相关的环境变量。
  3. 启动 WordPress 应用容器
    bash
    docker run -d \
    --network wordpress-net \
    -p 8080:80 \
    --name wordpress-app \
    -e WORDPRESS_DB_HOST=wordpress-db:3306 \
    -e WORDPRESS_DB_PASSWORD=somewordpress \
    wordpress

    • --network: 连接到同一个网络。
    • -p: 将宿主机的 8080 端口映射到容器的 80 端口。
    • --name: 命名为 wordpress-app
    • -e: 配置 WordPress 连接数据库所需的环境变量,其中 WORDPRESS_DB_HOST 直接使用了数据库容器的名称 wordpress-db

现在,打开浏览器访问 http://localhost:8080,你就可以看到 WordPress 的安装界面了。

结论

docker run 是 Docker 工具箱中最基本也是最强大的命令。通过组合使用其丰富的选项,你可以精确地控制容器的创建、网络、存储和生命周期。

掌握 docker run 不仅意味着能够启动和停止容器,更意味着理解了容器化应用部署的核心理念。希望这篇详细的解析能帮助你更好地驾驭 Docker,并将其应用到你的开发和运维工作中。

滚动至顶部