多容器复杂应用的部署

基于 flask容器,链接外部另一个redis 容器
docker pull redis
sudo docker run -d --name redis redis
# redis 没必要映射端口出来创建flask镜像
docker build -t kvin/flask-redis .镜像名称   Dockerfile的路径  . 是当前目录
运行容器并连接到数据库
docker run -d --name flask-redis --link redis -e REDIS_HOST=redis kvin/flask-redis
docker exec -it flask-redis /bin/bash

FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]

Dockerfile

app.py
from flask import Flask
from redis import Redisimport os
import socketapp = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')def hello():redis.incr('hits')return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())if __name__ == "__main__":app.run(host="0.0.0.0", port=5000, debug=True)

app.py


容器内部环境变量

root@1cd379675b76:/app# ping redis
PING redis (172.17.0.2) 56(84) bytes of data.
64 bytes from redis (172.17.0.2): icmp_seq=1 ttl=64 time=0.492 ms
64 bytes from redis (172.17.0.2): icmp_seq=2 ttl=64 time=0.134 ms
64 bytes from redis (172.17.0.2): icmp_seq=3 ttl=64 time=0.054 ms
64 bytes from redis (172.17.0.2): icmp_seq=4 ttl=64 time=0.134 ms
^C
--- redis ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.054/0.203/0.492/0.170 ms

容器内部测试

没有映射时,宿主本地访问不了
[root@docker-node1 flask-redis]# curl 127.0.0.1:5000
curl: (7) Failed connect to 127.0.0.1:5000; Connection refused
[root@docker-node1 flask-redis]# docker run -d -p 5000:5000 --name flask-redis --link redis -e REDIS_HOST=redis kvin/flask-redis
28ea7f498f5b9084935aa0a4fa0332aa56701a4357346b215cae689842f41fb1
[root@docker-node1 flask-redis]# curl 127.0.0.1:5000
Hello Container World! I have been seen 8 times and my hostname is 28ea7f498f5b.
[root@docker-node1 flask-redis]# curl 127.0.0.1:5000
Hello Container World! I have been seen 9 times and my hostname is 28ea7f498f5b.
[root@docker-node1 flask-redis]# curl 127.0.0.1:5000
Hello Container World! I have been seen 10 times and my hostname is 28ea7f498f5b.
[root@docker-node1 flask-redis]# curl 127.0.0.1:5000
Hello Container World! I have been seen 11 times and my hostname is 28ea7f498f5b.

映射

sudo docker run -d --name test4 -e DK_NAME=lewen busybox /bin/sh -c "while true;do sleep 3600;done"
[root@docker-node1 flask-redis]# docker exec -it test4 /bin/sh
/ # env
HOSTNAME=e72d1e6b396a
SHLVL=1
HOME=/root
DK_NAME=lewen
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
/ #

启动容器时,提前给容器设置环境变量

多机器通信

overlay

What is VXLAN and how it works?

https://www.evoila.de/2015/11/06/what-is-vxlan-and-how-it-works/

https://coreos.com/eted/

安装 etcd

vagrant@docker-node1:~$ wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
vagrant@docker-node1:~$ tar zxvf etcd-v3.0.12-linux-amd64.tar.gzvagrant@docker-node1:~$ cd etcd-v3.0.12-linux-amd64vagrant@docker-node1:~$ nohup ./etcd --name docker-node1 --initial-advertise-peer-urls http://192.168.205.10:2380 \--listen-peer-urls http://192.168.205.10:2380 \--listen-client-urls http://192.168.205.10:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://192.168.205.10:2379 \--initial-cluster-token etcd-cluster \--initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 \--initial-cluster-state new&

在docker-node1上

