Docker容器操作命令汇总笔记

1.Docker容器

Docker 是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后在任何支持Docker的系统上运行。容器类似于虚拟机,但它们更轻量、启动更快,并且占用更少的系统资源。

Docker容器的关键优势包括:

  • 环境一致性:容器打包了应用及其运行环境,确保应用在不同环境间无缝迁移,解决了“在我机器上可以运行”的问题。

  • 敏捷开发:容器化的应用可以快速启动和停止,加速开发和测试流程。

  • 隔离性:每个容器都是相互隔离的,运行在自己的环境中,互不干扰。

  • 可移植性:容器可以在多种环境中运行,包括物理机、虚拟机、数据中心和云平台。

  • 微服务架构:Docker容器非常适合微服务架构,每个微服务都可以独立打包和扩展。

  • 资源利用:容器共享宿主机的内核,不需要虚拟机那样的额外资源开销,提高了系统资源的利用率。

  • 持续集成/持续部署(CI/CD):容器的快速启动特性,使得它们成为实现CI/CD流程的理想选择。

Docker容器通过Docker Engine进行管理,包括创建、运行、停止、删除等操作。用户可以通过Docker客户端命令行工具与Docker Engine交互,或者使用Docker Compose来定义和运行多容器应用。

总的来说,Docker容器为应用开发和部署提供了一种灵活、高效、可扩展的解决方案。

2.创建和启动容器

2.1 docker create

功能:用于创建一个新的容器,但它不会启动容器。这个命令允许你预先设置容器的配置,例如网络设置、数据卷、环境变量等,而不需要在容器启动时指定这些配置

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

参数说明:

  • OPTIONS:创建容器时的各种选项,例如网络设置、数据卷、环境变量等。
  • IMAGE:指定要创建容器的基础镜像。
  • COMMAND:在容器启动时运行的命令。
  • ARG:传递给命令的参数。

OPTIONS说明:

--name="CONTAINER_NAME":为容器指定一个名称。
-d, --detach:后台运行容器。
--interactive,-i:保持容器的标准输入(STDIN)打开,即使不附加到容器终端。
--tty,-t:分配一个伪终端。
--env,-e:设置环境变量。
--volume,-v:绑定挂载一个卷。
--network:设置容器的网络连接。
--cpu-shares:设置容器的CPU共享权重。
--memory:设置容器可以使用的内存量。

示例:

# 创建一个名为 myubuntu 的容器,基于ubuntu镜像,但不启动它
docker create --name myubuntu ubuntu

# 创建一个后台运行的容器,名为 mynginx,使用 nginx 镜像,并暴露端口 80
docker create --name mynginx -d -p 80:80 nginx

# 创建一个具有环境变量的容器
docker create --name my_mysql -e "ENV_VAR=value" mysql

# 创建一个容器并挂载一个卷
docker create --name my_mysql -v /path/data:/container/data mysql

使用 docker create 创建的容器不会自动启动,需要使用 docker start 命令来启动它。这个命令通常用于脚本或自动化工具中,其中容器的创建和启动需要分开处理


2.2 docker run

功能:用于创建一个新的容器并启动它。这个命令非常灵活,支持多种参数来定制容器的运行环境。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

参数说明:

  • OPTIONS:创建容器时的各种选项,例如网络设置、数据卷、环境变量等。
  • IMAGE:指定要创建容器的基础镜像。
  • COMMAND:在容器启动时运行的命令(如果镜像预设了默认命令,则可以覆盖它)。
  • ARG:传递给命令的参数。

OPTIONS说明:

-d, --detach:后台运行容器,并打印容器ID。
--name:为容器指定一个名称。
-e, --env:设置环境变量。
--env-file:从文件中读取环境变量。
-P, --publish-all:将容器内部暴露的所有端口映射到宿主机的随机端口上。
-p, --publish:将容器的端口映射到宿主机的指定端口。
-v, --volume:绑定挂载一个卷。
--network:设置容器的网络连接。
--cpu-shares:设置容器的CPU共享权重。
--memory:设置容器可以使用的内存量。
--rm:容器退出时自动清理容器文件系统。
-it 或 -i:分配一个伪终端并保持 STDIN 打开,通常与 --detach 一起使用。

示例:

# 运行一个名为 my_ubuntu  的容器,使用 ubuntu 镜像,并执行 /bin/bash 命令
docker run --name my_ubuntu  -it ubuntu /bin/bash

# 后台运行一个名为 my_nginx  的容器,使用 nginx 镜像,并映射端口 80:
docker run --name my_nginx  -d -p 80:80 nginx

