docker network 基本命令

本文深入探讨Docker网络的创建、连接、检查与管理。详细介绍了默认的bridge网络和overlay网络的特点,以及如何在多主机环境下配置overlay网络。文章还对比了默认网络与自定义网络在容器连接上的差异,并讲解了如何利用网络别名和DNS解析实现容器间的灵活通信。

docker network命令

docker network所有子命令如下:

  • docker network create
  • docker network connect
  • docker network ls
  • docker network rm
  • docker network disconnect
  • docker network inspect

创建网络

在安装Docker Engine时会自动创建一个默认的bridge网络docker0。 
此外,还可以创建自己的bridge网络或overlay网络。

bridge网络依附于运行Docker Engine的单台主机上,而overlay网络能够覆盖运行各自Docker Engine的多主机环境中。

创建bridge网络比较简单如下:

 # 不指定网络驱动时默认创建的bridge网络
 docker network create simple-network
 # 查看网络内部信息
 docker network inspect simple-network
 # 应用到容器时,可进入容器内部使用ifconfig查看容器的网络详情

但是创建一个overlay网络就需要一些前提条件(具体操作请参考Docker容器网络相关内容): 
- key-value store(Engine支持Consul、Etcd和ZooKeeper等分布式存储的key-value store) 
- 集群中所有主机已经连接到key-value store 
- swarm集群中每个主机都配置了下面的daemon参数 
- –cluster-store 
- –cluster-store-opt 
- –cluster-advertise 
然后创建overlay网络:

# 创建网络时,使用参数`-d`指定驱动类型为overlay
docker network create -d overlay my-multihost-network

就使用--subnet选项创建子网而言,bridge网络只能指定一个子网,而overlay网络支持多个子网。

在bridge和overlay网络驱动下创建的网络可以指定不同的参数,具体请参考:https://docs.docker.com/engine/userguide/networking/work-with-networks/

连接容器

创建三个容器,分别前两个使用默认网络启动容器,第三个使用自定义bridge网络启动。 
然后再将第二个容器添加到自定义网络。这三个容器的网络情况如下

  • 第一个容器:只有默认的docker0
  • 第二个容器:属于两个网络——docker0、自定义网络
  • 第三个容器:只属于自定义网络

说明:通过容器启动指定的网络会覆盖默认bridge网络docker0。

# 创建三个容器 conTainer1,container2,container3
docker run -itd --name=container1 busybox
docker run -itd --name=container2 busybox
# 创建网络mynet
docker network create -d bridge --subnet 172.25.0.0/16 mynet
# 将容器containerr2连接到新建网络mynet
docker network connect mynet container2
# 使用mynet网络来容器container3
docker run --net=mynet --ip=172.25.3.3 -itd --name=container3 busybox

# 查看这三个容器的网络情况
docker network inspect container1 # docker0
docker network inspect container2 # docker0, mynet
docker network inspect container3 # mynet

默认网络与自定义bridge网络的差异

默认网络docker0:网络中所有主机间只能用IP相互访问。通过--link选项创建的容器可以对链接的容器名(container-name)作为hostname进行直接访问。 
自定义网络(bridge):网络中所有主机除ip访问外,还可以直接用容器名(container-name)作为hostname相互访问。

# 进入container2内部
docker attach container2
ping -w 4 container3 # 可访问
ping -w 4 container1 # 不可访问
ping -w 4 172.17.0.2 # 可访问container1的IP
# Ctrl+P+Q退出容器,让container2以守护进程运行

默认网络与自定义bridge网络在容器连接的差别

在默认网络中使用link(legency link),有如下功能: 
- 使用容器名作为hostname 
- link容器时指定alias: --link=<Container-Name>:<Alias> 
- 配合--icc=false隔离性,实现容器间的安全连接 
- 环境变量注入

自定义网络中使用docker net提供如下功能: 
- 使用DNS实现自动化的名称解析 
- 一个网络提供容器的安全隔离环境 
- 动态地attach与detach到多个网络 
- 支持与--link选项一起使用,为链接的容器提供别名(可以是尚不存在链接容器,与默认容器中–link使用的最大差别)

默认网络中的link是静态的,不允许链接容器重启,而自定义网络下的link是动态的,支持链接容器重启(以及IP变化) 
因此,使用--link时链接的容器,在默认网络中必须提前创建好,而自定义网络下不必预先建好。

使用docker network connetct将容器连接到新网络中时,用参数--link链接相同的容器时,可以指定不同的别名,它们是针对不同网络的。

# 运行容器使用自定义网络,同时使用--link链接尚不存在的container5容器
docker run --net=mynet -itd --name=container4 --link container5:c5 busybox
# 创建容器container5
docker run --net=mynet -itd --name=container5 --link container4:c4 busybox
# 虽然是相同容器,但是在不同的网络环境连接中可以不同的alias链接
docker network connect --link container5:foo local_alias container4
docker network connect --link container4:bar local_alias container5

指定容器在网络范围的别名(Network-scoped alias)

Network-scoped alias就是指定容器在可被同一网络范围内的其他容器访问的别名。 
不同于link别名的是,link别名是由链接容器的使用者提供的,只有它自己可使用; 
而指定网络范围内别名,是由容器提供给网络中其它容器使用的。

Network-scoped alias:同一网络中的多个容器可以指定相同的别名,在使用的当然只有第一个指定别名的容器才生效, 
只有当第一个容器关闭时,指定相同别名的第二个容器的别名才会开始生效。

