• Docker-创建和分享应用(3)


       

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

    1. 快速测试Docker环境是否可用

    docker run hello-world
    

    2. 创建Dockerfile文件

       在一个空目录中创建一个名为Dockerfile的文件,内容如下:

    # 使用官方的Python环境作为父镜像
    FROM python
    
    # 设置工作目录为 /app
    WORKDIR /app
    
    # 拷贝当前目录下的文件到容器的/app目录下
    COPY . /app
    
    # 在容器中运行下面命令安装 requirements.txt中的软件
    RUN pip install --trusted-host pypi.python.org -r requirements.txt
    
    # 暴露80端口到容器外部
    EXPOSE 80
    
    # 定义一个环境变量
    ENV NAME World
    
    # 当容器启动时,运行'python app.py'
    CMD ["python", "app.py"]
    

      

      

    3. 在该目录下继续创建一个Flask应用程序和安装文件清单

    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) 

    requirements.txt

    Flask
    Redis
    

      

    4. 构建应用程序

    我们准备构建应用程序。确保您仍处于新目录的顶层。这是ls应该显示的内容:

    $ ls
    Dockerfile		app.py			requirements.txt
    

      

    创建一个Docker镜像,我们将使用该--tag或者-t选项命名镜像

    docker build --tag=friendlyhello .
    

      

    查看创建的镜像

    root@node1 docker]# docker image ls
    REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
    friendlyhello                        latest              67bd580f29b8        21 seconds ago      937MB
    

      

    Linux用户的故障排除
    • 代理服务器设置

      代理服务器可以在Web应用程序启动并运行后阻止其连接。如果您位于代理服务器后面,请使用以下ENV命令将以下行添加到Dockerfile中,以指定代理服务器的主机和端口:

    # Set proxy server, replace host:port with values for your servers
    ENV http_proxy host:port
    ENV https_proxy host:port
    

      

    • DNS设置

      DNS配置错误可能会产生问题pip您需要设置自己的DNS服务器地址才能pip正常工作。您可能想要更改Docker守护程序的DNS设置。您可以/etc/docker/daemon.json使用dns密钥编辑(或创建)配置文件,如下所示:

    {
      "dns": ["your_dns_address", "8.8.8.8"]
    }

      在上面的示例中,列表的第一个元素是DNS服务器的地址。第二项是Google的DNS,可在第一项无法使用时使用。

      在继续之前,请保存daemon.json并重新启动docker服务。

    sudo service docker restart

    修复后,重试运行该build命令。

    5. 运行应用程序

    运行应用程序,使用以下方法将计算机的端口4000映射到容器的已发布端口80,-p是将容器的端口Publish到外部的意思。

    docker run -p 4000:80 friendlyhello
    

     在浏览器访问‘http://localhost:4000’即可访问到内部的应用程序,按Ctrl+c即可结束应用程序。

    后台以分离模式运行应用程序,-d就是在后台运行镜像,并打印出容器ID

    docker run -d -p 4000:80 friendlyhello
    

    6. 停止应用程序所在容器的运行

    docker container stop ID
    

      

    7. 分享镜像

    如果没有Docker帐户,请在hub.docker.com上注册一个帐户 ,并记下的用户名。

    1. 在本地的计算机上登录

    docker login
    

     

    2. 将镜像打上标签,该命令的语法是:

    docker tag image username/repository:tag
    

      比如我的登录名为scottcho,将版本库命名为flask,tag为v1

    [root@node1 docker]#  docker tag friendlyhello scottcho/flask:v1
    
    [root@node1 docker]# docker image ls scottcho/flask
    REPOSITORY   TAG IMAGE ID     CREATED    SIZE
    scottcho/flask v1 67bd580f29b8 30 minutes ago 937MB
    

      

    3. 发布镜像

    docker push scottcho/flask:v1
    

     在docker hup上可以看见所创建的镜像

    4. 在任何计算机上可以运行分享的镜像

    如果映像在本地不可用,则Docker会从存储库中提取映像。

    docker run -p 4000:80 scottcho/flask:v1
    

      

      

    查看容器内的改变信息

    创建一个容器,会在容器的对应的镜像上增加一个可写层,镜像部分是只读的。通过 diff命令可以看出改变的信息。如:

    [root@wls12c ~]$ docker run -i -t centos /bin/bash
    [root@224de7986c5f /]# touch demo.ext
    [root@224de7986c5f /]# echo hello docker >demo.ext 
    [root@224de7986c5f /]# rm -rf anaconda-post.log 
    [root@224de7986c5f /]# exit
    exit
    [root@wls12c ~]$ docker ps -l
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
    224de7986c5f        centos              "/bin/bash"         40 seconds ago      Exited (0) 3 seconds ago                       desperate_curie     
    [root@wls12c ~]$ docker diff 224d
    D /anaconda-post.log
    A /demo.ext
    C /root
    A /root/.bash_history

    说明:每行代表一个变动的文件或目录。其中 A 表示新增、C表示被修改、D表示被删除

    主机和容器之间的文件拷贝

    容器--->主机

    [root@wls12c ~]$ docker exec  -t -i 9f bin/bash
    [root@9f49397623ad /]# cat demo.txt 
    hello
    [root@9f49397623ad /]# exit
    exit
    [root@wls12c
    ~]$ docker cp 9f:/demo.txt /test [root@wls12c ~]$ cat /test/demo.txt hello

    主机-->容器

    [root@wls12c ~]$  cp ~/1.txt  /var/lib/docker/aufs/mnt/9f49397623ade7dfd2beb4d84454cbdb9878a4b22a2bab2e8b5db72bcffe60a0/test
    
    [root@wls12c ~]$ docker exec   -t -i 9f   /bin/bash
    [root@9f49397623ad /]# ls /test
    1.txt

    重命名容器

    [root@wls12c ~]$ docker rename stoic_meitner demo
  • 相关阅读:
    总公司路由排错?
    黄永成-thinkphp讲解-个人博客讲解26集
    fedora配置网络
    只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs
    痛苦的事, 伤心的事, 一生只需要一次, 别折腾, 别忘痛- 人生, 软件, 所有人皆如是!
    我再也不-或许永远不-用zend studio-受够了!
    linux安装-版本选择-终极决定
    黄永成-thinkphp讲解-个人博客讲解25集
    linux的多媒体 播放 软件版权问题
    如何解决winows启动后出现grub?
  • 原文地址:https://www.cnblogs.com/zydev/p/5803461.html
Copyright © 2020-2023  润新知