Docker run 命令用法实例
docker run
命令从给定的镜像创建容器,并使用给定命令启动容器。这是开始使用 Docker 时应该账务的第一批命令之一。
在本文中,我们将使用官方的 Nginx 镜像来展示运行 Docker 容器的各种方法。
Docker运行命令
docker run
命令采用以下形式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run
命令唯一需要的参数是从中创建容器的镜像的名称。如果本地系统上不存在该镜像,则将其从镜像仓库中拉出。
如果未指定命令,则在运行容器时将执行 Dockerfile 文件中指定的 CMD
或 ENTRYPOINT
指令。
从版本 1.13 开始, Docker CLI 已经进行了重组,并且所有命令都被分组在与之交互的对象下。
由于该 run
命令与容器交互,因此它是 docker container
的子命令。新命令的语法如下:
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
现在仍支持旧的 1.13 之前的语法。但事实上, docker run
命令是 docker container run
命令的别名。鼓励用户使用新的命令语法。
可以在 Docker 文档页面上找到 docker container run
的所有选项的列表。
在前台运行容器
默认情况下,如果没有为 docker run
命令提供任何选项,则根进程将在前台启动。这意味着来自根进程的标准输入,输出和错误将附加到终端会话。
docker container run nginx
Nginx 进程的输出将显示在您的终端上。由于没有与 Web 服务器的连接,因此终端为空。
要停止容器,请按终止正在运行的 Nginx 进程 CTRL+C
。
以分离模式运行容器
要在退出终端会话时保持容器运行,请以分离模式启动它。这类似于在后台运行 Linux 进程。
使用该 -d
选项启动分离的容器:
docker container run -d nginx
050e72d8567a3ec1e66370350b0069ab5219614f9701f63fcf02e8c8689f04fa
当根进程终止时,分离的容器将停止。
您可以使用 docker container ls
命令列出正在运行的容器。
要将终端附加到分离的容器根进程,请使用 docker container attach
命令。
退出后删除容器
默认情况下,当容器退出时,其文件系统将保留在主机系统上。
--rm
选项告诉 docker run
命令在容器自动退出时将其删除:
docker container run --rm nginx
Nginx 镜像可能不是在容器退出后清理容器的文件系统的最佳示例。此选项通常用于执行短期任务(例如测试或数据库备份)的前台容器。
设置容器名称
在 Docker 中,每个容器均由 UUID
和名称标识。默认情况下,如果未显式设置,则容器名称由 Docker 守护程序自动生成。
使用 --name
选项将自定义名称分配给容器:
docker container run -d --name my_nginx nginx
容器名称必须唯一。如果您尝试使用相同的名称启动另一个容器,则会收到类似于以下的错误:
docker: Error response from daemon: Conflict. The container name "/my_nginx" is already in use by container "9...c". You have to remove (or rename) that container to be able to reuse that name.
运行 docker container ls -a
以列出所有容器,并查看其名称:
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d695c1f5ef4 nginx "nginx -g 'daemon of…" 36 seconds ago Up 35 seconds 80/tcp my_nginx
有意义的名称对于在 Docker 网络中或运行 Docker CLI 命令时引用容器很有用。
发布端口
默认情况下,如果未发布任何端口,则只能从容器内部访问容器中运行的进程。
发布端口意味着将容器端口映射到主机端口,以便这些端口可用于 Docker 外部的服务。
要发布端口,请使用以下 -p
选项:
-p host_ip:host_port:container_port/protocol
- 如果未
host_ip
指定,则默认为0.0.0.0
。 - 如果未
protocol
指定,则默认为 TCP 。 - 要发布多个端口,请使用多个
-p
选项。
比如,要将容器中的 TCP 端口 80(nginx) 映射到主机 localhost 接口上的端口 8080 ,请运行:
docker container run --name web_server -d -p 8080:80 nginx
您可以通过 http://localhost:8080
在浏览器中打开或 curl
在 Docker 主机上运行以下命令来验证端口是否已发布:
curl -I http://localhost:8080
输出将如下所示:
HTTP/1.1 200 OK
Server: nginx/1.17.6
Date: Tue, 26 Nov 2019 22:55:59 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT
Connection: keep-alive
ETag: "5dd3e500-264"
Accept-Ranges: bytes
共享数据(安装数据卷)
停止容器时,将删除该容器生成的所有数据。 Docker Volumes 是使数据持久保存并在多个容器之间共享的首选方法。
要创建和管理卷,请使用以下 -p
选项:
-v host_src:container_dest:options
- 该
host_src
可以是主机或命名卷上的文件或目录的绝对路径。 - 该
container_dest
是到容器上的一个文件或目录的绝对路径。 - 选项可以是
rw
(读写)和ro
(只读)。如果未指定任何选项,则默认为rw
。
为了解释它是如何工作的,让我们在主机上创建一个目录并 在其中放置一个文件 index.html
:
mkdir public_html
echo "Testing Docker Volumes" > public_html/index.html
接下来,将 public_html
目录挂载到 /usr/share/nginx/html
容器中:
docker run --name web_server -d -p 8080:80 -v $(pwd)/public_html:/usr/share/nginx/html nginx
我们没有指定 public_html
目录的绝对路径,而是使用 $(pwd)
命令,该命令将打印当前工作目录。
现在,如果您输入 http://localhost:8080
浏览器,您应该会看到 index.html
文件的内容。您也可以使用 curl
:
curl http://localhost:8080
Testing Docker Volumes
交互式运行容器
当处理诸如的交互式过程时比如 bash
,请使用 -i
和 -t
选项启动容器。
这些 -it
选项告诉 Docker 将标准输入保留在终端上并分配一个伪 tty :
docker container run -it nginx /bin/bash
容器的 Bash shell 将附加到终端,命令提示符将更改:
现在,您可以与容器的外壳进行交互并在其中运行任何命令。
在此示例中,我们提供了命令 (/bin/bash
) 作为 docker run
已执行命令的参数,而不是 Dockerfile 中指定的命令。
结论
Docker 是打包和部署应用程序的标准,并且是 CI/CD ,自动化和 DevOps 的重要组成部分。
该 docker container run
命令用于创建和运行 Docker 容器。