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 命令行基础命令 | 查看更详细的说明 | 
登录和搜索命令 (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 imagesdocker images -aq | 
| docker pull | 从仓库下载镜像 docker pull 镜像无版本号,默认最新镜像:[版本号] | docker pull my_image | 
| docker push | 将镜像上传到仓库 | docker push my_image | 
| docker rmi | 本地移除一个或多个镜像 删除所有镜像 | docker rmi my_imagedocker 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.tardocker 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 网络名 镜像使用默认的桥接网络模式启动容器。 也可以指定其他网络模式如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:实现运行一个容器并让它保持住不自动退出。
            
            
              bash
              
              
            
          
          docker run -dit --name bb1 busyboxdocker run --rm 临时运行容器
默认情况下,容器退出后其文件系统和相关数据仍然保留,便于调试和数据持久化。
使用 --rm 可以让容器退出时自动清除容器并删除匿名卷(与容器关联的匿名卷)。
            
            
              bash
              
              
            
          
          docker run --rm -it busybox shdocker run --volume 绑定挂载
当绑定挂载的卷的主机目录不存在时,Docker会自动为你在主机上创建这个目录。
- 
--volume 挂载文件 
 格式:docker run -v <宿主机文件>:<容器中文件> <镜像>- 宿主机 中在当前目录下生成一个 hostname文件
- 将当前目录下的文件./hostname挂载为容器中的/etc/hostname
- 最后执行 cat /etc/hostname查看显示hahaha
- 因为测试用懒得手删,加 --rm退出容器自动清理
 bashecho hahaha > hostname docker run --rm -v ./hostname:/etc/hostname busybox cat /etc/hostname对比下原始内容,是类似这样的字符串 18a8c1299f0fbashdocker run --rm busybox cat /etc/hostname
- 宿主机 中在当前目录下生成一个 
- 
--volume 只读挂载 在容器中挂载点后加上 :ro即为只读。现在进去写一下,保存就会看到只读警告了。bashdocker 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内容一样。
 bashdocker run --rm -p 80:80 -v ./html:/usr/share/nginx/html nginx ls /usr/share/nginx/html对比下原始内容,原本有 50x.html,index.html两个文件bashdocker 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实现。bashdocker run --rm \ --mount type=bind,src=./hostname,dst=/etc/hostname \ busybox cat /etc/hostname
- 
--mount 挂载目录 将前面 --volume的例子换成--mount实现。如果目标存在则覆盖。bashdocker run --rm -it -p 80:80 \ --mount type=bind,src=./html,dst=/usr/share/nginx/html \ nginx ls /usr/share/nginx/html
- 
--mount 只读挂载 在容器中挂载点后加上 ,readonly即为只读。现在进去写一下,保存就会看到只读警告了。bashdocker run --rm -it \ --mount type=bind,src=./hostname,dst=/etc/hostname,readonly \ busybox sh
docker attach 进入运行中的容器
直接连接到正在运行的容器,查看或控制它的输出,就像在本地终端操作一样。
            
            
              bash
              
              
            
          
          docker attach 容器名| 直接退出 | 脱离容器,并让其保持后台运行 | 
|---|---|
| exit或Ctrl + c | Ctrl + p再Ctrl + 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复制到当前目录下,并命名为hostname001bashdocker cp bb:/etc/hostname hostname001
- 
从 容器 拷贝到 宿主机 
 将当前目录下的test.txt复制到bb容器中的/test/999.txtbashdocker 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 网络
- 创建 bridge网络时,-d bridge作为默认网络驱动,可以省略。
- 所有加入 bridge网络的容器都会被分配一个私有 IP 地址。
- 该网络支持容器间、容器与宿主机间及容器与外部网络间的通信。
- 安装 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- bb1ping- bb2、- bb3、- 宿主、- 外网
            
            
              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 网络
- 不使用任何网络栈。
- 容器将不会被分配 IP 地址,也不具备任何网络功能。
- 适用于不需要网络连接的容器或测试用途。
注意:用户不能自己创建 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 网络
- 容器直接使用宿主机的网络。(就相当于它是宿主机上运行的一个程序)
- 容器共享宿主机的 IP 地址和端口。
- 适用于需要完全访问宿主机网络的应用程序。
- 可能会导致端口冲突等问题。
注意:用户不能自己创建 Host 网络,运行容器时直接 --network host 即可。
            
            
              bash
              
              
            
          
          docker run -dit --name bbh1 --network host busybox
docker run -dit --name bbh2 --network host busyboxbbh1、bbh2 ping 外网,就相当于我宿主机自己 ping 外网。
            
            
              bash
              
              
            
          
          docker exec bbh1 ping -c3 www.baidu.com
docker exec bbh2 ping -c3 www.baidu.com另外再看一下 bbh1、bbh2 的 ip addr 显示的和宿主机完全一样,因为就是同一个东西
            
            
              bash
              
              
            
          
          docker exec bbh1 ip addr* 创建 Overlay 网络
- 用于 Docker Swarm 模式下的多主机网络。
- 允许容器跨多个 Docker 守护进程进行通信。
- 提供分布式服务发现和负载均衡。
- 适合集群环境下容器间的通信。
            
            
              bash
              
              
            
          
          docker network create -d overlay my-overlay-network创建 Macvlan 网络
使用 macvlan 网络可以让容器直接通过宿主机的物理网卡与外界通信,提高了网络性能,并允许容器直接在网络中被识别。这对于需要高性能和直接访问的应用场景非常有用。
- 
工作原理 - 
MAC VLAN :技术允许在宿主机的物理网卡上创建一个或多个虚拟接口,每个接口都有一个独立的 MAC 地址。这些接口共享同一个物理网卡,但可以在不同的 VLAN 中。 
- 
容器网络 :在 Docker 中使用 macvlan网络时,Docker 会为每个加入该网络的容器分配一个 MAC 地址,并将其直接连接到宿主机的物理网卡上。
 
- 
- 
优点 - 
高性能 :由于容器直接使用宿主机的物理网卡,避免了通过桥接网络带来的额外开销。 
- 
独立 IP 地址 :容器可以拥有独立的 IP 地址,可以直接在网络中被识别。 
- 
直接通信:容器可以直接与外部网络通信,无需通过宿主机的网关或代理。 
 
- 
- 
使用场景 - 
高性能网络应用 :适用于需要高性能网络通信的应用程序。 
- 
直接访问:适用于需要直接访问容器的服务,例如在生产环境中直接暴露容器的服务给外部网络。 
 
- 
在两台主机上创建相同的 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不然会造成冲突。bashdocker 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.11bashdocker run -dit --name c1 --net=my-macvlan-network --ip=182.28.38.11 busybox为 CentOS8设定IP :182.28.38.12bashdocker 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'这句直接给容器说,你用这个访问宿主。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
- 
接下来我们用 linux 命令创建一个 macvlan 取名 macvlan2
- 
在上面两容器所在网段选个空闲 IP 比如 182.28.38.120绑给macvlan2。
- 
在宿主机上设置下路由,让 182.28.38.0到182.28.38.255都走macvlan2
- 
这样就宿主机就可以与容器通信了。 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顺便附上卸载方法:先停掉,后删除 bashsudo ip link set macvlan2 down sudo ip link del macvlan2
 
- 
* 创建 IPvlan 网络
- 类似于 Macvlan,但在 IP 层而不是 MAC 层操作。
- 容器可以直接在三层网络中通信。
- 适用于需要高性能网络的应用。
- 需要宿主机支持 IPvlan。
            
            
              bash
              
              
            
          
          docker network create -d ipvlan --ipvlan-mode=l2 --subnet=192.168.0.0/24 --gateway=192.168.0.1 my-ipvlan-networkdocker 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 |