<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Docker - 标签 - 开发者技术小屋</title>
        <link>https://www.developerhome.net/tags/docker/</link>
        <description>Docker - 标签 - 开发者技术小屋</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 26 May 2020 15:47:44 &#43;0000</lastBuildDate><atom:link href="https://www.developerhome.net/tags/docker/" rel="self" type="application/rss+xml" /><item>
    <title>修改docker的默认存储目录</title>
    <link>https://www.developerhome.net/archives/541/</link>
    <pubDate>Tue, 26 May 2020 15:47:44 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/541/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-541.jpg" referrerpolicy="no-referrer">
            </div><h1></h1>
<h1 id="docker的默认存储">docker的默认存储</h1>
<p>目前docker默认是在<code>/var/lib/docker</code>下存储运行时等数据，当运行容器较大，时间很长时，这个目录会很大，仅做测试还好，当真正去跑的时候，会很大，因此需要我们去修改docker的默认存储位置</p>
<h1></h1>
<h1 id="如何修改docker的默认存储位置">如何修改docker的默认存储位置</h1>
<h1></h1>
<h1></h1>
<h1 id="使用systemctl启动的docker">使用systemctl启动的docker</h1>
<p>使用systemctl启动的docker服务，我们需要修改器服务的<code>service</code>配置</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>mkdir /mnt/docker-runtime
vi /etc/systemd/system/multi-user.target.wants/docker.service</code></pre></div>
<p>找到 <code>ExecStart</code> 这行，我们在启动参数中增加 <code>-g /mnt/docker-runtime</code>，然后保存退出，使用命令刷新服务</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>systemctl enable docker</code></pre></div>
<p>这样就刷新了服务，再使用命令重启</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>systemctl restart docker</code></pre></div>
<h1></h1>
<h1></h1>
<h1 id="直接修改docker的配置">直接修改docker的配置</h1>
<blockquote>
</blockquote>
<p>此方法对systemctl启动的docker不起作用</p>
<p>首先找到docker的配置文件</p>
<ul>
<li>Ubuntu 中的位置是：/etc/default/docker</li>
<li>CentOS 中的位置是：/etc/sysconfig/docker</li>
</ul>
<p>键入配置</p>]]></description>
</item>
<item>
    <title>traefik2初体验</title>
    <link>https://www.developerhome.net/archives/423/</link>
    <pubDate>Wed, 01 Jan 2020 23:57:05 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/423/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-423.jpg" referrerpolicy="no-referrer">
            </div><p><code>traefik</code> 作为一款稳定的网关，一直被很多微服务使用，目前<code>traefik</code>升级到了 <strong>2</strong> 版本，增加了针对tcp的支持，因为更新时间不长，还没有针对新版的中文文档，新版的文档在 <a href="https://docs.traefik.io/" target="_blank" rel="noopener noreffer ">官网</a>，如果使用之前的版本，可以参考<a href="https://docs.traefik.cn" target="_blank" rel="noopener noreffer ">中文文档</a>，之前在搭建k8s集群时曾经尝试过使用<code>traefik 1+</code> 的版本，后来因为项目时间问题，最后放弃了使用k8s，也就没有仔细去体会<code>traefik</code>的强大功能。最近因为另一个项目有一些需求，计划使用traefik来做API网关，才翻出来看看，结果发现更新到了2.0版本，竟然支持TCP了，好了，废话不多说，开始体验一下新版的功能吧！</p>
