从零开始学习docker(六)部署一个稍微复杂一点的应用
我们之前讲过部署一个简单的Python程序。
这一节我们将这个Python程序进行一个扩展,连接redis数据库,并对redis进行一些操作,
新建App.py,内容如下:
from flask import Flask
from redis import Redis
import 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 bean 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)
新建Dockerfile,内容如下:
FROM python:2.7
LABEL maintainer="vincent"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
创建image:
docker build -t vincent/flask-redis .
我们既然要使用redis,但是我们并没有在Dockerfile中安装redis,只是在引入了一个Python redis依赖库,如何使用redis服务?
当我们build一个复杂的App的时候,我们需要把App的组件分成不同的容器去部署。我们把redis作为一个单独的App进行部署,flask作为一个单独的App进行部署,flask要去访问redis。我们先创建一个redis的一个容器。
docker run -d --name redis redis
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fb5745864cd redis "docker-entrypoint.s…" 23 seconds ago Up 22 seconds 6379/tcp redis
但是我们现在的redis的端口是6379。但是我们在创建容器的时候,并没有指定-p 6379:6379 参数。
问什么呢?因为我们这里的redis不是提供给外面的人访问的,他是供我们App内部访问的,因此我们没必要把6379暴露到外面去(这样不安全)。
此外我们的App.py并不知道redis的IP地址,因此把地址用环境变量的方式获取(os.environ.get('REDIS_HOST', '127.0.0.1'))。
我们可以使用link参数,通过访问redis的容器名字来访问。
创建flask-redis的container:
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis
-e REDIS_HOST 表示在当前容器vincent/flask-redis中设置一个环境变量REDIS_HOST=redis
我们进入到容器中查看env:
docker exec -it flask-redis /bin/bash
root@45977ae3cbed:/app# env
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_PORT=tcp://172.17.0.2:6379
REDIS_NAME=/flask-redis/redis
LANG=C.UTF-8
HOSTNAME=45977ae3cbed
REDIS_PORT_6379_TCP_ADDR=172.17.0.2
REDIS_PORT_6379_TCP=tcp://172.17.0.2:6379
GPG_KEY=C01E1CAD5EA2C4F0B8E3571504C367C218ADD4FF
PYTHONIOENCODING=UTF-8
REDIS_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.5.tar.gz
REDIS_HOST=redis
PWD=/app
HOME=/root
REDIS_PORT_6379_TCP_PORT=6379
TERM=xterm
REDIS_ENV_REDIS_DOWNLOAD_SHA=2139009799d21d8ff94fc40b7f36ac46699b9e1254086299f8d3b223ca54a375
REDIS_ENV_GOSU_VERSION=1.10
PYTHON_VERSION=2.7.16
SHLVL=1
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
REDIS_ENV_REDIS_VERSION=5.0.5
PYTHON_PIP_VERSION=19.1.1
_=/usr/bin/env
可以看到里面有一个环境变量REDIS_HOST=redis
通过name来ping通:
root@45977ae3cbed:/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=1.16 ms
64 bytes from redis (172.17.0.2): icmp_seq=2 ttl=64 time=0.105 ms
64 bytes from redis (172.17.0.2): icmp_seq=3 ttl=64 time=0.215 ms
可以在容器内发送请求:
root@e9361b832e36:/app# curl 127.0.0.1:5000
Hello Container World! I have bean seen 3 times and my hostname is e9361b832e36.
root@e9361b832e36:/app# curl 127.0.0.1:5000
Hello Container World! I have bean seen 4 times and my hostname is e9361b832e36.
root@e9361b832e36:/app# curl 127.0.0.1:5000
Hello Container World! I have bean seen 5 times and my hostname is e9361b832e36.
但是这时候在宿主机中还是无法访问。
我们重新启动flask-redis服务,并指定端口:
docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
835a7fb5a689 vincent/flask-redis "python app.py" 2 minutes ago Up 4 seconds 0.0.0.0:5000->5000/tcp flask-redis
1fb5745864cd redis "docker-entrypoint.s…" 15 hours ago Up 40 seconds 6379/tcp redis
在宿主机中访问:
curl 127.0.0.1:5000
Hello Container World! I have bean seen 8 times and my hostname is 835a7fb5a689.
本节的架构图如下所示:
目前我们的两个container是在同一台机器上的,通过docker0可以相互通信。那么如果有两台Linux服务器,分别部署一个docker,那么如何通信呢?
我们将在后面介绍
从零开始学习docker(六)部署一个稍微复杂一点的应用相关推荐
- 从零开始学习docker(十八)Swarm mode 部署wordpress
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 本次我们部署一个稍微负复杂的application--wordpress. 之前我们使用docker run分别 ...
- 从零开始学习jQuery (六) AJAX快餐
本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...
- docker 中部署一个springBoot项目
docker 中部署一个springBoot项目 (1)介绍 springBoot项目 1.项目结构 2.pom.xml [java] view plaincopy <?xml version= ...
- [297]从零开始学习Docker
这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创. 学习过程中整理成适合我自己的笔记,其中也包含了我自己的实 ...
- 从零开始学习docker(十七)Swarm mode ---service
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 上一节中,我们学习了如何搭建一个swarm集群.本节中,我们介绍如何操作service. service,大家应 ...
- 从零开始学习docker(十九)Swarm mode 集群服务间通信--RoutingMesh
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 在上一节中,我们介绍了通过service create部署了wordpress和mysql,我们发现了几个问题: ...
- 从零开始学习docker(十五)Swarm mode 介绍
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 一般情况下,我们都在一台机器下部署容器,但实际情况下,应用如果只在一台机器上无法满足我们的需求,包含的容器比较多 ...
- 从零开始学习docker(十)搭建WordPress+Mysql,为什么要用Docker Compose
我们从这一节开始介绍一个非常非常重要的工具--Docker Compose,这个工具会经常使用. 先从一个案例介绍一下我们为什么要用Docker Compose. 案例:如何通过容器部署一个WordP ...
- 从零开始学习docker(七)docker配置环境变量
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 在上一节中我们介绍了部署一个复杂的docker流程.其中涉及到一个命令选项 -e.这个命令的作用是传递环境变量. ...
最新文章
- 减少Android staido 占用C 盘
- cie计算机科学,爱德思IGCSE 计算机科学 edexcel computer science
- mysql的join算法_mysql的Join算法-阿里云开发者社区
- MyBatis知多少(8)关系型数据库
- 检测air运行环境版本
- python之路--day10-闭包函数
- 阿里云服务器web项目启动连接mysql_在腾讯云阿里云上部署JavaWeb项目(Tomcat+MySQL)...
- 学习笔记:聚类算法Kmeans/K-均值算法
- 反编译那些事儿(四)—序列化问题
- 金蝶K3案例教程目录2022
- Markdown表格——复杂表格
- WPF - Visual调试工具Snoop
- redis+lua脚本
- JAVA中Iterator转List三种方法
- 苏州企业研发费用精准统计难点分析
- Android Studio如何建立VR视频
- 动物miRNA靶基因本地预测(三)—— 靶基因预测与结果分析
- python-基础语法
- PCI 32,PCI 64和PCI-X,PCI-E图解差别
- 小学语文修改病句5句口诀及符号使用