# 运行一个容器并设置环境变量
docker run -e "ENV_VAR=value" mysql

# 运行一个容器并挂载一个卷
docker run -v /path/data:/container/data mysql

# 运行一个容器并自动清理容器文件系统
docker run --rm redis

docker run 命令结合了 docker create 和 docker start 的功能,它首先创建一个新的容器,然后立即启动它。这个命令非常适合快速启动和管理容器。

3.运行中的容器

3.1 docker start

功能:用于启动一个或多个已经创建但处于停止状态的容器。如果已经使用 docker run 命令创建了一个容器,并且它已经停止,可以使用这个命令来重新启动它。

docker start CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:指定要启动的容器的名称或ID。

示例:

# 启动一个名为 my_redis 的容器
docker start my_redis 

# 同时启动多个容器
docker start my_redis my_mysql my_nginx 

# 使用容器ID来启动容器
docker start 容器ID

# 启动所有当前处于停止状态的容器
docker start $(docker ps -aq)

容器必须已经存在且处于停止状态才能被启动。
如果容器正在运行,docker start 命令将不会对它产生任何效果。
容器在启动时不会重新初始化,它将从之前停止的点继续执行。
如果容器在停止之前正在监听某些端口,那么在容器启动后这些端口将再次被监听。
容器的网络设置在启动时不会改变,即使在停止期间对网络进行了更改。


3.2 docker stop

功能:用于停止一个或多个正在运行的容器。该命令通过发送 SIGTERM 信号给容器,请求容器主进程优雅地停止。如果容器在一定时间内没有停止(默认是 10 秒),Docker 会发送 SIGKILL 信号来强制停止容器。

docker stop [OPTIONS] CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:指定要停止的容器的名称或ID

OPTIONS说明:

-t, --timeout:指定在发送 SIGKILL 信号之前等待容器停止的时间(单位为秒)。

示例:

# 停止一个名为 my_redis 的容器
docker stop my_redis 


# 同时停止多个容器
docker stop my_redis my_mysql

# 使用容器ID来停止容器
docker stop 容器ID


# 停止所有当前正在运行的容器
docker stop $(docker ps -q)

容器在停止后,仍然存在于 Docker 主机上,并且可以被重新启动或删除。停止容器不会影响容器的持久化数据,如绑定挂载的卷。如果容器内有进程无法响应 SIGTERM 信号,容器可能需要更长时间来停止。在容器停止后,你可以使用 docker start 命令来重新启动它。如果需要强制停止容器,可以不指定超时时间或将超时时间设置为 0。


3.3 docker restart

功能:命令用于重启一个或多个正在运行的容器。这个命令首先会停止容器,然后重新启动它。重启容器时,Docker 会发送 SIGTERM 信号给容器的主进程,请求其优雅地关闭,随后容器会重新启动。如果容器在指定的超时时间内没有停止,Docker 会发送 SIGKILL 信号来强制停止容器。

docker restart [OPTIONS] CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:指定要重启的容器的名称或ID

OPTIONS说明

-t, --timeout:指定在发送 SIGKILL 信号之前等待容器停止的时间(单位为秒)。

示例:

# 重启一个名为 my_redis的容器
docker restart my_redis

# 同时重启多个容器
docker restart my_redis my_mysql

# 使用容器ID来重启容器
docker restart 容器ID 

# 重启所有当前正在运行的容器
docker restart $(docker ps -q)

# 设置超时时间为10秒来重启容器
docker restart --timeout=10 my_redis

容器在重启后,其内部状态可能会根据容器的设计而有所不同。一些容器可能会恢复到之前的状态,而另一些则可能需要从头开始初始化。重启容器不会影响容器的持久化数据,如绑定挂载的卷。如果容器内有进程无法响应 SIGTERM 信号,容器可能需要更长时间来停止,此时可以指定更长的超时时间。在容器重启过程中,如果需要查看容器的日志,可以使用 docker logs 命令。
docker restart 命令不会删除容器,容器的ID保持不变。

4.查看容器

4.1 docker ps

功能:列出当前所有正在运行的容器。

docker ps [OPTIONS]

OPTIONS说明:

-a, --all:显示所有容器(默认仅显示正在运行的容器)。
-q, --quiet:仅显示容器的数字ID。
-n=INTEGER:仅显示最新创建的容器(默认为所有容器)。
--since=CONTAINER:仅显示创建时间在指定容器之后的容器。
--tail=ALL:显示容器的日志的完整输出(默认显示最后的几条日志)。
--no-trunc:显示完整的容器信息(默认信息会被截断)。
-l, --latest:仅显示最近创建的容器(仅在没有指定 -a 或 --all 时有效)。