<p>为了方便学习并去除系统差异，我将直接使用Docker来做环境，<code>traefik</code> 中支持 docker 模式，并能支持docker原生的swarm模式，下面我将统一使用docker-compose来做说明</p>
<p>首先我们先创建一个简单的例子，使用官方提供的 <code>containous/whoami</code> 来作为应用镜像，其可以显示请求的具体信息，以便一会做请求时来确认具体访问到的是哪个容器</p>
<p>下面我们来创建一个 <code>docker-compose.yml</code> 编排文件</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>version: &#34;3.4&#34;
services:
    traefik:
        image: traefik:v2.1
        ports:
            - &#34;80:80&#34;
            - &#34;8080:8080&#34;
        volumes: 
            - &#34;/var/run/docker.sock:/var/run/docker.sock&#34;
        command: 
            - &#34;--api.insecure=true&#34;
            - &#34;--api.dashboard=true&#34;
            - &#34;--accesslog=true&#34;
            - &#34;--providers.docker=true&#34;
            - &#34;--entrypoints.web.address=:80&#34;
    whoami:
        image: containous/whoami
        labels: 
            - &#34;traefik.http.routers.app.rule=Host(`localhost`)&#34;
            - &#34;traefik.http.routers.app.entrypoints=web&#34;</code></pre></div>
<p>上面这个编排文件中，我们开放traefik与docker的守护进程通信</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>volumes: 
    - &#34;/var/run/docker.sock:/var/run/docker.sock&#34;</code></pre></div>
<p>在启动命令中，我们首先开启了 <code>dashboard</code> 为了本地调试，我们使用 <code>insecure</code> 来开启不安全接口访问方便我们做本地调试</p>]]></description>
</item>
<item>
    <title>harbor中login提示401 Unauthorized解决</title>
    <link>https://www.developerhome.net/archives/386/</link>
    <pubDate>Thu, 25 Apr 2019 23:57:19 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/386/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-386.jpg" referrerpolicy="no-referrer">
            </div><p>这几天在做新公司的新集群架构，肯定要用到镜像仓库，之前只用过docker registry来启用一个仓库，管理挺不方便，所以这次决定使用harbor来搭建一个企业级的私有容器仓库。</p>
<p>harbor的具体搭建，其实挺简单的，去下载的官方的安装包，解压后，</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./prepare</span></span></code></pre></div></div>
<p>进行初始化配置，然后再install就行了</p>
<p>因为我搭建的Harbor仓库是在自己部署的Gitlab容器的服务器上，所以在最前端又用了nginx做了一个nginx做了反向代理，因为Harbor需要使用https，省事又自己弄了个自签证书</p>
<p>对于自签证书，现需要生成一个根证书，用于给自己做签名</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openssl req -newkey rsa:4096 -nodes -sha256 -x509 -days <span class="m">365</span> -keyout root.key -out root.crt</span></span></code></pre></div></div>
<p>回车后按照提示输入国家、地区组织信息就行了</p>
<p>之后我们需要生成一个域名的证书签名，比如域名为 developerhome.net</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">openssl req -newkey rsa:4096 -nodes -sha256 -keyout developerhome.net.key -out server.csr</span></span></code></pre></div></div>
<p>同样回车后按提示输入信息</p>]]></description>
</item>
<item>
    <title>docker中的ulimit配置</title>
    <link>https://www.developerhome.net/archives/115/</link>
    <pubDate>Mon, 09 Apr 2018 13:29:53 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/115/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-115.jpg" referrerpolicy="no-referrer">
            </div><p>docker1.6后可以在创建容器时使用命令 <code>--ulimit nofile=65535:65535 --ulimit -nofile=65535:65535</code>来设置创建容器的ulimit配置</p>]]></description>
</item>
<item>
    <title>docker启动位置的设定</title>
    <link>https://www.developerhome.net/archives/113/</link>
    <pubDate>Mon, 09 Apr 2018 13:29:15 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/113/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-113.jpg" referrerpolicy="no-referrer">
            </div><p>因为docker默认在/var/lib中启动，会占用大量系统空间，因此可以修改下docker启动位置，并通过挂载其他硬盘来让docker启动在其他硬盘中。
修改 centos的/etc/sysconfig/docker 或者ubuntu的/etc/default/docker
在docker的启动options中增加
&ndash;graph=/mnt/dockerdir
来让docker启动在别的位置</p>]]></description>
</item>
<item>
    <title>最近很忙，给大家发几个可能会用到的docker镜像</title>
    <link>https://www.developerhome.net/archives/201/</link>
    <pubDate>Wed, 04 Apr 2018 15:35:08 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/201/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-201.jpg" referrerpolicy="no-referrer">
            </div><p>首先先向大家致歉，最近实在是太忙了，没有更新文章。</p>
