清晨的美好过夜晚的雨 發表於 2019-1-20 23:38:00

两小时入门Docker

<h1>引入</h1>
<h2>Docker是什么?</h2>
<p>Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。<br>Docker 使用 Google 公司推出的 Go 语言 进行开发实现。<br>docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。<br>docker的接口相当简单,用户可以方便的创建、销毁容器。<br>docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。<br>程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了。</p>
<h2>应用场景</h2>
<ul>
<li>web应用的自动化打包和发布</li>
<li>自动化测试和持续集成、发布</li>
<li>在服务型环境中部署和调整数据库或其他应用</li>








</ul>
<h2>区别</h2>
<p>1,物理机</p>
<p><img src="https://img2018.cnblogs.com/blog/1392643/201901/1392643-20190120201550499-1654279132.png" alt=""></p>
<p>二,虚拟机</p>
<p><img src="https://img2018.cnblogs.com/blog/1392643/201901/1392643-20190120201624596-1171496358.png" alt=""></p>
<p>三,docker容器</p>
<p><img src="https://img2018.cnblogs.com/blog/1392643/201901/1392643-20190120201703123-269664938.png" alt=""></p>
<h2>Docker的三大概念及优势</h2>
<ol>
<li>镜像  image</li>
<li>容器  container</li>
<li>仓库  repository</li>





</ol>
<div class="cnblogs_code"><img id="code_img_closed_4db2d003-f404-4e8b-9a17-72f39b281391" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_4db2d003-f404-4e8b-9a17-72f39b281391" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_4db2d003-f404-4e8b-9a17-72f39b281391" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1. 更高效的利用系统资源</span>
<span style="color: rgba(0, 0, 0, 1)">由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2. 更快速的启动时间</span>
<span style="color: rgba(0, 0, 0, 1)">传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3. 一致的运行环境</span>
<span style="color: rgba(0, 0, 0, 1)">开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 4. 持续交付和部署</span>
<span style="color: rgba(0, 0, 0, 1)">对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery</span>/<span style="color: rgba(0, 0, 0, 1)">Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 5. 更轻松的迁移</span>
<span style="color: rgba(0, 0, 0, 1)">由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。</span></pre>
</div>
<span class="cnblogs_code_collapse">docker容器的优势</span></div>
<h1>Docker安装</h1>
<p>系统环境:docker最低支持centos7且在64位平台上,内核版本在3.10以上</p>
<p>版本:社区版,企业版(包含了一些收费服务)</p>
<p>官方版安装教程(英文)</p>
<p>博主版安装教程:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 安装docker</span>
<span style="color: rgba(0, 0, 0, 1)">yum install docker
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 启动docker </span>
systemctl start/<span style="color: rgba(0, 0, 0, 1)">status docker
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 查看docker启动状态</span>
docker version </pre>
</div>
<h3>配置加速器</h3>
<p>简介:<span class="external-link">DaoCloud 加速器&nbsp;是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。</span></p>
<p>DaoCloud官网</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 一条命令加速(记得重启docker)</span>
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io</pre>
</div>
<h1>Docker基础命令</h1>
<div class="cnblogs_code"><img id="code_img_closed_5dd6baa8-332c-4440-86f6-c70a2c563c7f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5dd6baa8-332c-4440-86f6-c70a2c563c7f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_5dd6baa8-332c-4440-86f6-c70a2c563c7f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">Usage:
docker COMMAND

       docker daemon [ </span>--help |<span style="color: rgba(0, 0, 0, 1)"> ... ]

       docker [ </span>--help | -v | --<span style="color: rgba(0, 0, 0, 1)">version ]



A
self</span>-sufficient runtime <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> containers.



Options:



</span>--config=~/.docker            Location of client config files<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">客户端配置文件的位置</span>

-D, --debug=false               Enable debug mode<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">启用Debug调试模式</span>

-H, --host=[]                   Daemon socket(s) to connect to<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">守护进程的套接字(Socket)连接</span>

-h, --help=false                Print usage<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">打印使用</span>

-l, --log-level=info            Set the logging level<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">设置日志级别</span>

--tls=false                     Use TLS; implied by--tlsverify<span style="color: rgba(0, 128, 0, 1)">#
</span>
--tlscacert=~/.docker/ca.pem    Trust certs signed only by this CA<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">信任证书签名CA</span>

--tlscert=~/.docker/cert.pem    Path to TLS certificate file<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">TLS证书文件路径</span>

