Docker 容器命令
Docker 容器命令
docker ps
docker ps
docker ps -a
docker ps --size
docker ps
是 Docker 的一个命令,用于查看当前正在运行的容器。
命令格式:
docker ps [OPTIONS]
常用选项:
-a
或--all
:显示所有容器(包括未运行的)-q
或--quiet
:只显示容器的 ID--no-trunc
:不截断输出(例如容器名、命令等)--format
:使用 Go 模板格式化输出内容
示例解释:
示例 1:
docker ps
显示当前正在运行的容器,包括:
- 容器 ID(CONTAINER ID)
- 镜像(IMAGE)
- 命令(COMMAND)
- 创建时间(CREATED)
- 状态(STATUS)
- 端口(PORTS)
- 容器名(NAMES)
示例输出:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abc123456789 nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:80->80/tcp webserver
示例 2:
docker ps -a
显示所有容器,包括已停止的容器。
docker run
docker run
是 Docker 中最常用的命令之一,用于创建并启动一个容器。它基于指定的镜像运行一个新的容器实例,可以指定容器运行的配置参数,例如端口映射、环境变量、挂载卷等。
基本语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
IMAGE
:镜像名称,例如nginx
、ubuntu
。COMMAND
:可选,覆盖镜像默认执行命令。OPTIONS
:可选参数,用于配置容器行为。
常见参数说明
参数 | 含义 |
---|---|
-d |
后台运行容器(detached 模式) |
-it |
交互模式运行容器,-i 保持输入流打开,-t 分配伪终端 |
--name |
指定容器名称 |
-p 主机端口:容器端口 |
端口映射,例如 -p 8080:80 |
-v 主机路径:容器路径 |
卷挂载,将主机目录挂载到容器中 |
--rm |
容器退出时自动删除 |
-e |
设置环境变量,例如 -e ENV_VAR=value |
示例
- 运行一个 Ubuntu 容器并进入交互模式:
docker run -it ubuntu bash
意思是:以 ubuntu
镜像运行一个容器,进入 bash 交互终端。
- 运行 Nginx 并映射端口:
docker run -d -p 8080:80 nginx
意思是:以后台方式运行 nginx
,并将主机的 8080 端口映射到容器的 80 端口。
- 运行带挂载卷的容器:
docker run -v /host/path:/container/path ubuntu
意思是:将主机的 /host/path
目录挂载到容器的 /container/path
。
- 设置环境变量:
docker run -e MY_ENV=prod ubuntu
重启策略
使用 Docker 的 --restart 来指定容器的重启策略。
重启策略控制 Docker 守护进程退出后是否重新启动容器。
Docker 支持以下重启策略:
Policy | Result |
---|---|
no |
当容器退出时,不要自动重启容器。这是默认值。 |
on-failure[:max-retries] |
仅当容器以非零退出状态退出时重新启动。可选地,限制Docker守护进程尝试重新启动的次数。 |
unless-stopped |
重新启动容器,除非它被显式停止或 Docker 本身被停止或重新启动。 |
always |
无论退出状态如何,总是重新启动容器。当您指定 always 时,Docker 守护进程将尝试无限期地重新启动容器。容器也将始终在守护进程启动时启动,而不管容器的当前状态如何。 |
说明
--restart=no
:容器退出时不重启。--restart=always
:无论容器是如何退出的,都会重启。--restart=on-failure
:只有在容器非正常退出(退出状态非 0)时才会重启。--restart=unless-stopped
:容器会一直重启,除非被手动停止。
关于手动停止了,如果 Docker 守护进程不被重启,都不会被启动,如果使用了类似systemctl restart docker
命令重启 Docker 守护进程,那么 unless-stopped
的容器已经被手动停止了就不会自动重启,always
的会自动重启。
固定物理地址
有些服务的授权或激活机制依赖于网络接口的 物理地址(MAC 地址)。
由于 Docker 容器默认每次启动都会分配一个新的虚拟 MAC 地址,这会导致激活信息失效或授权失效。
为了解决这个问题,可以在启动容器时通过 --mac-address
参数显式指定一个固定的 MAC 地址,例如:
docker run --mac-address 02:42:ac:11:00:01 ...
这样可以确保每次启动的容器网络接口使用相同的 MAC 地址,从而满足服务对物理地址不变的要求。
docker exec
在运行的容器中执行命令
命令使用
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
描述
docker exec
命令在运行的容器中运行一个新命令。
COMMAND在容器的默认目录下运行。如果底层映像在Dockerfile中使用WORKDIR指令指定了自定义目录,则使用此目录。
COMMAND必须是可执行文件。链式或加引号的命令不起作用。
一般进入容器可以使用
docker exec -it mycontainer bash
docker exec -it mycontainer /bin/bash
选项
Name, shorthand | 描述 |
---|---|
--detach , -d |
分离模式:后台运行命令 |
--detach-keys |
重写分离容器的键序列 |
--env , -e |
设置环境变量 |
--env-file |
读入一个环境变量文件 |
--interactive , -i |
保持标准输入打开,即使没有附加 |
--privileged |
为该命令提供扩展权限 |
--tty , -t |
分配伪 tty |
--user , -u |
用户名或 UID |
--workdir , -w |
容器内的工作目录 |
docker start
启动容器
docker stop
停止容器
docker restart
重启容器
docker rename
容器重命名
docker rename my_container my_new_container
docker rm
删除容器
docker cp
docker cp
是 Docker 提供的一个命令,用于在宿主机与容器之间复制文件或目录,语法简单实用。
一、命令格式:
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
二、参数说明:
SRC_PATH
:源路径,可以是本地路径或容器内路径(需加上CONTAINER:
)。DEST_PATH
:目标路径,可以是本地路径或容器内路径(需加上CONTAINER:
)。CONTAINER
:容器的名字或 ID。
三、常用示例:
- 从宿主机复制文件到容器中:
docker cp ./test.txt mycontainer:/app/test.txt
说明:将宿主机当前目录下的 test.txt
复制到容器 mycontainer
的 /app/
目录下。
- 从容器中复制文件到宿主机:
docker cp mycontainer:/app/test.txt ./test.txt
说明:将容器 mycontainer
中 /app/test.txt
复制到宿主机当前目录。
- 复制目录:
docker cp mycontainer:/app/data ./data
说明:将容器内的 /app/data
目录复制到宿主机当前目录下。
四、注意事项:
docker cp
只能用于运行中或已停止的容器(前提是容器存在)。- 支持相对路径和绝对路径。
- 如果目标路径存在同名文件或目录,会被覆盖。
- 该命令不会改变文件的权限或所有权,但可能会略有不同,尤其在不同操作系统之间使用时。
docker network
在 Docker 中,网络(network)用于连接容器,使它们可以相互通信,或者与主机、外部网络通信。Docker 提供了多种网络驱动类型,以满足不同的使用场景。
Docker 网络类型(驱动)
-
bridge(默认)
-
容器默认使用的网络类型(除非指定)。
-
适用于单主机上多个容器之间的通信。
-
每个容器都会获得一个虚拟 IP,彼此通过网络桥接通信。
-
示例:
docker run -d --name container1 nginx docker run -d --name container2 busybox
-
-
host
-
容器与宿主机共享网络命名空间。
-
容器不会有自己的 IP 地址,使用宿主机的 IP 和端口。
-
适用于对性能有要求,或不需要隔离的场景。
-
示例:
docker run --network host nginx
-
-
none
- 容器没有网络连接。
- 适用于需要完全隔离网络的场景。
-
overlay
-
用于 Docker Swarm 或集群环境下,跨主机容器通信。
-
构建在多个 Docker 主机之上的虚拟网络。
-
需要使用
docker swarm
初始化。 -
示例:
docker network create --driver overlay my_overlay
-
-
macvlan
- 为容器分配一个 MAC 地址,使其像物理设备一样存在于网络中。
- 适用于需要容器在二层网络中表现为独立主机的场景。
-
自定义网络
- 你可以通过
docker network create
创建自定义网络,并设置子网、网关等参数。 - 容器加入同一个自定义网络后,可以使用容器名直接通信(DNS 支持)。
- 你可以通过
常用命令
-
查看所有网络:
docker network ls
-
创建一个自定义桥接网络:
docker network create --driver bridge my_network
-
查看网络详情:
docker network inspect my_network
-
启动容器并指定网络:
docker run -d --name my_nginx --network my_network nginx
-
将已存在的容器连接到网络:
docker network connect my_network my_container
-
从网络中断开容器:
docker network disconnect my_network my_container
Docker 网络隔离
网络是为了隔离同一个服务器上不同应用的
Docker 网络可以用于隔离同一服务器上不同应用之间的通信。
通过创建不同的 Docker 网络,可以确保应用只与需要通信的其他容器进行通信,而不会受到其他不相关容器的干扰。
docker network create my_network
# 启动 app1 并连接到自定义网络
docker run -d --name app1 --network my_network -p 3000:3000 app1_image
# 启动 app2 并连接到自定义网络
docker run -d --name app2 --network my_network -p 5000:5000 app2_image
# 将运行中的容器加入网络
docker network connect my_network app3
# 在单个主机上部署多个容器,容器之间有隔离,需要使用同一网络,容器名字代替IP地址
# 比如:app1 的配置文件中关于 app2 的IP地址用容器名字代替,比如 app2:5000
# 如果容器之间通信走内部 Docker 网络,不通过宿主机映射端口,比如启动了多个 MySQL 容器,每个容器里面都是3306端口,如果都加入到了同一个网络,比如使用的 mysql8:3306 后面的 3306,要是容器内的端口。