8天入门docker系列 —— 第七天 让你的container实现跨主机访问
<p> </p><p> 当你有若干个容器之后,你可能就希望实现容器的跨机部署访问了,比如aspnetcore在一台host上,mysql在另外一个host上,如果要实现这样的功能,需要你</p>
<p>借助docker自带的overlay网络模型了。</p>
<p> </p>
<p><span style="font-size: 18pt">一: overlay网络模型</span></p>
<p> 要想快速的搭建overlay网络,你可以通过docker默认的swarm集群给你默认生成的名ingress的overlay网络,这样会默认开放一些端口供底层机器内的访问,比如:</p>
<p>UDP 4789 是用于overlay network 流量传输的,作为开发角度,你只需要知道这是一个基于底层物理网络构建出的一个上层虚拟网络,而你的程序都是跑在这个虚拟网</p>
<p>络上,如果要画图,大概就是这样吧!</p>
<p><img src="https://img2018.cnblogs.com/blog/214741/201907/214741-20190707123213768-434614850.jpg" alt=""></p>
<p> </p>
<p><span style="font-size: 18pt">二:通过docker swarm构建overlay网络</span></p>
<p> 为了构建overlay网络,需要备有两台机器(使用虚拟机即可):</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">23.146</span><span style="color: rgba(0, 0, 0, 1)">manager
</span><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">23.147</span>worker</pre>
</div>
<p> </p>
<p> 使用起来很简单,在 146机器上执行 docker swarm init 初始化一个集群,同时默认了该机作为 cluster 的manager节点。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(255, 0, 0, 1)">docker swarm init</span>
Swarm initialized: current node (g0o8vkgzruv63hsx4pkjs0yfk) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm </span><span style="color: rgba(0, 0, 255, 1)">join</span> --token SWMTKN-<span style="color: rgba(128, 0, 128, 1)">1</span>-0oxo6qrxwvl8xlneq0jqz2zd87nkj7c0vyf1h9m8kcj3qbzd4v-3eu9zb5athq0s2n79rncbejb1 <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">23.146</span>:<span style="color: rgba(128, 0, 128, 1)">2377</span><span style="color: rgba(0, 0, 0, 1)">
To add a manager to this swarm, run </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">docker swarm join-token manager</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> and follow the instructions.
# <span style="color: rgba(255, 0, 0, 1)">docker node ls</span><span style="color: rgba(0, 0, 0, 1)">
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
g0o8vkgzruv63hsx4pkjs0yfk </span>* manager Ready Active Leader <span style="color: rgba(128, 0, 128, 1)">18.09</span>.<span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">
# </pre>
</div>
<p> </p>
<p> 当执行完init之后,通过node ls 可以看到,当前cluster集群中只有一个node节点,而且还是Leader,同时docker还告诉我们怎么将其他node加入到集群中作为</p>
<p>worker节点,验证方式是token,好了,那我可以将这段output copy到 147 的 shell上。</p>
<div class="cnblogs_code">
<pre>#docker swarm <span style="color: rgba(0, 0, 255, 1)">join</span> --token SWMTKN-<span style="color: rgba(128, 0, 128, 1)">1</span>-0oxo6qrxwvl8xlneq0jqz2zd87nkj7c0vyf1h9m8kcj3qbzd4v-3eu9zb5athq0s2n79rncbejb1 <span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">23.146</span>:<span style="color: rgba(128, 0, 128, 1)">2377</span><span style="color: rgba(0, 0, 0, 1)">
This node joined a swarm as a worker.</span></pre>
</div>
<p> </p>
<p> 最后通过在 146 上执行 docker node ls 看一下集群信息,可以看到146,147都在一个集群了。</p>
<div class="cnblogs_code">
<pre># docker node <span style="color: rgba(0, 0, 255, 1)">ls</span><span style="color: rgba(0, 0, 0, 1)">
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
g0o8vkgzruv63hsx4pkjs0yfk </span>* manager Ready Active Leader <span style="color: rgba(128, 0, 128, 1)">18.09</span>.<span style="color: rgba(128, 0, 128, 1)">6</span><span style="color: rgba(0, 0, 0, 1)">
ojjngean30orjzswh72o25rsr worker Ready Active </span><span style="color: rgba(128, 0, 128, 1)">18.09</span>.<span style="color: rgba(128, 0, 128, 1)">6</span></pre>
</div>
<p> </p>
<p> 接下来再看一下,4789端口是否开放了,同时看一下ingress的overlay是否开启了,如下:</p>
<div class="cnblogs_code">
<pre># docker network <span style="color: rgba(0, 0, 255, 1)">ls</span><span style="color: rgba(0, 0, 0, 1)">
NETWORK ID NAME DRIVER SCOPE
f5fbe8d71b5a bridge bridge local
91cfc77a3c7f docker_gwbridge bridge local
ac4a48a43517 host host local
<span style="color: rgba(255, 0, 0, 1)">5eux1lz4yom7 ingress overlay swarm</span>
02f9bfe179ca none </span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)"> local
# netstat -<span style="color: rgba(0, 0, 0, 1)">tlnpu
Active Internet connections (only servers)
Proto Recv</span>-Q Send-Q Local Address Foreign Address State PID/<span style="color: rgba(0, 0, 0, 1)">Program name
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">22</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">4854</span>/<span style="color: rgba(0, 0, 0, 1)">sshd
tcp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>:<span style="color: rgba(128, 0, 128, 1)">25</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* LISTEN <span style="color: rgba(128, 0, 128, 1)">5523</span>/<span style="color: rgba(0, 0, 0, 1)">master
tcp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">2377</span> :::* LISTEN <span style="color: rgba(128, 0, 128, 1)">6349</span>/<span style="color: rgba(0, 0, 0, 1)">dockerd
tcp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">7946</span> :::* LISTEN <span style="color: rgba(128, 0, 128, 1)">6349</span>/<span style="color: rgba(0, 0, 0, 1)">dockerd
tcp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">22</span> :::* LISTEN <span style="color: rgba(128, 0, 128, 1)">4854</span>/<span style="color: rgba(0, 0, 0, 1)">sshd
tcp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> ::<span style="color: rgba(128, 0, 128, 1)">1</span>:<span style="color: rgba(128, 0, 128, 1)">25</span> :::* LISTEN <span style="color: rgba(128, 0, 128, 1)">5523</span>/<span style="color: rgba(0, 0, 0, 1)">master
udp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">47160</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* <span style="color: rgba(128, 0, 128, 1)">4549</span>/avahi-<span style="color: rgba(0, 0, 0, 1)">daemon:
udp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">68</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* <span style="color: rgba(128, 0, 128, 1)">4649</span>/<span style="color: rgba(0, 0, 0, 1)">dhclient
udp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">123</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* <span style="color: rgba(128, 0, 128, 1)">4555</span>/<span style="color: rgba(0, 0, 0, 1)">chronyd
udp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">127.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.1</span>:<span style="color: rgba(128, 0, 128, 1)">323</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* <span style="color: rgba(128, 0, 128, 1)">4555</span>/<span style="color: rgba(0, 0, 0, 1)">chronyd
<span style="color: rgba(255, 0, 0, 1)">udp </span></span><span style="color: rgba(255, 0, 0, 1)">0 0 0.0.0.0:4789 0.0.0.0:* -</span><span style="color: rgba(0, 0, 0, 1)">
udp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">5353</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* <span style="color: rgba(128, 0, 128, 1)">4549</span>/avahi-<span style="color: rgba(0, 0, 0, 1)">daemon:
udp </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">26134</span> <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:* <span style="color: rgba(128, 0, 128, 1)">4649</span>/<span style="color: rgba(0, 0, 0, 1)">dhclient
udp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">123</span> :::* <span style="color: rgba(128, 0, 128, 1)">4555</span>/<span style="color: rgba(0, 0, 0, 1)">chronyd
udp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> ::<span style="color: rgba(128, 0, 128, 1)">1</span>:<span style="color: rgba(128, 0, 128, 1)">323</span> :::* <span style="color: rgba(128, 0, 128, 1)">4555</span>/<span style="color: rgba(0, 0, 0, 1)">chronyd
udp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">47743</span> :::* <span style="color: rgba(128, 0, 128, 1)">4649</span>/<span style="color: rgba(0, 0, 0, 1)">dhclient
udp6 </span><span style="color: rgba(128, 0, 128, 1)">0</span> <span style="color: rgba(128, 0, 128, 1)">0</span> :::<span style="color: rgba(128, 0, 128, 1)">7946</span> :::* <span style="color: rgba(128, 0, 128, 1)">6349</span>/dockerd</pre>
</div>
<p> </p>
<p> 默认名为ingress 的overlay driver是默认是不支持standalone容器加入的,所以我需要重新new一个overlay,并设置一下允许standalone容器加入此网络,好了,</p>
<p>说干就干,new了一个 test-net的overlay网络,通过--attachable 开启附加功能。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(255, 0, 0, 1)">docker network create --driver=overlay --attachable test-</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">net</span>
dajh2glpfattdnq2ahqchlhur
# docker network <span style="color: rgba(0, 0, 255, 1)">ls</span><span style="color: rgba(0, 0, 0, 1)">
NETWORK ID NAME DRIVER SCOPE
f5fbe8d71b5a bridge bridge local
91cfc77a3c7f docker_gwbridge bridge local
ac4a48a43517 host host local
5eux1lz4yom7 ingress overlay swarm
02f9bfe179ca none </span><span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)"> local
<span style="color: rgba(255, 0, 0, 1)">dajh2glpfatt test</span></span><span style="color: rgba(255, 0, 0, 1)">-net overlay swarm</span></pre>
</div>
<p> </p>
<p><span style="font-size: 18pt">三:python 跨机连接 redis</span></p>
<p> 我准备把redis放在147机器上, python application 放在 146上,python 通过 对方的容器名(some-redis) 进行连接,如下图所示:</p>
<p> </p>
<p><img src="https://img2018.cnblogs.com/blog/214741/201907/214741-20190707131611831-620779288.jpg" alt=""></p>
<p> </p>
<p><span style="font-size: 18px">1. 在147上执行docker run时附加 network 为指定的 test-net 网络</span></p>
<div class="cnblogs_code">
<pre># docker run --network test-net --name some-redis -<span style="color: rgba(0, 0, 0, 1)">d redis
eca08e67e35160661e090ca42a61dacaee5dd8ca99f8e9c25e59ae6927d66328</span></pre>
</div>
<p> </p>
<p><span style="font-size: 18px">2. python应用程序</span></p>
<p>主要有三个部分,app.py, Dockerfile, requirements.txt。</p>
<p><img src="https://img2018.cnblogs.com/blog/214741/201907/214741-20190707132211510-1008693153.jpg" alt=""></p>
<p><span style="font-size: 16px">《1》 app.py</span></p>
<p> 下面要注意的是,在redis的构造函数中指定了host= some-redis ,也就是 147启动容器名。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">from</span> flask <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Flask
</span><span style="color: rgba(0, 0, 255, 1)">from</span> redis <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Redis, RedisError
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> socket
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> Connect to Redis</span>
redis = Redis(host=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">some-redis</span><span style="color: rgba(128, 0, 0, 1)">"</span>, db=0, socket_connect_timeout=2, socket_timeout=2<span style="color: rgba(0, 0, 0, 1)">)
app </span>= Flask(<span style="color: rgba(128, 0, 128, 1)">__name__</span><span style="color: rgba(0, 0, 0, 1)">)
@app.route(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> hello():
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
visits </span>= redis.incr(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">counter</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> RedisError:
visits </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"><i>cannot connect to Redis, counter disabled</i></span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
html </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"><b>Hostname:</b> {hostname}<br/></span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> \
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"><b>Visits:</b> {visits}</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> html.format(hostname=socket.gethostname(), visits=<span style="color: rgba(0, 0, 0, 1)">visits)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
app.run(host</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0.0.0.0</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=80)</pre>
</div>
<p> </p>
<p><span style="font-size: 16px">《2》 Flask 和 Redis 依赖包 (requirements.txt)</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">Flask
Redis</span></pre>
</div>
<p> </p>
<p><span style="font-size: 16px">《3》 最后就是dockerfile</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">FROM</span> python:2.7<span style="color: rgba(0, 0, 0, 1)">-slim
</span><span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app
</span><span style="color: rgba(0, 128, 128, 1)">COPY</span><span style="color: rgba(0, 0, 0, 1)"> . .
</span><span style="color: rgba(0, 128, 128, 1)">EXPOSE</span> 80
<span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> pip install --trusted-host pypi.python.org -r requirements.txt
</span><span style="color: rgba(0, 128, 128, 1)">VOLUME</span> [ "/app"<span style="color: rgba(0, 0, 0, 1)"> ]
</span><span style="color: rgba(0, 128, 128, 1)">CMD</span> [ "python", "app.py" ]</pre>
</div>
<p> </p>
<p>有了这三个,接下来就可以构建image了。</p>
<div class="cnblogs_code">
<pre># <span style="color: rgba(255, 0, 0, 1)">docker build -</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">t pyweb:v1 .</span>
Sending build context to Docker daemon</span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">.608kB
Step </span><span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : FROM python:<span style="color: rgba(128, 0, 128, 1)">2.7</span>-<span style="color: rgba(0, 0, 0, 1)">slim
</span><span style="color: rgba(128, 0, 128, 1)">2.7</span>-slim: Pulling from library/<span style="color: rgba(0, 0, 0, 1)">python
fc7181108d40: Already exists
8c60b810a35a: Pull complete
d207b275197c: Pull complete
63184f224d60: Pull complete
Digest: sha256:1405fa2f8e9a232e2f60cafbb2b06ca2f1e0f577f4b4c397c361d6dba59fd24e
Status: Downloaded newer image </span><span style="color: rgba(0, 0, 255, 1)">for</span> python:<span style="color: rgba(128, 0, 128, 1)">2.7</span>-<span style="color: rgba(0, 0, 0, 1)">slim
</span>---><span style="color: rgba(0, 0, 0, 1)"> ca96bab3e2aa
Step </span><span style="color: rgba(128, 0, 128, 1)">2</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : WORKDIR /<span style="color: rgba(0, 0, 0, 1)">app
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 6b8324c10dc0
Removing intermediate container 6b8324c10dc0
</span>---><span style="color: rgba(0, 0, 0, 1)"> a85fb403c57b
Step </span><span style="color: rgba(128, 0, 128, 1)">3</span>/<span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)"> : COPY . .
</span>---><span style="color: rgba(0, 0, 0, 1)"> f13015df5bf7
Step </span><span style="color: rgba(128, 0, 128, 1)">4</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : EXPOSE <span style="color: rgba(128, 0, 128, 1)">80</span>
---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 408a718df2b4
Removing intermediate container 408a718df2b4
</span>---><span style="color: rgba(0, 0, 0, 1)"> 39d30c3a092d
Step </span><span style="color: rgba(128, 0, 128, 1)">5</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : RUN pip <span style="color: rgba(0, 0, 255, 1)">install</span> --trusted-host pypi.python.org -<span style="color: rgba(0, 0, 0, 1)">r requirements.txt
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 0ee0982739d5
DEPRECATION: Python </span><span style="color: rgba(128, 0, 128, 1)">2.7</span> will reach the end of its life on January 1st, <span style="color: rgba(128, 0, 128, 1)">2020</span>. Please upgrade your Python as Python <span style="color: rgba(128, 0, 128, 1)">2.7</span> won<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">t be maintained after that date. A future version of pip will drop support for Python 2.7.</span>
Collecting Flask (from -r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/c3/31/6904ac846fc65a7fa6cac8b4ddc392ce96ca08ee67b0f97854e9575bbb26/Flask-1.1.0-py2.py3-none-any.whl (94kB)</span>
Collecting Redis (from -r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/ac/a7/cff10cc5f1180834a3ed564d148fb4329c989cbb1f2e196fc9a10fa07072/redis-3.2.1-py2.py3-none-any.whl (65kB)</span>
Collecting Jinja2>=<span style="color: rgba(128, 0, 128, 1)">2.10</span>.<span style="color: rgba(128, 0, 128, 1)">1</span> (from Flask->-r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/1d/e7/fd8b501e7a6dfe492a433deb7b9d833d39ca74916fa8bc63dd1a4947a671/Jinja2-2.10.1-py2.py3-none-any.whl (124kB)</span>
Collecting click>=<span style="color: rgba(128, 0, 128, 1)">5.1</span> (from Flask->-r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)</span>
Collecting Werkzeug>=<span style="color: rgba(128, 0, 128, 1)">0.15</span> (from Flask->-r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/9f/57/92a497e38161ce40606c27a86759c6b92dd34fcdb33f64171ec559257c02/Werkzeug-0.15.4-py2.py3-none-any.whl (327kB)</span>
Collecting itsdangerous>=<span style="color: rgba(128, 0, 128, 1)">0.24</span> (from Flask->-r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl</span>
Collecting MarkupSafe>=<span style="color: rgba(128, 0, 128, 1)">0.23</span> (from Jinja2>=<span style="color: rgba(128, 0, 128, 1)">2.10</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>->Flask->-r requirements.txt (line <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">))
Downloading https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">files.pythonhosted.org/packages/fb/40/f3adb7cf24a8012813c5edb20329eb22d5d8e2a0ecf73d21d6b85865da11/MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl</span>
<span style="color: rgba(0, 0, 0, 1)">Installing collected packages: MarkupSafe, Jinja2, click, Werkzeug, itsdangerous, Flask, Redis
Successfully installed Flask</span>-<span style="color: rgba(128, 0, 128, 1)">1.1</span>.<span style="color: rgba(128, 0, 128, 1)">0</span> Jinja2-<span style="color: rgba(128, 0, 128, 1)">2.10</span>.<span style="color: rgba(128, 0, 128, 1)">1</span> MarkupSafe-<span style="color: rgba(128, 0, 128, 1)">1.1</span>.<span style="color: rgba(128, 0, 128, 1)">1</span> Redis-<span style="color: rgba(128, 0, 128, 1)">3.2</span>.<span style="color: rgba(128, 0, 128, 1)">1</span> Werkzeug-<span style="color: rgba(128, 0, 128, 1)">0.15</span>.<span style="color: rgba(128, 0, 128, 1)">4</span> click-<span style="color: rgba(128, 0, 128, 1)">7.0</span> itsdangerous-<span style="color: rgba(128, 0, 128, 1)">1.1</span>.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
Removing intermediate container 0ee0982739d5
</span>---><span style="color: rgba(0, 0, 0, 1)"> 704e7d655494
Step </span><span style="color: rgba(128, 0, 128, 1)">6</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : VOLUME [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/app</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ]
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 0c4ad68db249
Removing intermediate container 0c4ad68db249
</span>---><span style="color: rgba(0, 0, 0, 1)"> 5b0ce6eef187
Step </span><span style="color: rgba(128, 0, 128, 1)">7</span>/<span style="color: rgba(128, 0, 128, 1)">7</span> : CMD [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">python</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">app.py</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ]
</span>---> Running <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> 388d972cbd6d
Removing intermediate container 388d972cbd6d
</span>---><span style="color: rgba(0, 0, 0, 1)"> fd7a0ffca7fc
Successfully built fd7a0ffca7fc
Successfully tagged pyweb:v1
# <span style="color: rgba(255, 0, 0, 1)">docker run </span></span><span style="color: rgba(255, 0, 0, 1)">-d --network test-net -p 80:80 -v /app:/app --</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">name pyapp pyweb:v1</span>
9d419507b00adddd003f8e45580ec1ee48d4a0347091b65da1bc183a8bbe1dc2
# <span style="color: rgba(255, 0, 0, 1)">docker </span></span><span style="color: rgba(255, 0, 0, 1)">ps</span><span style="color: rgba(0, 0, 0, 1)">
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d419507b00a pyweb:v1 </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">python app.py</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 128, 1)">4</span> seconds ago Up <span style="color: rgba(128, 0, 128, 1)">2</span> seconds <span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">0.0</span>:<span style="color: rgba(128, 0, 128, 1)">80</span>-><span style="color: rgba(128, 0, 128, 1)">80</span>/<span style="color: rgba(0, 0, 0, 1)">tcp pyapp
# </span></pre>
</div>
<p> </p>
<p> 然后访问一下 http://192.168.23.146,每刷新一下page,都会执行一次redis.incr操作。,这样就实现了多容器之间的跨机器访问,大家也可以把这些放到</p>
<p>docker-compose文件中哦。</p>
<p><img src="https://img2018.cnblogs.com/blog/214741/201907/214741-20190707132825995-1884976680.jpg" alt=""></p>
<p> </p>
<p> </p>
<p> 好了,本篇就说到这里,希望对你有帮助。</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/huangxincheng/p/11146098.html
頁:
[1]