vagrant@docker-node2:~$ wget https://github.com/coreos/etcd/releases/download/v3.0.12/etcd-v3.0.12-linux-amd64.tar.gz
vagrant@docker-node2:~$ tar zxvf etcd-v3.0.12-linux-amd64.tar.gz
vagrant@docker-node2:~$ cd etcd-v3.0.12-linux-amd64/vagrant@docker-node2:~$ nohup ./etcd --name docker-node2 --initial-advertise-peer-urls http://192.168.205.11:2380 \--listen-peer-urls http://192.168.205.11:2380 \--listen-client-urls http://192.168.205.11:2379,http://127.0.0.1:2379 \--advertise-client-urls http://192.168.205.11:2379 \--initial-cluster-token etcd-cluster \--initial-cluster docker-node1=http://192.168.205.10:2380,docker-node2=http://192.168.205.11:2380 \--initial-cluster-state new&

在docker-node2上

vagrant@docker-node2:~/etcd-v3.0.12-linux-amd64$ ./etcdctl cluster-health
member 21eca106efe4caee is healthy: got healthy result from http://192.168.205.10:2379
member 8614974c83d1cc6d is healthy: got healthy result from http://192.168.205.11:2379
cluster is healthy

检查cluster状态

在docker-node1上
$ sudo service docker stop
$ sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.10:2379 --cluster-advertise=192.168.205.10:2375&在docker-node2上
$ sudo service docker stop
$ sudo /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.205.11:2379 --cluster-advertise=192.168.205.11:2375&

重启docker服务

在docker-node1上创建一个demo的overlay network
vagrant@docker-node1:~$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0e7bef3f143a        bridge              bridge              local
a5c7daf62325        host                host                local
3198cae88ab4        none                null                local
vagrant@docker-node1:~$ sudo docker network create -d overlay demo
3d430f3338a2c3496e9edeccc880f0a7affa06522b4249497ef6c4cd6571eaa9
vagrant@docker-node1:~$ sudo docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0e7bef3f143a        bridge              bridge              local
3d430f3338a2        demo                overlay             global
a5c7daf62325        host                host                local
3198cae88ab4        none                null                local
vagrant@docker-node1:~$ sudo docker network inspect demo
[{"Name": "demo","Id": "3d430f3338a2c3496e9edeccc880f0a7affa06522b4249497ef6c4cd6571eaa9","Scope": "global","Driver": "overlay","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "10.0.0.0/24","Gateway": "10.0.0.1/24"}]},"Internal": false,"Containers": {},"Options": {},"Labels": {}}
]

创建overlay network

我们会看到在node2上,这个demo的overlay network会被同步创建

vagrant@docker-node2:~$ sudo docker network ls
NETWORK ID         NAME               DRIVER             SCOPE
c9947d4c3669       bridge             bridge             local
3d430f3338a2       demo               overlay             global
fa5168034de1       host               host               local
c2ca34abec2a       none               null               local

view

通过查看etcd的key-value, 我们获取到,这个demo的network是通过etcd从node1同步到node2的

vagrant@docker-node2:~/etcd-v3.0.12-linux-amd64$ ./etcdctl ls /docker
/docker/network
/docker/nodes
vagrant@docker-node2:~/etcd-v3.0.12-linux-amd64$ ./etcdctl ls /docker/nodes
/docker/nodes/192.168.205.11:2375
/docker/nodes/192.168.205.10:2375
vagrant@docker-node2:~/etcd-v3.0.12-linux-amd64$ ./etcdctl ls /docker/network/v1.0/network
/docker/network/v1.0/network/3d430f3338a2c3496e9edeccc880f0a7affa06522b4249497ef6c4cd6571eaa9
vagrant@docker-node2:~/etcd-v3.0.12-linux-amd64$ ./etcdctl get /docker/network/v1.0/network/3d430f3338a2c3496e9edeccc880f0a7affa06522b4249497ef6c4cd6571eaa9 | jq .
{"addrSpace": "GlobalDefault","enableIPv6": false,"generic": {"com.docker.network.enable_ipv6": false,"com.docker.network.generic": {}},"id": "3d430f3338a2c3496e9edeccc880f0a7affa06522b4249497ef6c4cd6571eaa9","inDelete": false,"ingress": false,"internal": false,"ipamOptions": {},"ipamType": "default","ipamV4Config": "[{\"PreferredPool\":\"\",\"SubPool\":\"\",\"Gateway\":\"\",\"AuxAddresses\":null}]","ipamV4Info": "[{\"IPAMData\":\"{\\\"AddressSpace\\\":\\\"GlobalDefault\\\",\\\"Gateway\\\":\\\"10.0.0.1/24\\\",\\\"Pool\\\":\\\"10.0.0.0/24\\\"}\",\"PoolID\":\"GlobalDefault/10.0.0.0/24\"}]","labels": {},"name": "demo","networkType": "overlay","persist": true,"postIPv6": false,"scope": "global"
}

view

创建连接demo网络的容器

vagrant@docker-node1:~$ sudo docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done"
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
56bec22e3559: Pull complete
Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912
Status: Downloaded newer image for busybox:latest
a95a9466331dd9305f9f3c30e7330b5a41aae64afda78f038fc9e04900fcac54
vagrant@docker-node1:~$ sudo docker ps
CONTAINER ID       IMAGE               COMMAND                 CREATED             STATUS             PORTS               NAMES
a95a9466331d       busybox             "sh -c 'while true; d"   4 seconds ago       Up 3 seconds                           test1
vagrant@docker-node1:~$ sudo docker exec test1 ifconfig
eth0     Link encap:Ethernet  HWaddr 02:42:0A:00:00:02inet addr:10.0.0.2  Bcast:0.0.0.0  Mask:255.255.255.0inet6 addr: fe80::42:aff:fe00:2/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1RX packets:15 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:1206 (1.1 KiB)  TX bytes:648 (648.0 B)
​
eth1     Link encap:Ethernet  HWaddr 02:42:AC:12:00:02inet addr:172.18.0.2  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe12:2/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)
​
lo       Link encap:Local Loopbackinet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
​