docker run --net=mynet -itd --name=container6 --net-alias app busybox
docker network connect --alias scoped-app local_alias container6
docker run --net=isolated_nw -itd --name=container7 --net-alias app busybox
docker network connect --alias scoped-app local_alias container7
# 在container4中
docker attach container4
ping app # 访问container6的IP
# 从container4中以守护进程运行退出:Ctrl+P+Q
docker stop container6
docker attach container4
ping app # 访问的container7的IP

断开网络与移除网络

# 容器从mynet网络中断开(它将无法再网络中的容器container3通讯)
docker network disconnect mynet container2
# 测试与容器container3失败
docker attach container2
ping contianer3 # 访问失败 

在多主机的网络环境中,在将容器用已移除的容器名称连接到网络中时会出现container already connected to network的错误, 
这时需要将新容器强制移除docker rm -f,重新运行并连接到网络中。

移除网络要求网络中所有的容器关闭或断开与此网络的连接时,才能够使用移除命令:

# 断开最后一个连接到mynet网络的容器
docker network disconnet mynet container3
# 移除网络
docker network rm mynet
<think>好的,我现在需要帮助用户学习和练习Docker基本命令。首先,我得整理一下用户的需求。用户提到了几个引用内容,里面涉及Dockerfile、docker build、docker exec、docker-compose的安装、运行容器、端口映射、后台运行等。可能用户是刚开始接触Docker,需要从基础命令入手。 首先,我应该按照Docker基本使用流程来组织内容,比如从安装、镜像操作、容器管理、网络和存储卷,再到Docker Compose。这样结构清晰,用户能一步步跟着学。用户提供的引用中有提到docker run的各种参数,比如--name、-d、-it、-p,这些需要详细解释,因为它们是创建和运行容器的关键。 然后,用户提到的引用里有安装docker-compose的部分,可能用户也需要了解如何编排多容器应用,所以得包括docker-compose的基本用法。此外,用户引用的博客中有安装Redis的例子,或许可以举一个实际例子,比如运行Nginx或Redis,这样用户能更直观地理解命令的使用。 还要注意用户提到的在容器内执行命令,比如docker exec,这也是管理容器的重要部分。另外,Dockerfile的使用和构建镜像的过程也需要涵盖,因为用户引用1提到了这点。 需要检查是否有遗漏的基础命令,比如查看日志、容器状态、停止删除容器等。这些日常操作对用户练习很重要。同时,用户可能对网络和存储卷不太熟悉,需要简单介绍,但不用太深入,避免信息过载。 最后,生成相关问题时要围绕用户可能遇到的下一步问题,比如如何优化镜像、管理数据持久化、调试容器等,这样能帮助用户深化学习。确保引用标记正确,每个引用对应到用户提供的参考内容,比如docker exec对应引用1,docker-compose安装对应引用2,运行应用对应引用3,安装Redis对应引用4,docker run参数对应引用5。 现在需要确保所有命令的示例正确,符合LaTeX格式要求,行内公式用$...$,独立公式用$$...$$,但这里可能更多是代码块和命令,所以注意代码块的格式。另外,回答用中文,结构清晰,分步骤讲解,最后的问题要相关且有针对性。</think>### Docker基本命令教程 Docker是容器化技术的核心工具,以下是基本命令的分类整理和操作示例: --- #### 一、安装与配置 1. **安装Docker引擎** - Ubuntu示例: ```bash sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io ``` - macOS/Windows可通过[Docker Desktop](https://www.docker.com/products/docker-desktop)安装。 2. **安装docker-compose** ```bash curl -L https://get.daocloud.io/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose # 添加执行权限[^2] ``` --- #### 二、镜像操作 1. **构建镜像** 编写`Dockerfile`后执行: ```bash docker build -t my-image:latest . # -t指定标签,.表示当前目录[^1] ``` 2. **管理镜像** ```bash docker images # 查看本地镜像 docker pull nginx # 拉取公共镜像 docker rmi <镜像ID> # 删除镜像 ``` --- #### 三、容器管理 1. **启动容器** ```bash docker run -d --name my-nginx -p 80:80 nginx # 后台运行,映射端口[^5] docker run -it ubuntu /bin/bash # 交互式进入容器[^5] ``` 2. **查看与操作容器** ```bash docker ps -a # 查看所有容器(包括已停止的) docker start/stop <容器ID> # 启动/停止容器 docker exec -it my-nginx /bin/bash # 进入运行中的容器执行命令[^1] docker rm <容器ID> # 删除容器 ``` --- #### 四、网络与存储 1. **网络配置** ```bash docker network create my-network # 创建自定义网络 docker run --network=my-network --name service1 my-image # 指定网络启动容器 ``` 2. **数据卷挂载** ```bash docker run -v /宿主机路径:/容器路径 nginx # 绑定目录 docker volume create my-volume # 创建数据卷 ``` --- #### 五、Docker Compose 1. **编写`docker-compose.yml`** ```yaml version: '3' services: web: image: nginx ports: - "80:80" ``` 2. **启动服务** ```bash docker-compose up -d # 后台启动多容器应用 docker-compose down # 停止并清理资源 ``` --- #### 六、实战示例:运行Python Flask应用 1. **编写Dockerfile** ```dockerfile FROM python:3.8 COPY . /app WORKDIR /app RUN pip install flask CMD ["python", "app.py"] ``` 2. **构建并运行** ```bash docker build -t flask-app . docker run -d -p 5000:5000 flask-app # 映射Flask默认端口[^3] ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值