示例:

# 列出所有正在运行的容器
docker ps

# 列出所有容器,包括未运行的
docker ps -a

# 仅显示容器的数字ID
docker ps -q

# 显示最近创建的容器的完整信息
docker ps -l --no-trunc

# 显示最近创建的容器的日志的最后几条输出
docker ps -l --tail=5

# 显示创建时间在特定容器之后的容器
docker ps --since=container_id_or_name

5.进入容器

5.1 docker exec

功能:在运行中的容器内执行命令,通常是用于交互式 shell 访问。方便我们进入容器内部进行故障排查、管理或任何需要直接访问容器环境的操作

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

参数说明:

  • OPTIONS:可选参数,用于配置执行命令的环境。
  • CONTAINER:要在其内部执行命令的容器的名称或ID。
  • COMMAND:要在容器内执行的命令。
  • ARG...:传递给命令的参数。

OPTIONS说明:

-it:分配一个伪终端,并保持 STDIN 打开,即使不附加到容器终端。
-d:在后台运行命令。
--user 或 -u:以指定的用户身份执行命令。
--env 或 -e:设置环境变量。
--workdir 或 -w:设置容器内命令的工作目录。

示例:

# 在名为 my_redis 的容器内执行 /bin/bash 并分配一个交互式终端
docker exec -it my_redis /bin/bash

# 在容器内执行 ls -l 命令,列出当前目录的内容
docker exec my_redis ls -l

# 在容器内执行 top 命令,实时查看容器内部的进程信息
docker exec -it my_redis top


# 以特定用户身份在容器内执行命令,例如以 root 用户身份
docker exec -u root -it my_redis /bin/bash

# 设置环境变量 MY_ENV_VAR 为 value 后执行命令
docker exec -e MY_ENV_VAR=value my_redis echo $MY_ENV_VAR

# 在容器的特定工作目录下执行命令,例如 /usr/src/local
docker exec -w /usr/src/local my_redis ls


5.2 docker attach 

功能:附加到一个正在运行的容器的标准输入、输出和标准错误上

docker attach [OPTIONS] CONTAINER

参数说明:

  • OPTIONS:可选参数。
  • CONTAINER:要附加的容器的名称或ID。

OPTIONS说明:

--no-stdin:不挂载 STDIN,可以与 --detach-keys 选项一起使用来分离容器。
--detach-keys:定义容器分离的键,格式为 ctrl-a,ctrl-w,默认是 ctrl-p,ctrl-q。

示例:

# 附加到名为 my_redis 的容器
docker attach my_redis 

# 使用自定义的分离键 ctrl-a,ctrl-w 附加到容器
docker attach --detach-keys="ctrl-a,ctrl-w" my_redis 

# 附加到容器但不允许输入
docker attach --no-stdin my_redis 
  • 如果容器是通过 docker run -d 在后台运行的,那么 docker attach 将允许你连接到容器的 STDIN,并且可以与其交互。
  • 如果容器没有运行前台进程(例如,没有运行 shell 或者前台进程已经退出),docker attach 将不会工作,因为没有什么可以交互的。
  • 当你使用 docker attach 连接到容器时,容器的 STDOUT 和 STDERR 将会被你的终端所接收。
  • 你可以通过在容器内按 ctrl-p,ctrl-q(默认的分离键)来从容器中断开连接,而不会停止容器。
  • docker attach 只能附加到一个正在运行的容器。如果容器停止或不存在,docker attach 命令将失败。

6.查看容器日志与端口

6.1 docker logs

功能:Docker info 命令在 Docker 中用于显示有关当前 Docker 宿主机的环境和配置的信息。这个命令提供了大量的细节,包括 Docker 版本、操作系统、内核版本、驱动程序、容器、镜像和存储卷的数量,以及更多关于 Docker 守护进程状态的信息。docker info 是一个非常有用的命令,可以提供关于 Docker 宿主机的全面信息,有助于日常管理和故障排查。
 

docker logs [OPTIONS] CONTAINER


参数说明:

  • CONTAINER:容器的 ID 或名称。

OPTIONS说明:

-f, --follow:跟踪日志输出,类似于 tail -f。
-t, --timestamps:在日志中显示时间戳。
--tail:仅显示最新的 N 条日志(例如 --tail="all" 显示所有日志)。


 示例:

# 查看容器日志
docker logs container_id
 
# 查看带有时间戳的容器日志
docker logs -t container_id
 
# 实时跟踪容器日志
docker logs -f container_id
 