在docker-node1上

在docker-node2上
vagrant@docker-node2:~$ sudo docker run -d --name test1 --net demo busybox sh -c "while true; do sleep 3600; done"
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
56bec22e3559: Pull complete
Digest: sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912
Status: Downloaded newer image for busybox:latest
fad6dc6538a85d3dcc958e8ed7b1ec3810feee3e454c1d3f4e53ba25429b290b
docker: Error response from daemon: service endpoint with name test1 already exists.
vagrant@docker-node2:~$ sudo docker run -d --name test2 --net demo busybox sh -c "while true; do sleep 3600; done"
9d494a2f66a69e6b861961d0c6af2446265bec9b1d273d7e70d0e46eb2e98d20

在docker-node2上

vagrant@docker-node2:~$ sudo docker exec -it test2 ifconfig
eth0     Link encap:Ethernet  HWaddr 02:42:0A:00:00:03inet addr:10.0.0.3  Bcast:0.0.0.0  Mask:255.255.255.0inet6 addr: fe80::42:aff:fe00:3/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1RX packets:208 errors:0 dropped:0 overruns:0 frame:0TX packets:201 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:20008 (19.5 KiB)  TX bytes:19450 (18.9 KiB)
​
eth1     Link encap:Ethernet  HWaddr 02:42:AC:12:00:02inet addr:172.18.0.2  Bcast:0.0.0.0  Mask:255.255.0.0inet6 addr: fe80::42:acff:fe12:2/64 Scope:LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:8 errors:0 dropped:0 overruns:0 frame:0TX packets:8 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)
​
lo       Link encap:Local Loopbackinet addr:127.0.0.1  Mask:255.0.0.0inet6 addr: ::1/128 Scope:HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0TX packets:0 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
​vagrant@docker-node1:~$ sudo docker exec test1 sh -c "ping 10.0.0.3"PING 10.0.0.3 (10.0.0.3): 56 data bytes64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.579 ms64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.411 ms64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.483 ms^Cvagrant@docker-node1:~$

验证连通性

[root@docker-node2 etcd-v3.0.12-linux-amd64]# docker run -d --name test1 --net demo busybox /bin/sh -c "while true;do sleep 3600;done"

到此位于不同机器上的docker容器通信完成

可以看到容器,分别有两个网卡 10.0.0.0/24 是基于demo网络的虚拟IP

172.xx.xx.xx 是分别宿主机基于 docker网桥的ip

查看网络中的容器