--tlskey=~/.docker/key.pem      Path to TLS key file<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">TLS密钥文件路径</span>

--tlsverify=false               Use TLS <span style="color: rgba(0, 0, 255, 1)">and</span> verify the remote<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用TLS验证远程</span>

-v, --version=false             Print version information <span style="color: rgba(0, 0, 255, 1)">and</span> quit<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">打印版本信息并退出</span>
<span style="color: rgba(0, 0, 0, 1)">


Commands:

    attach    Attach to a running container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">当前shell下attach连接指定运行镜像</span>
<span style="color: rgba(0, 0, 0, 1)">
    build   Build an image </span><span style="color: rgba(0, 0, 255, 1)">from</span> a Dockerfile<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">通过Dockerfile定制镜像</span>
<span style="color: rgba(0, 0, 0, 1)">
    commit    Create a new image </span><span style="color: rgba(0, 0, 255, 1)">from</span> a container<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s changes#提交当前容器为新的镜像</span>
<span style="color: rgba(0, 0, 0, 1)">
    cp    Copy files</span>/folders <span style="color: rgba(0, 0, 255, 1)">from</span> a container to a HOSTDIR <span style="color: rgba(0, 0, 255, 1)">or</span> to STDOUT<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">从容器中拷贝指定文件或者目录到宿主机中</span>
<span style="color: rgba(0, 0, 0, 1)">
    create    Create a new container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">创建一个新的容器,同run 但不启动容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    diff    Inspect changes on a container</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s filesystem#查看docker容器变化</span>
<span style="color: rgba(0, 0, 0, 1)">
    events    Get real time events </span><span style="color: rgba(0, 0, 255, 1)">from</span> the server<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">从docker服务获取容器实时事件</span>

    <span style="color: rgba(0, 0, 255, 1)">exec</span>    Run a command <span style="color: rgba(0, 0, 255, 1)">in</span> a running container<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">在已存在的容器上运行命令</span>
<span style="color: rgba(0, 0, 0, 1)">
    export    Export a container</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s filesystem as a tar archive#导出容器的内容流作为一个tar归档文件(对应import)</span>
<span style="color: rgba(0, 0, 0, 1)">
    history    Show the history of an image</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">展示一个镜像形成历史</span>
<span style="color: rgba(0, 0, 0, 1)">
    images    List images</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">列出系统当前镜像</span>

    <span style="color: rgba(0, 0, 255, 1)">import</span>    Import the contents <span style="color: rgba(0, 0, 255, 1)">from</span> a tarball to create a filesystem image<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">从tar包中的内容创建一个新的文件系统映像(对应export)</span>
<span style="color: rgba(0, 0, 0, 1)">
    info    Display system</span>-wide information<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">显示系统相关信息</span>
<span style="color: rgba(0, 0, 0, 1)">
    inspect    Return low</span>-level information on a container <span style="color: rgba(0, 0, 255, 1)">or</span> image<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">查看容器详细信息</span>
<span style="color: rgba(0, 0, 0, 1)">
    kill    Kill a running container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">kill指定docker容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    load    Load an image </span><span style="color: rgba(0, 0, 255, 1)">from</span> a tar archive <span style="color: rgba(0, 0, 255, 1)">or</span> STDIN<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">从一个tar包中加载一个镜像(对应save)</span>
<span style="color: rgba(0, 0, 0, 1)">
    login    Register </span><span style="color: rgba(0, 0, 255, 1)">or</span> log <span style="color: rgba(0, 0, 255, 1)">in</span> to a Docker registry<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">注册或者登陆一个docker源服务器</span>
<span style="color: rgba(0, 0, 0, 1)">
    logout    Log out </span><span style="color: rgba(0, 0, 255, 1)">from</span> a Docker registry<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">从当前Docker registry退出</span>
<span style="color: rgba(0, 0, 0, 1)">
    logs    Fetch the logs of a container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">输出当前容器日志信息</span>
<span style="color: rgba(0, 0, 0, 1)">
    pause    Pause all processes within a container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">暂停容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    port    List port mappings </span><span style="color: rgba(0, 0, 255, 1)">or</span> a specific mapping <span style="color: rgba(0, 0, 255, 1)">for</span> the CONTAINER<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">查看映射端口对应的容器内部源端口</span>
<span style="color: rgba(0, 0, 0, 1)">
    ps    List containers</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">列出容器列表</span>
