当前位置: 首页 > news >正文

Docker学习笔记_使用Dockerfile创建flask的一个镜像

一、实验环境

      1、宿主机OS:Win10 64位

      2 、虚拟机OS:Ubuntu18.04 64位    虚拟机名称:Ubuntu18VM1   虚拟机IP:192.168.8.25

      3、账号:docker    

二、简要步骤

  1.编写一个dockerfile文件
  2.编写外部文件requirements.txt
  3.编写一个app.py文件
  4.创建镜像
  5.查看镜像
  6.创建并运行容器
  7.从浏览器里查看

三、详细步骤

       1、建立一个docker的工作文件夹dokerspace,进入这个文件夹,编写dockerfile
           $vi Dockerfile

          

           文件Dockerfile内容:

           FROM python:3.5
           WORKDIR /app
      ADD . /app
           RUN pip install -r requirements.txt
           EXPOSE 80
           ENV NAME World
           CMD ["python","app.py"]
          

  2、编写外部文件requirements.txt

            Flask

            Redis

       3、编写app.py,3、这里app.py是一个简单的Python应用文件内容:

from flask import Flask
from redis import Redis,RedisError
import os
import socket

redis = Redis(host="redis",db=0,socket_connect_timeout=2,socket_timeout=2)
app = Flask(__name__)
@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis,counter disababled</i>"
    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b>{hostname}<br>" \
           "<b>Visits:</b>{visits}"

    return html.format(name=os.getenv("NAME","world"),hostname=socket.gethostname(),visits=visits)

if __name__=="__main__":
    app.run(host='0.0.0.0',port=80)

       4、创建镜像

       $docker build -t hellodocker . 
       其中,docker build是构建镜像的指令;-t参数指定了生成的镜像的名称为hellodocker;最后的点,表明是当前目录。如果Dockerfile不在此目录,则需要将点替换为

Dockerfile所在的目录。

       5、查看镜像

       $sudo docker ps

       6、创建并启动容器

       $sudo docker run -d -p 5000:80 hellodocker

       

       7、从宿主机浏览器里查看

      

        
         至此,一个简单的基于flask镜像创建的容器已经运行。


四、遇到问题及处理

     1、遇到问题:在试验中,能创建镜像,但无法创建并启动容器。

          经检查,是app.py文件里存在bug。把此文件放到一个Python的环境里,排查问题,直到能正常解释执行。修正本实验中的app.py后,后续步骤正常进行。

 

转载于:https://www.cnblogs.com/SH170706/p/10394281.html

相关文章:

  • java 多线程基础, 我觉得还是有必要看看的
  • Nginx压测和并发预估
  • 未发先侃?对比华为,高通第二代5G调制解调器如何?
  • 安卓P底部有空白,需要手动全屏
  • vue.js框架原理浅析
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • SpringBoot 实战 (九) | 整合 Mybatis
  • ThinkSNSPlus 2.0 产品体验报告
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 资源 | 上千份简历模板统统给你!都拿去!
  • idou老师教你学Istio :5分钟简析Istio异常检测
  • CSS 专业技巧
  • 交互设计原则
  • Btrace使用入门
  • GraphQL学习过程应该是这样的
  • ----------
  • [PHP内核探索]PHP中的哈希表
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 03Go 类型总结
  • echarts的各种常用效果展示
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • es6(二):字符串的扩展
  • Fabric架构演变之路
  • git 常用命令
  • Promise面试题2实现异步串行执行
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • TCP拥塞控制
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • - 概述 - 《设计模式(极简c++版)》
  • 王永庆:技术创新改变教育未来
  • 问题之ssh中Host key verification failed的解决
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #define与typedef区别
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (笔试题)合法字符串
  • (六)c52学习之旅-独立按键
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)http-server应用
  • (转)为C# Windows服务添加安装程序
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • ./configure,make,make install的作用(转)
  • .NET Core 版本不支持的问题
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Micro Framework初体验
  • .NET开发者必备的11款免费工具
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .Net语言中的StringBuilder:入门到精通
  • .Net中间语言BeforeFieldInit
  • @ModelAttribute 注解
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • []串口通信 零星笔记