美文网首页
使用 Dockerfile 定义容器

使用 Dockerfile 定义容器

作者: tingshuo123 | 来源:发表于2018-11-30 11:56 被阅读6次

    准备

    新建一个空目录 docker-test

    sudo mkdir docker-test
    

    文件夹下有三个文件

    $ ls
    app.py  Dockerfile  requirements.txt
    

    文件内容分别为

    $ cat Dockerfile 
    # 将官方 Python 运行时用作父镜像
    FROM python:2.7-slim
    
    # 将工作目录设置为 /app
    WORKDIR /app
    
    # 将当前目录内容复制到位于 /app 中的容器中
    ADD . /app
    
    # 安装 requirements.txt 中指定的任何所需软件包
    RUN pip install -r requirements.txt
    
    # 使端口 80 可供此容器外的环境使用
    EXPOSE 80
    
    # 定义环境变量
    ENV NAME World
    
    # 在容器启动时运行 app.py
    CMD ["python", "app.py"]
    
    $ cat requirements.txt 
    Flask
    Redis
    
    $ cat Dockerfile 
    # 将官方 Python 运行时用作父镜像
    FROM python:2.7-slim
    
    # 将工作目录设置为 /app
    WORKDIR /app
    
    # 将当前目录内容复制到位于 /app 中的容器中
    ADD . /app
    
    # 安装 requirements.txt 中指定的任何所需软件包
    RUN pip install -r requirements.txt
    
    # 使端口 80 可供此容器外的环境使用
    EXPOSE 80
    
    # 定义环境变量
    ENV NAME World
    
    # 在容器启动时运行 app.py
    CMD ["python", "app.py"]
    ubuntu@VM-0-10-ubuntu:~/test-python$ cat 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__":
    

    构建应用

    运行构建命令,创建由我们自己定制 Docker 镜像

    docker build -t friendlyhello .
    

    构建成功标识

    Successfully built 730effa82331
    Successfully tagged friendlyhello:latest
    

    查看镜像

    $ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    friendlyhello       latest              730effa82331        29 minutes ago      131MB
    <none>              <none>              be8ab6ceffdf        32 minutes ago      120MB
    python              2.7-slim            0dc3d8d47241        13 days ago         120MB
    hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB
    

    运行应用

    运行应用,使用 -p 参数将机器的 4000 端口映射到 Docker 容器的 80 端口:

    $ docker run -p 4000:80 friendlyhello
    

    启动成功标识

     * Serving Flask app "app" (lazy loading)
     * Environment: production
       WARNING: Do not use the development server in a production environment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
    

    可以另起一个终端,使用 curl 访问通过 Docker 启动的应用

    $ curl localhost:4000
    <h3>Hello World!</h3><b>Hostname:</b> c4fb61eb00ef<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>
    

    成功后可以使用 CTRL + C 退出 Python 应用

    相关文章

      网友评论

          本文标题:使用 Dockerfile 定义容器

          本文链接:https://www.haomeiwen.com/subject/fnnccqtx.html