<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Slides on Ricky</title><link>https://5b54be02.linzeyan.pages.dev/zh-tw/tags/slides/</link><description>Recent content in Slides on Ricky</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Fri, 11 Sep 2026 08:23:01 +0800</lastBuildDate><atom:link href="https://5b54be02.linzeyan.pages.dev/zh-tw/tags/slides/index.xml" rel="self" type="application/rss+xml"/><item><title>Til</title><link>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2026/20260911-til/</link><pubDate>Fri, 11 Sep 2026 08:23:01 +0800</pubDate><guid>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2026/20260911-til/</guid><description>&lt;ul>
&lt;li>&lt;a href="https://www.checklist.design/" target="_blank" rel="noopener">Checklist Design&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tuxedono2.com/" target="_blank" rel="noopener">Tuxedo No.2 - A Cocktail Companion&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://mangamillion.shueisha.co.jp/" target="_blank" rel="noopener">MangaMillion&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://debloat.dev/" target="_blank" rel="noopener">debloat.dev — replace the junk&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://metawilo.com/" target="_blank" rel="noopener">台灣罪犯圖鑑&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://bsb.kh.edu.tw/" target="_blank" rel="noopener">直轄市及各縣市短期補習班資訊管理系統&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://coach-case-tracker.thinkingpower-office.workers.dev/" target="_blank" rel="noopener">各運動種類不適任教練名單 — 案源比對工作表&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.sports.gov.tw/News/6295" target="_blank" rel="noopener">運動部 - 涉及違法事件不適任教練資訊專區&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.sports.gov.tw/CoachDatas/6357" target="_blank" rel="noopener">運動部 - 教練證照查詢系統&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://crc.sfaa.gov.tw/ChildYoungLaw/Sanction?AspxAutoDetectCookieSupport=1" target="_blank" rel="noopener">CRC 聯合國兒童權利公約資訊網 - 違反兒少法&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ma.mohw.gov.tw/Accessibility/VIOSearch/MASearchVIO" target="_blank" rel="noopener">衛生福利部 - 醫事人員性別事件資訊專區&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://ap.ece.moe.edu.tw/webecems/punishSearch.aspx" target="_blank" rel="noopener">全國教保資訊網 - 裁罰紀錄查詢&lt;/a>&lt;/li>
&lt;li>&lt;strong>Article&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://shopify.engineering/scaling-inventory-reservations" target="_blank" rel="noopener">We replaced Redis with MySQL for inventory reservations—and it scaled&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tailscale.com/blog/sqlite-wal-reset-bug" target="_blank" rel="noopener">How we tracked down a 16-year-old SQLite bug&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Database&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/vlcn-io/cr-sqlite" target="_blank" rel="noopener">cr-sqlite - Convergent, Replicated, SQLite&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/amacneil/dbmate" target="_blank" rel="noopener">Dbmate is a database migration tool that will keep your database schema in sync across multiple developers and your production servers.&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Diagram&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/tt-a1i/archify" target="_blank" rel="noopener">Turn a codebase or system description into a polished, interactive system map — directly in chat.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/cathrynlavery/diagram-design" target="_blank" rel="noopener">Editorial diagrams your designer won&amp;rsquo;t hate.&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Github&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/drumih/turbo-fieldfare" target="_blank" rel="noopener">Gemma 4 26B-A4B inference in ~2 GB of RAM on any M-series MacBook&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/liaohch3/claude-tap" target="_blank" rel="noopener">claude-tap is a local proxy and trace viewer for AI coding agents.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Finb/Bark" target="_blank" rel="noopener">Bark is an iOS App which allows you to push custom notifications to your iPhone&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/darrylmorley/whatcable" target="_blank" rel="noopener">macOS menu bar app that tells you, in plain English, what each USB-C cable plugged into your Mac can actually do&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/img2threejs/img2threejs" target="_blank" rel="noopener">Rebuild the object in a reference image as a code-only, procedural Three.js model.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/darama22/Malware-Research-Hub" target="_blank" rel="noopener">MALWARE RESEARCH HUB&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Pumpkin-MC/Pumpkin" target="_blank" rel="noopener">Pumpkin is a Minecraft server built entirely in Rust, offering a fast, efficient, and customizable experience.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/LodyAI/Lody" target="_blank" rel="noopener">Lody: A shared workspace for the coding agents your team already uses.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Lakr233/vphone-cli" target="_blank" rel="noopener">Boot a virtual iPhone via Apple&amp;rsquo;s Virtualization.framework using PCC research VM infrastructure.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/uiverse-io/galaxy" target="_blank" rel="noopener">The largest Open-Source UI Library! Community-made and free to use. Made with either CSS or Tailwind.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/galaxyproject/galaxy" target="_blank" rel="noopener">Data intensive science for everyone.&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>MCP&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/dmtrKovalenko/fff" target="_blank" rel="noopener">fff: A file search toolkit for humans and AI agents.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/colbymchenry/codegraph" target="_blank" rel="noopener">Pre-indexed code knowledge graph, auto syncs on code changes.&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Present&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/hugohe3/ppt-master" target="_blank" rel="noopener">PPT Master — AI generates native PowerPoint from any document&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/nyblnet/bento" target="_blank" rel="noopener">Bento — the office suite that fits in a file&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/1weiho/open-slide" target="_blank" rel="noopener">The slide framework built for agents.&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Self-Hosted&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/fabriziosalmi/certmate" target="_blank" rel="noopener">CertMate - Certificate Lifecycle Management&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>&lt;strong>Skill&lt;/strong>
&lt;ul>
&lt;li>&lt;a href="https://github.com/emilkowalski/skills" target="_blank" rel="noopener">Skills for Designers and Engineers.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/dotnet/skills/blob/main/plugins/dotnet-test/agents/code-testing-generator.agent.md" target="_blank" rel="noopener">Test Generator Agent&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/mattpocock/skills" target="_blank" rel="noopener">Skills for Real Engineers. Straight from my .agents directory.&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/htdt/godogen" target="_blank" rel="noopener">Autonomous game development for Godot, Bevy, and Babylon.js with Claude Code and Codex&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/leonxlnx/taste-skill" target="_blank" rel="noopener">Taste-Skill - gives your AI good taste. stops the AI from generating boring, generic slop&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Emily2040/seedance-2.0" target="_blank" rel="noopener">Comprehensive production pipeline for quad-modal AI filmmaking with Seedance 2.0&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/dexhunter/seedance2-skill" target="_blank" rel="noopener">skill to create best prompts for generating videos with seedance2.0&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item><item><title>Gitlab-CI Introduction</title><link>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2021/20210924-gitlab/</link><pubDate>Fri, 24 Sep 2021 11:11:03 +0800</pubDate><guid>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2021/20210924-gitlab/</guid><description>&lt;h1 id="gitlab-ci">Gitlab CI&lt;/h1>
&lt;h2 id="concept">Concept&lt;/h2>
&lt;h3 id="gitlab">Gitlab&lt;/h3>
&lt;ul>
&lt;li>DevOps&lt;/li>
&lt;li>GitOps&lt;/li>
&lt;/ul>
&lt;h3 id="workflow">Workflow&lt;/h3>
&lt;pre tabindex="0">&lt;code>code push -&amp;gt; pipeline -&amp;gt; stage -&amp;gt; job
&lt;/code>&lt;/pre>&lt;h3 id="design">Design&lt;/h3>
&lt;pre tabindex="0">&lt;code>plan -&amp;gt; code -&amp;gt; build -&amp;gt; test -&amp;gt; release -&amp;gt; deploy -&amp;gt; operate -&amp;gt; monitor -&amp;gt; plan
&lt;/code>&lt;/pre>&lt;h3 id="runner-executors">Runner Executors&lt;/h3>
&lt;ul>
&lt;li>Shell&lt;/li>
&lt;li>VirtualBox&lt;/li>
&lt;li>Docker&lt;/li>
&lt;li>Docker Machine&lt;/li>
&lt;li>Kubernetes&lt;/li>
&lt;li>Else&amp;hellip;&lt;/li>
&lt;/ul>
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://docs.gitlab.com/ee/ci/" target="_blank" rel="noopener">Gitlab CI/CD&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.gitlab.com/runner/" target="_blank" rel="noopener">Gitlab Runner&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.gitlab.com/ee/ci/yaml/" target="_blank" rel="noopener">.gitlab-ci.yaml&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="runner">Runner&lt;/h2>
&lt;h3 id="register">Register&lt;/h3>
&lt;p>&lt;code>gitlab-runner register&lt;/code>&lt;/p>
&lt;h3 id="after-register">After register&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-toml" data-lang="toml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">concurrent&lt;/span> = &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">check_interval&lt;/span> = &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[&lt;span style="color:#a6e22e">session_server&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">session_timeout&lt;/span> = &lt;span style="color:#ae81ff">1800&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[[&lt;span style="color:#a6e22e">runners&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;public-shell&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">url&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;https://gitlab.go2cloudten.com/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">token&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;-mdH9OAOzG5yPsf_AVnW&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">executor&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;shell&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>[[&lt;span style="color:#a6e22e">runners&lt;/span>]]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">name&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;public-docker&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">url&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;https://gitlab.go2cloudten.com/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">token&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;AcEGPPKTS1uuQ_A_qpWy&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">executor&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;docker&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> [&lt;span style="color:#a6e22e">runners&lt;/span>.&lt;span style="color:#a6e22e">docker&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">dns&lt;/span> = [&lt;span style="color:#e6db74">&amp;#34;192.168.185.5&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;192.168.185.6&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">tls_verify&lt;/span> = &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">image&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;registry.go2cloudten.com/it/office_sop/node:12.13.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">privileged&lt;/span> = &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">disable_entrypoint_overwrite&lt;/span> = &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">oom_kill_disable&lt;/span> = &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">disable_cache&lt;/span> = &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">shm_size&lt;/span> = &lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">pull_policy&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;if-not-present&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">volumes&lt;/span> = [&lt;span style="color:#e6db74">&amp;#34;/cache&amp;#34;&lt;/span>]
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="repository">Repository&lt;/h2>
&lt;h3 id="gitlab-ciyaml">.gitlab-ci.yaml&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">stages&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">domain&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">check-icp&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">stage&lt;/span>: &lt;span style="color:#ae81ff">domain&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">registry.go2cloudten.com/it/office_sop/icp&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">tags&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">docker&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">script&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">domains=$(awk -F &amp;#39;|&amp;#39; &amp;#39;{if($6 ~ &amp;#34;Y&amp;#34; &amp;amp;&amp;amp; ($7 ~ &amp;#34;West&amp;#34; || $7 ~ &amp;#34;Yuqu&amp;#34;)) print $3}&amp;#39; domains-info.md | sed &amp;#39;s/ //g&amp;#39; | sort | uniq)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">if [[ &amp;#34;${domains}&amp;#34; == &amp;#34;&amp;#34; ]]; then telegram.sh &amp;#39;There is no domain in list&amp;#39; ; else telegram.sh &amp;#39;Start checking ICP.&amp;#39; ; fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">for i in ${domains}; do result=$(checkicp ${i}); if [[ &amp;#34;${result}&amp;#34; == &amp;#34;未备案&amp;#34; ]];then telegram.sh &amp;#34;${i} 未备案&amp;#34;; sleep 1 ;fi;done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">telegram.sh &amp;#39;ICP check completed.&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">only&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">schedules&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Docker Introduction</title><link>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2021/20210917-docker/</link><pubDate>Fri, 17 Sep 2021 14:11:03 +0800</pubDate><guid>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2021/20210917-docker/</guid><description>&lt;h1 id="docker">Docker&lt;/h1>
&lt;h2 id="concept">Concept&lt;/h2>
&lt;h3 id="vm-vs-container">VM vs Container&lt;/h3>
&lt;ul>
&lt;li>VM - Base on OS&lt;/li>
&lt;li>Container - Base on Application (Linux Kernel: Namespace and Cgroup)&lt;/li>
&lt;/ul>
&lt;h3 id="client-to-server">Client to Server&lt;/h3>
&lt;ul>
&lt;li>Docker daemon - containerd, docker-containerd-shim, docker-runc&lt;/li>
&lt;li>Docker client - cli command&lt;/li>
&lt;/ul>
&lt;pre tabindex="0">&lt;code>docker cli -&amp;gt; docker daemon -&amp;gt; containerd -&amp;gt; runc -&amp;gt; namespace &amp;amp; cgroup
&lt;/code>&lt;/pre>&lt;h3 id="image">Image&lt;/h3>
&lt;ul>
&lt;li>Snapshots&lt;/li>
&lt;/ul>
&lt;h3 id="container">Container&lt;/h3>
&lt;ul>
&lt;li>Read-Only processes on image&lt;/li>
&lt;/ul>
&lt;h3 id="hub--registry">Hub / Registry&lt;/h3>
&lt;ul>
&lt;li>Store images&lt;/li>
&lt;/ul>
&lt;h3 id="references">References&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://philipzheng.gitbook.io/docker_practice/" target="_blank" rel="noopener">Docker —— 從入門到實踐&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.docker.com/" target="_blank" rel="noopener">docker docs&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="docker-commands">Docker commands&lt;/h2>
&lt;h3 id="dockerfile">Dockerfile&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">ARG&lt;/span> dist&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/tmp/password&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">ARG&lt;/span> projectDir&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/password&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">FROM&lt;/span>&lt;span style="color:#e6db74"> golang:1.16-alpine3.14 AS builder&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">RUN&lt;/span> apk add build-base upx&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">ARG&lt;/span> dist&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">ARG&lt;/span> projectDir&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">WORKDIR&lt;/span>&lt;span style="color:#e6db74"> ${projectDir}&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">COPY&lt;/span> . .&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">RUN&lt;/span> go build -trimpath -o main cmd/main.go&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">RUN&lt;/span> upx -9 -o &lt;span style="color:#e6db74">${&lt;/span>dist&lt;span style="color:#e6db74">}&lt;/span> main&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">FROM&lt;/span>&lt;span style="color:#e6db74"> scratch&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">ARG&lt;/span> dist&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">ENV&lt;/span> TZ&lt;span style="color:#f92672">=&lt;/span>Asia/Taipei&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">COPY&lt;/span> --from&lt;span style="color:#f92672">=&lt;/span>builder &lt;span style="color:#e6db74">${&lt;/span>dist&lt;span style="color:#e6db74">}&lt;/span> /usr/local/bin/password&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="dockerfile1">Dockerfile1&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">FROM&lt;/span>&lt;span style="color:#e6db74"> alpine&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">CMD&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;nc&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;-l&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;12345&amp;#34;&lt;/span>]&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="dockerfile2">Dockerfile2&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-dockerfile" data-lang="dockerfile">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">FROM&lt;/span>&lt;span style="color:#e6db74"> alpine&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">&lt;/span>&lt;span style="color:#66d9ef">CMD&lt;/span> [&lt;span style="color:#e6db74">&amp;#34;echo&amp;#34;&lt;/span>,&lt;span style="color:#e6db74">&amp;#34;DOCKER&amp;#34;&lt;/span>]&lt;span style="color:#960050;background-color:#1e0010">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="docker-build-command">docker build command&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-shell" data-lang="shell">&lt;span style="display:flex;">&lt;span>docker build . -t program
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker build . -f Dockerfile -t test_mysql
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker build . -t hello:v1.1 --build-arg dist&lt;span style="color:#f92672">=&lt;/span>/tmp/hello --build-arg projectDir&lt;span style="color:#f92672">=&lt;/span>/hello
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="docker-build">docker build&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Before build&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker image ls
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker build . -f docker/Dockerfile1 -t test1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker build . -f docker/Dockerfile2 -t test2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="docker-image">docker image&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">After build&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker image ls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="docker-run-and-rm">docker run AND rm&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Run container1&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run -d --name container1 test1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Run container2&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker run -d --name container2 test2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List alive containers&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker ps
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List all containers&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker ps -a
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Remove alive container&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker rm -f container1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List all containers&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker ps -a
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Remove exit container&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker rm container2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List all containers&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker ps -a
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="docker-pull-and-rmi">docker pull AND rmi&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List all image&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker image ls
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Pull alpine image&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker pull alpine
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List all image&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker image ls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="docker-rmi">docker rmi&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">Remove alpine image&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker rmi alpine
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List all image&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker image ls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="prune">prune&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>docker system prune -f --volumes
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="docker-history">docker history&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">History of test1&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker history test1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">History of mysql:8&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>docker history mysql:8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="docker-remote">Docker remote&lt;/h2>
&lt;h3 id="edit-service-file">Edit service file&lt;/h3>
&lt;pre tabindex="0">&lt;code># /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
&lt;/code>&lt;/pre>&lt;h3 id="restart-service">Restart service&lt;/h3>
&lt;pre tabindex="0">&lt;code>systemctl daemon-reload
systemctl restart docker
&lt;/code>&lt;/pre>&lt;h3 id="specify-docker_host">Specify DOCKER_HOST&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>. docker/status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo -e &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>GREEN&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">List images on 192.168.185.9&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>RESET&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DOCKER_HOST&lt;span style="color:#f92672">=&lt;/span>192.168.185.9:2375 docker images
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="docker-compose">Docker-compose&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">version&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;3&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">svn&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">zeyanlin/svn&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_HOSTS=${LDAP_HOSTS}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_BASE_DN=${LDAP_BASE_DN}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_BIND_DN=${LDAP_BIND_DN}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_ADMIN_PASS=${LDAP_ADMIN_PASS}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">8000&lt;/span>:&lt;span style="color:#ae81ff">80&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">3690&lt;/span>:&lt;span style="color:#ae81ff">3690&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">depends_on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">ldap&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ldap&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">zeyanlin/openldap&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_DOMAIN=${LDAP_DOMAIN}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_ADMIN_PASS=${LDAP_ADMIN_PASS}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">389&lt;/span>:&lt;span style="color:#ae81ff">389&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">636&lt;/span>:&lt;span style="color:#ae81ff">636&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">php&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">zeyanlin/phpldapadmin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LDAP_HOSTS=${LDAP_HOSTS}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">80&lt;/span>:&lt;span style="color:#ae81ff">80&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">depends_on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">ldap&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h3 id="env">Env&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LDAP_HOSTS&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">ldap&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LDAP_DOMAIN&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;knowhow.fun&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LDAP_BASE_DN&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;dc=knowhow,dc=fun&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LDAP_BIND_DN&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;cn=admin&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LDAP_ADMIN_PASS&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;123qwe&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Ansible 簡介</title><link>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2020/20200926-ansible/</link><pubDate>Sat, 26 Sep 2020 16:57:21 +0800</pubDate><guid>https://5b54be02.linzeyan.pages.dev/zh-tw/posts/2020/20200926-ansible/</guid><description>&lt;h1 id="認識-ansible">認識 Ansible&lt;/h1>
&lt;h2 id="大綱">大綱&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="#%e7%b0%a1%e4%bb%8b">簡介&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%e5%ae%89%e8%a3%9d">安裝&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84">常用模組&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%e8%b3%87%e6%96%99%e5%a4%be%e7%b5%90%e6%a7%8b">資料夾結構&lt;/a>&lt;/li>
&lt;li>&lt;a href="#%e7%b5%90%e8%aa%9e">結語&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="簡介">簡介&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>安裝部署工具、設定管理工具等&lt;/p>
&lt;/li>
&lt;li>
&lt;p>同類型工具：Chef、Puppet、SaltStack&lt;/p>
&lt;/li>
&lt;li>
&lt;p>不需要 Agent、透過 ssh&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Linux 有 python 即可 ( ssh port )&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Win 啟用 winrm 即可 ( 5986 port )&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html#inventory-options" target="_blank" rel="noopener">https://docs.ansible.com/ansible/latest/user_guide/windows_winrm.html#inventory-options&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>資料夾結構簡單易懂、官方文件豐富易懂、模組多支援設備多、易撰寫&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://5b54be02.linzeyan.pages.dev/posts/2020/20200926-ansible/pics/20200926_ansible.pics/20200926_ansible0.png" alt="">&lt;/p>
&lt;p>&lt;img src="https://5b54be02.linzeyan.pages.dev/posts/2020/20200926-ansible/pics/20200926_ansible.pics/20200926_ansible1.png" alt="">&lt;/p>
&lt;hr>
&lt;h3 id="安裝">安裝&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>pip install ansible&lt;/p>
&lt;ul>
&lt;li>pip3 install ansible&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>yum install ansible&lt;/p>
&lt;/li>
&lt;li>
&lt;p>apt-get install ansible&lt;/p>
&lt;/li>
&lt;li>
&lt;p>apk add ansible&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://5b54be02.linzeyan.pages.dev/posts/2020/20200926-ansible/pics/20200926_ansible.pics/20200926_ansible2.png" alt="">&lt;/p>
&lt;hr>
&lt;h3 id="常用模組">常用模組&lt;/h3>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-ping">ping&lt;/a>&lt;/p>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-shell-command">shell / command&lt;/a>&lt;/p>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-file">file&lt;/a>&lt;/p>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-yum">yum&lt;/a>&lt;/p>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-systemd-service">systemd / service&lt;/a>&lt;/p>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-template-copy">template / copy&lt;/a>&lt;/p>
&lt;p>&lt;a href="#%e5%b8%b8%e7%94%a8%e6%a8%a1%e7%b5%84-debug">debug&lt;/a>&lt;/p>
&lt;hr>
&lt;h4 id="常用模組---ping">常用模組 - ping&lt;/h4>
&lt;p>&lt;img src="https://5b54be02.linzeyan.pages.dev/posts/2020/20200926-ansible/pics/20200926_ansible.pics/20200926_ansible3.png" alt="">&lt;/p>
&lt;hr>
&lt;h4 id="常用模組---shell--command">常用模組 - shell / command&lt;/h4>
&lt;p>&lt;img src="https://5b54be02.linzeyan.pages.dev/posts/2020/20200926-ansible/pics/20200926_ansible.pics/20200926_ansible4.png" alt="">&lt;/p></description></item></channel></rss>