15-多容器复杂应用的部署

15-多容器复杂应用的部署

此节主要是通过部署一个复杂的应用场景,进而练习容器的网络相关知识。

创建一个flask-web应用

  1. 创建一个 flask-web 文件夹

    mkdir flask-web
    

    在此文件夹内创建 app.py 文件

    cd flask-web
    touch app.py
    
  2. 编写一个简单的 web 程序

    import os
    import socket
    import redis
    from flask import Flaskapp = 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 been 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)
    

创建一个 redis 数据库容器

  1. 创建容器

    docker run -d --name redis redis
    

    这里为什么没有增加端口呢,是因为我们想内部自己访问,不想暴露给外面,这样也比较安全。

  2. 查看运行情况

    [vagrant@10 flask-web]$ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
    d9916db96279        redis               "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        6379/tcp             redis
    

部署

  1. 创建自定义的 web 程序镜像

    首先编写Dockerfile

    FROM python:2.7
    LABEL maintaner="vincent <jeffmanword@gmail.com>"
    COPY ./app.py /app/
    WORKDIR /app
    RUN pip install flask redis
    EXPOSE 5000
    CMD ["python", "app.py"]
    

    构建镜像

    docker build -t vincent/flask-redis .
    
  2. 创建 flask-redis 的容器

    docker run -d --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis
    

    -d 是后台执行
    –link 是连接redis容器,使 flask-redis 容器可以访问 redis 容器
    -e 设定容器的环境变量,下面讲

  3. 问题解决

    上一步构建完成后,查看容器运行情况

    docker ps
    

    发现刚刚创建的flask-redis容器并没有运行,而是停止了,说明工作不正常,那么我怎么办?

    首先我们查看运行日志

    [vagrant@10 flask-web]$ docker logs flask-redis 
    Traceback (most recent call last):File "app.py", line 7, in <module>redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
    NameError: name 'Redis' is not defined
    

    发现这里有一个错误,这是使用redis错误导致的,app.py 修改如下

    import os
    import socket
    import redis
    from flask import Flaskapp = Flask(__name__)
    redis = 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 been 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)
    

    重新构建镜像

    docker rm flask-redis && docker rmi vincent/flask-redis
    

    重新创建容器

    docker run -d --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis
    
  4. 进入 flask-redis 容器

    docker exec -it flask-redis /bin/bash
    

    查看 env

    root@99a298edd5da:/app# env
    

    我们能在返回的内容中找到这样一条环境变量

    REDIS_HOST=redis
    

    说明刚刚创建容器的时候参数 -e的作用就在此。

  5. 测试网络

    测试ping redis 查看是否连通

    root@99a298edd5da:/app# ping redis
    PING redis (172.17.0.4) 56(84) bytes of data.
    64 bytes from redis (172.17.0.4): icmp_seq=1 ttl=64 time=0.079 ms
    64 bytes from redis (172.17.0.4): icmp_seq=2 ttl=64 time=0.068 ms
    

    ping redis 是通的。这是因为

    redis = redis.Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
    

    在这里的 REDIS_HOST 被替换成了我们设定的名字,其实这段代码在访问的时候其实是直接访问的 redis,因为设定了 --link 参数,那么是可以访问的,而不需要ip。到这里有的人会有疑问,为什么不直接在代码中写 redis 呢?原因是方便我们后续更改名称,我们只需要在创建容器的时候指定名称即可,你可以叫 redis1,redis2 都可以。

    我们在这个容器内访问 web 服务

    root@99a298edd5da:/app# curl 127.0.0.1:5000
    hello Container World! I have been seen 1 times and my hostname is 99a298edd5da.
    

    这个web程序运行是正常的。

  6. 设定端口

    退出容器,测试访问本地 5000 端口

    [vagrant@10 flask-web]$ curl 127.0.0.1:5000
    curl: (7) Failed connect to 127.0.0.1:5000; 拒绝连接
    

    我们无法访问,这是因为我们只是暴露了 容器的 5000端口,但是并没有和本地端口进行绑定。

    那我们重新创建容器

    docker stop flask-redis && docker rm flask-redis
    docker run -d -p 5000:5000 --link redis --name flask-redis -e REDIS_HOST=redis vincent/flask-redis
    

    再次测试访问本地 5000 端口

    [vagrant@10 flask-web]$ curl 127.0.0.1:5000
    hello Container World! I have been seen 2 times and my hostname is e2ecfc2256f7.
    

