docker可以给镜像做端口映射
基本的命令是 -P(大写) :Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
基本的命令是-p(小写的P):Docker则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。
支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
docker run -d -p 80:8080 tomcat:7.0.55
//
本地的80端口到容器的8080端口(所有地址)
docker run -d -p 127.0.0.1::8080
/udp
tomcat:7.0.55
//127
地址的随机端口到容器的8080端口(UDP协议)
可以通过port指令查看内部端口的映射信息
[[email protected]_0 ~]# docker port a65f82f9b142 80
0.0.0.0:8081
当Docker启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段( 172.17.0.0/16 )的地址。
当创建一个Docker容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI 2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker就创建了在主机和所有容器之间一个虚拟共享网络
11.把镜像的依赖关系绘制成图
docker images命令有一个很拉风的选项:-viz,可以把镜像的依赖关系绘制成图并通过管道符号保存到图片文件:
# 生成一个依赖关系的图表
|
这样,主机的当前路径下就生成了一张png图,然后,用python开启一个微型的HTTP服务器:
python -m SimpleHTTPServer
|
然后在别的机器上用浏览器打开:
http: //machinename :8000 /docker .png
|
OK,依赖关系一目了然!
(译者注:要使用dot命令,主机要安装graphviz包。另外,如果主机ip没有绑定域名,machinename换成主机的ip即可。)
12.Docker把东西都存到哪里去了?
Docker实际上把所有东西都放到/var/lib/docker路径下了。切换成super用户,到/var/lib/docker下看看,你能学到很多有趣的东西。执行下面的命令:
$ sudo su
|
可以看到不少目录,containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样你就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如 何一层一层叠加起来的。
13.Docker源代码:Go, Go, Go, Golang!
Docker的源代码全部是用Go语言写的。Go是一门非常酷的语言。其实,不只是Docker,很多优秀的软件都是用Go写的。对我来说,Docker源文件中,有4个是我非常喜欢阅读的:
commands.go
docker的命令行接口,是对REST API的一个轻量级封装。Docker团队不希望在命令中出现逻辑,因此commands.go只是向REST API发送指令,确保其较小的颗粒性。
api.go
REST API的路由(接受commands.go中的请求,转发到server.go)
server.go
大部分REST API的实现
buildfile.go
Dockerfile的解析器
有的伙计惊叹”Wow!Docker是怎么实现的?!我无法理解!”没关系,Docker是开源软件,去看它的源代码就可以了。如果你不太清楚Dockerfile中的命令是怎么回事,直接去看buildfile.go就明白了。
14.运行几个Docker后台程序,再退出容器,会发生什么?
OK,倒数第二个要点。如果在Docker中运行几个后台程序,再退出Docker容器,会发生什么?答案是:不要这么做!因为这样做后台程序就全丢了。
Dockerfile中用RUN命令去开启一个后台程序,如:
RUN pg_ctl start
|
这样的话,RUN命令开启的后台程序就会丢失。调用容器的bash连到容器的shell:
$ docker run -i -t postgresimage bash
|
然后调用 ps aux查看进程,你会发现postgres的进程并没有跑起来。 RUN命令会影响文件系统。因此,不要再Dockerfile中用启动后台程序,要把后台程序启动成前台进程。或者,像一些高手提议的那样,写一个启动脚 本,在脚本中启动这些后台程序或进程。
15.容器之间进行友好沟通:链接
这是最拉风的功能!我把它留到最后压轴!这是0.6.5中最重要的新功能,我们前面已经提过两次了。运行一个容器,给它一个名称,在下面的例子中,我们通过-name参数给容器指定名称”loldb”:
$ docker run -d -name loldb loldbimage
|
再运行另一个容器,加上-link参数来连接到第一个容器(别名为loldb),并给第二个容器也指定一个别名(这里用的是cheez):
$ docker run -link /loldb :cheez otherimage env
|
顺便得到cheez的环境变量:
CHEEZ_PORT=tcp: //172 .17.0.8:6379
|
这样,我们就在两个容器间建立起一个网络通道(bridge),基于此,我们可以建立一个类似rails的程序:一个容器可以访问数据库容器而不对外暴露其他接口。非常酷!数据库容器只需要知道第一个容器的别名(在本例中为cheez)和要打开的端口号。所以数据库容器也可以env命令来查看这个端口是否打开。