1.端口映射现实访问容器
1.1从外部访问容器应用
在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过 -P 或 -P 参数来指定端口映射。当使用-P标记时,docker 会随机映射一个49000~49900的端口至容器内部开放的网络端口:
docker run -d -P centos ping www.baidu.com
docker ps -l
查看日志信息
docker logs -f name
-p (小写)则可以指定要映射的端口并且在一个指定端口上只可以绑定一个容器。支持格式为 ip:hostPort:containerPort |ip::containerPort | hostpost:containerport.
1.2. 映射所有接口地址
使用hostport:containerport 格式将本地的5001端口映射到容器的5001端口,可以执行如下格式
[root@kubernetes /data/docker/dbdata]# docker run -d -p 5001:5001 --name ceshi training/webapp python app.py
e75bbe91989b2a59f447112a84bcdc5a7d4213fe559728409bbaf2a09b0e6551
#查看
[root@kubernetes /data/docker/dbdata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e75bbe91989b training/webapp "python app.py" 2 seconds ago Up 2 seconds 5000/tcp, 0.0.0.0:5001->5001/tcp ceshi
此时默认会绑定本地所有接口上的所有地址。多次使用 -p 标记可以绑定多个端口。
docker run -d -p 5000:5000 -p 80:3000 centos ping www.baidu.com
#查看
[root@ybsrv1 /data/webapp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b627d6330b83 centos "ping www.baidu.com" 24 seconds ago Up 23 seconds 0.0.0.0:5000->5000/tcp, 0.0.0.0:80->3000/tcp condescending_einstein
7265c5c841b8 centos "/bin/bash" 22 hours ago Up 8 minutes db1
1.3.映射到指定地址的指定端口
[root@ybsrv1 /data/webapp]# docker run -d -p 127.0.0.1:5000:5000 centos ping www.baidu.com
eecc1d011cff8c1ad7ce3e0c577efffe66860c260a3394a4ced80f967bc5df50
[root@ybsrv1 /data/webapp]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eecc1d011cff centos "ping www.baidu.com" 3 seconds ago Up 2 seconds 127.0.0.1:5000->5000/tcp ecstatic_pasteur
7265c5c841b8 centos "/bin/bash" 22 hours ago Up 18 minutes db1
1.4. 映射到指定地址的任意端口
[root@kubernetes /data/docker/dbdata]# docker run -d -p 127.0.0.1::5000 --name test training/webapp python app.py
511cb93f3fedb42f200f9f0a0772183b8f9dcff3460faa68d34d128506f2c860
[root@kubernetes /data/docker/dbdata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
511cb93f3fed training/webapp "python app.py" 2 seconds ago Up 2 seconds 127.0.0.1:32768->5000/tcp test
使用udp标记指定udp端口
docker run -d -p 127.0.0.1:5000:5000/udp centos ping www.baidu.com
1.5. 查看映射端口配置
使用docker port来查看当前映射的端口配置,也可以查看到绑定的地址
[root@kubernetes /data/docker/dbdata]# docker port test 5000
127.0.0.1:32768
注: 容器内的ip地址可以通过docker [container] inspect +r=容器ID查看
2, 容器互联实现容器间通信
容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。它会在源和接收器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP地址
2.1 自定义容器命名
自定义的命名: 比较好记,比如一个Web 应用容器我们可以给它起名叫web,
当要连接其他容器时候(几遍重启),也可以使用容器名而不用改变,比如连接web容器到db容器
使用 --name 标记可以为容器命名
docker run -d -P --name web centos /bin/bash
使用docker ps来验证设定的命名;
[root@kubernetes /data/docker/dbdata]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
511cb93f3fed training/webapp "python app.py" 17 minutes ago Up 17 minutes 127.0.0.1:32768->5000/tcp web
使用docker inspect 来查看容器名字
[root@ybsrv1 /src/webapp]# docker inspect -f "{{ .Name }}" 45e785
/web
容器名字是惟一的,如果已经命名了一个叫web的容器,要先删除web容器
在执行docker [container] run 的时候如果添加 -- rm 标记,则容器在终止后会立即删除注意 -- rm 和 - d 参数不能同时使用
2.2 容器互联
使用 --link 参数可以让容器之间安全的进行交互
先创建一个新的容器
docker run -d --name db training/postgres
删除之前创建的web容器,并将它连接到db容器
docker run -d -P --name web --link db:db training/webapp python app.py
此时,db容器和web容器简历互联关系
-- link 参数格式为 --link name:alias 其中name 是要连接的容器名称,alias是这个链接的别名
查看容器连接
[root@kubernetes /data/docker/dbdata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8fc36b3fabe training/webapp "python app.py" 17 seconds ago Up 16 seconds 0.0.0.0:32771->5000/tcp web
5c83232ce3ae training/postgres "su postgres -c '/us…" 30 seconds ago Up 2 seconds 5432/tcp db
docker 在两个互联容器的之间建立一个安全隧道,而且不用映射他们的端口到宿主主机上。在启动db容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露数据库端口到外部网络上
docker 通过两种方式为容器公开链接信息
1. 更新环境变量
2. 更新/etc/hosts文件
使用env 命令查看web容器的环境变量
[root@kubernetes /data/docker/dbdata]# docker run --rm --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=81ee2bf69fde
DB_PORT=tcp://172.17.0.5:5432
DB_PORT_5432_TCP=tcp://172.17.0.5:5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root
其中DB_ 开头的环境变量是提供web容器链接到db容器使用的前缀采用大写链接别名
除了环境变量,docker 还添加host 信息到父容器的/etc/hosts的文件,下面是web容器的hosts文件
[root@kubernetes /data/docker/dbdata]# docker run -it --rm --name web2 --link db:db training/webapp /bin/bash
root@f1f565481664:/opt/webapp# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5 db 5c83232ce3ae
172.17.0.8 f1f565481664
这里有两个hosts信息,第一个是web容器,web容器用自己的id作为默认主机名, 第二个是db容器的ip和主机名。可以在web容器中安装ping命令来测试跟db容器的联通
[root@8a302a215d3c /]# ping db
PING db (172.17.0.111) 56(84) bytes of data.
64 bytes from db (172.17.0.111): icmp_seq=1 ttl=64 time=1.24 ms
64 bytes from db (172.17.0.111): icmp_seq=2 ttl=64 time=0.016 ms
^C
--- db ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.016/0.631/1.247/0.616 ms
可以连接多个子容器到父容器,比如可以连接多个web到db容器上