当前位置: 首页 > article >正文

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管理 Dockerdocker 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
列出所有的容器 IDdocker 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 网络名 镜像
使用默认的桥接网络模式启动容器。
也可以指定其他网络模式如 hostnone 等。
–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 <宿主机文件>:<容器中文件> <镜像>

    1. 宿主机中在当前目录下生成一个 hostname 文件
    2. 将当前目录下的文件./hostname挂载为容器中的/etc/hostname
    3. 最后执行 cat /etc/hostname 查看显示 hahaha
    4. 因为测试用懒得手删,加 --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 如果目标存在则覆盖。

    1. 我事先在./html下生成了几个测试文件,nginx 镜像里绝对不会存在。
    2. 容器起来后会运行 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 容器名
直接退出脱离容器,并让其保持后台运行
exitCtrl + cCtrl + pCtrl + 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 网络

  1. 创建 bridge 网络时,-d bridge 作为默认网络驱动,可以省略。
  2. 所有加入 bridge 网络的容器都会被分配一个私有 IP 地址。
  3. 该网络支持容器间容器宿主机间及容器外部网络间的通信。
  4. 安装 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 ping bb2bb3宿主外网
#!/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 网络

  1. 不使用任何网络栈。
  2. 容器将不会被分配 IP 地址,也不具备任何网络功能。
  3. 适用于不需要网络连接的容器或测试用途。

注意:用户不能自己创建 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 网络

  1. 容器直接使用宿主机的网络。(就相当于它是宿主机上运行的一个程序)
  2. 容器共享宿主机的 IP 地址和端口。
  3. 适用于需要完全访问宿主机网络的应用程序。
  4. 可能会导致端口冲突等问题。

注意:用户不能自己创建 Host 网络,运行容器时直接 --network host 即可。

docker run -dit --name bbh1 --network host busybox
docker run -dit --name bbh2 --network host busybox

bbh1bbh2 ping 外网,就相当于我宿主机自己 ping 外网。

docker exec bbh1 ping -c3 www.baidu.com
docker exec bbh2 ping -c3 www.baidu.com

另外再看一下 bbh1bbh2ip addr 显示的和宿主机完全一样,因为就是同一个东西

docker exec bbh1 ip addr

* 创建 Overlay 网络

  1. 用于 Docker Swarm 模式下的多主机网络。
  2. 允许容器跨多个 Docker 守护进程进行通信。
  3. 提供分布式服务发现和负载均衡。
  4. 适合集群环境下容器间的通信。
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。接下来我要做如下步骤:

  1. 分别在 CentOS7,CentOS8 使用完全一样的参数,创建 macvlan 都叫 my-macvlan-network
  2. 在 CentOS7 运行一个容器 c1 加入 my-macvlan-network 网络,IP指定为 182.28.38.11
  3. 在 CentOS8 运行一个容器 c2 加入 my-macvlan-network 网络,IP指定为 182.28.38.12
  4. 两个容器互 ping

在创建 macvlan 前要先搞清楚一下我们的网络情况。

  1. 我的电脑上安装的是 Win11家庭版本,
    Win11 中装了 WSL
    WSL 中装了CentOS7CentOS8 子系统
  2. 查看网络信息
    2.1. Win11中执行 ipconfig 发现 vEthernet (WSL) 这里的 IP 就是 WSL 中所有子系统的网关
    2.2. 进入各子系统如 CentOS7、CentOS8 执行 ip route show | grep -i default | awk '{ print $3}' 可以验证。
  • CentOS7CentOS8 执行相样的操作,创建 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.0182.28.38.255
      这意味着这个子网中排除掉网络地址( 182.28.38.0)和广播地址(182.28.38.255),
      可用的 IP 地址范围是从 182.28.38.1182.28.38.254 数量为 254 个。
    • --gateway=182.28.38.1:指定这个网络的网关地址为 182.28.38.1。(网关又占一个,只剩253了)
    • -o parent=eth0:表示这个 MAC VLAN 网络所基于的物理网络接口是 eth0,即这个新创建的网络将通过 eth0 与外部网络进行通信。
      使用 ip link show 可以查看我们的物理网卡名子。通常是以 ethenpens开头。
      比如我这里宿主机的物理网卡名就叫 eth0
    • my-macvlan-network:为新创建的网络指定一个名称。
  • 然后,分别在 CentOS7CentOS8 运行容器并让其连接到 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
    在这里插入图片描述

  • 实现宿主与容器间通信
    前面工作完成后发现,容器可以互通了,但是容器与宿主不通。

    1. 对创建 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
      
    2. 接下来我们用 linux 命令创建一个 macvlan 取名 macvlan2

    3. 在上面两容器所在网段选个空闲 IP 比如 182.28.38.120 绑给 macvlan2

    4. 在宿主机上设置下路由,让 182.28.38.0182.28.38.255 都走 macvlan2

    5. 这样就宿主机就可以与容器通信了。

      # 创建另一个 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 网络

  1. 类似于 Macvlan,但在 IP 层而不是 MAC 层操作。
  2. 容器可以直接在三层网络中通信。
  3. 适用于需要高性能网络的应用。
  4. 需要宿主机支持 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 命令行基础命令
官方例子


http://www.kler.cn/a/302634.html

相关文章:

  • Ceph 中PG与PGP的概述
  • 前缀和技巧解析
  • IC 脚本之python
  • Python高级编程模式和设计模式
  • python制作一个简单的端口扫描器,用于检测目标主机上指定端口的开放状态
  • Springboot配置全局异常通用返回
  • 外贸网站建设该怎么做
  • Certbot 生成 SSL 证书并配置自动续期
  • android 发一个可以下载的的android studio历史版本
  • 深度学习——pycharm配置远程服务器(蓝耘GPU智算云)
  • JavaScript拷贝的艺术:玩转深拷贝和浅拷贝
  • Arcgis字段计算器:随机生成规定范围内的数字
  • vue2中使用web worker启动定时器
  • 25届计算机专业选题推荐-基于微信小程序的校园快递驿站代收管理系统
  • 修改docker的默认存储位置及镜像存储位置
  • 无人机低空安全管控系统技术详解
  • 2024年9月13日随笔
  • c++中extern “C“的作用及理解
  • 【FFMPEG】FFplay音视频同步分析(下)
  • 仕考网:2525年国考时间是什么时候?
  • Maven基本使用(下)
  • 无头服务(Headless Service)
  • 按图搜索的实时性:阿里巴巴拍立淘API返回值的快速响应
  • 学懂C++(五十六): 深入理解MFC框架、底层原理及消息映射机制
  • openstack之glance介绍
  • 智能体-AI-Agent-简介