<span style="color: rgba(0, 0, 0, 1)">
    pull    Pull an image </span><span style="color: rgba(0, 0, 255, 1)">or</span> a repository <span style="color: rgba(0, 0, 255, 1)">from</span> a registry<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">从docker镜像源服务器拉取指定镜像或者库镜像</span>
<span style="color: rgba(0, 0, 0, 1)">
    push    Push an image </span><span style="color: rgba(0, 0, 255, 1)">or</span> a repository to a registry<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">推送指定镜像或者库镜像至docker源服务器</span>
<span style="color: rgba(0, 0, 0, 1)">
    rename    Rename a container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">重命名容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    restart    Restart a running container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">重启运行的容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    rm    Remove one </span><span style="color: rgba(0, 0, 255, 1)">or</span> more containers<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">移除一个或者多个容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    rmi    Remove one </span><span style="color: rgba(0, 0, 255, 1)">or</span> more images<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)</span>
<span style="color: rgba(0, 0, 0, 1)">
    run    Run a command </span><span style="color: rgba(0, 0, 255, 1)">in</span> a new container<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">创建一个新的容器并运行一个命令</span>
<span style="color: rgba(0, 0, 0, 1)">
    save    Save an image(s) to a tar archive</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">保存一个镜像为一个tar包(对应load)</span>
<span style="color: rgba(0, 0, 0, 1)">
    search    Search the Docker Hub </span><span style="color: rgba(0, 0, 255, 1)">for</span> images<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">在docker</span>
<span style="color: rgba(0, 0, 0, 1)">hub中搜索镜像

    start    Start one </span><span style="color: rgba(0, 0, 255, 1)">or</span> more stopped containers<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">启动容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    stats    Display a live stream of container(s) resource usage statistics</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">统计容器使用资源</span>
<span style="color: rgba(0, 0, 0, 1)">
    stop    Stop a running container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">停止容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    tag         Tag an image into a repository</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">给源中镜像打标签</span>
<span style="color: rgba(0, 0, 0, 1)">
    top       Display the running processes of a container </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">查看容器中运行的进程信息</span>
<span style="color: rgba(0, 0, 0, 1)">
    unpause    Unpause all processes within a container</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">取消暂停容器</span>
<span style="color: rgba(0, 0, 0, 1)">
    version    Show the Docker version information</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">查看容器版本号</span>
<span style="color: rgba(0, 0, 0, 1)">
    wait         Block until a container stops, then </span><span style="color: rgba(0, 0, 255, 1)">print</span> its exit code<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">截取容器停止时的退出状态值</span>
<span style="color: rgba(0, 0, 0, 1)">