总结

我们通过这个例子我们创建了两个容器,并且相互之间有访问设定,这很符合我们前后端开发的一个模式,一般 web程序 和 数据是分离的,这也是我们把 redis 单独封装在一个容器的原因。

这里我们在创建容器的时候使用了 -e 参数,我们详细介绍一下。

创建一个带-e参数的test4 容器

docker run -d -e PENG=vincent --name test4 busybox /bin/sh -c "while true; do sleep 3600; done"

进入容器

docker exec -it test4 /bin/sh

这里说明一下何时加 -it 参数当我们使用 exec 的时候需要加,这时我们想进入一个容器,如果我们在创建一个容器的时候,也就是run命令,那么是否加-it取决于,这个容器内的启动命令配置,例如: 如果使用 ENTRYPOINT [“ls”] 那么我们不需要加 -it,如果什么都没有设置,那么就需要加,一般这样使用docker run -it test1 /bin/sh ls

执行 env

/ # env
HOSTNAME=51801dc17c67
SHLVL=1
HOME=/root
TERM=xterm
PENG=vincent
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

我们可以看到 PENG=vincent 已经被设置在容器内了。这有什么用呢,有的时候有些程序需要读取环境变量才能工作,这就很有用了。

最后我们再回顾一下这节部署的程序网络模型图

在这里插入图片描述

我们部署的两个容器是在同一台linux主机内的,他们可以访问是很简单的,那么如果是两台linux呢?

在这里插入图片描述

我们假设这两台linux主机是可以通信的,现在我们想把 redis 部署在一台linux主机上,flask-web 部署在另一台linux主机上,他们如何通信?如何配置? 大家思考一下。

答案将在下一节我们讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16-多机器通信

16-多机器通信 回顾上节课的思考题。 flask-redis 想访问 redis&#xff0c;该如何通信&#xff1f; 创建另外一台linux虚拟机 直接拷贝Vagrantfile文件创建一个 centos 虚拟机 我们创建一个centos7-2文件夹&#xff0c;然后创建虚拟机 vagrant up创建的过程中提示选择网络接…

17-Docker的数据持久化介绍

17-Docker的数据持久化介绍 回顾容器与镜像 容器是在镜像之上创建的一层运行时层&#xff0c;这一层是可以读写的&#xff0c;我们能够在容器内添加数据&#xff0c;读取数据。 也就是说我们在创建容器的时候&#xff0c;我们能够在容器内创建文件&#xff0c;安装软件等等&a…

在Linux中对硬盘进行分区、格式化和挂载

在Linux中对硬盘进行分区、格式化和挂载 我最近有一个全新的4-TB硬盘加入我的电脑。所以我需要在Linux中安装它。为此&#xff0c;我需要执行以下操作&#xff1a; 分区格式化挂载检查是否已安装硬盘驱动器 分区 首先&#xff0c;在通过SATA和电源线将硬盘连接到计算机后&am…

Angular gitlab持续集成之runner配置

gitlab持续集成 安装Runner 正常安装 sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64sudo chmod x /usr/local/bin/gitlab-runner sudo useradd --comment GitLab Runner --creat…

vscode设置中文

vscode设置中文 当我们安装完成vscode后&#xff0c;会发现它是中文的&#xff0c;因为默认情况下&#xff0c;vscode使用的语言为英文(us)。 那很多同学是不喜欢英文的&#xff0c;不是看不懂&#xff0c;而是不方便哈。 修改语言配置文件 使用快捷键组合【CtrlShiftp】 在…

linux下编译boost

linux下编译boost 下载boot库 官方下载地址 下载完成会解压。 编译 1.进入解压后的文件夹内 cd boost_1_69_0 执行下面的语句 ./bootstrap.sh --with-librariesall --with-toolsetgcc–with-libraries 指定编译哪些boost库&#xff0c;all的话就是全部编译&#xff0c;只想…

conky安装配置

conky安装配置 安装conky sudo apt-get install conky-all修改配置 在主目录下创建’.conkyrc’ 文件内容&#xff1a; # set to yes if you want Conky to be forked in the background background no cpu_avg_samples 2 net_avg_samples 2 out_to_console no # X font w…

Windows子系统安装图形界面

Windows子系统安装图形界面 有很多同学需要使用 linux 系统,但是又不想真正安装一个 linux 系统。于是微软大哥就把 ubuntu 系统集成到 windows 内了&#xff0c;你说 微软 屌不屌&#xff1f; 言归正传。 安装Xlaunch 因为这个是最靠谱的图形化界面了&#xff0c;所以不解…

