<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Docker on Yeqown</title>
    <link>https://www.yeqown.xyz/tags/Docker/</link>
    <description>Recent content in Docker on Yeqown</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Wed, 12 Aug 2020 09:38:22 +0800</lastBuildDate>
    <atom:link href="https://www.yeqown.xyz/tags/Docker/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>近期使用Docker打包镜像遇到的问题总结</title>
      <link>https://www.yeqown.xyz/2020/08/12/%E8%BF%91%E6%9C%9F%E4%BD%BF%E7%94%A8Docker%E6%89%93%E5%8C%85%E9%95%9C%E5%83%8F%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/</link>
      <pubDate>Wed, 12 Aug 2020 09:38:22 +0800</pubDate>
      <guid>https://www.yeqown.xyz/2020/08/12/%E8%BF%91%E6%9C%9F%E4%BD%BF%E7%94%A8Docker%E6%89%93%E5%8C%85%E9%95%9C%E5%83%8F%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93/</guid>
      <description>&lt;h3 id=&#34;背景&#34;&gt;背景&lt;a class=&#34;anchor&#34; href=&#34;#%e8%83%8c%e6%99%af&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;在 &lt;a href=&#34;https://github.com/yeqown/goreportcard&#34;&gt;github.com/yeqown/goreportcard&lt;/a&gt; 项目中我改造了 &lt;code&gt;goreportcard&lt;/code&gt;。&#xA;后续为了方便部署，我准备将其打包成为docker镜像并上传到 &lt;code&gt;DockerHub&lt;/code&gt;。期间遇到了下面的问题，并一一解决，这里做一个记录帮助以后遇到类似的问题可以快速解决。&lt;/p&gt;&#xA;&lt;p&gt;初期的目标是：将&lt;code&gt;goreportcard&lt;/code&gt;和&lt;code&gt;golangci-lint&lt;/code&gt;编译好，尽可能较小镜像的体积。因此第一次尝试，我使用了分阶段编译，用&lt;code&gt;golang:1.14.1&lt;/code&gt;编译，&lt;code&gt;alpine&lt;/code&gt;来发布。&lt;/p&gt;&#xA;&lt;p&gt;基本 Dockerfile 如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# building stage&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;golang:1.14-alpine3.11&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;build&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WORKDIR&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/tmp/build&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; . .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;RUN&lt;/span&gt; export GOPROXY&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;https://goproxy.cn,direct&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; go mod download &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; go build -o app ./cmd/goreportcard-cli/ &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; go get github.com/golangci/golangci-lint &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; go install github.com/golangci/golangci-lint/cmd/golangci-lint&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# release stage&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;FROM&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;golang:1.14-alpine3.11&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;release&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;WORKDIR&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;/app/goreportcard&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; --from&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;build /tmp/build/app .&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; --from&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;build /tmp/build/tpl ./tpl&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; --from&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;build /tmp/build/assets ./assets&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# FIXED: 不能使用golangci-lint, `File not found` 错误&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;COPY&lt;/span&gt; --from&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;build /go/bin/golangci-lint /usr/local/bin&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;EXPOSE&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;8000&lt;/span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;ENTRYPOINT&lt;/span&gt; [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;./app&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;start-web&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;问题清单和解决方案&#34;&gt;问题清单和解决方案&lt;a class=&#34;anchor&#34; href=&#34;#%e9%97%ae%e9%a2%98%e6%b8%85%e5%8d%95%e5%92%8c%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;由于并不是所有的问题都和Docker有关，因此我会使用 &lt;code&gt;[分类]&lt;/code&gt; 在标题上注明。&lt;/p&gt;</description>
    </item>
    <item>
      <title>docker&#43;jenkins&#43;golang持续集成实践</title>
      <link>https://www.yeqown.xyz/2018/05/03/docker-jenkins-golang%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E5%AE%9E%E8%B7%B5/</link>
      <pubDate>Thu, 03 May 2018 16:54:10 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/05/03/docker-jenkins-golang%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90%E5%AE%9E%E8%B7%B5/</guid>
      <description>&lt;hr&gt;&#xA;&lt;h3 id=&#34;起因&#34;&gt;起因&lt;a class=&#34;anchor&#34; href=&#34;#%e8%b5%b7%e5%9b%a0&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;因为生产需要最近又重新折腾了一下Jenkins和docker。主要目的是想自动编译，打包，部署一些Golang的HttpServer。于是决定使用Jenkins来做这个持续集成的载体，选择Jenkins出于两点原因：&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;1. 以前就使用过，上手会更快&lt;/em&gt;&#xA;&lt;em&gt;2. 社区比较成熟，插件和文档丰富&lt;/em&gt;&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;安装docker和pull-jenkins镜像&#34;&gt;安装Docker和Pull Jenkins镜像&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85docker%e5%92%8cpull-jenkins%e9%95%9c%e5%83%8f&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;这一步，作为前置条件且不是本文主要要描述的步骤，因此略去。网上也有很多参考资料～&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;jenkins--docker-compose配置&#34;&gt;Jenkins &amp;amp; docker-compose配置&lt;a class=&#34;anchor&#34; href=&#34;#jenkins--docker-compose%e9%85%8d%e7%bd%ae&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;为了方便我才用了docker-compose这个工具，docker-compose 基础可以参见我的&lt;a href=&#34;https://yeqown.github.io/2018/01/24/Docker-Compose%E4%B8%8A%E6%89%8B/&#34;&gt;docker-compose上手&lt;/a&gt;。这里直接上配置：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;jenkins&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jenkins-lts&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;9001&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8080&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;50000&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;50000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;jenkins/jenkins:lts&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/home/worker/jenkins/jenkins_home:/var/jenkins_home&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置也是官方的示例配置。&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;Note: 将宿主机的/home/worker/jenkins/jenkins_home挂载为容器的/var/jenkins_home目录。这样做的目的是，如果容器被不小心删除也不至于Jenkins的数据丢失。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;到这里，我们只需要执行&lt;code&gt;docker-compose up -d&lt;/code&gt;便可以将Jenkins容器跑起来了，再配置一下Nginx，便可以直接访问到Jenkins页面了，并进行初始化。&lt;/p&gt;&#xA;&lt;p&gt;我的目录结构如下：&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;➜  jenkins ll&#xA;total 8.0K&#xA;-rw-rw-r--  1 worker worker  220 May  2 17:19 docker-compose.yml&#xA;drwxrwxr-x 19 worker worker 4.0K May  3 15:53 jenkins_home&#xA;➜  jenkins pwd&#xA;/home/worker/jenkins&#xA;➜  jenkins docker-compose up -d # 运行&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;publish-over-ssh配置&#34;&gt;Publish Over SSH配置&lt;a class=&#34;anchor&#34; href=&#34;#publish-over-ssh%e9%85%8d%e7%bd%ae&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;Publish Over SSH&lt;/code&gt;配置，由于我们是通过docker运行的Jenkins，因此要特别配置一下SSH，方便Jenkins部署项目。这里先列出步骤：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Drone体验</title>
      <link>https://www.yeqown.xyz/2018/01/27/Drone%E4%BD%93%E9%AA%8C/</link>
      <pubDate>Sat, 27 Jan 2018 00:24:40 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/27/Drone%E4%BD%93%E9%AA%8C/</guid>
      <description>&lt;p&gt;相较于Jenkins，Gitlab-CI&amp;hellip;等，尝试Drone的首要原因是，天生的docker支持。不用去操心部署CI或者CD的环境配置等等烦心事。只需要上手，如何配置这个CD工具，让我使用更加畅快和顺手。&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;安装部署&#34;&gt;安装部署&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85%e9%83%a8%e7%bd%b2&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;&lt;em&gt;前提：已经安装了docker，docker-compose，并基本掌握docker用法，基本熟悉docker-compose配置文件&lt;/em&gt;&lt;/p&gt;&#xA;&lt;h4 id=&#34;pull镜像&#34;&gt;pull镜像&lt;a class=&#34;anchor&#34; href=&#34;#pull%e9%95%9c%e5%83%8f&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull drone/drone:0.8  &lt;span style=&#34;color:#75715e&#34;&gt;# droner-server 镜像&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull dorner/agent:0.8 &lt;span style=&#34;color:#75715e&#34;&gt;# drone-agent 镜像&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以跳过这一步，docker运行的时候，如果匹配不到本地镜像，会自动拉取。&lt;/p&gt;&#xA;&lt;h4 id=&#34;docker-composeyml配置文件&#34;&gt;docker-compose.yml配置文件&lt;a class=&#34;anchor&#34; href=&#34;#docker-composeyml%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;为了方便，新建一个Drone文件夹，目录结构如下：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;--Drone                  # 文件夹&#xA;  |---docker-compose.yml # docker-compose 配置文件&#xA;  |---data               # 用于挂载的数据文件&#xA;  |---drone.domain.com   # nginx sever 配置文件&#xA;  `---other.file         # 其他文件&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;已知文件结构后，编写的docker-compose.yml文件如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;drone-server&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone/drone:0.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone-server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;8000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;9000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./data:/var/lib/drone/&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 在没有跟数据库绑定的情况下，默认使用sqlite数据库&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_OPEN=false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_HOST=http://127.0.0.1:8000&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 最好是在服务器上，localhost无法收到webhook的通知&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_ADMIN=yourname&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_GITHUB=true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_GITHUB_CLIENT=7bc7971bxxxxx&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 需要预先注册一个github oauth应用&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_GITHUB_SECRET=9456c630xxxxxxxxxxxxxx&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_SECRET=secret&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_DEBUG=false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;drone-agent&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone/agent:0.8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;drone-agent&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;command&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;agent&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;restart&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;always&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;depends_on&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;drone-server&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_SERVER=drone-server:9000&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_SECRET=secret&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;DRONE_DEBUG=true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;启动drone&#34;&gt;启动Drone&lt;a class=&#34;anchor&#34; href=&#34;#%e5%90%af%e5%8a%a8drone&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;启动就很简单了，Drone目录下执行：&lt;code&gt;docker-compose up -d&lt;/code&gt;，启动结果截图如下：&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/drone-starting.png&#34; alt=&#34;Drone-starting.png&#34; /&gt;&#xA;如果是首次打开，会先去github请求授权，然后回调&lt;code&gt;schema://drone.your_domain.com/authorize&lt;/code&gt;，如截图：&#xA;&lt;img src=&#34;https://www.yeqown.xyz/images/drone-running.png&#34; alt=&#34;Drone-running-web.png&#34; /&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>docker-compose上手</title>
      <link>https://www.yeqown.xyz/2018/01/24/Docker-Compose%E4%B8%8A%E6%89%8B/</link>
      <pubDate>Wed, 24 Jan 2018 16:01:02 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/24/Docker-Compose%E4%B8%8A%E6%89%8B/</guid>
      <description>&lt;p&gt;docker compose 用于快速在集群中部署分布式应用。按我的理解也可以用于简化部署单个应用。譬如我要使用dock er启动一个nginx服务，需要做端口映射，挂载数据文件，指定镜像&amp;hellip;等等，这种情况下，可以将启动容器的命令整合到docker-compose.yml文件中，可以在多个服务器上运行，瞬间就完成了nginx的安装及配置，再也不用去编译，解决环境依赖了，这种感觉实在是太爽了！！！&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%89%e8%a3%85&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;使用pip &lt;code&gt;pip install docker-compose&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;从官方&lt;a href=&#34;https://github.com/docker/compose/releases&#34;&gt;Github Release&lt;/a&gt;下载二进制包文件&lt;/li&gt;&#xA;&lt;li&gt;其他方法略去&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;使用场景&#34;&gt;使用场景&lt;a class=&#34;anchor&#34; href=&#34;#%e4%bd%bf%e7%94%a8%e5%9c%ba%e6%99%af&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;在日常工作中，经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目，除了 Web 服务容器本身，往往还需要再加上后端的数据库服务容器，甚至还包括负载均衡容器等。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;h3 id=&#34;实战场景&#34;&gt;实战场景&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%9e%e6%88%98%e5%9c%ba%e6%99%af&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;需要部署的项目，只有两个docker容器，一个server，一个db。一般的部署方式是，分别启动两个容器，容器间通过互联的方式通信：&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo docker run --rm -p 5433:5432 --name postgres -e POSTGRES_PASSWORD=minepwd -e POSTGRES_USER=mineusr -d postgres&#xA;&#xA;sudo docker run --rm -p 9091:9091 --link postgres:postgres --name mineserver -d me/mineserver&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这两条命令还是有挺麻烦的，如果记不住，当然可以用shell脚本来运行，可以如果其中某一个服务无法如期运行。。。就很监介了。这时候就可以引入&lt;strong&gt;docker-compose&lt;/strong&gt;了。&lt;/p&gt;&#xA;&lt;h3 id=&#34;编写docker-composeyml来部署项目&#34;&gt;编写docker-compose.yml来部署项目&lt;a class=&#34;anchor&#34; href=&#34;#%e7%bc%96%e5%86%99docker-composeyml%e6%9d%a5%e9%83%a8%e7%bd%b2%e9%a1%b9%e7%9b%ae&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yml&#34; data-lang=&#34;yml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;version&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 指定docker-compose版本&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;services&lt;/span&gt;:    &lt;span style=&#34;color:#75715e&#34;&gt;# 项目依赖的服务&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;postgres&lt;/span&gt;:  &lt;span style=&#34;color:#75715e&#34;&gt;# 服务名字&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;postgres&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;# 服务需要的docker镜像与docker run命令中的镜像指定方式一致&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:        &lt;span style=&#34;color:#75715e&#34;&gt;# 挂载卷，这里的主要目的是，方便同步数据库和数据脚本&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./postgres:/var/lib/postgresql/data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./sh:/usr/src/sh&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:          &lt;span style=&#34;color:#75715e&#34;&gt;# 端口绑定&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;5433&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;5432&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;postgres&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;environment&lt;/span&gt;:    &lt;span style=&#34;color:#75715e&#34;&gt;# 设置环境变量&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;minepwd&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;POSTGRES_USER&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;mineusr&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;POSTGRES_DB&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;minedb&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;mineserver&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;image&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;me/mineserver&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;volumes&lt;/span&gt;:        &lt;span style=&#34;color:#75715e&#34;&gt;# 挂载卷，方便查看输出日志&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;./logs:/usr/src/mineserver/logs&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;ports&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;9091&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;9091&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;container_name&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;mineserver&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;links&lt;/span&gt;:          &lt;span style=&#34;color:#75715e&#34;&gt;# 容器互联&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      - &lt;span style=&#34;color:#ae81ff&#34;&gt;postgres:postgres&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在编写docker-compose.yml的时候，需要注意的是各个选项的数据类型，不过docker-compose会有提示，也很方便&lt;/p&gt;</description>
    </item>
    <item>
      <title>docker&#43;selenium&#43;python构建前端自动化分布式测试环境</title>
      <link>https://www.yeqown.xyz/2018/01/23/docker-selenium-python%E6%9E%84%E5%BB%BA%E5%89%8D%E7%AB%AF%E8%87%AA%E5%8A%A8%E5%8C%96%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/</link>
      <pubDate>Tue, 23 Jan 2018 11:07:08 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/23/docker-selenium-python%E6%9E%84%E5%BB%BA%E5%89%8D%E7%AB%AF%E8%87%AA%E5%8A%A8%E5%8C%96%E5%88%86%E5%B8%83%E5%BC%8F%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83/</guid>
      <description>&lt;p&gt;docker + selenium + python 构建前端自动化分布式测试环境。利用seleninum-grid分布式框架，python编写测试代码，docker部署来进行前端自动化测试&lt;/p&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;2018-2-1 更新 &lt;a href=&#34;#%e4%bd%bf%e7%94%a8docker-compose%e7%bc%96%e6%8e%92&#34;&gt;使用docker-compose编排&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;!-- more --&gt;&#xA;&lt;h3 id=&#34;分布式部署的优点&#34;&gt;分布式部署的优点&lt;a class=&#34;anchor&#34; href=&#34;#%e5%88%86%e5%b8%83%e5%bc%8f%e9%83%a8%e7%bd%b2%e7%9a%84%e4%bc%98%e7%82%b9&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;自动化的优缺点就不再重复了，主要分析下docke部署和分布式的优势&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;提高自动化的测试效率（分布式）&lt;/li&gt;&#xA;&lt;li&gt;方便打包和持续集成（docker）&lt;/li&gt;&#xA;&lt;li&gt;解决多人coding，却因为路径不一致导致无法运行的问题（当然也可以通过其他方式来解决～）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;这里还有一个问题就是：使用docker部署方式运行测试代码，是看不见本地浏览器启动的，因此在调试测试代码的时候，需要一定的工具来协助，譬如&lt;a href=&#34;https://www.realvnc.com/en/connect/download/viewer/&#34;&gt;VNC viewer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;开篇-selenium&#34;&gt;开篇-selenium&lt;a class=&#34;anchor&#34; href=&#34;#%e5%bc%80%e7%af%87-selenium&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;blockquote class=&#39;book-hint &#39;&gt;&#xA;&lt;p&gt;大家都知道 Selenium 是支持多种浏览器多个编程语言的一个自动化测试工具。而 Selenium Grid 是一种可以让用户在不同的环境和不同的浏览器上并行运行 web 测试用例的框架。换而言之，使用 Selenium Grid 可以让我们在分布式测试环境下执行测试，例如 Windows，Linux，Mac OS，Andoid/iOS 等等，这样可以大大减少重复的工作量，提高我们的工作效率。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&lt;p&gt;selenium分布式结构如图：&#xA;&lt;img src=&#34;https://www.ibm.com/developerworks/cn/opensource/os-cn-docker-selenium-grid-test/image001.png&#34; alt=&#34;selunium-grid&#34; /&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;搭建分布式环境&#34;&gt;搭建分布式环境&lt;a class=&#34;anchor&#34; href=&#34;#%e6%90%ad%e5%bb%ba%e5%88%86%e5%b8%83%e5%bc%8f%e7%8e%af%e5%a2%83&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;在Dockerhub已经具有了相应的selenium的镜像，我们直接使用就行了&lt;/p&gt;&#xA;&lt;h4 id=&#34;拉取镜像&#34;&gt;拉取镜像&lt;a class=&#34;anchor&#34; href=&#34;#%e6%8b%89%e5%8f%96%e9%95%9c%e5%83%8f&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull selenium/hub&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;docker pull selenium/node-chorme-debug&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关于&lt;code&gt;node-chrome-debug&lt;/code&gt;和&lt;code&gt;node-chrome&lt;/code&gt;的区别：&#xA;暂未研究&lt;/p&gt;&#xA;&lt;h4 id=&#34;运行容器&#34;&gt;运行容器&lt;a class=&#34;anchor&#34; href=&#34;#%e8%bf%90%e8%a1%8c%e5%ae%b9%e5%99%a8&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker run -d -p 4444:4444 --name sel-hub selunium/hub # 运行hub服务&#xA;docker run -d -p 5900:5900 --link sel-hub:hub selunium/node-chrome-debug # 运行slenium chrome 节点&#xA;# more node could append like node-chrome-debug&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;查看节点信息&#34;&gt;查看节点信息&lt;a class=&#34;anchor&#34; href=&#34;#%e6%9f%a5%e7%9c%8b%e8%8a%82%e7%82%b9%e4%bf%a1%e6%81%af&#34;&gt;#&lt;/a&gt;&lt;/h4&gt;&#xA;&lt;p&gt;在浏览器中打开&lt;a href=&#34;http://127.0.0.1:4444/grid/console&#34;&gt;http://127.0.0.1:4444/grid/console&lt;/a&gt;&#xA;这里需要注意的是，如果是在本地运行的容器，并映射4444端口，因此得到127.0.0.1:4444，如果是在虚拟机中运行，ip和端口应该根据网络来获取相应的IP和PORT&lt;/p&gt;</description>
    </item>
    <item>
      <title>docker探索</title>
      <link>https://www.yeqown.xyz/2018/01/18/docker%E6%8E%A2%E7%B4%A2/</link>
      <pubDate>Thu, 18 Jan 2018 15:02:49 +0000</pubDate>
      <guid>https://www.yeqown.xyz/2018/01/18/docker%E6%8E%A2%E7%B4%A2/</guid>
      <description>&lt;p&gt;docker 学习实战笔记。关于docker的详细信息参见&lt;a href=&#34;https://docs.docker.com/docker-for-mac/networking/#i-cannot-ping-my-containers&#34;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&#xA;&lt;!-- more --&gt;&#xA;&lt;p&gt;实战环境配置：&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;系统&lt;/th&gt;&#xA;          &lt;th&gt;Docker&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;MacOS&lt;/td&gt;&#xA;          &lt;td&gt;17.12.0-ce&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h3 id=&#34;实战一-简单部署可执行文件&#34;&gt;实战一 简单部署可执行文件&lt;a class=&#34;anchor&#34; href=&#34;#%e5%ae%9e%e6%88%98%e4%b8%80-%e7%ae%80%e5%8d%95%e9%83%a8%e7%bd%b2%e5%8f%af%e6%89%a7%e8%a1%8c%e6%96%87%e4%bb%b6&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;本次实战是部署一个golang的web服务, 需要mongo, redis支持&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;省略代码，打包过程（Mac用户别忘了打包GOOS=linux，0·0）&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;编写Dockerfile&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;FROM alpine # 简版linux&#xA;&#xA;RUN mkdir /app # 在镜像中创建一个文件夹&#xA;&#xA;COPY ./webapp /app &#xA;COPY ./config /app/config&#xA;COPY ./logs /app/logs&#xA;&#xA;EXPOSE 35764 # 暴露35764端口，也就是为了从外部可以访问到容器类的服务&#xA;&#xA;WORKDIR /app # 切换到应用文件夹（在镜像执行的时候，会自动切换）&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;&#xA;&lt;li&gt;构建镜像&#xA;执行命令 &lt;code&gt;docker build -t tp-api:v1 .&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;执行结果如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sending build context to Docker daemon   55.5MB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 1/7 : FROM alpine&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; 3fd9065eaf02&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 2/7 : RUN mkdir /app&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; Using cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; 6948fdc89bbd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 3/7 : COPY ./webapp /app&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; Using cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;555307961735&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 4/7 : COPY ./config /app/config&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; ab15feb5a3ab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 5/7 : COPY ./logs /app/logs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; 0055512da60b&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 6/7 : EXPOSE &lt;span style=&#34;color:#ae81ff&#34;&gt;35764&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; Running in db0503538961&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Removing intermediate container db0503538961&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; 1d214b7aff6d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Step 7/7 : WORKDIR /app&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Removing intermediate container 42889dd384a7&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ---&amp;gt; f0b05bcb428d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully built f0b05bcb428d&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Successfully tagged tp-api:v2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;&#xA;&lt;li&gt;调试容器&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;执行命令&lt;code&gt;docker run -it --rm -p 35765:35764 tp-api:v1&lt;/code&gt;,会进入容器交互模式，如下：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
