zoukankan      html  css  js  c++  java
  • Docker入门 二 开发自己的镜像

     体验新的开发环境

    在以前,如果你想要进行Python开发,那么你第一件事情就是必须现在自己的电脑上面安装Python运行时和类库。

    但是,这样导致了一种情况,那就是为了期望应用运行正常必须跟你开发电脑环境一样,服务器部署运行也是这样的情况。

    使用了Docker,你能够仅抓取一个便携式的作为镜像的Python运行时,而无需安装。这样,你构建出来的东西包含了基础的Python镜像和你的应用代码,保证了你的应用和它的依赖还有运行时都能够作为整体来传输和使用。其实,你狗构建出来的东西还是镜像,是通过一个叫做Dockerfile来定义的。

    使用Dockerfile定义一个容器

    Dockerfile能够定义容器内部的环境如何运行。为了要访问资源,像网络接口和硬盘驱动在容器内部都是虚拟化的,与主机系统的其他部分都是隔离的,你不得不映射端口到外部,确定具体的文件交互格式。不管怎么样,你使用Dockerfile 把你的应用定义成镜像,就能够做到无论在什么样的环境下,都能够运行地特别一致。

    1 新建一个文件叫Dockerfile,然后复制进去以下内容:

    -------------------

    # Use an official Python runtime as a parent image
    FROM python:2.7-slim
    
    # Set the working directory to /app
    WORKDIR /app
    
    # Copy the current directory contents into the container at /app
    ADD . /app
    
    # Install any needed packages specified in requirements.txt
    RUN pip install -r requirements.txt
    
    # Make port 80 available to the world outside this container
    EXPOSE 80
    
    # Define environment variable
    ENV NAME World
    
    # Run app.py when the container launches
    CMD ["python", "app.py"]
    ----------------------------------------
    里面使用了app.py and requirements.txt两个文件,接着创建
    2 应用本身

    requirements.txt

    ----------
    Flask Redis
    ----------

    app.py

    -------------------------------------------------

    from flask import Flask
    from redis import Redis, RedisError
    import os
    import socket
    
    # Connect to Redis
    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 disabled</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)
    --------------------------------------------------
    现在来分析,【pip install -r requirements.txt】这个命令安装了Python版本的 Flask 和Redis,打印了环境变量 NAME,同时输出了调用
    socket.gethostname()结果。最后,因为Redis没有运行(我们只是安装了Python类库,并没有安装服务器啊),结果可惜而知当用到时就会报错。
    3 构建应用
    我们准备构建(就是打包),确保你是在目录中

    现在运行狗i按命令,使用 -t 参数来指定一个友好的名字

    docker build -t friendlyhello .
    看清楚了最后有一个空格和点,否则就会出错,正确结果是这样滴

    网速慢,真烦人。

    生成的镜像去了哪里?在我们电脑的本地镜像中心

     

    运行你的应用

    使用-p参数来映射宿主的端口到容器内的端口

    docker run -p 4000:80 friendlyhello
    结果

    访问本机浏览器 http://localhost:4000/

    提示出错了,不过这是在预期内。

    使用 -d参数让它在后台运行

    docker run -d -p 4000:80 friendlyhello
    查看运行
    停止下来
    docker stop 2c209c0636f4
    分享你的镜像
    先去官网注册一个账号。
    连接 Docker login
    标记你的镜像
    命令
    docker tag image username/repository:tag
    例子
    docker tag friendlyhello archimate/get-started:part1
    结果

    发布你的镜像到注册中心

    之后,就可以从远程来使用这个镜像了

    docker run -p 4000:80 archimate/get-started:part1。

    到此,容器已经创建并发布成功,下一章介绍如果在服务中运行容器并扩展。

     
     
  • 相关阅读:
    交易盈利核心
    tbquant 两个画线函数的说明
    胜率40% 盈亏2:1 交易策略源码
    Apache是如何运作的
    JSON_UNESCAPED_UNICODE的作用与理解
    Python的装饰器是什么?
    Python中的浅拷贝、深拷贝和赋值之间有什么区别?
    Python面试题——基础篇
    GD32F30x_ADC电压采集(规则并行+DMA方式)
    GD32F30x_定时器输出比较模式输出方波(DMA方式)
  • 原文地址:https://www.cnblogs.com/PerfectBeauty/p/7474199.html
Copyright © 2011-2022 走看看