Run </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">docker COMMAND --help</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">for</span> more information on a command.<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">运行docker命令在帮助可以获取更多信息</span></pre>
</div>
<span class="cnblogs_code_collapse">docker --help(中文注解)</span></div>
<div class="cnblogs_code">
<pre>docker searchhello-docker<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 搜索hello-docker的镜像</span>
docker search centos <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 搜索centos镜像</span>
docker pull hello-docker <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取centos镜像</span>
docker runhello-world   <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">运行一个docker镜像,产生一个容器实例(也可以通过镜像id前三位运行)</span>
docker image ls<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 查看本地所有镜像</span>
docker images<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 查看docker镜像</span>
docker image rmi hello-docker <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 删除centos镜像</span>
docker ps<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">列出正在运行的容器(如果创建容器中没有进程正在运行,容器就会立即停止)</span>
docker ps -a<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 列出所有运行过的容器记录</span>
docker save centos &gt; /opt/centos.tar.gz<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 导出docker镜像至本地</span>
docker load &lt; /opt/centos.tar.gz   <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">导入本地镜像到docker镜像库</span>
docker stop`docker ps -aq`<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 停止所有正在运行的容器</span>
dockerrm `docker ps -aq`    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 一次性删除所有容器记录</span>
docker rmi`docker images -aq`   <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 一次性删除所有本地的镜像记录</span></pre>
</div>
<h2>启动容器的两种方式</h2>
<p>容器是运行应用程序的,所以必须得先有一个操作系统为基础<br><strong>1. 基于镜像新建一个容器并启动</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1. 后台运行一个docker</span>
docker run -d centos /bin/sh -c <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">while true;do echo 正在运行; sleep 1;done</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -d后台运行容器</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> /bin/sh指定使用centos的bash解释器</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -c 运行一段shell命令</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> "while true;do echo 正在运行; sleep 1;done"在linux后台,每秒中打印一次正在运行</span>
docker ps<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 检查容器进程</span>
dockerlogs-f容器id/名称<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 不间断打印容器的日志信息 </span>
docker stop centos<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 停止容器</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2. 启动一个bash终端,允许用户进行交互</span>
docker run --name mydocker -it centos /bin/<span style="color: rgba(0, 0, 0, 1)">bash
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> --name给容器定义一个名称</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -i让容器的标准输入保持打开</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -t 让Docker分配一个伪终端,并绑定到容器的标准输入上</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> /bin/bash 指定docker容器,用shell解释器交互</span></pre>
</div>
<p>当利用docker run来创建容器时,Docker在后台运行的步骤如下:</p>
<div class="cnblogs_code"><img id="code_img_closed_e1c74e51-f9f5-4cff-ace3-99a0d66971f0" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_e1c74e51-f9f5-4cff-ace3-99a0d66971f0" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_e1c74e51-f9f5-4cff-ace3-99a0d66971f0" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2. 利用镜像创建并启动一个容器</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3. 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 4. 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 5. 从地址池配置一个ip地址给容器</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 6. 执行用户指定的应用程序</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 7. 执行完毕后容器被终止</span></pre>
</div>
<span class="cnblogs_code_collapse">运行步骤</span></div>
<p><strong>2.&nbsp;将一个终止状态(stopped)的容器重新启动</strong></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> docker ps -a# 先查询记录</span>
<span style="color: rgba(0, 0, 0, 1)">CONTAINER ID      IMAGE               COMMAND                  CREATED             STATUS                        PORTS                  NAMES
ee92fcf6f32d      centos            </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/bin/bash</span><span style="color: rgba(128, 0, 0, 1)">"</span>            4 days ago          Exited (137) 3<span style="color: rgba(0, 0, 0, 1)"> days ago                              kickass_raman

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> docker start ee9# 再启动这个容器</span>
<span style="color: rgba(0, 0, 0, 1)">ee9

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> docker exec -itee9 /bin/bash# 进入容器交互式界面</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">   # 注意看用户名,已经变成容器用户名</span></pre>
</div>
<h2>提交创建自定义镜像</h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.我们进入交互式的centos容器中,发现没有vim命令</span>
    docker run -<span style="color: rgba(0, 0, 0, 1)">it centos
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.在当前容器中,安装一个vim</span>
    yum install -<span style="color: rgba(0, 0, 0, 1)">y vim
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3.安装好vim之后,exit退出容器</span>
<span style="color: rgba(0, 0, 0, 1)">    exit
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 4.查看刚才安装好vim的容器记录</span>
    docker container ls -<span style="color: rgba(0, 0, 0, 1)">a
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 5.提交这个容器,创建新的image</span>
    docker commit 059fdea031ba chaoyu/centos-<span style="color: rgba(0, 0, 0, 1)">vim
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 6.查看镜像文件</span>
<span style="color: rgba(0, 0, 0, 1)">    docker images
REPOSITORY          TAG               IMAGE ID            CREATED             SIZE
chaoyu</span>/centos-vim   latest            fd2685ae25fe      5 minutes ago       348MB</pre>
</div>
<h2>外部访问容器</h2>
<p>容器中可以运行网络应用,但是要让外部也可以访问这些应用,可以通过-p或-P参数指定端口映射。</p>
<div class="cnblogs_code">
<pre>docker run -d -P training/<span style="color: rgba(0, 0, 0, 1)">webapp python app.py
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -P 参数会随机映射端口到容器开放的网络端口</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 检查映射的端口</span>
docker ps -<span style="color: rgba(0, 0, 0, 1)">l
CONTAINER ID      IMAGE               COMMAND             CREATED            STATUS            PORTS                     NAMES
cfd632821d7a      training</span>/webapp   <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">python app.py</span><span style="color: rgba(128, 0, 0, 1)">"</span>   21 seconds ago      Up 20 seconds       0.0.0.0:32768-&gt;5000/<span style="color: rgba(0, 0, 0, 1)">tcp   brave_fermi
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">宿主机ip:32768 映射容器的5000端口</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 查看容器日志信息</span>
docker logs -f cfd<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> #不间断显示log</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 也可以通过-p参数指定映射端口</span>
docker run -d -p 9000:5000 training/webapp python app.py</pre>
</div>
<p>打开浏览器访问服务器的9000端口, 内容显示 Hello world!表示正常启动</p>
<p>(如果访问失败的话,检查自己的防火墙,以及云服务器的安全组)</p>
<h1>&nbsp;利用dockerfile定制镜像</h1>
<p>镜像是容器的基础,每次执行docker run的时候都会指定哪个镜像作为容器运行的基础。我们之前的例子都是使用来自docker hub的镜像,直接使用这些镜像只能满足一定的需求,当镜像无法满足我们的需求时,就得自定制这些镜像。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 镜像的定制就是定制每一层所添加的配置、文件。如果可以吧每一层修改、安装、构建、操作的命令都写入到一个脚本,用脚本来构建、定制镜像,这个脚本就是dockerfile。</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令 构建一层,因此每一条指令的内容,就是描述该层应当如何构建。</span></pre>
</div>
<div class="cnblogs_code"><img id="code_img_closed_3a37a7d2-e0c8-4721-b67e-8f23b9919ba0" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_3a37a7d2-e0c8-4721-b67e-8f23b9919ba0" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_3a37a7d2-e0c8-4721-b67e-8f23b9919ba0" class="cnblogs_code_hide">
<pre>FROM scratch <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">制作base image 基础镜像,尽量使用官方的image作为base image</span>
FROM centos <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">使用base image</span>
FROM ubuntu:14.04 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">带有tag的base image</span>
<span style="color: rgba(0, 0, 0, 1)">
LABEL version</span>=“1.0” <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">容器元信息,帮助信息,Metadata,类似于代码注释</span>
LABEL maintainer=“yc_uuu@163.com<span style="color: rgba(128, 0, 0, 1)">"
</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!</span>
RUN yum update &amp;&amp; yum install -<span style="color: rgba(0, 0, 0, 1)">y vim \
    Python</span>-dev <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">反斜线换行</span>
