Docker 常用命令(未完待续...)

Docker 常用命令(未完待续...)

  • 命令的完整名称和别名
  • 帮助
  • 登录和搜索命令 (Login and Search Commands)
  • 其他管理命令 (Other Management Commands)
  • 镜像命令 (Image Commands)
  • 容器命令 (Container Commands)
    • [docker run 从镜像创建并运行一个新的容器](#docker run 从镜像创建并运行一个新的容器)
      • [docker run 运行一个容器,并让其不会自动退出](#docker run 运行一个容器,并让其不会自动退出)
      • [docker run --rm 临时运行容器](#docker run --rm 临时运行容器)
      • [docker run --volume 绑定挂载](#docker run --volume 绑定挂载)
      • [docker run --mount 绑定挂载](#docker run --mount 绑定挂载)
    • [docker attach 进入运行中的容器](#docker attach 进入运行中的容器)
    • [docker exec 在运行中的容器执行命令](#docker exec 在运行中的容器执行命令)
    • [docker cp 复制文件](#docker cp 复制文件)
    • [docker logs 查看容器日志](#docker logs 查看容器日志)
  • 网络命令 (Network Commands)
    • [docker network create 创建网络](#docker network create 创建网络)
      • [创建 bridge 网络](#创建 bridge 网络)
      • [**创建 None 网络**](#创建 None 网络)
      • [创建 Host 网络](#创建 Host 网络)
      • [* 创建 Overlay 网络](#* 创建 Overlay 网络)
      • [创建 Macvlan 网络](#创建 Macvlan 网络)
        • [在两台主机上创建相同的 macvlan 网络,并运行容器,互 Ping](#在两台主机上创建相同的 macvlan 网络,并运行容器,互 Ping)
      • [* 创建 IPvlan 网络](#* 创建 IPvlan 网络)
    • [docker network connect 连接容器到网络](#docker network connect 连接容器到网络)
  • 卷命令 (Volume Commands)
  • 参考资料

命令的完整名称和别名

镜像命令 为例:
全名: docker image xx 所有镜像命令都以 docker image 开头
别名: docker xx 也就是我们常用的简写方式,省掉了中间的 image

其他比如 容器命令网络命令 等等也都是同理。为了省点字,同时也符合使用习惯,下文中有别名的就用别名了。

帮助

命令 说明
docker --help 查看帮助信息
docker 命令 --help 查看指定命令的帮助信息
官方文档 Docker 命令行基础命令 查看更详细的说明
命令 说明 示例
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](#— 命 令 选 项 —— 说明 示例 (名称可以换成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 my_container
[docker attach](#— 命 令 选 项 —— 说明 示例 (名称可以换成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 attach my_container
[docker exec](#— 命 令 选 项 —— 说明 示例 (名称可以换成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 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](#— 命 令 选 项 —— 说明 示例 (名称可以换成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 cp my_container:/path/in/container /local/path
docker diff 检查容器文件系统的更改 docker diff my_container
docker port 列出容器的端口映射或特定映射 docker port my_container
[docker logs](#— 命 令 选 项 —— 说明 示例 (名称可以换成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 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:实现运行一个容器并让它保持住不自动退出。
bash 复制代码
docker run -dit --name bb1 busybox

docker run --rm 临时运行容器

默认情况下,容器退出后其文件系统和相关数据仍然保留,便于调试和数据持久化。

使用 --rm 可以让容器退出时自动清除容器并删除匿名卷(与容器关联的匿名卷)。

bash 复制代码
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 退出容器自动清理
    bash 复制代码
    echo hahaha > hostname
    docker run --rm -v ./hostname:/etc/hostname busybox cat /etc/hostname 

    对比下原始内容,是类似这样的字符串 18a8c1299f0f

    bash 复制代码
    docker run --rm busybox cat /etc/hostname
  • --volume 只读挂载

    在容器中挂载点后加上:ro 即为只读。现在进去写一下,保存就会看到只读警告了。

    bash 复制代码
    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 内容一样。
    bash 复制代码
    docker run --rm -p 80:80 -v ./html:/usr/share/nginx/html nginx ls /usr/share/nginx/html

    对比下原始内容,原本有 50x.html,index.html 两个文件

    bash 复制代码
    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 实现。

    bash 复制代码
    docker run --rm \
    --mount type=bind,src=./hostname,dst=/etc/hostname \
    busybox cat /etc/hostname 
  • --mount 挂载目录

    将前面 --volume 的例子换成 --mount 实现。如果目标存在则覆盖。

    bash 复制代码
    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 即为只读。现在进去写一下,保存就会看到只读警告了。

    bash 复制代码
    docker run --rm -it \
    --mount type=bind,src=./hostname,dst=/etc/hostname,readonly \
    busybox sh

docker attach 进入运行中的容器

直接连接到正在运行的容器,查看或控制它的输出,就像在本地终端操作一样。

bash 复制代码
docker attach 容器名
直接退出 脱离容器,并让其保持后台运行
exitCtrl + c Ctrl + pCtrl + q

docker exec 在运行中的容器执行命令

格式: docker exec <容器名> <命令> [参数]

在运行的容器 bb 中执行命令 ls 参数 /

bash 复制代码
docker exec bb ls /

docker cp 复制文件

先开一个容器

bash 复制代码
docker run --name bb -dit \
--mount type=bind,src=./hostname,dst=/etc/hostname,readonly \
busybox sh
  • 宿主机 拷贝到 容器
    bb容器中的/etc/hostname 复制到当前目录下,并命名为 hostname001

    bash 复制代码
    docker cp bb:/etc/hostname hostname001
  • 容器 拷贝到 宿主机
    将当前目录下的 test.txt 复制到 bb 容器中的/test/999.txt

    bash 复制代码
    docker cp test.txt bb:/test/999.txt

    目录文件夹必须存在,如果不存在,可以先创建一下docker exec bb mkdir /test

docker logs 查看容器日志

实时查看容器的日志。初始 10 行

bash 复制代码
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 解析服务,通常我们会自己创建一个来用。
  • 创建一个桥接网络
bash 复制代码
docker network create -d bridge my-bridge-network
  • 创建三台容器 bb1,bb2,bb3 ,并加入 my-bridge-network
bash 复制代码
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宿主外网
bash 复制代码
#!/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

bash 复制代码
docker run -dit --name bbn1 --network none busybox
docker run -dit --name bbn2 --network none busybox

两个容器互 ping 不通

bash 复制代码
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 即可。

bash 复制代码
docker run -dit --name bbh1 --network host busybox
docker run -dit --name bbh2 --network host busybox

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

bash 复制代码
docker exec bbh1 ping -c3 www.baidu.com
docker exec bbh2 ping -c3 www.baidu.com

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

bash 复制代码
docker exec bbh1 ip addr

* 创建 Overlay 网络

  1. 用于 Docker Swarm 模式下的多主机网络。
  2. 允许容器跨多个 Docker 守护进程进行通信。
  3. 提供分布式服务发现和负载均衡。
  4. 适合集群环境下容器间的通信。
bash 复制代码
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不然会造成冲突。

    bash 复制代码
    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

    bash 复制代码
    docker run -dit --name c1 --net=my-macvlan-network --ip=182.28.38.11 busybox

    CentOS8 设定IP :182.28.38.12

    bash 复制代码
    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' 这句直接给容器说,你用这个访问宿主。

      bash 复制代码
      # 创建 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. 这样就宿主机就可以与容器通信了。

      bash 复制代码
      # 创建另一个 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

      顺便附上卸载方法:先停掉,后删除

      bash 复制代码
      sudo ip link set macvlan2 down
      sudo ip link del macvlan2

* 创建 IPvlan 网络

  1. 类似于 Macvlan,但在 IP 层而不是 MAC 层操作。
  2. 容器可以直接在三层网络中通信。
  3. 适用于需要高性能网络的应用。
  4. 需要宿主机支持 IPvlan。
bash 复制代码
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 [选项] <网络> <容器>

bash 复制代码
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 命令行基础命令
官方例子

相关推荐
wclass-zhengge8 分钟前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇14 分钟前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试2 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!8 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林9 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis11 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision11 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge11 小时前
Docker篇(Docker Compose)
运维·docker·容器
北漂IT民工_程序员_ZG12 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
梦魇梦狸º15 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github