美文网首页
Docker入门 - 2.基础知识 & 常用指令

Docker入门 - 2.基础知识 & 常用指令

作者: NowhereToRun | 来源:发表于2018-09-12 21:37 被阅读26次

    参考官方文档

    介绍

    是时候使用Docker的方法来构建app了。我们从container —— app的底层构建开始。在这一层的上方是服务,他定义了一个产品中的containers的行为,这个会在后面介绍。最顶层是stack,他定义了服务的所有交互。

    • Stack
    • Services
    • Container (you are here)

    开发环境

    一般情况下,如果想搭建一套开发环境,首先需要安装一大堆的依赖,很多人相比都经历过这样的痛苦,例如一个Python应用,你必须先安装Python的运行环境。
    使用Docker,您可以将可移植的Python运行时作为镜像(image)获取,无需安装。构建时可以在应用程序代码旁边包含基本Python镜像,这样可以确保您的应用程序,其依赖项和运行时都一起运行。
    这些可移植镜像统称为Dockerfile。

    Dockerfile

    Dockerfile定义了你的container内部环境。
    对网络接口和磁盘驱动器等资源的访问需要在此环境中进行虚拟化,该环境与系统的其他部分隔离,因此您需要将内部端口映射到外部,并具体说明要“复制”哪些文件到那个环境。但是,在执行此操作之后,您可以预期这个Dockerfile定义的应用程序在其运行的任何位置都会完全相同。

    创建Dockerfile

    新建一个文件夹,新建一个文件命名为Dockerfile,复制以下内容

    # 使用官方 Python runtime 作为父镜像(image)  
    FROM python:2.7-slim
    
    # 设置工作区 /app
    WORKDIR /app
    
    # 把当前路径下的所有文件拷贝到容器中的 /app
    ADD . /app
    
    # 安装所有requirements.txt中定义的依赖
    RUN pip install --trusted-host pypi.python.org -r requirements.txt
    
    # 向容器外暴露80端口
    EXPOSE 80
    
    # 定义环境变量
    ENV NAME World
    
    # container启动时执行 app.py
    CMD ["python", "app.py"]
    

    创建App

    这个稍微有一点python基础的都可以看懂,没有基础的也能看明白大致意思
    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)
    

    构建App

    目前我们的文件夹下应该有以下三个文件

    $ ls
    Dockerfile      app.py          requirements.txt
    

    执行build操作,这会创建一个Docker image,我们使用 -t 让他有一个有好的名字

    docker build -t friendlyhello .
    

    查看你的构建结果

    $ docker image ls
    
    REPOSITORY            TAG                 IMAGE ID
    friendlyhello         latest              326387cea398
    

    运行App

    将本机端口4000映射到容器的已发布端口80 -p:

    docker run -p 4000:80 friendlyhello  
    
    // 后台模式
    docker run -d -p 4000:80 friendlyhello
    

    访问 http://localhost:4000即可查看结果。

    使用后台模式启动时,会返回一个应用程序的长容器ID。

    $ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED
    1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago
    

    停止这个进程

    docker container stop 1fa4ab2cf395  
    

    共享image

    Docker提供了想github一样的平台,用于多人共享。
    如果您没有Docker帐户,请在hub.docker.com上注册一个帐户 。记下您的用户名。
    登录本地计算机上的Docker公共注册表。

    $ docker login
    

    将本地映像与注册表上的存储库相关联的表示法是 username/repository:tag。标签是可选的,但建议使用。

    现在,把它们放在一起来标记图像。docker tag image使用您的用户名,存储库和标记名称运行,以便将图像上载到所需的目标位置。该命令的语法是:

    docker tag image username/repository:tag
    

    例如:

    docker tag friendlyhello nowheretorun/get-started:master
    

    运行docker image ls以查看新标记的图像。

    $ docker image ls
    REPOSITORY                    TAG                 IMAGE ID               CREATED             SIZE
    friendlyhello                        latest                71d87c79fd0e        4 hours ago         132MB
    nowheretorun/get-started   master              71d87c79fd0e        4 hours ago         132MB
    hello-world                          latest                4ab4c602aa5e        4 days ago          1.84kB
    python                                2.7-slim             c9cde4658340        7 days ago          120MB
    

    发布

    docker push username/repository:tag
    

    这样之后,就可以直接拉取并执行一个远程仓库的镜像
    如果映像在计算机上不可用,则Docker会从存储库中提取映像。

    常用命令

    进入容器(有四种方式,先只记最方便的一种)

    docker ps // 查看 CONTAINER ID
    docker exec -it 69f6eecda047 /bin/bash// 根据ID 进入容器
    

    停止服务

    docker container stop 69f6eecda047 // CONTAINER ID
    

    相关文章

      网友评论

          本文标题:Docker入门 - 2.基础知识 & 常用指令

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