# 查看容器的最后几条日志
docker logs --tail=5 container_id
 
# 查看从特定时间点开始的日志
docker logs --since="2021-03-15T12:00:00" container_id

6.2 docker port

功能:列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口

docker port CONTAINER

参数说明:

  • CONTAINER:要查看端口映射的容器的名称或ID

示例:

# 查看名为 my_redis 的容器的端口映射
docker port my_redis 

# 指定协议和端口号
docker port my_redis 80/tcp
  • 端口映射是在 docker run 命令中通过 -p 参数指定的。
  • 如果容器没有映射任何端口,docker port 命令将不会显示任何输出。
  • 宿主机上的端口号是由 Docker 在容器启动时自动分配的,除非在 docker run 命令中明确指定了端口号。
  • 可以通过 docker ps 命令查看所有容器的端口映射情况,但 docker port 命令可以针对特定容器进行查询。

6.3 docker top

功能:查看容器中运行的进程信息,支持 ps 命令参数

docker top CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:要查看进程的容器的名称或ID

OPTIONS说明:

-n=INTEGER:显示最近启动的 N 个进程。
--no-trunc:不截断输出。

示例:

# 查看名为 my_redis 的容器内运行的进程
docker top my_redis 

# 查看多个容器内运行的进程
docker top my_redis my_mysql

# 查看容器内最近启动的 3 个进程
docker top -n=3 my_mysql

# 查看容器内所有进程的完整命令行
docker top --no-trunc my_mysql

容器必须处于运行状态才能使用 docker top 命令

7.删除容器

7.1 docker rm

功能:删除一个或多个已经停止的容器。

docker rm [OPTIONS] CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:要删除的容器的名称或ID。

OPTIONS说明:

-f, --force:强制删除一个正在运行的容器。容器将被停止,然后删除。
-v, --volumes:在删除容器时,也删除其关联的卷。
--link:移除链接的容器。

示例:

 

# 删除名为 my_redis 的容器
docker rm my_redis 

# 强制删除名为 my_redis 的正在运行的容器
docker rm -f my_redis 

# 删除容器时,同时删除其关联的卷
docker rm -v my_redis 

# 删除多个容器
docker rm my_redis my_redis1 my_redis2

  • 只有当容器停止后,才能使用 docker rm 删除它们。如果容器正在运行,你需要先使用 docker stop 命令停止容器。
  • 使用 -f 或 --force 选项可以强制删除正在运行的容器,但请谨慎使用,因为这可能导致数据丢失或其他问题。
  • 删除容器时,默认情况下不会删除与容器关联的卷。如果你希望删除容器及其关联的卷,可以使用 -v 或 --volumes 选项。
  • 如果容器与其他容器有链接关系,使用 --link 选项可以移除这些链接。 

7.2 docker kill

功能:用于发送信号到一个或多个容器以强制停止它们的主进程。默认情况下,这个命令会发送 SIGKILL 信号,这相当于在不通知进程的情况下立即终止它。你也可以选择发送其他信号,比如 SIGTERM,它会给进程一个清理和正常退出的机会。

docker kill [OPTIONS] CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:要发送信号的容器的名称或ID。

OPTIONS说明:

