• docker学习与应用


    概要

      众所周知,Docker是当前非常火的虚拟化容器技术,对于它的优势以及使用场景网上的资料非常多,这里我推荐大家去这2个网站去详细学习:

          https://www.liwenzhou.com/posts/Go/how_to_deploy_go_app_using_docker/

          https://yeasy.gitbooks.io/docker_practice/introduction/why.html

      我这里就写一下作为一名后端开发程序员,自己学习docker的笔记以及对docker在实际工作中的应用的理解。

    开发->测试->运维的传统环境配置问题

      一开始之所以不介绍docker的安装、语法等基础知识点,是因为在实际工作中,作为一名后端开发者,我们不仅要扎实自己代码与逻辑的基本功,更要弄清楚自己的工作在整个项目流程中所处的位置、跟整个项目负责其他工作的同事协同合作,确保项目从开发到测试再到上线的顺利进行。

    环境配置带来的问题

      在虚拟化技术出现之前,阻挡在开发、测试与运维之间的一道横坎儿便是“环境配置”了,每台计算机的环境都不相同,应该如何确保自己的程序换一台机器能运行起来呢?

    为了让同一程序在不同的机器上跑起来,用户必须确保的是:

    1. 操作系统的相同
    2. 各种平台库和组件的安装
    3. 例如python依赖包,环境变量等

    如果一些低版本的依赖模块和当前环境不兼容,那就头疼了!

    环境配置确实是个痛苦的过程,如果实际中换一台机器,就得重新配置一下,那么在安装软件的时候,就得按照原始环境一模一样的复制过来。

    网上有一个段子,对这个现象描述的十分生动:

    然而,开发和运维之间聊天一般是这样的~

    虚拟化技术解决环境配置的问题

    为了解决类似这种问题,聪明的人们发明了虚拟化技术。

    其实就是为每种开发运行环境配置对应的开发环境,开发做完后将环境迁移到测试工程师那里,测试完毕后再将同一套环境迁移到实际的生产环境中给运维工程师去维护。

    虚拟化技术分为两种:一种是虚拟机,另外一种就是本文要介绍的docker虚拟化容器技术

    docker相比于虚拟机确实有十分强大的优势,下表就是docker与传统的虚拟机的性能对比:

    下面是网上对于docker容器的优势的诠释:

    更高效的利用系统资源
    由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
    无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
    更快速的启动时间
    传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
    一致的运行环境
    开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
    而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
    持续交付和部署
    对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
    使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,
    而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
    而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
    更轻松的迁移
    由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
    因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

    开发->测试->运维基于docker的高效协作流程

    有了docker后,开发、测试与运维之间不会再为环境配置而浪费不必要的时间了,我们可以把更多的精力放在自己本身的技术工作中!

    下图简单的诠释了利用dockerhub(docker镜像的远程存储仓库)与github程序员、测试员与运维人员之间的协作关系:

    docker的三大概念

    docker的三大概念是:

    1. 镜像 image
    2. 容器 container
    3. 仓库 repository

     docker的整个生命周期就是这三个概念。

    镜像image

    Docker镜像就是一个只读的模板。
    
    例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。
    
    镜像可以用来创建Docker容器。
    
    Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

    image的分层存储

    因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构。
    镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成。

    容器container

    imagecontainer的关系,就像面向对象程序设计中的 类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object)。
    
    容器可以被创建启动停止删除暂停
    Docker利用容器来运行应用。 容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。 可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

    仓库repository

    仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
    
    仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
    
    最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。
    
    当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。
    
    注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

    docker Registry

    Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
    
    最常使用的Registry公开服务是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
    
    除此以外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;Google的Google Container Registry,Kubernetes的镜像使用的就是这个服务。
    由于某些原因,在国内访问这些服务可能会比较慢。
    国内的一些云服务商提供了针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有阿里云加速器、DaoCloud加速器、灵雀云加速器等。
    使用加速器会直接从国内的地址下载Docker Hub的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。
    国内也有一些云服务商提供类似于Docker Hub的公开服务。比如时速云镜像仓库、网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等。

    centos7中安装docker

    推荐遵循官方的安装方式

    官方的安装方式:

    1.卸载旧版本
    sudo yum remove docker 
                      docker-client 
                      docker-client-latest 
                      docker-common 
                      docker-latest 
                      docker-latest-logrotate 
                      docker-logrotate 
                      docker-selinux 
                      docker-engine-selinux 
                      docker-engine
    
    2.设置存储库
    sudo yum install -y yum-utils 
      device-mapper-persistent-data 
      lvm2
    
    sudo yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    
    3.安装docker社区版
    sudo yum install docker-ce
    4.启动关闭docker systemctl start docker

    如果你的网速不是很快,也可以用yum源安装(注意提前配置好阿里云的yum源!)

    配置阿里云的yum源参考我的这篇博客:https://www.cnblogs.com/paulwhw/p/11122400.html

    yum install docker -y 

    docker版本

    Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。
    企业版包含了一些收费服务,个人开发者一般用不到。本文的介绍都针对社区版。

    系统环境支持 

    docker最低支持centos7且在64位平台上,内核版本在3.10以上
    [root@oldboy_python ~ 10:48:11]#uname -r
    3.10.0-693.el7.x86_64

    配置docker加速器

    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

    这个命令是修改/etc/docker/daemon.json文件,写入一个json数据如下:

    [root@whw ~]# cat /etc/docker/daemon.json
    
    {"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}

    注意这里有一个坑:

    运行完加速命令后,会提示你restart docker,然后,你在重启docker的时候可能会报错:

    这条错误的出现,原因其实是在执行加速命令的时候,上面的那个json文件多了一个逗号~

    把文件中的那个逗号删除,然后保存退出后再执行 systemctl restart docker 就可以了~

    配置好docker加速器的目的是提高下载docker镜像的速度!

    下载centos的docker镜像

    当然你也可以下载ubuntu的镜像,我们先拿centos的镜像来举例:

    docker pull centos  

    运行docker容器

    我们可以吧docker的镜像比作是面向对象的类,而docker容器就是这个“类”实例化出的对象!

    查看docker镜像的命令为:

    # 查看镜像
    docker images

    通过镜像运行出容器实例的命令为:

    docker  run  镜像名/镜像id  

    查看容器的命令如下:

    #查看正在运行的容器进程
    docker  ps  
    #显示所有运行过的容器进程(正在运行的,以及挂掉的容器进程)
    docker ps -a  
    #同上,是旧的命令 
    docker container ls -a  

    进行docker容器的管理 

    管理docker镜像对于程序开发者来说十分重要,我这里单独拿出一个篇幅去详细介绍docker容器的管理!

    docker容器的管理 —— 常用命令

    注意以下3点:

    # docker容器中必须有进程在后台运行,否则容器挂掉!!!
    
    # docker镜像每次运行 都会生成新的容器id记录
    
    # 运行三次同一个镜像,会出现三次容器新的记录
    docker run hello-world  
    docker run hello-world
    docker run hello-world

    常用命令

    ##获取镜像
    (1)
    docker pull centos  #下载docker镜像 centos
    docker pull hello-world  #获取一个hello-world镜像  
    
    (2)从指定的地点pull docker pull 192.168.16.142:5000/whw-hello-world docker pull xxx/centos-entrypoint-exec # xxx是你dockerhub的用户名 ##查看所有的docker镜像 docker images 或者 docker image ls ##查看正在运行的docker实例 docker ps ##查看所有的docker实例 docker ps -a ##运行一个交互式的ubuntu容器实例 ##参数解释 -i 交互式的命令操作 -t 开启一个终端界面 /bin/bash 指定linux的解释器 docker run -it ubuntu /bin/bash ##交互式的运行一个centos容器 docker run -it centos /bin/bash ##获取一个python的flask的镜像 ## docker run的特点是,如果镜像不存在,会自动的先去docker pull docker run -d -P training/webapp python app.py -d 后台运行 -P 端口映射,随机映射 training/webapp 镜像名 python app.py 你要执行的命令 ##删除容器id记录,只能删除挂掉的容器 docker rm 容器id

     #删除本地docker镜像
      docker rmi 镜像id或者镜像名
     #强制删除镜像文件
      docker rmi -f 镜像id

    ##批量删除挂掉的容器记录   
    ##注意这不是引号,是键盘按键1左边的那个符号!
    docker  rm  `docker ps -aq`  
    
    ##在容器的后台运行一个进程,运行出活着的容器
    docker run -d centos /bin/sh -c "while true;do echo  'naruto'; sleep 1;done"  
        
        -d  就是daemonize 后台运行的意思
        centos  指定哪个镜像
        /bin/sh 指定linux的解释器
        -c  指定一段shell代码
        "while true;do echo 'naruto'; sleep 1;done"     每秒打印一个naruto字符串
        
    ##进入容器空间内
    docker exec  -it   运行着的容器id     /bin/bash    
    
    ##查看容器日志
    docker logs  容器id
    docker logs -f  容器id  #检测容器内的日志

    仓库及容器端口映射的相关命令

    #运行一个web容器的操作
    获取一个python的flask的镜像
    ## 注意 docker run的特点是,如果镜像不存在,会自动的先去docker pull
    docker run -d -P training/webapp python app.py -d 后台运行 -P 端口映射,随机映射 training/webapp 镜像名 python app.py 你要执行的命令 ##docker容器的端口映射 docker port 容器id ##容器的启停管理 docker start 容器id docker stop 容器id

    docker基本命令注释:

    [root@docker ~]# docker --help
    
    Usage:
    docker [OPTIONS] COMMAND [arg...]
    
           docker daemon [ --help | ... ]
    
           docker [ --help | -v | --version ]
    
     
    
    A
    self-sufficient runtime for containers.
    
     
    
    Options:
    
     
    
      --config=~/.docker              Location of client config files  #客户端配置文件的位置
    
      -D, --debug=false               Enable debug mode  #启用Debug调试模式
    
      -H, --host=[]                   Daemon socket(s) to connect to  #守护进程的套接字(Socket)连接
    
      -h, --help=false                Print usage  #打印使用
    
      -l, --log-level=info            Set the logging level  #设置日志级别
    
      --tls=false                     Use TLS; implied by--tlsverify  #
    
      --tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA  #信任证书签名CA
    
      --tlscert=~/.docker/cert.pem    Path to TLS certificate file  #TLS证书文件路径
    
      --tlskey=~/.docker/key.pem      Path to TLS key file  #TLS密钥文件路径
    
      --tlsverify=false               Use TLS and verify the remote  #使用TLS验证远程
    
      -v, --version=false             Print version information and quit  #打印版本信息并退出
    
     
    
    Commands:
    
        attach    Attach to a running container  #当前shell下attach连接指定运行镜像
    
        build     Build an image from a Dockerfile  #通过Dockerfile定制镜像
    
        commit    Create a new image from a container's changes  #提交当前容器为新的镜像
    
        cp    Copy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中
    
        create    Create a new container  #创建一个新的容器,同run 但不启动容器
    
        diff    Inspect changes on a container's filesystem  #查看docker容器变化
    
        events    Get real time events from the server#从docker服务获取容器实时事件
    
        exec    Run a command in a running container#在已存在的容器上运行命令
    
        export    Export a container's filesystem as a tar archive  #导出容器的内容流作为一个tar归档文件(对应import)
    
        history    Show the history of an image  #展示一个镜像形成历史
    
        images    List images  #列出系统当前镜像
    
        import    Import the contents from a tarball to create a filesystem image  #从tar包中的内容创建一个新的文件系统映像(对应export)
    
        info    Display system-wide information  #显示系统相关信息
    
        inspect    Return low-level information on a container or image  #查看容器详细信息
    
        kill    Kill a running container  #kill指定docker容器
    
        load    Load an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)
    
        login    Register or log in to a Docker registry#注册或者登陆一个docker源服务器
    
        logout    Log out from a Docker registry  #从当前Docker registry退出
    
        logs    Fetch the logs of a container  #输出当前容器日志信息
    
        pause    Pause all processes within a container#暂停容器
    
        port    List port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口
    
        ps    List containers  #列出容器列表
    
        pull    Pull an image or a repository from a registry  #从docker镜像源服务器拉取指定镜像或者库镜像
    
        push    Push an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器
    
        rename    Rename a container  #重命名容器
    
        restart    Restart a running container  #重启运行的容器
    
        rm    Remove one or more containers  #移除一个或者多个容器
    
        rmi    Remove one or more images  #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
    
        run    Run a command in a new container  #创建一个新的容器并运行一个命令
    
        save    Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
    
        search    Search the Docker Hub for images  #在docker
    hub中搜索镜像
    
        start    Start one or more stopped containers#启动容器
    
        stats    Display a live stream of container(s) resource usage statistics  #统计容器使用资源
    
        stop    Stop a running container  #停止容器
    
        tag         Tag an image into a repository  #给源中镜像打标签
    
        top       Display the running processes of a container #查看容器中运行的进程信息
    
        unpause    Unpause all processes within a container  #取消暂停容器
    
        version    Show the Docker version information#查看容器版本号
    
        wait         Block until a container stops, then print its exit code  #截取容器停止时的退出状态值
    
     
    
    Run 'docker COMMAND --help' for more information on a command.  #运行docker命令在帮助可以获取更多信息
    docker基本命令

    制作docker镜像及使用制作好的docker镜像的简单过程 ***

    ##1.获取一个centos基础镜像,运行处容器后
        docker run -it  centos bash  
    
    ##2.进入容器空间内,默认没有python3 和其他软件
        进入之后,安装一个vim
        yum install vim -y 
    
    ##3.在docker容器里面依次按:ctr+p+q —— 不关闭这个容器退出到外面的命令行
        —— 注意如果直接exit的话,docker容器的进程会挂掉,里面修改的东西会不生效
    
    ##4.commit这个镜像文件 —— 使之前的配置生效,注意此时容器还在运行
    docker commit 容器id  新的镜像的名字
    docker commit 5c2  whw/centos-vim
    
    ##5.查看提交的镜像文件
    docker images 
    
    ##6.此时进入上面那个已经运行的docker镜像:
        docker exec -it 5c2 bash
    
    
    ###7.可以看到里面还有之前装好的yum
        (1)执行exit退出容器
        (2)在mac中执行docker ps 发现容器还在运行
        (3)手动停止这个正在运行的docker容器:docker stop 5c2
        (4)执行docker ps -a 查看所有的容器,如果想启动一个挂掉的docker容器可以执行:docker start [id]
        (5)如果想删除所有挂掉的docker的容器,可以执行;docker container prune
    
    
    ##8.导出这个镜像文件,指定导出的文件名和后缀
    docker save 镜像名/id > /opt/whw-centos-vim.tar.gz
    
    ##9.在本地测试导入这个镜像
    ###### 可以在本地测试,先删除原本的镜像
    导入命令
    docker load < /opt/whw-centos-vim.tar.gz
    
    ##10.给导入的镜像,修改tag别名
    docker tag 旧的镜像名 以dockerhub仓库id开头的/新的镜像名 
    ### 以dockerhub仓库id开头的是为了以后在推送的时候,根据这个名字在远程仓库找到对应的仓库名
    docker tag 621 xxx/whw-centos-vim   # xxx是你的dockerhub的用户名
    
    ##11.执行这个docker镜像,运行处容器后,查看是否携带了vim
    #语法
    关键字 关键字  参数   镜像名   你要执行的命令
    docker run -it xxx/whw-centos-vim  bash  # xxx是你的dockerhub的用户名

    dockerfile

    dockerfile实在是太重要了,我这里也单独把它作为一个篇幅来讲。

    获取docker镜像的三种方式

    1.去docker仓库获取的方式,一个是公网仓库,一个是私有仓库
        docker pull
    
    2.获取别人发来的镜像,也就是自定义的镜像
    
    3.通过dockerfile构建docker镜像

      大家可以再返回看一下上面的那张阐述了开发与测试跟运维之间解决环境配置的简图,其中最为重要的一点就是:开发把dockerfile(可以看成是docker配置环境的文件)上传至github,运维跟测试依据这个dockerfile去快速的搭建环境!

    之所以利用这种方式去构建环境是因为通过dockerfile我们可以自定制镜像。

      镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。

      Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

      说白了,这个文件就是定制docker镜像的一个脚本而已,我们需要学习里面的功能性的参数

    通过dockerfile构建docker镜像的说明:

    FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
    FROM centos #使用base image
    FROM ubuntu:14.04 #带有tag的base image
    
    LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
    LABEL maintainer=“xxx@163.com" # 邮箱地址 
    
    #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
    RUN yum update && yum install -y vim 
        Python-dev #反斜线换行
    RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
    
    WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
    WORKDIR /test #如果没有就自动创建
    WORKDIR demo #再进入demo文件夹
    RUN pwd     #打印结果应该是/test/demo
    
    ADD and COPY 
    ADD hello /  #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
    ADD test.tar.gz /  #添加到根目录并解压
    
    WORKDIR /root
    ADD hello test/  #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
    COPY hello test/  #等同于上述ADD效果
    
    ADD与COPY
       - 优先使用COPY命令
        -ADD除了COPY功能还有解压功能
    添加远程文件/目录使用curl或wget
    
    ENV #环境变量,尽可能使用ENV增加可维护性
    ENV MYSQL_VERSION 5.6 #设置一个mysql常量
    RUN yum install -y mysql-server=“${MYSQL_VERSION}” 
    
    ------这里需要稍微理解一下了-------中级知识--- VOLUME and EXPOSE 存储和网络 RUN and CMD and ENTRYPOINT RUN:执行命令并创建新的Image Layer CMD:设置容器启动后默认执行的命令和参数 ENTRYPOINT:设置容器启动时运行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo ”hello docker” ENTRYPOINT echo “hello docker” Exec格式 RUN [“apt-get”,”install”,”-y”,”vim”] CMD [“/bin/echo”,”hello docker”] ENTRYPOINT [“/bin/echo”,”hello docker”] 通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [“/bin/echo”,”hello $name”]#这个仅仅是执行echo命令,读取不了shell变量 ENTRYPOINT [“/bin/bash”,”-c”,”echo hello $name"] CMD 容器启动时默认执行的命令 如果docker run指定了其他命令(docker run -it [image] /bin/bash ),CMD命令被忽略 如果定义多个CMD,只有最后一个执行 ENTRYPOINT 让容器以应用程序或服务形式运行 不会被忽略,一定会执行 最佳实践:写一个shell脚本作为entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [“docker-entrypoint.sh] EXPOSE 27017 CMD [“mongod”] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name”]

    通过dockerfile定制一个python flask web程序,运行出容器

    配置过程如下:

    1.准备一个flask代码文件

    touch whwflask.py
    vim whwflask.py

    flask的代码如下:

    #coding:utf8
    from flask import Flask
    app=Flask(__name__)
    @app.route('/')
    def hello():
    return "HELLO NARUTO"
    if __name__=="__main__":
    app.run(host='0.0.0.0',port=8080)

    2.配置python2的包管理,安装flask

    easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask

    3.准备Dockerfile,写入如下内容

    FROM centos
    COPY CentOS-Base.repo /etc/yum.repos.d/
    COPY epel.repo /etc/yum.repos.d/ 
    RUN yum clean all 
    RUN yum install python-setuptools -y
    RUN easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
    COPY whwflask.py /opt/
    WORKDIR /opt
    EXPOSE 8080 #暴露容器内的8080端口
    CMD ["python","whwflask.py"] #让容器执行如下命令

    4.准备好齐全的文件,开始构建docker镜像

    [root@whw whwdocker]# ls
    CentOS-Base.repo Dockerfile epel.repo whwflask.py

    5.构建docker镜像的命令,这个命令得在Dockerfile的目录下执行!!!

    docker build .

    6.构建镜像完成之后,查看镜像文件

    docker images
    # 6f0是docker镜像的id的前三个字母
    docker tag 6f0 whw-flask-docker

    7.运行这个镜像即可

    docker run -d -p 7777:8080 6f0

    docker仓库的学习

    docker提供了一个类似于github的仓库dockerhub。

    网址是https://hub.docker.com/需要注册使用。

    公有仓库

    公有仓库的使用比较简单,基本步骤如下:

    #注册docker id后,在linux中登录dockerhub
    docker login #输入你的账号密码 就可以成功登录
    
    #注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
    docker tag 你的dockerhub账号名/你的docker镜像名 本地的镜像id或名
    
    语法是:docker tag 仓库名 huoyingwhw/仓库名
    
    #推送docker image到dockerhub
    docker push huoyingwhw/centps-cmd-exec:latest
    
    #在dockerhub中检查镜像
    https://hub.docker.com/
    
    #删除本地镜像,测试下载pull 镜像文件
    docker pull huoyingwhw/centos-entrypoint-exec

    私有仓库

    私有仓库的配置方法如下:

    1.下载一个registry 私有仓库镜像
    # 这个  是换行符的意思 
    # -v 是数据文件夹挂载  ,宿主机的数据文件夹:容器内的文件夹
    
    docker run -d 
        -p 5000:5000 
        -v /opt/data/registry:/var/lib/registry 
        registry
        
    2.可以查看私有仓库的api数据地址,如下
    http://10.0.0.128:5000/v2/_catalog
    
    3.但是此时的私有仓库还没法使用,它不支持http方式的推送,修改默认的配置文件即可
        1.编辑docker的配置文件
        vim /etc/docker/daemon.json  
        2.写入如下信息,地址改成你自己的ip
        {"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
            "insecure-registries":["10.0.0.128:5000"]
        }
        3.修改docker的配置文件
    vim
    /lib/systemd/system/docker.service 添加如下配置,在[Service]的代码区域块中,添加如下参数 [Service] EnvironmentFile=-/etc/docker/daemon.json 4.重新加载这个文件 systemctl daemon-reload 5.重启整个docker服务 systemctl restart docker 6.重新启动一个私有仓库 # 外部的9000端口映射到docker容器的5000端口 docker run --privileged=true -d -p 9000:5000 -v /opt/data/registry:/var/lib/registry registry 参数解释: --privileged=true docker容器的安全机制:设置特权级运行的容器 7.推送本地的镜像,到私有仓库中去 docker push 10.0.0.128:5000/whw-hello-world 8.其他同事就可以通过这个私有仓库的镜像地址获取你的镜像了 docker pull 10.0.0.128:5000/whw-hello-world 4.还得修改本地镜像的名字,以仓库地址为开头 #docker tag 你要修改的镜像 修改之后的镜像名 docker tag fce 10.0.0.128:5000/whw-hello-world 5.编写Dockerfile,文件名固定 touch dockerfile vim dockerfile ...

    ~~

  • 相关阅读:
    Echarts、大屏动态折线图无状态加载
    地图获取城市编码vue-jsonp请求,处理跨域
    将数组中的元素拼接为一个字符串
    vue兄弟组件通信、兄弟组件传值(本人是用的是中央控件作为媒介),并一同解决重负传值、第一未传值
    vue、react动态新增行
    vue-antd 分页pagination相关重置问题
    关闭ESLint警告,本人使用的是vue-antd-pro
    文本长短不一文本长短不一致,css让其左右两侧对齐致,css让其左右两侧对齐
    Maven私服搭建 Nexus
    Maven常用命令
  • 原文地址:https://www.cnblogs.com/paulwhw/p/11140036.html
Copyright © 2020-2023  润新知