8天入门docker系列 —— 第七天 让你的container实现跨主机访问
当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你
借助docker自带的overlay网络模型了。
一: overlay网络模型
要想快速的搭建overlay网络,你可以通过docker默认的swarm集群给你默认生成的名ingress的overlay网络,这样会默认开放一些端口供底层机器内的访问,比如:
UDP 4789 是用于overlay network 流量传输的,作为开发角度,你只需要知道这是一个基于底层物理网络构建出的一个上层虚拟网络,而你的程序都是跑在这个虚拟网
络上,如果要画图,大概就是这样吧!
二:通过docker swarm构建overlay网络
为了构建overlay网络,需要备有两台机器(使用虚拟机即可):
192.168.23.146 manager
192.168.23.147 worker
使用起来很简单,在 146机器上执行 docker swarm init 初始化一个集群,同时默认了该机作为 cluster 的manager节点。
[root@manager ~]# docker swarm init
Swarm initialized: current node (g0o8vkgzruv63hsx4pkjs0yfk) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-0oxo6qrxwvl8xlneq0jqz2zd87nkj7c0vyf1h9m8kcj3qbzd4v-3eu9zb5athq0s2n79rncbejb1 192.168.23.146:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
g0o8vkgzruv63hsx4pkjs0yfk * manager Ready Active Leader 18.09.6
[root@manager ~]#
当执行完init之后,通过node ls 可以看到,当前cluster集群中只有一个node节点,而且还是Leader,同时docker还告诉我们怎么将其他node加入到集群中作为
worker节点,验证方式是token,好了,那我可以将这段output copy到 147 的 shell上。
[root@worker ~]# docker swarm join --token SWMTKN-1-0oxo6qrxwvl8xlneq0jqz2zd87nkj7c0vyf1h9m8kcj3qbzd4v-3eu9zb5athq0s2n79rncbejb1 192.168.23.146:2377
This node joined a swarm as a worker.
最后通过在 146 上执行 docker node ls 看一下集群信息,可以看到146,147都在一个集群了。
[root@manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
g0o8vkgzruv63hsx4pkjs0yfk * manager Ready Active Leader 18.09.6
ojjngean30orjzswh72o25rsr worker Ready Active 18.09.6
接下来再看一下,4789端口是否开放了,同时看一下ingress的overlay是否开启了,如下:
[root@manager ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f5fbe8d71b5a bridge bridge local
91cfc77a3c7f docker_gwbridge bridge local
ac4a48a43517 host host local
5eux1lz4yom7 ingress overlay swarm
02f9bfe179ca none null local
[root@manager ~]# netstat -tlnpu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4854/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5523/master
tcp6 0 0 :::2377 :::* LISTEN 6349/dockerd
tcp6 0 0 :::7946 :::* LISTEN 6349/dockerd
tcp6 0 0 :::22 :::* LISTEN 4854/sshd
tcp6 0 0 ::1:25 :::* LISTEN 5523/master
udp 0 0 0.0.0.0:47160 0.0.0.0:* 4549/avahi-daemon:
udp 0 0 0.0.0.0:68 0.0.0.0:* 4649/dhclient
udp 0 0 0.0.0.0:123 0.0.0.0:* 4555/chronyd
udp 0 0 127.0.0.1:323 0.0.0.0:* 4555/chronyd
udp 0 0 0.0.0.0:4789 0.0.0.0:* -
udp 0 0 0.0.0.0:5353 0.0.0.0:* 4549/avahi-daemon:
udp 0 0 0.0.0.0:26134 0.0.0.0:* 4649/dhclient
udp6 0 0 :::123 :::* 4555/chronyd
udp6 0 0 ::1:323 :::* 4555/chronyd
udp6 0 0 :::47743 :::* 4649/dhclient
udp6 0 0 :::7946 :::* 6349/dockerd
默认名为ingress 的overlay driver是默认是不支持standalone容器加入的,所以我需要重新new一个overlay,并设置一下允许standalone容器加入此网络,好了,
说干就干,new了一个 test-net的overlay网络,通过--attachable 开启附加功能。
[root@manager ~]# docker network create --driver=overlay --attachable test-net
dajh2glpfattdnq2ahqchlhur
[root@manager ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f5fbe8d71b5a bridge bridge local
91cfc77a3c7f docker_gwbridge bridge local
ac4a48a43517 host host local
5eux1lz4yom7 ingress overlay swarm
02f9bfe179ca none null local
dajh2glpfatt test-net overlay swarm
三:python 跨机连接 redis
我准备把redis放在147机器上, python application 放在 146上,python 通过 对方的容器名(some-redis) 进行连接,如下图所示:
1. 在147上执行docker run时附加 network 为指定的 test-net 网络
[root@worker ~]# docker run --network test-net --name some-redis -d redis
eca08e67e35160661e090ca42a61dacaee5dd8ca99f8e9c25e59ae6927d66328
2. python应用程序
主要有三个部分,app.py, Dockerfile, requirements.txt。
《1》 app.py
下面要注意的是,在redis的构造函数中指定了host= some-redis ,也就是 147启动容器名。
from flask import Flask
from redis import Redis, RedisError
import os
import socket# Connect to Redis
redis = Redis(host="some-redis", db=0, socket_connect_timeout=2, socket_timeout=2)app = Flask(__name__)@app.route("/")
def hello():try:visits = redis.incr("counter")except RedisError:visits = "<i>cannot connect to Redis, counter disabled</i>"html = "<b>Hostname:</b> {hostname}<br/>" \"<b>Visits:</b> {visits}"return html.format(hostname=socket.gethostname(), visits=visits)if __name__ == "__main__":app.run(host='0.0.0.0', port=80)
《2》 Flask 和 Redis 依赖包 (requirements.txt)
Flask
Redis
《3》 最后就是dockerfile
FROM python:2.7-slimWORKDIR /appCOPY . .EXPOSE 80RUN pip install --trusted-host pypi.python.org -r requirements.txtVOLUME [ "/app" ]CMD [ "python", "app.py" ]
有了这三个,接下来就可以构建image了。
[root@manager app]# docker build -t pyweb:v1 .
Sending build context to Docker daemon 4.608kB
Step 1/7 : FROM python:2.7-slim
2.7-slim: Pulling from library/python
fc7181108d40: Already exists
8c60b810a35a: Pull complete
d207b275197c: Pull complete
63184f224d60: Pull complete
Digest: sha256:1405fa2f8e9a232e2f60cafbb2b06ca2f1e0f577f4b4c397c361d6dba59fd24e
Status: Downloaded newer image for python:2.7-slim---> ca96bab3e2aa
Step 2/7 : WORKDIR /app---> Running in 6b8324c10dc0
Removing intermediate container 6b8324c10dc0---> a85fb403c57b
Step 3/7 : COPY . .---> f13015df5bf7
Step 4/7 : EXPOSE 80---> Running in 408a718df2b4
Removing intermediate container 408a718df2b4---> 39d30c3a092d
Step 5/7 : RUN pip install --trusted-host pypi.python.org -r requirements.txt---> Running in 0ee0982739d5
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting Flask (from -r requirements.txt (line 1))Downloading https://files.pythonhosted.org/packages/c3/31/6904ac846fc65a7fa6cac8b4ddc392ce96ca08ee67b0f97854e9575bbb26/Flask-1.1.0-py2.py3-none-any.whl (94kB)
Collecting Redis (from -r requirements.txt (line 2))Downloading https://files.pythonhosted.org/packages/ac/a7/cff10cc5f1180834a3ed564d148fb4329c989cbb1f2e196fc9a10fa07072/redis-3.2.1-py2.py3-none-any.whl (65kB)
Collecting Jinja2>=2.10.1 (from Flask->-r requirements.txt (line 1))Downloading https://files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl (124kB)
Collecting click>=5.1 (from Flask->-r requirements.txt (line 1))Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
Collecting Werkzeug>=0.15 (from Flask->-r requirements.txt (line 1))Downloading https://files.pythonhosted.org/packages/9f/57/92a497e38161ce40606c27a86759c6b92dd34fcdb33f64171ec559257c02/Werkzeug-0.15.4-py2.py3-none-any.whl (327kB)
Collecting itsdangerous>=0.24 (from Flask->-r requirements.txt (line 1))Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10.1->Flask->-r requirements.txt (line 1))Downloading https://files.pythonhosted.org/packages/fb/40/f3adb7cf24a8012813c5edb20329eb22d5d8e2a0ecf73d21d6b85865da11/MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl
Installing collected packages: MarkupSafe, Jinja2, click, Werkzeug, itsdangerous, Flask, Redis
Successfully installed Flask-1.1.0 Jinja2-2.10.1 MarkupSafe-1.1.1 Redis-3.2.1 Werkzeug-0.15.4 click-7.0 itsdangerous-1.1.0
Removing intermediate container 0ee0982739d5---> 704e7d655494
Step 6/7 : VOLUME [ "/app" ]---> Running in 0c4ad68db249
Removing intermediate container 0c4ad68db249---> 5b0ce6eef187
Step 7/7 : CMD [ "python", "app.py" ]---> Running in 388d972cbd6d
Removing intermediate container 388d972cbd6d---> fd7a0ffca7fc
Successfully built fd7a0ffca7fc
Successfully tagged pyweb:v1
[root@manager app]# docker run -d --network test-net -p 80:80 -v /app:/app --name pyapp pyweb:v1
9d419507b00adddd003f8e45580ec1ee48d4a0347091b65da1bc183a8bbe1dc2
[root@manager app]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d419507b00a pyweb:v1 "python app.py" 4 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp pyapp
[root@manager app]#
然后访问一下 http://192.168.23.146,每刷新一下page,都会执行一次redis.incr操作。,这样就实现了多容器之间的跨机器访问,大家也可以把这些放到
docker-compose文件中哦。
好了,本篇就说到这里,希望对你有帮助。
8天入门docker系列 —— 第七天 让你的container实现跨主机访问相关推荐
- Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问
前言 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址.Docker提供了创建这些网络的默认网络驱动程序,你可以创建一个新的Bridge网络,Over ...
- docker容器的跨主机访问
在同一宿主机下的Docker的容器之间是默认互相联通的.通过docker inspect id或name可以查看到ip地址.在不同的容器中来执行ping是可以ping通的,然而跨容器则行不通,于是总结 ...
- docker容器4:docker网络类型+跨主机访问
文章目录 一.网络类型介绍 1.查看支持网络类型 2.测试使用种类网络类型 3.网络类型设置 3.1 bridge 3.2 host 3.3 none 3.4创建自定义网络 4.Docker跨主机网络 ...
- docker+consul+overly 实现docker的跨主机访问
docker 的跨主机访问 集群中主机连接到键值存储,Docker支持 Consul.Etcd和Zookeeper 集群中主机运行一个Docker守护进程 集群中主机必须具有唯一的主机名,因为键值存储 ...
- PHP on Windows Azure 入门教学系列(2) ——利用SQL Azure做一个简单的访问计数器...
公告:本博客为微软云计算中文博客的镜像博客.部分文章因为博客兼容性问题,会影响阅读体验.如遇此情况,请访问原博客. 本文是PHP on Windows Azure 入门教学系列第二篇文章.请上一篇文章 ...
- 2D游戏入门——小狐狸系列(七)人物跳跃动画
Session07:跳跃动画 LayerMask 添加动画.设置转换条件 这节课我们来为人物添加跳跃动画. 按照上节课的方法,添加jump和fall的动画到Player,然后回到Animator,添加 ...
- [Jeson]Nginx入门到实践1-4章 ,关闭iptables,nginx重启,nginx缓存, 跨站访问,Rewrite规则,Https服务优化
第4章 Nginx 与 Lua nginx 与 Lua Https服务优化 激活keepalive长连接 设置ssl session 缓存 动静分离 Rewrite规则 nginx 常见正则匹配符号表 ...
- Docker系列之八:在Dockerfile中使用多段构建Muti-stage build
系列链接 Docker系列之一:Docker介绍及在Ubuntu上安装 Docker系列之二:Docker 入门 Docker系列之三:使用Docker镜像和仓库 Docker系列之四:Dockerf ...
- Docker系列之三:使用Docker镜像和仓库
系列链接 Docker系列之一:Docker介绍及在Ubuntu上安装 Docker系列之二:Docker 入门 Docker系列之三:使用Docker镜像和仓库 Docker系列之四:Dockerf ...
最新文章
- HTML POST提交参数给PHP并返回json,上传execl文件
- 为python安装numpy和scipy(federo)
- 日本精密减速器,到底牛在哪?
- BSOJ 3899 -- 【CQOI2014】 数三角形
- 虚幻UE4中如何采集360度全景图片和VR视频
- IOS开发之自定义Button(集成三种回调模式)
- Mongo服务器二进制文件修复,Mongodb-File-Server
- 我的世界服务器破坏方块有延迟,问一下我的世界游戏方块不会被破坏的指令以及指令适用于游戏的版本
我记得在服务器上和单机上好像有不同的指令...
- java 打包下载文件_java下载打包下载文件
- javaTemplates-学习笔记四
- RocketMQ中消息的优先级
- 除法运算、商、余数与取模
- match VS match_phrase
- ARP过程——删除地址映射
- PADS导出gerber文件
- 计算机地图制图 知识总结
- java实现汉字转为拼音
- python求极限中有算术平方根如何表达_Python求算数平方根和约数的方法汇总
- suse linux 修复模式,用 SuSE Linux Rescue Mode 恢复超级用户口令
- 【知识分享】如何制作Gif动态图