zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/zydev/p/5803461.html
Copyright © 2011-2022 走看看