Docker学习过程 (6-网络基础)

关于网络,数据和是这样写的:
  容器技术的特点就是隔离性,网络作为计算机重要资源之一,自然也在容器隔离的范围之内。Docker通过Network Namespace的方式,为每一个容器建立了独立的王伦,形成了完全与宿主机隔离的环境。
  默认情况下,Docker启动时会在宿主机上架一个名为 docker0 的虚拟网络,用来连接宿主机与容器。
  容器启动时,Docker会把在宿主机上的网络通过Network Namespace 建立的独立网络,通过 Veth Pair 连接到 docker0 所在的虚拟网络上。Veth Pair 是专门用于虚拟网卡间通信的通道。
&emps; 通过 Veth Pair 在本来已经隔离的 Network Namespace 打出一个小孔,把容器内部网络与容器外部网络连接起来。 [1]
如下图:
Docker学习过程 (6-网络基础)

上述方式可以让容器访问外界,但外界不能访问容器内部。所以另外还可以通过容器的网络端口和宿主机的网络端口直接映射,实现跳过 docker0 ,直接实现外部网络对容器的访问。

基本命令

sudo docker inspect $container 		#查看网络网络的信息包含在返回的 NetworkSettings 字段
sudo docker run -P $container		#通过-P 让容器端口和宿主机端口在容器启动时随机绑定
sudo docker ps -l 					#返回字段可以看见具体的绑定方式
sudo docker run -p $hport:$cport $container 	#通过-p, 让容器 $container 的 $cport 端口绑定到宿主机 $hport 端口。
sudo docker run -p $ip:$hport:$cport $container	# $ip 指定的宿主机的 $hport 端口绑定到容器的 $cport 端口
sudo docker run -p $c1port:$c2port --link $container2 $container1 
									#让 $container1 的 $c1port 与 $container2 的 $c2port 端口连接
进入容器内部可以查看网络连接。
实践
查看网络配置
sudo docker run -d -P --name web nginx 	#-d 是让容器后台运行,免得占用终端
sudo docker run -d -p 80:80 -p 443:443 --name web2 nginx #用多个 -p 可以多个端口一起来
sudo docker ps -l					# 查看最近一个容器
sudo docker inspect web

Docker学习过程 (6-网络基础)
Docker学习过程 (6-网络基础)

连接容器网络
sudo docker run -d -p 80:80 -p 443:443 --name mysql --link web2:WEB mysql
										#mysql 连接上面的 web2。这里的 web2:WEB 是把 web2 在 mysql 里面重命名为 WEB。不重命名也可以!
sudo docker run -d -p 82:82 -p 444:400 --name mysql2 --link web2:WEB mysql
sudo docker exec -it web2 /bin/bash		#进入 web2 内部
env 									#查看环境变量

Docker学习过程 (6-网络基础)
第一行代码报错,因为端口已经被占用了,这也在意料之中。
Docker学习过程 (6-网络基础)
书上说可以看见容器连接相关的环境变量,但我好像没看到。可能是书上的是用 web 去连 mysql,我的是用 mysql 连接 web。但感觉不对,先不管了,学多了再回头看自然会知道!!