Docker 多机网络相关推荐

  1. docker容器的网络配置,允许docker可以被宿主机以外的其它主机访问以及局域网内可以直接访问docker容器ip

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.端口映射(局域网,外网 ...

  2. Docker 容器的网络连接

    2019独角兽企业重金招聘Python工程师标准>>> 文章首发于公众号<程序员果果> 地址:https://mp.weixin.qq.com/s/DzF-ZwaY4Qt ...

  3. Docker学习之网络篇

    Docker 中的网络功能介绍 Docker 允许通过外部访问容器或容器互联的方式来提供网络服务. 外部访问容器 容器中运行的网络应用,外部要访问这些应用.可以通过-P 或 -p 参数指定端口映射. ...

  4. Docker四种网络模式

    四种网络模式 host模式 使用docker run时使用–net=host指定 Docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机上的ip. [root@localhost ~ ...

  5. (三)Docker四种网络模式

    实现原理 Docker使用Linux桥接(参考<Linux虚拟网络技术>),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分 ...

  6. docker学习笔记(三)docker中的网络

    目录 Linux中的网卡 Network Namespace Docker中的Bridge网络 使用自定义Bridge网络创建容器 Container中的其他网络 Host网络 None网络 Linu ...

  7. Docker Compose搭建consul群集环境(了解Docker Compose及常用命令,Docker四种网络,Doker指定端口)

    文章目录 Docker Compose搭建consul群集环境 认识Docker Compose IConsul Docker Compose容器编排 Dasker Compose配置常用字段 Bos ...

  8. Docker容器之网络模式

    目录 一.Docker网络实现原理 二.Docker的网络模式 1.Host模式 2.Container模式 3.None模式 4.bridge模式 三.自定义网络 1.查看网络模式列表 2.查看容器 ...

  9. docker单主机网络类型

    作为小笔记参考!!! 这个文主要写了docker 单主机网络类型 none host container bridge 前面三个是简单的带过 最后会详细的说下bridge网络 docker安装的时候会 ...

最新文章

  1. 基于YOLO的目标检测界面化部署实现(支持yolov1-yolov5、yolop、yolox)
  2. 阿里巴巴5月5日综合算法题详解
  3. Android 任意区域截屏
  4. 异常规范之异常的概念
  5. React开发(198):需要加个{}
  6. [Java反射基础四]通过反射了解集合泛型的本质
  7. 大文件上传NeatUpload简单用法nbsp;(…
  8. pyside2 镜像安装_简单安装Pyside2
  9. Scintilla教程(5): 选中
  10. 【_ 記 】SQL语句实现三目表达式
  11. Altium Designer原理图与PCB设计学习笔记6——AD如何在多个原理图中查找相同的网络标号
  12. Spring warmth
  13. 极路由通过SSH添加静态路由表之后无法跳转的问题
  14. angular中的?:什么意思
  15. 服务器CPU占用过高如何解决
  16. 被人民日报点名的马保国,一年能挣多少钱?
  17. 46. 孩子们的游戏-圆圈中最后剩下的数字
  18. 读《图解密码技术》(三):密钥、随机数和应用技术
  19. 机器学习中的随机过程(伯努利过程与泊松过程)
  20. 华兴资本首日破发 包凡:对短期股价波动我们不太在意

热门文章

  1. 万网mysql中文乱码_Linux下MySQL出现乱码的解决方法-阿里云开发者社区
  2. debug内exe文件复制到桌面无法打开_Qt打包生成exe步骤和无法定位程序输入点_gxx_personality_v0于动态链接库...
  3. bootstrap文件不能被识别_树莓派安装openCV做图像识别
  4. 单板机 单片机 c语言,单板机 单片机 个人计算机有什么区别吗
  5. button标签设置隐藏和显示_离职后我隐藏一张工作表,老板找了一天没找到
  6. html 注册插件,HTML 插件
  7. springcloud @EnableDiscoveryClient注解作用
  8. springboot 实现策略模式
  9. GitHub 标星 5000+!学生党学编程,有这份资料就够了!
  10. 机器学习两大利器:Boosting 与 AdaBoost