之前都是单个容器的配置、启动、数据操作。
现在配置容器的网络和通信,通过端口,多个容器之间可以通信、互联、协作。
容器对外都可以借助实体机的网卡向外通讯,容器与容器之间可以像计算机一样通过网络互传,但是就会产生通讯成本,占用带宽。
容器内可以通过docker的虚拟网络互连,如果容器都在一台实体机上,可以不用通过网络,直接在内部搞定,降低通讯成本。
这样有好有不好。
好的方面:1、效率高;2、成本降低;
不好的方面:1、容器配置复杂了一些,如果容器很多,管理起来难度会增加;2、与传统的运维方式不一样,容易导致排查问题困难,学习成本也增加;
个人建议在带宽足够的情况下,容器不是海量的情况下,尽量让容器的运维方式与传统方式保持一致。
当然得根据实际的场景来定。
------------------------------------------------------------------
docker container inspect 容器ID 可以查看容器自己内部网络和IP地址,一般是172的地址,所以尽量实体机不要使用这些地址,避免维护上和运行上的问题
------------------------------------------------------------------
将容器的端口映射到实体机的端口上,提供对外通信的能力
docker container run -P 镜像名 容器名 当 大写P 时,随机给容器分配个端口,docker container ps -l 可以看到端口信息
docker container run -p 5000:5000 -p 3000:80 镜像名 容器名 当 小写p 时, 实体机端口:容器端口 将实体机的端口映射给容器,可以多条 -p 一起写
docker container run -p IP:5000:5000 镜像名 容器名 IP:实体机端口:容器端口 将 IP地址(可以和实体机的不一样)和端口 映射给容器。一般实体机都有IP地址,用得不多
docker container run -p IP::5000 镜像名 容器名 IP:空:容器端口 将 IP地址(可以和实体机的不一样)和一个随机端口 映射给容器
docker container run -p IP:5000:5000/udp 镜像名 容器名 IP:实体机端口:容器端口/udp 将 IP地址(可以和实体机的不一样)和UDP端口 映射给容器。
docker container port 容器名 端口号 查看容器端口映射到实体机那个端口上
------------------------------------------------------------------
容器与容器的内部互联(linking),即,不映射到实体机的端口上,通过 容器名 实现互访(类似DNS),实现容器与容器之间的互访。如果外部计算机要访问容器,比如客户访问部署在容器的网站,依然要进行端口映射到实体机。linking只是针对 容器对容器,这样可以避免容器的通讯端口暴露给外部,可以提升一些安全性。
假设已经有个容器,容器名是 db
新建一个容器,容器名是web,通过linking 将web与db互联
docker container run --name web --link db:db 镜像名 容器名 --link 要连接的容器名(也就是db):连接的别名。连接的别名主要用于多个容器连同一个容器是。比如,多建一个容器web2,也连db,连接的别名可以起 db_web2,这样就能够区分了。可以用 docker container ps 查看连接,里面可以看到连接的容器名和连接的别名。
两个容器linking以后,要通过两种方式互相公开连接信息,就是要告诉对方IP地址。
1、更新docker的环境变量;2、更新容器的 /etc/hosts 文件
更新docker的环境变量。用env命令查看环境变量。里面有容器互联的信息。如果有更新,修改里面的就可以。具体的修改,等待下次更新。
更新容器的 /etc/hosts 文件。 在web的 /etc/hosts 文件里面 把db(这里应该是连接别名) 的IP地址 和 连接别名写上,解析的时候是解析连接别名,就可以互访了。