Linux下查看显卡PCIE速率x16x8x4及设定

Linux下查看显卡PCIE速率x16x8x4 由于linux软件并不是很齐全所以查看显卡占用PCIE的带宽并不直观&#xff0c;所以本文介绍如何查看。 Windows下使用GPU-Z即可查看 Linux 确定当前显卡型号 lspci | grep NVIDIA返回 02:00.0 3D controller: NVIDIA Corporation GM107M [GeFor…

Deepin安装最新显卡RTX2080Ti及CUDA10.1

Deepin安装最新显卡RTX2080Ti及CUDA10.1 废话不多说直接上教程。 本系统为Deepin 15.10.2&#xff0c;是基于debian 9发布的&#xff0c;不排除后续deepin升级为debian 10&#xff0c;就目前来看是和ubuntu 16.04一样&#xff0c;使用的是debian 9&#xff0c;所以下载安装包等…

Clonezilla再生龙备份与还原linux系统

文章目录Clonezilla再生龙备份与还原linux系统简介功能与要求一、制作再生龙启动盘1.下载镜像2.制作启动盘二、系统分区三、备份系统四、还原系统注意事项Clonezilla再生龙备份与还原linux系统 简介 再生龙&#xff08;Clonezilla&#xff09;是一个免费的灾难恢复、硬盘克隆…

网页滚动条上下滚动固定元素左右不固定之sticky

网页滚动条上下滚动固定元素左右不固定之sticky 有时候我们需要网页中某元素在上下滚动时可以固定在某一位置&#xff0c;但是左右不固定&#xff0c;也就是会随着左右滚动条滚动。那么我们可以通过 sticky 布局来解决。 position: sticky 我们先看看兼容性&#xff1a; 在使…

Timeshift系统备份与还原

Timeshift系统备份与还原 系统备份 一般Linux系统是比较稳定的&#xff0c;但是一旦崩溃就很难恢复&#xff0c;这里介绍 Timeshift系统备份工具。 安装Timeshift ubuntu 和 linux mint sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get ins…

图片床

仅供存储图片

Angular实现dialog对话框封装

Angular实现dialog对话框封装 为什么要封装? 对于Angular Material UI库中的dialog组件,实在不是很好用,所以打算简单封装一下啊。 直接代码吧。 封装dialog组件 1.创建一个dialog组件 2.dialog.component.html文件 <ng-template #dialog><!-- 对话框投射内容…

Ubuntu LinuxMint安装微信QQ阿里旺旺

Ubuntu LinuxMint安装微信QQ阿里旺旺 目前linux大部分桌面发行版都可以安装windows版本的微信、QQ、阿里旺旺等软件了&#xff0c;这是deepin系统的功劳&#xff0c;这里还要感谢一下 前深度CEO 勇哥的不懈努力和坚持。 安装 这里推荐一个移植好的安装方法。 zq1997/deepin-w…

Angular消息通知组件ngx-notification

Angular消息通知组件ngx-notification It is a flexible and usable component. Demo Demo Installation 1.You need install @flywine93/ngx-notification by npm npm install @flywine93/ngx-notification --save2.You need install @flywine93/ngx-autounsubscrb npm …

01-go安装

01-go安装 本教程适用于linux发行版安装。 当前系统使用的是linux mint 19.ubuntu deepin 等同理。 下载安装包 下载地址 go downloads。 选择Linux包点击下载。 开始安装 1.设定安装目录 在下载好的压缩包文件夹内打开终端&#xff0c;并设置安装目录环境变量&#xff0c…

02-go的IDE安装

02-go的IDE安装 此篇文章是在go已经安装的前提下进行的&#xff0c;如果go还没有安装请参考这篇文章 01-go安装。 本文章使用的是vscode作为go IDE&#xff0c;所以需要提前安装好vscode&#xff0c;并且是在linux系统下。 当前系统为linux mint 19&#xff0c;ubuntu deepin…

go validator使用教程

go validator使用教程 很多时候在B/S开发过程中,经常会遇到对参数的校验工作,一般客户端需要提前验证一次提交的数据是否合理,以减少后端的压力,而后端是必须要对数据做验证的。 一般验证的方式大多都是if-else,这种方式会让你掉入无底的深渊,就像下面一样。 [图片来源…