<p>今天先给大家推荐自己打的两个docker镜像包吧，如果正好有需要，可以pull试试看。</p>
<p>现在越来越多的公司开始用到swoole来开发更高性能要求和特定场合的服务级应用了，而我查了下，大部分的swoole的扩展的镜像都很大，都是300M以上的，所以，我为大家打了一个75M左右的包含swoole扩展的镜像包，其中开启了swoole的协程、异步redis、mysqlnd支持，同时开启了mysqli、pdo_mysql、mbstring、openssl、redis等常用的扩展，并安装了composer。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker pull jarod2014/swoole_composer_alpine</span></span></code></pre></div></div>
<p>dockerfile可以去<a href="https://github.com/jarod2011/dockerfile-swoole-composer" target="_blank" rel="noopener noreffer ">github</a>查看</p>
<p>现在大部分的敏捷开发都是用laravel开发，而作为性能版的laravel，Lumen也有越来越多的开发者来使用，用于开发纯接口服务，那么为大家奉上一个Lumen的开发环境和Lumen的运行环境，都是超小型的镜像，开发环境比运行环境增加了lumen-installer。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-bash">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker pull jarod2014/lumen_alpine</span></span></code></pre></div></div>
<p>开发版请使用dev标签，dockerfile可以去<a href="https://github.com/jarod2011/dockerfile-lumen" target="_blank" rel="noopener noreffer ">github</a>查看</p>]]></description>
</item>
<item>
    <title>谈谈分词的解决方案</title>
    <link>https://www.developerhome.net/archives/190/</link>
    <pubDate>Wed, 07 Mar 2018 17:12:11 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/190/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-190.jpg" referrerpolicy="no-referrer">
            </div><p><strong>今天来给大家聊聊，针对一些简单的分词的解决方案。</strong></p>