RUN /bin/bash -c <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">source $HOME/.bashrc;echo $HOME”</span>
<span style="color: rgba(0, 0, 0, 1)">
WORKDIR </span>/root <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd</span>
WORKDIR /test <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 如果没有就自动创建</span>
WORKDIR demo <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 再进入demo文件夹</span>
RUN pwd   <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 打印结果应该是/test/demo</span>
<span style="color: rgba(0, 0, 0, 1)">
ADD </span><span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> COPY
ADD hello </span>/<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录</span>
ADD test.tar.gz /<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 添加到根目录并解压</span>
<span style="color: rgba(0, 0, 0, 1)">
WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">root
ADD hello test</span>/<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径</span>
COPY hello test/<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 等同于上述ADD效果</span>
<span style="color: rgba(0, 0, 0, 1)">
ADD与COPY
   </span>-<span style="color: rgba(0, 0, 0, 1)"> 优先使用COPY命令
    </span>-<span style="color: rgba(0, 0, 0, 1)">ADD除了COPY功能还有解压功能
添加远程文件</span>/<span style="color: rgba(0, 0, 0, 1)">目录使用curl或wget

ENV </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 环境变量,尽可能使用ENV增加可维护性</span>
ENV MYSQL_VERSION 5.6 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 设置一个mysql常量</span>
RUN yum install -y mysql-server=“${MYSQL_VERSION}” </pre>
</div>
<span class="cnblogs_code_collapse">参数详解</span></div>
<div class="cnblogs_code"><img id="code_img_closed_60016d61-f52d-47a7-ab7b-fc59441f4e38" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_60016d61-f52d-47a7-ab7b-fc59441f4e38" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_60016d61-f52d-47a7-ab7b-fc59441f4e38" class="cnblogs_code_hide">
<pre>VOLUME <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> EXPOSE
存储和网络

RUN </span><span style="color: rgba(0, 0, 255, 1)">and</span> CMD <span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> ENTRYPOINT
RUN:执行命令并创建新的Image Layer
CMD:设置容器启动后默认执行的命令和参数
ENTRYPOINT:设置容器启动时运行的命令

Shell格式和Exec格式
RUN yum install </span>-<span style="color: rgba(0, 0, 0, 1)">y vim
CMD echo ”hello docker”
ENTRYPOINT echo “hello docker”

