Docker 常用命令(未完待续...)
Docker 常用命令(未完待续...)
- 命令的完整名称和别名
- 帮助
- 登录和搜索命令 (Login and Search Commands)
- 其他管理命令 (Other Management Commands)
- 镜像命令 (Image Commands)
- 容器命令 (Container Commands)
- docker run 从镜像创建并运行一个新的容器
- docker run 运行一个容器,并让其不会自动退出
- docker run --rm 临时运行容器
- docker run --volume 绑定挂载
- docker run --mount 绑定挂载
- docker attach 进入运行中的容器
- docker exec 在运行中的容器执行命令
- docker cp 复制文件
- docker logs 查看容器日志
- 网络命令 (Network Commands)
- docker network create 创建网络
- 创建 bridge 网络
- **创建 None 网络**
- 创建 Host 网络
- * 创建 Overlay 网络
- 创建 Macvlan 网络
- 在两台主机上创建相同的 macvlan 网络,并运行容器,互 Ping
- * 创建 IPvlan 网络
- docker network connect 连接容器到网络
- 卷命令 (Volume Commands)
- 参考资料
命令的完整名称和别名
以 镜像命令
为例:
全名: docker image xx
所有镜像命令都以 docker image
开头
别名: docker xx
也就是我们常用的简写方式,省掉了中间的 image
其他比如 容器命令
、网络命令
等等也都是同理。为了省点字,同时也符合使用习惯,下文中有别名的就用别名了。
帮助
命令 | 说明 |
---|---|
docker --help | 查看帮助信息 |
docker 命令 --help | 查看指定命令的帮助信息 |
官方文档 Docker 命令行基础命令 | 查看更详细的说明 |
登录和搜索命令 (Login and Search Commands)
命令 | 说明 | 示例 |
---|---|---|
docker login | 登录注册表 | docker login |
docker logout | 从注册表登出 | docker logout |
docker search | 在 Docker Hub 上搜索镜像docker search 镜像名 | docker search nginx |
其他管理命令 (Other Management Commands)
命令 | 说明 | 示例 |
---|---|---|
docker system | 管理 Docker | docker system <command> |
- 显示 Docker 磁盘使用情况 | docker system df | |
- 从服务器获取实时事件 | docker system events | |
- 显示系统范围的信息 | docker system info | |
- 移除未使用的数据 | docker system prune | |
docker version | 显示 Docker 版本信息 | docker version |
docker info | 显示系统范围的信息 | docker info |
镜像命令 (Image Commands)
my_image
用于举例的镜像名称
my_image:latest
用于举例的镜像名称,带版本号
——— 命 令 ——— | 说明 | 示例(名称 可以换成ID ) |
---|---|---|
docker images | 列出镜像 列出所有镜像,但只显示ID | docker images docker images -aq |
docker pull | 从仓库下载镜像docker pull 镜像 无版本号,默认最新 镜像:[版本号] | docker pull my_image |
docker push | 将镜像上传到仓库 | docker push my_image |
docker rmi | 本地移除一个或多个镜像 删除所有镜像 | docker rmi my_image docker rmi $(docker images -aq) |
docker tag | 给镜像加标记docker tag 镜像 标签 执行后会多出一个镜像引用,注意看ID是相同的 | docker tag my_image:latest my_repo/my_image:1.0 |
docker save | 保存一个或多个镜像到 tar 归档docker save -o 归档文件 镜像 | docker save -o image.tar my_image |
docker load | 从 tar 归档或标准输入加载镜像(对应docker save)docker load --input 归档文件 docker load < 归档文件 | docker load --input image.tar docker load < image.tar |
docker import | 从一个归档文件(比如 tar)创建一个 Docker 镜像。 (不限于 docker 导出的 tar) | docker import export导出的文件 |
docker history | 显示镜像的历史记录 | docker history my_image |
docker build | 用 Dockerfile 构建镜像 | docker build -t my_image . |
容器命令 (Container Commands)
my_container
用于举例的容器名称
— 命 令 选 项 —— | 说明 | 示例 (名称 可以换成ID ) |
---|---|---|
docker ps | 列出运行的容器 | docker ps |
列出所有的容器 | docker ps -a | |
列出运行的容器(只显示ID) | docker ps -q | |
列出所有的容器 ID | docker ps -aq | |
docker run | 从镜像创建并运行一个新的容器 | docker run my_container |
docker attach | 将本地的标准输入、输出和错误流附加到正在运行的容器 | docker attach my_container |
docker exec | 在运行中的容器内执行命令 | docker exec -it my_container /bin/bash |
docker create | 创建一个新的容器 | docker create --name my_container busybox echo Hello World |
docker start | 启动一个或多个容器 | docker start my_container |
docker restart | 重启一个或多个容器 | docker restart my_container |
docker pause | 暂停一个或多个容器内的所有进程 | docker pause my_container |
docker unpause | 恢复一个或多个暂停的容器 | docker unpause my_container |
docker stop | 停止一个或多个运行中的容器 相当于正常关机 | docker stop my_container |
docker kill | 终止一个或多个运行中的容器 相当于强制关机,一般用于结束卡死的容器 | docker kill my_container |
docker rename | 重命名容器 | docker rename my_container new_name |
docker commit | 从容器的更改创建一个新的镜像 | docker commit my_container my_new_image |
docker rm | 移除一个或多个容器 | docker rm my_container 删除所有容器: docker rm $(docker ps -aq) |
docker cp | 在容器和本地文件系统之间复制文件/文件夹 | docker cp my_container:/path/in/container /local/path |
docker diff | 检查容器文件系统的更改 | docker diff my_container |
docker port | 列出容器的端口映射或特定映射 | docker port my_container |
docker logs | 获取容器的日志 | docker logs my_container |
docker top | 显示容器中正在运行的进程 | docker top my_container |
docker inspect | 返回关于 Docker 对象的底层信息 | docker inspect my_container |
docker export | 将指定容器的当前状态存档 为 tar后续可导入再运行实现 取档 对应 docker import (这种方式导出的 tar 是不限于 Docker 的,比如可以导去 WS) | 参考: Wni11 下 WSL 安装 CentOS |
docker run 从镜像创建并运行一个新的容器
格式:docker run [选项] <镜像名/ID> [容器运行起来后会执行的命令] [命令参数…]
以下是常见用法及参数说明:
docker run 参 数 | 说明 | 举例 |
---|---|---|
-d | 以守护式(后台)模式运行容器 | docker run -d nginx 在后台启动一个 Nginx 容器。 |
-p | 将容器的端口映射到主机端口 | docker run -p 8080:80 nginx ,将主机的 8080 端口映射到容器的 80 端口, 可通过访问主机的 8080 端口访问容器中的 Nginx 服务。 |
–name | 为容器指定一个名称 | docker run --name mynginx nginx 为容器命名为“mynginx”。 |
-e | 设置环境变量 | docker run -e KEY=VALUE nginx 在容器中设置环境变量 KEY 为 VALUE。 比如 mysql 容器就可以用它设置 root 密码 |
–network | 指定容器的网络模式 | docker run --network 网络名 镜像 使用默认的桥接网络模式启动容器。 也可以指定其他网络模式如 host 、none 等。 |
–restart | 设置容器的重启策略 | docker run --restart always nginx ,容器退出时总是自动重启。 |
-it | 以交互模式运行容器,并为容器分配一个伪终端 | docker run -it ubuntu /bin/bash ,启动一个 Ubuntu 容器并进入其命令行界面。 |
–rm | 当容器退出时,自动删除该容器及其关联的匿名卷。 | docker run --rm nginx 启动一个 nginx 容器。退出时容器会自动清理掉。 |
-w, --workdir | 设置当前工作目录。如果目录不存在,会在容器中自动创建 | docker run -it -w /app ubuntu ls 启动 ubuntu 后会默认以 /app 为当前路径,并执行 ls |
-v, --volume | 将主机目录挂载到容器中 | docker run -v /host/path:/container/path nginx ,将主机上的 /host/path 目录挂载到容器中的 /container/path ,方便在容器和主机之间共享数据。 |
–mount | 和 -v 基本相同,但是它的参数是以参数名=参数值 的方式提供,语义清晰推荐使用。当挂载到容器中已有的目录时与 -v 不同,它会用源目录 冒充容器中的目录. | docker run -it --mount type=bind,source=/test,target=/test nginx |
docker run 运行一个容器,并让其不会自动退出
-d
:容器在后台运行,不会把容器的输出打印到当前终端。-i
:保持容器的标准输入打开,即使没有连接到终端,容器也可以接收输入。-t
:为容器分配一个伪终端(pseudo-tty),使得容器的输出可以像在终端中一样显示。dit
:实现运行一个容器并让它保持住不自动退出。
docker run -dit --name bb1 busybox
docker run --rm 临时运行容器
默认情况下,容器退出后其文件系统和相关数据仍然保留,便于调试和数据持久化。
使用 --rm
可以让容器
退出时自动清除容器
并删除匿名卷
(与容器关联的匿名卷)。
docker run --rm -it busybox sh
docker run --volume 绑定挂载
当绑定挂载的卷的主机目录
不存在时,Docker会自动
为你在主机上创建
这个目录。
-
–volume 挂载文件
格式:docker run -v <宿主机文件>:<容器中文件> <镜像>
- 宿主机中在当前目录下生成一个
hostname
文件 - 将当前目录下的文件
./hostname
挂载为容器中的/etc/hostname
- 最后执行
cat /etc/hostname
查看显示hahaha
- 因为测试用懒得手删,加
--rm
退出容器自动清理
echo hahaha > hostname docker run --rm -v ./hostname:/etc/hostname busybox cat /etc/hostname
对比下原始内容,是类似这样的字符串
18a8c1299f0f
docker run --rm busybox cat /etc/hostname
- 宿主机中在当前目录下生成一个
-
–volume 只读挂载
在容器中挂载点后加上:ro
即为只读。现在进去写一下,保存就会看到只读警告了。docker run --name bb -v ./hostname:/etc/hostname:ro -it busybox sh
-
–volume 挂载目录
将当前路径下的html目录./html
挂载到容器中/usr/share/nginx/html
如果目标存在则覆盖。- 我事先在
./html
下生成了几个测试文件,nginx 镜像里绝对不会存在。 - 容器起来后会运行
ls /usr/share/nginx/html
一看便知和宿主机的./html
内容一样。
docker run --rm -p 80:80 -v ./html:/usr/share/nginx/html nginx ls /usr/share/nginx/html
对比下原始内容,原本有
50x.html
,index.html
两个文件docker run --rm -p 80:80 nginx ls /usr/share/nginx/html
- 我事先在
docker run --mount 绑定挂载
--mount
允许你在容器中挂载卷
、主机目录
和 tmpfs
挂载。
--mount
支持 --volume
支持的大多数选项,但使用不同的语法。
尽管没有计划弃用 --volume
,但 建议 使用 --mount
。
- –mount 支持的几种类型
type | 说明 |
---|---|
bind | 挂载宿主机 中的文件 或目录 到容器中 。1. 绑定挂载通常用于将 宿主机 的文件 或目录 ,共享 给容器中的程序使用,2. 比如开发中共享代码目录、读取配置文件或输出日志等场景。 3. 宿主机上的 目录 或文件 必须事先存在 。 |
volume | 将卷 volume 挂载到容器中。1. 卷是 Docker 容器数据持久化首选机制, 2. 相比 绑定 bind 挂载有易备份迁移、可管理、跨平台、安全共享、可扩展功能等优势,3. 且通常比直接在容器中写数据更好。 4. 当绑定挂载的卷的主机 目录不存在 时,Docker会在主机上为你自动创建 这个目录。 |
tmpfs | 临时文件系统 挂载,将数据存储在宿主机 的内存 中,而不是磁盘上。1. 适合于一些 不需要持久化 ,且需要快速读写 的临时数据。 |
-
–mount 挂载文件
将前面--volume
的例子换成--mount
实现。docker run --rm \ --mount type=bind,src=./hostname,dst=/etc/hostname \ busybox cat /etc/hostname
-
–mount 挂载目录
将前面--volume
的例子换成--mount
实现。如果目标存在则覆盖。docker run --rm -it -p 80:80 \ --mount type=bind,src=./html,dst=/usr/share/nginx/html \ nginx ls /usr/share/nginx/html
-
–mount 只读挂载
在容器中挂载点后加上,readonly
即为只读。现在进去写一下,保存就会看到只读警告了。docker run --rm -it \ --mount type=bind,src=./hostname,dst=/etc/hostname,readonly \ busybox sh
docker attach 进入运行中的容器
直接连接到正在运行的容器,查看或控制它的输出,就像在本地终端操作一样。
docker attach 容器名
直接退出 | 脱离容器,并让其保持后台运行 |
---|---|
exit 或 Ctrl + c | Ctrl + p 再 Ctrl + q |
docker exec 在运行中的容器执行命令
格式:docker exec <容器名> <命令> [参数]
在运行的容器 bb 中执行命令 ls
参数 /
docker exec bb ls /
docker cp 复制文件
先开一个容器
docker run --name bb -dit \
--mount type=bind,src=./hostname,dst=/etc/hostname,readonly \
busybox sh
- 从 宿主机 拷贝到 容器
将bb
容器中的/etc/hostname
复制到当前目录下,并命名为hostname001
docker cp bb:/etc/hostname hostname001
- 从 容器 拷贝到 宿主机
将当前目录下的test.txt
复制到bb
容器中的/test/999.txt
目录文件夹必须存在,如果不存在,可以先创建一下docker cp test.txt bb:/test/999.txt
docker exec bb mkdir /test
docker logs 查看容器日志
实时查看容器的日志。初始 10 行
docker logs -f -n 10 容器名
网络命令 (Network Commands)
my_network
用于举例的网络名称
—————— 命 令 —————— | 说明 | 示例 |
---|---|---|
docker network ls | 列出网络 | docker network ls |
docker network create | 创建网络 | docker network create my_network |
docker network inspect | 显示网络的详细信息 | docker network inspect my_network |
docker network connect | 连接容器到网络 (把一个 容器 添加到一个网络 中,它就可以和这个网络下的其他容器通信了) | docker network connect my_network my_container |
docker network disconnect | 断开容器与网络连接 | docker network disconnect my_network my_container |
docker network rm | 删除网络 | docker network rm my_network |
docker network create 创建网络
格式:docker network create [选项] 网络名称
创建 bridge 网络
- 创建
bridge
网络时,-d bridge
作为默认网络驱动,可以省略。 - 所有加入
bridge
网络的容器都会被分配一个私有 IP 地址。 - 该网络支持
容器间
、容器
与宿主机
间及容器
与外部网络
间的通信。 - 安装 Docker 默认创建的
docker0
不包含 DNS 解析服务,通常我们会自己创建一个来用。
- 创建一个桥接网络
docker network create -d bridge my-bridge-network
- 创建三台容器
bb1
,bb2
,bb3
,并加入my-bridge-network
docker run -dit --network my-bridge-network --name bb1 busybox
docker run -dit --network my-bridge-network --name bb2 busybox
docker run -dit --network my-bridge-network --name bb3 busybox
bb1
pingbb2
、bb3
、宿主
、外网
#!/bin/bash
container_name="bb1"
targets=("bb2" "bb3" "172.17.0.1" "www.baidu.com")
for target in "${targets[@]}"; do
if docker exec $container_name ping -c1 -W1 $target &>/dev/null; then
echo "$container_name ping $target: 成功"
else
echo "$container_name ping $target: 失败"
fi
done
创建 None 网络
- 不使用任何网络栈。
- 容器将不会被分配 IP 地址,也不具备任何网络功能。
- 适用于不需要网络连接的容器或测试用途。
注意:用户不能自己创建 None 网络,运行容器时直接 --network none
即可。
创建两个容器网络设置为 none
docker run -dit --name bbn1 --network none busybox
docker run -dit --name bbn2 --network none busybox
两个容器互 ping 不通
docker exec bbn1 ping bbn2
ping: bad address 'bbn2'
docker exec bbn2 ping bbn1
ping: bad address 'bbn1'
创建 Host 网络
- 容器直接使用宿主机的网络。(就相当于它是宿主机上运行的一个程序)
- 容器共享宿主机的 IP 地址和端口。
- 适用于需要完全访问宿主机网络的应用程序。
- 可能会导致端口冲突等问题。
注意:用户不能自己创建 Host 网络,运行容器时直接 --network host
即可。
docker run -dit --name bbh1 --network host busybox
docker run -dit --name bbh2 --network host busybox
bbh1
、bbh2
ping 外网,就相当于我宿主机自己 ping 外网。
docker exec bbh1 ping -c3 www.baidu.com
docker exec bbh2 ping -c3 www.baidu.com
另外再看一下 bbh1
、bbh2
的 ip addr
显示的和宿主机完全一样,因为就是同一个东西
docker exec bbh1 ip addr
* 创建 Overlay 网络
- 用于 Docker Swarm 模式下的多主机网络。
- 允许容器跨多个 Docker 守护进程进行通信。
- 提供分布式服务发现和负载均衡。
- 适合集群环境下容器间的通信。
docker network create -d overlay my-overlay-network
创建 Macvlan 网络
使用 macvlan
网络可以让容器直接通过宿主机的物理网卡与外界通信,提高了网络性能,并允许容器直接在网络中被识别。这对于需要高性能和直接访问的应用场景非常有用。
-
工作原理
1. MAC VLAN:技术允许在宿主机的物理网卡上创建一个或多个虚拟接口,每个接口都有一个独立的 MAC 地址。这些接口共享同一个物理网卡,但可以在不同的 VLAN 中。
2. 容器网络:在 Docker 中使用macvlan
网络时,Docker 会为每个加入该网络的容器分配一个 MAC 地址,并将其直接连接到宿主机的物理网卡上。 -
优点
1. 高性能:由于容器直接使用宿主机的物理网卡,避免了通过桥接网络带来的额外开销。
2. 独立 IP 地址:容器可以拥有独立的 IP 地址,可以直接在网络中被识别。
3. 直接通信:容器可以直接与外部网络通信,无需通过宿主机的网关或代理。 -
使用场景
1. 高性能网络应用:适用于需要高性能网络通信的应用程序。
2. 直接访问:适用于需要直接访问容器的服务,例如在生产环境中直接暴露容器的服务给外部网络。
在两台主机上创建相同的 macvlan 网络,并运行容器,互 Ping
我正好在 WSL 中装了一台 CentOS7,一台CentOS8。接下来我要做如下步骤:
- 分别在 CentOS7,CentOS8 使用完全一样的参数,创建 macvlan 都叫
my-macvlan-network
- 在 CentOS7 运行一个容器
c1
加入my-macvlan-network
网络,IP指定为182.28.38.11
- 在 CentOS8 运行一个容器
c2
加入my-macvlan-network
网络,IP指定为182.28.38.12
- 两个容器互 ping
在创建 macvlan 前要先搞清楚一下我们的网络情况。
- 我的电脑上安装的是
Win11
家庭版本,
Win11 中装了WSL
,
WSL 中装了CentOS7
,CentOS8
子系统 - 查看网络信息
2.1. Win11中执行ipconfig
发现vEthernet (WSL)
这里的 IP 就是 WSL 中所有子系统的网关
。
2.2. 进入各子系统如 CentOS7、CentOS8 执行ip route show | grep -i default | awk '{ print $3}'
可以验证。
-
在
CentOS7
,CentOS8
执行相样的操作,创建my-macvlan-network
注意: 避开当前环境已经存在的IP
不然会造成冲突。docker network create \ --driver macvlan \ --subnet=182.28.38.0/24 \ --gateway=182.28.38.1 \ -o macvlan_mode=bridge \ -o parent=eth0 \ my-macvlan-network
-d macvlan
:指定网络驱动为 MAC VLAN。--subnet=182.28.38.0/24
:定义这个网络的子网为182.28.38.0
到182.28.38.255
,
这意味着这个子网中排除掉网络地址(182.28.38.0
)和广播地址(182.28.38.255
),
可用的 IP 地址范围是从182.28.38.1
到182.28.38.254
数量为254
个。--gateway=182.28.38.1
:指定这个网络的网关地址为182.28.38.1
。(网关又占一个,只剩253
了)-o parent=eth0
:表示这个 MAC VLAN 网络所基于的物理网络接口是eth0
,即这个新创建的网络将通过eth0
与外部网络进行通信。
使用ip link show
可以查看我们的物理网卡名子。通常是以eth
、enp
、ens
开头。
比如我这里宿主机的物理网卡名就叫eth0
。my-macvlan-network
:为新创建的网络指定一个名称。
-
然后,分别在
CentOS7
,CentOS8
运行容器并让其连接到my-macvlan-network
网络:
为CentOS7
设定IP :182.28.38.11
docker run -dit --name c1 --net=my-macvlan-network --ip=182.28.38.11 busybox
为
CentOS8
设定IP :182.28.38.12
docker run -dit --name c2 --net=my-macvlan-network --ip=182.28.38.12 busybox
-
互 ping 验证
c1 ping 182.28.38.11
c2 ping 182.28.38.10
-
实现宿主与容器间通信
前面工作完成后发现,容器可以互通了,但是容器与宿主不通。-
对创建
macvlan2
的命令稍加改造,(运行容器的命令不变)
--aux-address='host=182.28.38.120'
这句直接给容器说,你用这个访问宿主。# 创建 Docker macvlan docker network create -d macvlan \ --subnet=182.28.38.0/24 \ --gateway=182.28.38.1 \ --aux-address='host=182.28.38.120' \ -o parent=eth0 \ my-macvlan-network
-
接下来我们用 linux 命令创建一个 macvlan 取名
macvlan2
-
在上面两容器所在网段选个空闲 IP 比如
182.28.38.120
绑给macvlan2
。 -
在宿主机上设置下路由,让
182.28.38.0
到182.28.38.255
都走macvlan2
-
这样就宿主机就可以与容器通信了。
# 创建另一个 macvlan sudo ip link add macvlan2 link eth0 type macvlan mode bridge \ sudo ip addr add 182.28.38.120/32 dev macvlan2 \ sudo ip link set macvlan2 up \ sudo ip route add 182.28.38.0/24 dev macvlan2
顺便附上卸载方法:先停掉,后删除
sudo ip link set macvlan2 down sudo ip link del macvlan2
-
* 创建 IPvlan 网络
- 类似于 Macvlan,但在 IP 层而不是 MAC 层操作。
- 容器可以直接在三层网络中通信。
- 适用于需要高性能网络的应用。
- 需要宿主机支持 IPvlan。
docker network create -d ipvlan --ipvlan-mode=l2 --subnet=192.168.0.0/24 --gateway=192.168.0.1 my-ipvlan-network
docker network connect 连接容器到网络
格式:docker network connect [选项] <网络> <容器>
docker network connect my-bridge-network c1
卷命令 (Volume Commands)
my_volume
用于举例的卷名
命令 | 说明 | 示例 |
---|---|---|
docker volume create | 创建卷 | docker volume create my_volume 如果不传卷名,系统会自动生成随机字符串作卷名。 |
docker volume ls | 列出卷 | docker volume ls |
docker volume inspect | 显示卷的详细信息 | docker volume inspect my_volume |
docker volume rm | 删除卷 | docker volume rm my_volume |
参考资料
笑虾:WSL 下的 CentOS 装 Docker
Docker 命令行基础命令
官方例子