<p>首先我们来看一个常用的场景：</p>
<blockquote>
<p>一个购物网站的搜索功能，要求可以根据用户的搜索精准的查询到商品，比如我要买咖啡，我搜索关键字 <strong>咖啡</strong> 可以搜索到很多咖啡商品，但我要求搜索** 我要买好喝的咖啡 **也可以搜索到很多咖啡商品。这要如何实现呢？</p>
</blockquote>
<p>对于仅仅搜索关键字来说，小库直接去like查询，就可以解决，若库大了做索引，缓存等都可以去解决，这里就不再赘述了，因为我们今天主要的核心讨论点是<strong>分词</strong>。</p>
<p>我们来看这句话 <strong>我要买好喝的咖啡</strong> ，通过我们自主的观察，我们需要的是** 咖啡**，其是一个名词，而去除掉 **我 **，**买 **是一个动词， **好喝 **是一个形容词。这样我们就捋清楚了，我们其实大部分搜索需要的都是名词。</p>
<p>这样我们只要能从 **我要买好喝的咖啡 <strong>中通过分词，顺利找到</strong> 咖啡 **，或者说，从一段需要搜索的话中，找到其中的所有名词，就可以了。</p>
<p>今天给大家推荐的分词工具包，是由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包，其官网（<a href="http://thulac.thunlp.org/" target="_blank" rel="noopener noreffer ">http://thulac.thunlp.org/</a>）的描述是这样的：</p>
<blockquote>
<p>THULAC（THU Lexical Analyzer for Chinese）由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包，具有中文分词和词性标注功能。THULAC具有如下几个特点：</p>
</blockquote>
<ul>
<li>能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库（约含5800万字）训练而成，模型标注能力强大。</li>
<li>准确率高。该工具包在标准数据集Chinese Treebank（CTB5）上分词的F1值可达97.3％，词性标注的F1值可达到92.9％，与该数据集上最好方法效果相当。</li>
<li>速度较快。同时进行分词和词性标注速度为300KB/s，每秒可处理约15万字。只进行分词速度可达到1.3MB/s。</li>
</ul>
<p>目前，其提供了C++、Java和Python的包供大家使用，那么对于其他语言的人怎么办呢？</p>
<p>其实很简单，只要用这三种语言，写个端口和地址监听，提供一个分词的API接口就行了，有人会问了，这三种语言不会啊，环境都不会配，怎么办？</p>
<p><strong>不要忘记了，我们有 Docker !!!</strong></p>
<p>我选用Python来构建一个API接口，通过使用thulac的包，然后我选用flask（<a href="http://www.pythondoc.com/Flask-RESTful/" target="_blank" rel="noopener noreffer ">http://www.pythondoc.com/Flask-RESTful/</a>）来写个简单的接口文件，然后在一个有Python环境下，运行监听地址和端口，其他语言只要去访问这个接口，就可以获取到针对句子的分词结果了，然后根据自己的业务逻辑，对分词结果做相应的处理，就可以了。</p>
<p>我们先来完成接口文件</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-python">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">thulac</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">json</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">flask_restful</span> <span class="kn">import</span> <span class="n">Api</span><span class="p">,</span> <span class="n">Resource</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span><span class="p">,</span> <span class="n">request</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">thul</span> <span class="o">=</span> <span class="n">thulac</span><span class="o">.</span><span class="n">thulac</span><span class="p">(</span><span class="n">filt</span><span class="o">=</span><span class="kc">True</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">api</span> <span class="o">=</span> <span class="n">Api</span><span class="p">(</span><span class="n">app</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">history</span> <span class="o">=</span> <span class="p">{};</span>
</span></span><span class="line"><span class="cl"><span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">CutWord</span><span class="p">(</span><span class="n">Resource</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"><span class="k">return</span> <span class="n">history</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"><span class="k">global</span> <span class="n">index</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">req</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">form</span><span class="p">[</span><span class="s1">&#39;data&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="n">res</span> <span class="o">=</span> <span class="n">thul</span><span class="o">.</span><span class="n">cut</span><span class="p">(</span><span class="n">req</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">history</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;req&#39;</span><span class="p">:</span> <span class="n">req</span><span class="p">,</span> <span class="s1">&#39;res&#39;</span><span class="p">:</span> <span class="n">res</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">api</span><span class="o">.</span><span class="n">add_resource</span><span class="p">(</span><span class="n">CutWord</span><span class="p">,</span> <span class="s1">&#39;/&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"><span class="n">app</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s1">&#39;0.0.0.0&#39;</span><span class="p">);</span></span></span></code></pre></div></div>
<p>上面我监听了本地的5000端口（FLask默认5000端口），对根路径提供RESTful接口，其针对get获取历史查询列表，对post将会通过data提供的句子做分词并返回结果。当然这只是一个简单的接口，有兴趣的Python大神们可以扩展出更多的功能和做性能优化等。</p>]]></description>
</item>
<item>
    <title>使用Phantomjs来处理针对js渲染的页面的爬取</title>
    <link>https://www.developerhome.net/archives/160/</link>
    <pubDate>Wed, 31 Jan 2018 17:12:36 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/160/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-160.jpg" referrerpolicy="no-referrer">
            </div><p>对于爬虫来说，主要的任务就是获取页面的内容，从最初页面直接后端渲染结果后输出到后端输出模版再使用ajax等技术来渲染数据，而随着前端技术的发展，越来越多的网站开始使用纯js来渲染页面，比如Vue、React等。</p>
