Docker 多容器, 复杂应用的部署!
这次启动两个容器
一个容器用于运行 redis。 另一个运行 python的 flask web应用。
在这个 web app 里面, 访问redis。
[miller@docker4 py-flask-redis]$ ls
app.py Dockerfile
[miller@docker4 py-flask-redis]$ cat app.py
from flask import Flask
import redis
import os
host = os.environ.get("REDIS_HOST", "redis")
redis_conn = redis.Redis(host=host, port="6379")
app = Flask(__name__)
@app.route("/")
def web_test():
res = redis_conn.incr("range_key")
return "这是我第 %s 次调用, incr 方法。" % res
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
[miller@docker4 py-flask-redis]$ cat Dockerfile
FROM python:3.7.7
LABEL maintainer="5913114@qq.com"
COPY app.py /app/
RUN pip install flask redis
WORKDIR /app
EXPOSE 5000
CMD ["python3", "app.py"]
然后进行 docker build
[miller@docker4 py-flask-redis]$ docker build -t caijiwandocker/flask-redis
[miller@docker4 py-flask-redis]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
caijiwandocker/flask-redis latest 557535394ca7 8 minutes ago 929MB
python 3.7.7 859d8ec7db6a 10 days ago 919MB
redis latest 4cdbec704e47 11 days ago 98.2MB
构建完成之后, 执行docker run
先将redis 容器 启动起来,
[miller@docker4 py-flask-redis]$ docker run -d --name=redis redis
然后启动刚刚构建好的 flask的应用。
[miller@docker4 py-flask-redis]$ docker run -d --link=redis -p 5000:5000 -e REDOS_HOST=reids caijiwandocker/flask-redis
解释一下:
--link=redis link到 redis。 这个redis仅仅只是个名字, 用代替 redis 这个容器的 ip地址使用的。(因为ip地址是多变的。但是只要name不变 就可以访问)
-p 5000:5000 将主机的 5000端口 映射到 这个flask 容器,抛出的5000端口上。
-e REDOS_HOST=reids 为这个flask容器 添加一个环境变量。 (app.py 中 os.environ.get("REDOS_HOST")) 其实就是获取的这个环境变量。
这样如果某一天, redis这个容器要换一个名字,换成 redis-v1 , 那再运行flask这个容器时就可以这样:
[miller@docker4 py-flask-redis]$ docker run -d --link=redis-v1 -p 5000:5000 -e REDOS_HOST=reids-v1 caijiwandocker/flask-redis
完全不需要去理会, ip地址到底是多少。 很是方便。
##################################################################################################
在这个例子中 redis 服务器。仅仅只是 内部的 app 进行访问。 而由于docker的 bridge 存在. 容器和容器之间就可以相互的通信访问。
所以redis服务器, 完全没必要去做映射。 这样反而会让外部也能访问到 redis。 反而不安全。
仅仅只需要 为 flask 容器。 做一个映射 让外部可以访问到flask就可以了。
原文地址:https://www.cnblogs.com/chengege/p/12681273.html
- Elasticsearch聚合 之 Histogram 直方图聚合
- Elasticsearch聚合 之 Date Histogram聚合
- Elasticsearch聚合 之 Terms
- Elasticsearch聚合初探——metric篇
- AngularJS API之$injector ---- 依赖注入
- AngularJS API之extend扩展对象
- AngularJS API之equal比较对象
- Elasticsearch之_default_—— 为索引添加默认映射
- Elasticsearch 动态映射——自动检测
- Elaticsearch REST API常用技巧
- C++拷贝构造函数
- 记录安装oracle的那些事(一)之oracle我很大
- Elasticsearch 连接查询
- 小程序加戏成功!变身游戏成新版微信最大主角,用户玩得不亦乐乎
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 单细胞转录组基础分析五:细胞再聚类
- Semaphore回顾
- iOS13 关闭黑暗模式+状态栏显示问题解决方法
- 0807-6.2.0-CDSW中Session列表和team分析
- 单细胞转录组基础分析八:可视化工具总结
- 单细胞转录组基础分析七:差异基因富集分析
- 定位权限请求时易犯的错误小结
- NSOperationQueue队列中操作依赖相关思考
- 单细胞转录组高级分析一:多样本合并与批次校正
- 10元最多可喝多少瓶啤酒?(不可借酒+可借酒,swift语言实现)
- 单细胞转录组高级分析二:转录调控网络分析
- 关于数组内元素是否会被改变的思考
- 排序之选择排序实现(swift)
- 去除友盟等第三方SDK失败的解决办法(clang: error: no such file or directory:xx)
- iOS踩坑之多代理模式使用注意