Exec格式
RUN [“apt</span>-get”,”install”,”-<span style="color: rgba(0, 0, 0, 1)">y”,”vim”]
CMD [“</span>/bin/<span style="color: rgba(0, 0, 0, 1)">echo”,”hello docker”]
ENTRYPOINT [“</span>/bin/<span style="color: rgba(0, 0, 0, 1)">echo”,”hello docker”]


通过shell格式去运行命令,会读取$name指令,而exec格式是仅仅的执行一个命令,而不是shell指令
cat Dockerfile
    FROM centos
    ENV name Docker
    ENTRYPOINT [“</span>/bin/echo”,”hello $name”]<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">这个仅仅是执行echo命令,读取不了shell变量</span>
    ENTRYPOINT[“/bin/bash”,”-c”,”echo hello $name<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">]</span>
<span style="color: rgba(0, 0, 0, 1)">
CMD
容器启动时默认执行的命令
如果docker run指定了其他命令(docker run </span>-it /bin/<span style="color: rgba(0, 0, 0, 1)">bash ),CMD命令被忽略
如果定义多个CMD,只有最后一个执行

ENTRYPOINT
让容器以应用程序或服务形式运行
不会被忽略,一定会执行
最佳实践:写一个shell脚本作为entrypoint
COPY docker</span>-entrypoint.sh /usr/local/<span style="color: rgba(0, 0, 0, 1)">bin
ENTRYPOINT [“docker</span>-<span style="color: rgba(0, 0, 0, 1)">entrypoint.sh]
EXPOSE </span>27017<span style="color: rgba(0, 0, 0, 1)">
CMD [“mongod”]

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> more Dockerfile</span>
<span style="color: rgba(0, 0, 0, 1)">FROm centos
ENV name Docker
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">CMD ["/bin/bash","-c","echo hello $name"]</span>
ENTRYPOINT [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/bin/bash</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-c</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">echo hello $name”]</span></pre>
</div>
<span class="cnblogs_code_collapse">进阶知识(了解)</span></div>
<h1>发布到仓库</h1>
<h2>1,docker hub共有镜像发布</h2>
<p>docker提供了一个类似于github的仓库docker hub,</p>
<p>官方网站(需注册使用)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 注册docker id后,在linux中登录dockerhub</span>
<span style="color: rgba(0, 0, 0, 1)">    docker login

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag</span>
    docker tag chaoyu/centos-vim peng104/centos-<span style="color: rgba(0, 0, 0, 1)">vim
</span><span style="color: rgba(0, 128, 0, 1)">    #</span><span style="color: rgba(0, 128, 0, 1)"> 语法是:docker tag   仓库名   peng104/仓库名</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 推送docker image到dockerhub</span>
    docker push peng104/centps-cmd-<span style="color: rgba(0, 0, 255, 1)">exec</span><span style="color: rgba(0, 0, 0, 1)">:latest

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 去dockerhub中检查镜像</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> 先删除本地镜像,然后再测试下载pull 镜像文件</span>
    docker pull peng104/centos-entrypoint-<span style="color: rgba(0, 0, 255, 1)">exec</span></pre>
</div>
<h2>2,私有仓库</h2>
<p>docker hub 是公开的,其他人也是可以下载,并不安全,因此还可以使用docker registry官方提供的私有仓库</p>
<p>用法详解点我</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.下载一个docker官方私有仓库镜像</span>
<span style="color: rgba(0, 0, 0, 1)">    docker pull registry
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.运行一个docker私有容器仓库</span>
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/<span style="color: rgba(0, 0, 0, 1)">registryregistry
    </span>-<span style="color: rgba(0, 0, 0, 1)">d 后台运行
    </span>-<span style="color: rgba(0, 0, 0, 1)">p端口映射 宿主机的5000:容器内的5000
    </span>-v数据卷挂载宿主机的 /opt/data/registry :/var/lib/<span style="color: rgba(0, 0, 0, 1)">registry
    registry镜像名
    </span>/var/lib/<span style="color: rgba(0, 0, 0, 1)">registry存放私有仓库位置
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> 3.修改docker的配置文件,让他支持http方式,上传私有镜像</span>
    vim /etc/docker/<span style="color: rgba(0, 0, 0, 1)">daemon.json
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 写入如下内容</span>
<span style="color: rgba(0, 0, 0, 1)">    {
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">registry-mirrors</span><span style="color: rgba(128, 0, 0, 1)">"</span>: [<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://f1361db2.m.daocloud.io</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">],
      </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">insecure-registries</span><span style="color: rgba(128, 0, 0, 1)">"</span>:[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">192.168.11.37:5000</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
    }
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 4.修改docker的服务配置文件</span>
    vim /lib/systemd/system/<span style="color: rgba(0, 0, 0, 1)">docker.service
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 找到这一代码区域块,写入如下参数</span>
<span style="color: rgba(0, 0, 0, 1)">   
    EnvironmentFile</span>=-/etc/docker/<span style="color: rgba(0, 0, 0, 1)">daemon.json
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 5.重新加载docker服务</span>
    systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 6.重启docker服务</span>
<span style="color: rgba(0, 0, 0, 1)">    systemctl restart docker
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 注意:重启docker服务,所有的容器都会挂掉</span>

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 7.修改本地镜像的tag标记,往自己的私有仓库推送</span>
    docker tag docker.io/peng104/hello-world-docker 192.168.11.37:5000/peng-<span style="color: rgba(0, 0, 0, 1)">hello
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 浏览器访问http://192.168.119.10:5000/v2/_catalog查看仓库</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> 8.下载私有仓库的镜像</span>
    docker pull 192.168.11.37:5000/peng-hello</pre>
</div>
<h1>实例演示</h1>
<p>编写dockerfile,构建自己的镜像,运行flask程序。</p>
<p>确保app.py和dockerfile在同一个目录!</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1.准备好app.py的flask程序</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> cat app.py</span>
    <span style="color: rgba(0, 0, 255, 1)">from</span> flask <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> Flask
    app</span>=Flask(<span style="color: rgba(128, 0, 128, 1)">__name__</span><span style="color: rgba(0, 0, 0, 1)">)
    @app.route(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> hello():
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hello docker</span><span style="color: rgba(128, 0, 0, 1)">"</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span>==<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">:
      app.run(host</span>=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0.0.0.0</span><span style="color: rgba(128, 0, 0, 1)">'</span>,port=8080<span style="color: rgba(0, 0, 0, 1)">)
    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> ls</span>
<span style="color: rgba(0, 0, 0, 1)">    app.pyDockerfile

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2.编写dockerfile</span>
    <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> cat Dockerfile</span>
    FROM python:2.7<span style="color: rgba(0, 0, 0, 1)">
    LABEL maintainer</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">温而新</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    RUN pip install flask
    COPY app.py </span>/app/<span style="color: rgba(0, 0, 0, 1)">
    WORKDIR </span>/<span style="color: rgba(0, 0, 0, 1)">app
    EXPOSE </span>8080<span style="color: rgba(0, 0, 0, 1)">
    CMD [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">python</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">app.py</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 3.构建镜像image,找到当前目录的Dockerfile,开始构建</span>
    docker build -t peng104/flask-hello-<span style="color: rgba(0, 0, 0, 1)">docker .

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 4.查看创建好的images</span>
<span style="color: rgba(0, 0, 0, 1)">    docker image ls

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 5.启动此flask-hello-docker容器,映射一个端口供外部访问</span>
    docker run -d -p 8080:8080 peng104/flask-hello-<span style="color: rgba(0, 0, 0, 1)">docker

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 6.检查运行的容器</span>
<span style="color: rgba(0, 0, 0, 1)">    docker container ls

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 7.推送这个镜像到私有仓库</span>
    docker tagpeng104/flask-hello-docker   192.168.11.37:5000/peng-<span style="color: rgba(0, 0, 0, 1)">flaskweb
    docker push </span>192.168.11.37:5000/peng-flaskweb</pre>
</div>
<h1>&nbsp;关于博客皮肤</h1>
<p>因为一篇皮肤引发的热门惨案~</p>
<p>博主声明一下:本博客皮肤也是找的网上一位大神写的,我也很是敬佩。</p>
<p>由于评论区大多是问博客皮肤的,也怕因为忙没时间回复。所以把皮肤地址贴出来。</p>
<p>&nbsp;</p>
<p>博客皮肤代码地址:&nbsp;https://github.com/deng104/Cnblogs-Theme-SimpleMemory</p>
<p>我也只是借花献佛一下啦~</p>
<p>当然你们肯定也是对于技术的热爱才会访问本篇博客的</p>
<p>最后,感谢大家的支持。谢谢</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/peng104/p/10296717.html
頁: [1]
查看完整版本: 两小时入门Docker