-s, --signal="SIGKILL":设置要发送的信号的名称或数字(例如 SIGKILL、SIGTERM、15、9`)。

示例:

# 强制停止名为 my_redis 的容器
docker kill my_redis 

#  向名为 my_container 的容器发送 SIGTERM 信号
docker kill -s SIGTERM my_redis 

# 向多个容器发送 SIGKILL 信号
docker kill my_redis my_redis1 my_redis2
  • 容器必须处于运行状态才能接收到 SIGKILL 或其他信号。
  • SIGTERM 信号允许容器内的进程进行清理操作并优雅地退出,而 SIGKILL 信号则立即终止进程,不给它任何清理的机会。
  • 如果你希望容器内的进程有机会正常关闭,应该发送 SIGTERM 信号而不是 SIGKILL。
  • 在某些情况下,如果容器内的主进程捕获了 SIGTERM 信号并进行了处理,你可能需要发送 SIGKILL 信号来强制停止容器。

8.容器状态和统计信息

8.1 docker stats

功能:用于实时显示 Docker 容器的资源使用情况,包括 CPU、内存、网络 I/O 等。这个命令提供了一个动态的界面,可以帮你监控容器的资源使用情况,对于性能调优和资源管理非常有用

docker stats [OPTIONS]

OPTIONS说明:

--all,-a:显示所有容器的资源使用情况,包括未运行的容器。
--no-stream,--no-streaming:禁用实时流输出,只显示一次当前的资源使用情况。
--no-trunc:不截断输出(例如,显示完整的容器 ID 而不是简短的 ID)。
--format:自定义输出格式,使用 Go 模板语法。
--latest:仅显示最近创建的容器的资源使用情况。

示例:

# 实时显示所有容器的资源使用情况
docker stats

# 显示所有容器的资源使用情况,不进行实时流输出
docker stats --no-stream

# 显示未运行容器的资源使用情况
docker stats --all

# 自定义输出格式,仅显示容器的名称和 CPU 使用情况
docker stats --format "table {{.Name}}\t{{.CPUPerc}}"

# 显示最近创建的容器的资源使用情况
docker stats --latest

8.2 docker inspect

功能:显示一个容器或镜像的元数据,该命令用于获取有关 Docker 对象(容器、镜像、网络或卷)的详细信息。这个命令对于调试和获取对象的配置非常有用。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]


参数说明:

  • NAME|ID: 要检查的容器、镜像、网络或卷的名称或ID。

OPTIONS说明:

-f, --format:格式化输出,使用Go模板格式化。
-s, --size:显示总大小。
--type:返回给定类型的信息("container"或"image")


示例:

# 获取容器的详细信息
docker inspect mycontainer
 
# 以 JSON 格式获取镜像的详细信息
docker inspect myimage:latest
 
# 格式化输出容器的 IP 地址
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mycontainer
 
# 获取容器的总大小
docker inspect -s mycontainer


输出默认为 JSON 格式,除非使用 --format 选项进行格式化,可以使用 --format 选项来定制输出,例如提取特定的字段或属性,如果需要检查多个对象,可以一次性传递多个名称或ID。

9.容器与主机的数据拷贝

9.1 docker cp

功能:容器与主机之间的数据拷贝,用于在 Docker 容器和 Docker 主机之间复制文件或目录。这个命令对于从容器中提取日志文件、配置文件或部署应用程序非常有用。

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH

docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

参数说明:

  • CONTAINER:容器的名称或ID。
  • SRC_PATH:源文件或目录的路径。
  • DEST_PATH:目标文件或目录的路径。

OPTIONS说明:

-a, --archive:以归档模式复制,等同于 --no-preserve 选项的反义词,适用于备份容器文件系统。
L, --follow-link:复制时跟随符号链接。
--no-preserve:不保留文件的所有权和修改时间。

示例:

# 从名为 my_redis 的容器中复制文件 /etc/hosts 到宿主机的当前目录
docker cp my_redis :/etc/redis .

# 将宿主机的当前目录下的文件复制到名为 my_redis 的容器的 /etc/ 目录
docker cp a.text my_container:/etc/

# 以归档模式将容器的整个 /etc 目录复制到宿主机的 backup 目录
docker cp my_redis :/etc/ backup/
  • 使用 docker cp 命令时,容器必须处于运行状态。
  • 如果目标路径不存在,Docker 会自动创建它。
  • 如果目标路径已经存在一个同名文件,docker cp 命令会覆盖它。
  • docker cp 命令不会保留文件的所有权和修改时间,除非你使用 -a 或 --archive 选项。

10.暂停和恢复容器中的所有进程

10.1 docker pause

功能:命令会暂停容器内所有正在运行的进程。这并不是完全停止容器,容器依旧会运行,但是其内部的进程会被冻结,不会继续执行

docker pause CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:要暂停的容器的名称或ID。

示例:

# 暂停名为 my_redis 的容器
docker pause my_redis 

# 暂停多个容器
docker pause my_redis1 my_redis2 my_redis3
  • 只有当容器处于运行状态时,才能被暂停。
  • 暂停容器不会影响容器的网络连接,容器依旧可以接收和发送网络数据包。
  • 暂停容器不会释放容器占用的资源,如内存和CPU。
  • 某些类型的进程可能无法被 docker pause 命令正确暂停,例如那些不响应 SIGSTOP 信号的进程。
  • 暂停容器后,可以使用 docker unpause 命令来恢复容器内所有进程的执行。

10.2 docker unpause

功能:命令用于恢复之前被 docker pause 暂停的容器中的所有进程

docker unpause CONTAINER [CONTAINER...]

参数说明:

  • CONTAINER:要恢复的容器的名称或ID。

示例:

# 恢复名为 my_redis 的容器
docker unpause my_redis 

# 恢复多个容器
docker unpause my_redis1 my_redis2 my_redis3

11.最后

感谢大家,请大家多多支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微刻时光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值