前面介绍了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基础的更多相关文章

  1. docker 系列 - 基础镜像环境和Docker常用命令整理

    =======================docker 基础镜像环境 alpine=======================可以使用 docker search 命令搜索指定的 image, ...

  2. Docker入门基础(一)

    Docker入门基础 Linux只存在文件目录,不存在“盘”的概念 Dockers优点:方便部署环境.资源占用少(微服务) Docker的三大概念 镜像:类似虚拟机的镜像.用俗话说就是安装文件.容器: ...

  3. docker容器基础

    一.docker容器基础6种名称空间:UTS.MOunt.IPC.PID.User.Net (1) Linux Namespaces:namespace 系统调用参数 隔离内容 内核版本  UTS   ...

  4. docker+k8s基础篇四

    Docker+K8s基础篇(四) pod控制器 A:pod控制器类型 ReplicaSet控制器 A:ReplicaSet控制器介绍 B:ReplicaSet控制器的使用 Deployment控制器 ...

  5. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  6. docker+k8s基础篇二

    Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...

  7. docker+k8s基础篇一

    Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...

  8. docker入门 基础命令 docker安装

    docker入门   在学一门新知识的时候,超哥喜欢提问,why?what?how? wiki资料 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes ...

  9. Docker Network containers

    Network containers Estimated reading time: 5 minutes If you are working your way through the user gu ...

随机推荐

  1. PDF 补丁丁 0.6.0.3282 版发布(修复内存漏洞)

    补丁丁的新测试版修复了旧版在导出图片.分析文件结构时的内存漏洞. 对于希望表达对本软件感情的用户,可点击“帮助”菜单的“关于本程序及作者”命令,用微信扫描里面的二维码表达您的谢意. 新的测试版正在制作 ...

  2. 垃圾收集器(GC)

    堆分区:所有new的对象都会存放在堆中      > 新生代(Young Generation):存放生命周期短的对象,具体还分为Eden和Survivor两个区,其中Survivor分为Fro ...

  3. linux curl http get 请求中带有中文参数或者特殊字符处理

    在使用c++去请求http服务的时候,使用的是著名的curl工具提供的类库 libcurl,但是在使用的过程中发现,如果请求的参数值带了空格或者是参数是中文,会导致响应的回调函数没有被执行,虽然cur ...

  4. Centos7 systemctl和防火墙firewalld命令(参考https://www.cnblogs.com/marso/archive/2018/01/06/8214927.html)

    一.防火墙的开启.关闭.禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:systemctl disable fire ...

  5. Java 1.7 NQuery

    package org.rx.common; import java.lang.reflect.Array; import java.util.*; /** * Created by wangxiao ...

  6. re模块+面向对象

    re模块 re:其实就是带有特殊语法的字符串 语法:单个字符和多个字符 单个字符: \d是匹配所有的数字 \D是匹配所有的非数字 \s是所有的换行符,制表符,空白等,回车符 \S是所有费换行符,空白和 ...

  7. java面向对象编程(四)--类变量、类方法

    1.什么是类变量? 类变量是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. 如何定义类变量? 定义语法:     ...

  8. aps.net国际化本地资源 .resources”正确嵌入或链接到程序集

    asp.net国际化提供了资源文件的解决的方式, asp.net自带的两个项目文件夹 分别是:App_GlobalResources和App_LocalResources, App_GlobalRes ...

  9. 剑指Offer 43. 左旋转字符串 (字符串)

    题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&quo ...

  10. jQuery获取元素上一个、下一个、父元素、子元素

    jQuery.parent(expr),找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(&q ...