Docker 入门到实战教程(四)容器链接
在使用Docker容器时,我们需要访问容器的内部网络,或需要在容器间相互访问。Docker 容器默认不会开放任何端口,因此需要将容器与宿主机进行端口映射,使容器可外部访问。而容器间互相访问,除了可以基于端口映射进行访问外,还可以通过容器链接(Link)的方式,也可以通过Docker 网络(Networking)实现。
一. 端口映射与外部访问容器
Docker 容器运行后默认不会开启任何网络端口,这样就无法通过网络访问容器。要使容器可以通过外部网络访问Docker 容器的内部网络,就需要将容器端口与宿主机端口建立映射关系。
容器与宿主机间建立端口映射关系时,可以在运行容器时使用-P或-p参数指定端口映射。两者区别如下:
- -P参数会随机分配一个49000~49900之间的端口到容器内部开放的网络(通过EXPORT指定的)端口
- -p则可以具体指定要映射的端口,并且在一个指定端口上只能绑定一个容器
1.1 -P绑定宿主机随机端口
-P
参数会随机绑定一个49000~49900之间的端口所运行容器的导出端口。
如,运行一个容器,并使用-P绑定宿主机端口:在上一篇我拉取了一个 python 应用的镜像
docker run -d --name webapp-test -P training/webapp
file
在这个示例中,我们通过training/webapp镜像创建并运行了一个名为webapp-test的容器。运行容器时,我们通过-P参数进行了端口映射。这时,可以通过docker ps命令查看所分配的端口号:
如上所示,宿主机的32770端口被绑定到了容器的5000端口。
1.2 -p指定端口、IP地址绑定
如果不想使用随机端口,则可以使用-p参数来指定要绑定的端口号。-p参数除了可以指定端口号外,还可以指定宿主机的IP。-p
支持以下几种绑定格式:
// 绑定宿主机IP及端口
ip:hostPort:containerPort
// 绑定宿主机IP
ip::containerPort
// 绑定宿主机端口
hostPort:containerPort
1.2.1 绑定宿主机所有的IP
使用hostPort:containerPort格式进行宿主机及容器端口映射时,默认会将宿主机的所有IP绑定到容器。如:
docker run -d --name webapp-test -p 5000:5000 training/webapp
在这个示例中,将宿主机的5000端口映射到了容器的5000端口。在这种情况下,会绑定本地所有接口上的所有IP地址
1.2.2 映射到指定地址的指定端口
使用ip:hostPort:containerPort格式可以将宿主机指定的IP及端口,绑定到容器端口。
如,绑定127.0.0.1IP到容器:
docker run -d --name webapp-test -p 127.0.0.1:5000:5000 training/webapp
1.2.3 映射指定地址及随机端口
ip::containerPort格式会绑定宿主机的指定IP地址及随机端口到容器端口。如:
docker run -d --name webapp-test -p 127.0.0.1::5000 training/webapp
使用docker ps查看所分配的端口:
file
1.3 其它
在前面示例中,我们通过docker ps
查看已创建的容器及容器所绑定的端口。除了docker ps命令外,还可以使用docker port查看所绑定的端口及IP地址:
docker port webapp-test
file
容器内部可能会使用多个网络端口,使用docker port
命令时,可以指定端口参数,以查看容器指定端口的绑定情况:
docker port webapp-test 5000
file
在创建/运行容器时,-p参数可以被多次使用,以绑定多个容器端口:
docker run -d --name webapp-test -p 5000:5000 -p 6000:80 training/webapp
Docker进行端口绑定时,默认都是绑定 tcp 端口,如果要绑定 UDP端口,可以在端口后面加上 /udp:
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
file
二. 容器链接(Link)
端口映射并不是唯一把 docker 连接到另一个容器的方法。 docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。 docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
2.1 容器的命名
Docker的连接系统会依据容器的名称来进行连接,因此,首先需要定义容器的名称。在不指定容器命令的情况,docker 会自动对它进行命名。另外,我们也可以使用 --name
标识来命名容器,例如:
docker run -d -P --name webapp training/webapp python app.py
命令并运行容器后,可以通过docker ps命令来查看相关信息。也可以使用docker inspect命令来查看容器的名称:
file
docker inspect -f "{{ .Name }}" 8afb061a2da9
file
2.2 容器的互联
使用--link参数可以让容器间安全的进行互联。
2.2.1 下载postgres镜像
docker pull postgres:9.4
file
2.2.2 新建一个数据库容器
docker run -d --name db -e POSTGRES_PASSWORD=123456 postgres:9.4
file
2.2.3 新建一个web容器和postgres容器互联
docker run -d -P --name web --link db:db training/webapp python app.py
file
--link
表示建立容器互联,参数为name:alias
,name
是要链接的容器名称,alias
是我们取得别名
通过--link
参灵敏,Docker 会在两个互联的容器之间创建了一个安全的隧道,且不用映射它们的端口到宿主主机上。在前面我们启动db容器的时,并没有使用-p和-P参数,从而避免了暴露数据库端口到外部网络上,增加了容器的安全性。
2.3 查看新建的容器
docker ps
file
web容器的hosts文件也发生了变化,我们可以看下
docker exec -it web /bin/bash
cat /etc/hosts
file
这里面有两个ip,一个是web的,一个是db的,我们可以用ping命令查看这个两个ip之间能否ping通
ping db
file
ping 1efe89571e10
file
ping 172.18.0.11
file
建立链接没问题!我们启动db容器的时候,没有通过-p指定端口,避免了数据库端口暴露在外部网络,这样很安全。
三. Docker网络(Networking)
Docker Networking允许用户创建自己的网络,容器间可以通过这个网络互相通讯。Docker Networking允许容器跨越不同的宿主机通讯,且网络配置方式更灵活。
Docker Engine 会在引擎安装时自动创建一个名为bridge(桥接)网络,这个网络会与docker0(Docker内部网络)相对应。
除此之外,用户还可以自行创建bridge或overlay类型的网络。bridge网络适用于单台宿主机运行的单Docker引擎环境,而overlay网络允许我们跨多台宿主机进行通讯。
3.1 创建网络
要实现Docker Networking互联,首先要使用docker network create命令创建一个网络:
docker network create -d bridge test-net
参数说明:
-
-d:
参数指定 Docker 网络类型,有 bridge、overlay。
其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
现在可以通过docker network inspect
查看这个新建的网络:
file
使用docker network
ls命令也可以看到这个新建的网络
docker network ls
file
3.2 创建容器并连接到网络
创建网络后,可以在创建容器时通过--network
参数指定容器要使用的网络:
docker run -d --name db2 --network=test-net training/postgres
file
使用docker network inspect查看的网络情况:
docker network inspect test-net
file
可以看到test-net
网络的Containers参数中,包含了网创建的容器的信息,表中容器已连接到我们所创建的网络,而该容器的IP地址为172.19.0.2/16。
接下来,创建一个交互式容器,并查看该容器内部的网络情况:
docker run -it --name web3 --network=test-net training/webapp /bin/bash
file
然后使用ping
测试是否可以连接到db2
容器:
ping db2
file
由此可见在同一网络中的容器是可以互相访问的。
3.3 将已有容器连接到Docker网络
当需要将已在运行的容器添加到已有的网络时,可以使用docker network connect命令。
删除刚创建的web容器,并使用以下命令重新创建:
docker ps -a
docker rm 5f5e095922f2
docker run -d --name web3 training/webapp python app.py
file
将这个容器连接到已创建的名为test-net的网络:
docker network connect test-net web3
使用docker network inspect
查看的网络情况,Containers
节点内容如下:
file
一个容器可以连接入多个网络,从而构建出非常复杂的网络模型。
3.4 断开网络与网络删除
可以使用docker network disconnect
命令将容器与网络断开连接:
docker network disconnect test-net web3
这样就将容器web3与网络test-net断开的了连接。
网络不在需要后,可以使用docker network rm命令将网络删除:
docker network rm test-net
注意:删除网络时,需要已断开所容器的连接,否则会删除失败。
参考链接: http://suo.im/5EYLab
- [原创]Fluent NHibernate之旅(三)-- 继承
- Web应用手工渗透测试——用SQLMap进行SQL盲注测试
- IIS4\IIS5 CGI环境块伪造0day漏洞
- [原创]Fluent NHibernate之旅(四)-- 关系(上)
- 基于流量的OpenSSL漏洞利用检测方法
- [原创]Fluent NHibernate之旅(四)-- 关系(中)
- 华为专家 | 轻量化微服务测试实践
- Android Material Design系列之Navigation Drawer
- [原创]Fluent NHibernate之旅(四)-- 关系(下)
- 一次通过漏洞挖掘成功渗透某网站的过程
- 使用fuzzDB进行web安全测试
- Android Material Design系列之FloatingActionButton和Snackbar
- Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
- Android Material Design系列之Toolbar
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SharedPreferences VS MMKV
- 第009课 gcc和arm-linux-gcc和Makefile
- Go 每日一库之 quicktemplate
- 第010课 掌握Jz2440_ARM芯片时钟体系
- 第011课 Jz2400串口(UART)的使用
- 面试官看完我手写的单例直接惊呆了!
- 安利几个JS开发小技巧
- 深入理解Pod(一)
- [902]python list排序
- 第012课 内存控制器与SDRAM
- 一篇文章教给你Bypass学习基础
- 第013课 S3c2440代码重定位详解
- [901]sqlite数据库的导出与导入
- 【React】730- 从 loading 的 9 种写法谈 React 业务开发
- 第014课 Jz2400_ARM异常与中断体系详解