<p>而对于爬虫来说，想要获取页面内容，也从最初的直接拿到页面内容，变成了针对不同页面针对性写爬取规则，比如A页面，有3个ajax用来获取渲染数据，那么就要对于爬取A页面的爬虫，就要再写3个针对ajax的数据爬取</p>
<p>而当需要爬取的页面越来越多的时候，如何能提升效率呢？</p>
<p>于是，针对页面的解析工作，就交给了一些浏览器核去处理了，Phantomjs就是一个基于webkit的js api，能够实现浏览器的功能，这样我们将一个页面输入给Phantomjs，其就如同一个浏览器一样，去解析执行这个页面，获取最终展示的结果。</p>
<p>这两种方式各有优缺点：</p>
<ul>
<li>针对页面写特定爬虫，准确，执行效率快，维护性差，一旦页面接口变动则需要根据变动修改爬虫</li>
<li>Phantomjs通用性高，不需要针对特定页面去写，但执行速度慢（相当于浏览器访问页面了，其所有网络访问都渲染完成了才结束）</li>
<li></li>
</ul>
<p>那么如何使用Phantomjs呢？</p>
<p>首先是环境，其官网为<a href="http://phantomjs.org" target="_blank" rel="noopener noreffer ">http://phantomjs.org</a></p>
<p>推荐使用docker来pull一个镜像，环境都配好了，省事，我使用的是 wernight/phantomjs 这个镜像</p>
<p>下面我们来写个测试页面：</p>
<p></p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-html">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="cp">&lt;!DOCTYPE html&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">&#34;en&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">&#34;UTF-8&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">&#34;viewport&#34;</span> <span class="na">content</span><span class="o">=</span><span class="s">&#34;width=device-width, initial-scale=1.0&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">meta</span> <span class="na">http-equiv</span><span class="o">=</span><span class="s">&#34;X-UA-Compatible&#34;</span> <span class="na">content</span><span class="o">=</span><span class="s">&#34;ie=edge&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">title</span><span class="p">&gt;</span>一个JS渲染的页面<span class="p">&lt;/</span><span class="nt">title</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">head</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">body</span><span class="p">&gt;&lt;/</span><span class="nt">body</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">&#34;&lt;p&gt;Your can see me if your are not spider.&lt;/p&gt;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">script</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;/</span><span class="nt">html</span><span class="p">&gt;</span></span></span></code></pre></div></div>
<p>很简单的一个页面，其会在页面生成一句 **Your can see me if your are not spider. **</p>]]></description>
</item>
<item>
    <title>nginx因POST数据过大，报500错误</title>
    <link>https://www.developerhome.net/archives/109/</link>
    <pubDate>Tue, 25 Jul 2017 21:02:52 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/109/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-109.jpg" referrerpolicy="no-referrer">
            </div><p>今天在部署docker的一个nginx服务时候，发现当POST过来数据太大时，会出现一个500的网络错误，打开nginx日志，显示的是对目录访问权限不够，因此进入docker内部，将lib下的nginx给予755权限即可，因为是使用的轻量版的docker容器，无法进入内部，所以使用docker exec即可，命令如下<code>docker exec -it nginxserver chmod -R 755 /var/lib/nginx</code></p>]]></description>
</item>
<item>
    <title>docker部署时在centos7中遇到的挂载时权限问题</title>
    <link>https://www.developerhome.net/archives/74/</link>
    <pubDate>Wed, 03 May 2017 00:47:04 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/74/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-74.jpg" referrerpolicy="no-referrer">
            </div><p>今天在一台centos7部署docker的一个mysql镜像，做配置和数据库的文件挂载，可是怎么都不行，每次使用docker logs 查看都是提示的权限问题，经过反复查找资料，原来是centos7种的selinux将权限给禁掉了</p>
<p>具体解决方法有几种：</p>
<ol>
<li>
<p>最简单的方法，直接在生成docker容器时，加入参数 <code>--privileged=true</code> 来增加特权</p>
</li>
<li>
<p>将挂在的目录添加到selinux的规则中</p>
</li>
</ol>
<p>比如挂在目录为 /app 则使用 <code>chcon -Rt svirt_sandbox_file_t /app</code></p>
<ol start="3">
<li>临时关闭掉selinux</li>
</ol>
<p>关闭命令：<code>su -c &quot;setenforce 0&quot;</code></p>
<p>在创建docker后再次开启使用命令：<code>su -c &quot;setenforce 1&quot;</code></p>]]></description>
</item>
</channel>
</rss>
