我们之前讲过部署一个简单的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(六)部署一个稍微复杂一点的应用相关推荐

  1. 从零开始学习docker(十八)Swarm mode 部署wordpress

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 本次我们部署一个稍微负复杂的application--wordpress. 之前我们使用docker run分别 ...

  2. 从零开始学习jQuery (六) AJAX快餐

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

  3. docker 中部署一个springBoot项目

    docker 中部署一个springBoot项目 (1)介绍 springBoot项目 1.项目结构 2.pom.xml [java] view plaincopy <?xml version= ...

  4. [297]从零开始学习Docker

    这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创. 学习过程中整理成适合我自己的笔记,其中也包含了我自己的实 ...

  5. 从零开始学习docker(十七)Swarm mode ---service

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 上一节中,我们学习了如何搭建一个swarm集群.本节中,我们介绍如何操作service. service,大家应 ...

  6. 从零开始学习docker(十九)Swarm mode 集群服务间通信--RoutingMesh

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 在上一节中,我们介绍了通过service create部署了wordpress和mysql,我们发现了几个问题: ...

  7. 从零开始学习docker(十五)Swarm mode 介绍

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 一般情况下,我们都在一台机器下部署容器,但实际情况下,应用如果只在一台机器上无法满足我们的需求,包含的容器比较多 ...

  8. 从零开始学习docker(十)搭建WordPress+Mysql,为什么要用Docker Compose

    我们从这一节开始介绍一个非常非常重要的工具--Docker Compose,这个工具会经常使用. 先从一个案例介绍一下我们为什么要用Docker Compose. 案例:如何通过容器部署一个WordP ...

  9. 从零开始学习docker(七)docker配置环境变量

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 在上一节中我们介绍了部署一个复杂的docker流程.其中涉及到一个命令选项 -e.这个命令的作用是传递环境变量. ...

最新文章

  1. 减少Android staido 占用C 盘
  2. cie计算机科学,爱德思IGCSE 计算机科学 edexcel computer science
  3. mysql的join算法_mysql的Join算法-阿里云开发者社区
  4. MyBatis知多少(8)关系型数据库
  5. 检测air运行环境版本
  6. python之路--day10-闭包函数
  7. 阿里云服务器web项目启动连接mysql_在腾讯云阿里云上部署JavaWeb项目(Tomcat+MySQL)...
  8. 学习笔记:聚类算法Kmeans/K-均值算法
  9. 反编译那些事儿(四)—序列化问题
  10. 金蝶K3案例教程目录2022
  11. Markdown表格——复杂表格
  12. WPF - Visual调试工具Snoop
  13. redis+lua脚本
  14. JAVA中Iterator转List三种方法
  15. 苏州企业研发费用精准统计难点分析
  16. Android Studio如何建立VR视频
  17. 动物miRNA靶基因本地预测(三)—— 靶基因预测与结果分析
  18. python-基础语法
  19. PCI 32,PCI 64和PCI-X,PCI-E图解差别
  20. 小学语文修改病句5句口诀及符号使用

热门文章

  1. MYSQL(04)-间隙锁详解
  2. Python实现顺序表
  3. 人工智能、机器学习和深度学习的区别?
  4. tcp为什么要三次握手,而不能二次握手?
  5. 收集的48个Shell脚本小技巧
  6. Basic操作系统概念梳理
  7. java 将对象转_如何将Java对象转换为C对象?
  8. vue实现两个数组的合并
  9. css怎么设置圆角背景,CSS新特性:圆角边框多栏Gird布局背景设置
  10. java ajax json 解析json数组对象数组对象数组对象数组_ajax传递包含对象数组的json数据...