docker network基础
前面介绍了nginx与php两个容器间是如何进行通信的:
[root@docker ~]# docker run -d --name=php -v /www:/usr/local/nginx/html php
[root@docker ~]# docker run -d --name=nginx --link=php:php -v /www:/usr/local/nginx/html -p : nginx
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58280fe851f9 nginx "/usr/local/nginx/..." seconds ago Up seconds 0.0.0.0:->/tcp nginx
9ea150c35587 php "/usr/local/php/sb..." seconds ago Up seconds /tcp php
通过容器间的选项--link指定容器名称进行不同容器间的通信(--link container_name或者将container_name取一个别名)
现在使用另外一种方式替代--link来达到容器间的通信:docker network
查看local的网络信息:
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5133ec415c3c bridge bridge local
f359ca4e2d39 host host local
8d68673c045c none null local
现在创建一个网络名为my_net且driver为bridge的网络:(默认创建的就是bridge)
[root@docker ~]# docker network create my_net
67e29f0e4a77c79144efc337a081a889188b5b8e289968f22be6e4ddd9b80610
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5133ec415c3c bridge bridge local
f359ca4e2d39 host host local
67e29f0e4a77 my_net bridge local
8d68673c045c none null local
利用--network启动容器提供服务:
[root@docker ~]# docker run -d --name=php --network my_net --network-alias php -v /www:/usr/local/nginx/html php
6b493cbe8207dee4cb4d5945cfce305dba96914083bd7f46841b0b42376bcb99
[root@docker ~]# docker run -d --name=nginx --network my_net --network-alias nginx -v /www:/usr/local/nginx/html -p : nginx
5ab220196b52bb768bef508433f0b920eecee70c3ee47880ebc5e2a74b5ee254
通过选项--network-alias将取名的my_net起了一个别名
[root@docker ~]# docker exec -it nginx ping php
PING php (172.18.0.2) () bytes of data.
bytes from php.my_net (172.18.0.2): icmp_seq= ttl= time=0.079 ms
bytes from php.my_net (172.18.0.2): icmp_seq= ttl= time=0.090 ms
这里为啥能够ping通过php这个容器呢,因为这两个容器在同一个网络m'y_net内,而nginx里面ping的php是容器名(这里管理的是容器级别)
由于能够ping通php,所以在nginx中配置的:
server {
listen ;
root /usr/local/nginx/html;
index index.htm index.html index.php;
location ~ \.php$ {
root /usr/local/nginx/html;
fastcgi_pass php:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
所以配置文件中的php不会导致nginx启动失败,通过network的driver bridge实现了容器间的访问

上面在容器启动的时候使用的是选项--network,而在compose的配置文件中则是networks,现在通过配置文件来进行阐述该参数的作用:
[root@docker lnmp]# cat lnmp.yml
version: ''
services:
nginx:
image: nginx
container_name: lnmp-nginx
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
php:
image: php
container_name: lnmp-php
expose:
- ""
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html" networks:
net1:
driver: bridge
由上述文件中可以知道networks定义了一个名称为net1的网络,由于networks是top-level(顶层级别,所以需要在顶层设置),而在创建的网络时候需要指定driver(单一网络使用bridge,swarm集群使用overlay),而且driver内容不能省略,在nginx和php两个service中使用了同一网络net1,现在将服务启动:
[root@docker lnmp]# docker-compose -f lnmp.yml up
Creating network "lnmp_net1" with driver "bridge"
Creating lnmp-php ...
Creating lnmp-php ... done
Creating lnmp-nginx ...
Creating lnmp-nginx ... done
Attaching to lnmp-php, lnmp-nginx
可以看出在启动服务的时候创建了服务级别的网络lnmp_net1
[root@docker lnmp]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5133ec415c3c bridge bridge local
f359ca4e2d39 host host local
29d798852b52 lnmp_net1 bridge local
67e29f0e4a77 my_net bridge local
8d68673c045c none null local
服务nginx和php在网络lnmp_net1实现了互联通信
[root@docker lnmp]# docker-compose -f lnmp.yml exec nginx ping php
PING php (172.19.0.2) () bytes of data.
bytes from lnmp-php.lnmp_net1 (172.19.0.2): icmp_seq= ttl= time=0.060 ms
在nginx服务中能够访问php的服务,在compose编排中级别的访问是对service级别的访问,所以在nginx服务配置文件中对应的php能够实现,不会导致nginx启动失败
及在compose的配置文件设置并对应的是service级别,当使用参数links也是配置的php服务,使得nginx服务能够ping通php服务并实现访问通信
[root@docker lnmp]# cat lnmp.yml
version: ''
services:
nginx:
image: nginx
container_name: lnmp-nginx
depends_on:
- php
ports:
- "80:80"
links:
- php:php
volumes:
- "/www:/usr/local/nginx/html"
php:
image: php
container_name: lnmp-php
expose:
- ""
volumes:
- "/www:/usr/local/nginx/html"
将networks参数改为了links参数,使得两个服务能够继续互联访问
[root@docker lnmp]# docker-compose -f lnmp.yml up
Creating network "lnmp_default" with the default driver
Creating lnmp-php ...
Creating lnmp-php ... done
Creating lnmp-nginx ...
Creating lnmp-nginx ... done
Attaching to lnmp-php, lnmp-nginx
而且启动的时候创建的默认的网络
[root@docker lnmp]# docker-compose -f lnmp.yml exec nginx ping php
PING php (172.19.0.2) () bytes of data.
bytes from lnmp-php.lnmp_default (172.19.0.2): icmp_seq= ttl= time=0.091 ms
bytes from lnmp-php.lnmp_default (172.19.0.2): icmp_seq= ttl= time=0.107 ms
--links也是能够使得服务间进行访问的
现在通过案例讲解参数external_links的作用:external_links类似于links针对的也是service级别,但是external_links对应的是外部的service而不是同一compose配置文件中的service
[root@docker lnmp]# cat lnmp.yml
version: ''
services:
nginx:
image: nginx
container_name: lnmp-nginx
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
external_links:
- php1:php
php:
image: php
container_name: lnmp-php
expose:
- ""
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html" networks:
net1:
driver: bridge
上面可以看见external_links配置了php1的服务,并且将php1的服务也取别名为了php,然后编写另一个compose配置文件,并配置服务名为php1的服务:
[root@docker lnmp]# cat php1.yml
version: ''
services:
php1:
image: php
container_name: lnmp-php1
expose:
- ""
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html" networks:
net1:
driver: bridge
结合两个compose配置文件,可以知道有nginx、php、php1的服务,并且php1的服务也有php的别名,现在依次开启php1,和nginx与php:
[root@docker lnmp]# docker-compose -f php1.yml up
Creating network "lnmp_net1" with driver "bridge"
Creating lnmp-php1 ...
Creating lnmp-php1 ... done
Attaching to lnmp-php1
[root@docker lnmp]# docker-compose -f lnmp.yml up --build
WARNING: Found orphan containers (lnmp-php1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Creating lnmp-php ...
Creating lnmp-php ... done
Creating lnmp-nginx ...
Creating lnmp-nginx ... done
Attaching to lnmp-php, lnmp-nginx
查看启动的容器状态:
[root@docker www]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a089cd261279 nginx "/usr/local/nginx/..." seconds ago Up seconds 0.0.0.0:->/tcp lnmp-nginx
4ff4bf7c1bf9 php "/usr/local/php/sb..." seconds ago Up seconds /tcp lnmp-php
4e39cdf62bf1 php "/usr/local/php/sb..." seconds ago Up seconds /tcp lnmp-php1
现在将nginx一起的php的这个服务停止掉,看下nginx服务是否将会被停止:
[root@docker lnmp]# docker-compose -f lnmp.yml stop php
Stopping lnmp-php ... done
而在nginx这里的输出如下:
lnmp-php exited with code
[root@docker www]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a089cd261279 nginx "/usr/local/nginx/..." minutes ago Up minutes 0.0.0.0:->/tcp lnmp-nginx
4ff4bf7c1bf9 php "/usr/local/php/sb..." minutes ago Exited () seconds ago lnmp-php
而php服务对应的容器lnmp-php也停止了,但是nginx的服务却没有停止,为什么呢?那是因为php1的服务并没有停止,而php1的服务也是别名php服务的,而external_links就是实现这种情况的
使一个compose中的服务能与另一个compose中的服务能够互联通信,compose就是service级别的实现,配置文件中对应的都是service级别,而不是容器名

而在另一个compose中也必须定义与之相同的网络名称,也就是说配置external_links时,两者服务间的网络名称必须一致,不然依旧不能进行互相访问
当使用了external_links时,必须启动另一个compose的service,如果仅仅启动的是包含此函数的compose那么service将会启动报错
[root@docker lnmp]# cat lnmp.yml_external_links
version: ''
services:
nginx:
image: nginx
container_name: lnmp-nginx
depends_on:
- php
ports:
- "80:80"
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html"
external_links:
- php1:php
php:
image: php
container_name: lnmp-php
expose:
- ""
networks:
- "net1"
volumes:
- "/www:/usr/local/nginx/html" networks:
net1:
driver: bridge
[root@docker lnmp]# docker-compose -f lnmp.yml up --build
Creating network "lnmp_net1" with driver "bridge"
Creating lnmp-php ...
Creating lnmp-php ... done
Creating lnmp-nginx ...
Creating lnmp-nginx ... done
Attaching to lnmp-php, lnmp-nginx
lnmp-nginx | nginx: [emerg] host not found in upstream "php" in /usr/local/nginx/conf/vhost/www.conf:
lnmp-nginx exited with code
参数external_links连接的外部php服务并没有启动,所以nginx还是启动报错
docker network基础的更多相关文章
- docker 系列 - 基础镜像环境和Docker常用命令整理
=======================docker 基础镜像环境 alpine=======================可以使用 docker search 命令搜索指定的 image, ...
- Docker入门基础(一)
Docker入门基础 Linux只存在文件目录,不存在“盘”的概念 Dockers优点:方便部署环境.资源占用少(微服务) Docker的三大概念 镜像:类似虚拟机的镜像.用俗话说就是安装文件.容器: ...
- docker容器基础
一.docker容器基础6种名称空间:UTS.MOunt.IPC.PID.User.Net (1) Linux Namespaces:namespace 系统调用参数 隔离内容 内核版本 UTS ...
- docker+k8s基础篇四
Docker+K8s基础篇(四) pod控制器 A:pod控制器类型 ReplicaSet控制器 A:ReplicaSet控制器介绍 B:ReplicaSet控制器的使用 Deployment控制器 ...
- docker+k8s基础篇三
Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...
- docker+k8s基础篇二
Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...
- docker+k8s基础篇一
Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...
- docker入门 基础命令 docker安装
docker入门 在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes ...
- Docker Network containers
Network containers Estimated reading time: 5 minutes If you are working your way through the user gu ...
随机推荐
- Oracle单机Rman笔记[0]---环境准备
A. 安装操作系统rhel6.6,关闭防火墙,修改网卡配置IP(略)PS:1.默认分区选项(第二项,默认为LVM),然后进行调整2.安装类型选择“桌面”3.安装后 分配IP.调整防火墙.测试SSH B ...
- position的sticky与fixed
fixed(固定定位) 生成绝对定位的元素,相对于浏览器窗口进行定位.元素的位置通过 "left", "top", "right" 以及 & ...
- vue项目目录结构
VUE项目目录结构 如上图所示,我们的目录结构就是这样的了. 目录/文件 说明 build 这个是我们最终发布的时候会把代码发布在这里,在开发阶段,我们基本不用管. config 配置目录,默认配置没 ...
- 经典的Foo和getName
搜了下经典的Foo和getName的题目,看了几个解释,懒得看,自己解一下,作为笔记. function Foo(){ getName = function(){ console.log(1); }; ...
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
- 6.对图像进行ROI选取并操作
void Test_ROIWith2Image() { Mat g_srcImage=imread("D:\\OpenCV Projects\\OpenCV_Test_Image\\6.jp ...
- go web framework gin 路由表的设计
在上一篇go web framework gin 启动流程分析这一篇文章中,我分析了go gin启动的过程,在这一篇文章中我将继续上面的分析,讨论gin 中路由表是如何设计的? 首先查看engine. ...
- 第二章:深入分析java I/O的工作机制
.2.1 java的I/O类库的基本架构 I/O的机器获取和交换信息的主要渠道,在当今数据大爆炸时代,I/O问题尤其突出,很容易成为一个性能瓶颈,Java在I/O上也一直做持续的优化,现在也引入了NI ...
- wc语法2
wc命令的功能为统计指定文件中的字节数.字数.行数, 并将统计结果显示输出. 语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同 ...
- shell批处理文件,并将运算结果返回
问题背景是这样的:别人用C++写了一个算法,算法内部比较复杂,但是呢,对于编译好的文件用起来比较方便,比如在linux终端,my_program 1.png 2.txt这样就可以用,但是这样只能够输入 ...