<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker-Compose on Quietbo</title><link>https://quietbo.com/tags/docker-compose/</link><description>Recent content in Docker-Compose on Quietbo</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Thu, 03 Feb 2022 13:08:42 +0000</lastBuildDate><atom:link href="https://quietbo.com/tags/docker-compose/index.xml" rel="self" type="application/rss+xml"/><item><title>[docker-compose] 環境設置</title><link>https://quietbo.com/2022/02/03/docker-compose-%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE/</link><pubDate>Thu, 03 Feb 2022 13:08:42 +0000</pubDate><guid>https://quietbo.com/2022/02/03/docker-compose-%E7%92%B0%E5%A2%83%E8%A8%AD%E7%BD%AE/</guid><description>&lt;p&gt;主要docker-compose.yml檔案不要直接暴露redis的密碼。&lt;/p&gt;
&lt;h2 id="使用-env設置密碼範例.wp-block-heading"&gt;使用.env設置密碼範例
&lt;/h2&gt;&lt;p&gt;下方為目錄結構:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/1mLAJkZ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;以下為docker-compose.yml檔內容&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask:
 build:
 context: ./flask
 dockerfile: Dockerfile
 image: flask-demo:latest
 environment:
 - REDIS_HOST=redis-server
 - REDIS_PASS=${REDIS_PASS}
 networks:
 - backend
 - frontend

 redis-server:
 image: redis:latest
 command: redis-server --requirepass ${REDIS_PASS}
 networks:
 - backend

 nginx:
 image: nginx:stable-alpine
 ports:
 - 8000:80
 depends_on:
 - flask
 volumes:
 - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
 - ./var/log/nginx:/var/log/nginx
 networks:
 - frontend

networks:
 backend:
 frontend:&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.env檔&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;REDIS_PASS=ABC123&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;.gitignore檔(用於不要上傳到git上)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.env&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看目前設置內容:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose config&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="指定路徑的方式.wp-block-heading"&gt;指定路徑的方式
&lt;/h2&gt;&lt;p&gt;若不使用.env檔，想使用其他路徑下的檔案，改成myenv的檔名，下指令&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;docker-compose --env-file myenv config
docker-compose --env-file myenv up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;則可正常執行。&lt;/p&gt;</description></item><item><title>[docker-compose] 服務的更新</title><link>https://quietbo.com/2022/02/02/docker-compose-%E6%9C%8D%E5%8B%99%E7%9A%84%E6%9B%B4%E6%96%B0/</link><pubDate>Tue, 01 Feb 2022 18:11:04 +0000</pubDate><guid>https://quietbo.com/2022/02/02/docker-compose-%E6%9C%8D%E5%8B%99%E7%9A%84%E6%9B%B4%E6%96%B0/</guid><description>&lt;h2 id="服務更新.wp-block-heading"&gt;服務更新
&lt;/h2&gt;&lt;p&gt;下方為目錄結構:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ tree 
.
├── docker-compose.yml
└── my_flask
 ├── app.py
 └── dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;app.py檔如下&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
 redis.incr('hits')
 return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dockerfile如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker-compose.yml檔內容如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask-demo:
 build: ./my_flask
 image: flask_demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 container_name: redis-demo
 image: redis:latest
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在該目錄下執行:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;會創建2個容器，一個是flask-demo，一個是redis，開起瀏覽器輸入127.0.0.1:8899，會看到下方字串(隨著開啟次數會累加):&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;Hello Container World! I have been seen 1 times and my hostname is b895a0c7b962.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若有更新app.py內的code，重新build一次flask，下方為演示的訊息:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ docker-compose up -d --build
Building flask-demo
[+] Building 5.9s (10/10) FINISHED 
 =&amp;gt; [internal] load build definition from Dockerfile 0.0s
 =&amp;gt; =&amp;gt; transferring dockerfile: 37B 0.0s
 =&amp;gt; [internal] load .dockerignore 0.0s
 =&amp;gt; =&amp;gt; transferring context: 2B 0.0s
 =&amp;gt; [internal] load metadata for docker.io/library/python:3.9.5-slim 5.8s
 =&amp;gt; [auth] library/python:pull token for registry-1.docker.io 0.0s
 =&amp;gt; [internal] load build context 0.0s
 =&amp;gt; =&amp;gt; transferring context: 395B 0.0s
 =&amp;gt; [1/4] FROM docker.io/library/python:3.9.5-slim@sha256:9828573e6a0b02b6d0ff0bae0716b027aa21cf8e59ac18a76724d216bab7ef04 0.0s
 =&amp;gt; CACHED [2/4] RUN pip install flask redis &amp;&amp; groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; mkdir /src &amp;&amp; chown -R 0.0s
 =&amp;gt; [3/4] COPY app.py /src/app.py 0.0s
 =&amp;gt; [4/4] WORKDIR /src 0.0s
 =&amp;gt; exporting to image 0.0s
 =&amp;gt; =&amp;gt; exporting layers 0.0s
 =&amp;gt; =&amp;gt; writing image sha256:cc1bafcde9c602150db215976497c20a13db386bdbfeecf41d84e36ed77286e9 0.0s
 =&amp;gt; =&amp;gt; naming to docker.io/library/flask_demo:latest 0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
redis-demo is up-to-date
Recreating mydocker_flask-demo_1 ... done&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看容器狀況，會發現原本的redis沒有被重構，只有因修改了app.py後重建的flask-demo，畫面如下:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/jTeoXcD.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="刪除服務.wp-block-heading"&gt;刪除服務
&lt;/h2&gt;&lt;p&gt;將原本的docker-compose.yml檔新增一個busbox:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask-demo:
 build: ./my_flask
 image: flask_demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 container_name: redis-demo
 image: redis:latest
 networks:
 - demo-network

 busybox:
 image: busybox:latest
 command: sh -c "while true; do sleep 3600; done"
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在剛才已有兩個容器的狀況下，再下一次指令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Z5Bn8Te.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;在已經建立3個容器的狀況下，將yml檔的busbox註解掉，再重新下一次指令，會出現一段WARNING的訊息:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;WARNING: Found orphan containers (mydocker_busybox_1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/Wf3b6zu.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;使用剛才建議的指令，來刪除不需要的service&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d --remove-orphans&lt;/code&gt;&lt;/pre&gt;&lt;figure class="wp-block-image"&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/QsCEeSA.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;三個更新文件指令:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=" line-numbers"&gt;docker-compose build # 只build dockerfile 的image
docker-compose up -d --remove-orphans # 刪除不需要使用的service
docker-compose restart # 重啟&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[docker-compose] image build與pull(build非dockerfile名稱)</title><link>https://quietbo.com/2022/02/01/docker-compose-image-build%E8%88%87pullbuild%E9%9D%9Edockerfile%E5%90%8D%E7%A8%B1/</link><pubDate>Tue, 01 Feb 2022 13:52:15 +0000</pubDate><guid>https://quietbo.com/2022/02/01/docker-compose-image-build%E8%88%87pullbuild%E9%9D%9Edockerfile%E5%90%8D%E7%A8%B1/</guid><description>&lt;div id="ez-toc-container" class="ez-toc-v2_0_82_2 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction"&gt;
 &lt;div class="ez-toc-title-container"&gt;
 &lt;p class="ez-toc-title" style="cursor:inherit"&gt;
 Table of Contents
 &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;span class=&amp;quot;ez-toc-title-toggle&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle&amp;quot; aria-label=&amp;quot;顯示/隱藏內容目錄&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-js-icon-con&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;eztoc-hide&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;Toggle&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;ez-toc-icon-toggle-span&amp;quot;&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; class=&amp;quot;list-377408&amp;quot; width=&amp;quot;20px&amp;quot; height=&amp;quot;20px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; fill=&amp;quot;none&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z&amp;quot; fill=&amp;quot;currentColor&amp;quot;&amp;gt;&amp;lt;/path&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;svg style=&amp;quot;fill: #999;color:#999&amp;quot; class=&amp;quot;arrow-unsorted-368013&amp;quot; xmlns=&amp;quot;http://www.w3.org/2000/svg&amp;quot; width=&amp;quot;10px&amp;quot; height=&amp;quot;10px&amp;quot; viewBox=&amp;quot;0 0 24 24&amp;quot; version=&amp;quot;1.2&amp;quot; baseProfile=&amp;quot;tiny&amp;quot;&amp;gt;&amp;lt;path d=&amp;quot;M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z&amp;quot;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;nav&gt;
 &lt;ul class='ez-toc-list ez-toc-list-level-1 ' &gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-1" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B" &gt;目錄結構&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-2" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#docker-compose_image_buildpull%E7%9A%84%E6%8C%87%E4%BB%A4%E5%B7%AE%E7%95%B0" &gt;docker-compose image build/pull的指令差異&lt;/a&gt;&lt;ul class='ez-toc-list-level-3' &gt;
 &lt;li class='ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-3" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#docker-compose_build" &gt;docker-compose build&lt;/a&gt;
 &lt;/li&gt;
 &lt;li class='ez-toc-page-1 ez-toc-heading-level-3'&gt;
 &lt;a class="ez-toc-link ez-toc-heading-4" href="https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#docker-compose_pull" &gt;docker-compose pull&lt;/a&gt;
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li class='ez-toc-page-1 ez-toc-heading-level-2'&amp;gt;
 &amp;lt;a class=&amp;quot;ez-toc-link ez-toc-heading-5&amp;quot; href=&amp;quot;https://quietbo.com/2022/02/01/docker-compose-image-build%e8%88%87pullbuild%e9%9d%9edockerfile%e5%90%8d%e7%a8%b1/#%E9%83%A8%E5%88%86%E5%9F%BA%E7%A4%8E%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8&amp;quot; &amp;gt;部分基礎的命令行基本使用&amp;lt;/a&amp;gt;
&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;/ul&gt;&lt;/nav&gt;
&lt;/div&gt;
&lt;h2 id="目錄結構.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="%E7%9B%AE%E9%8C%84%E7%B5%90%E6%A7%8B"&gt;&lt;/span&gt;目錄結構&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;當要build的image名稱不是dockerfile時，是其他名稱，且在不同路徑下，例如：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.
├── docker-compose.yml
└── my_flask
 ├── app.py
 └── dockerfile.data&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 build: 要build的指令：&lt;ul&gt;
 &lt;li&gt;
 context: 檔案路徑
 &lt;/li&gt;
 &lt;li&gt;
 dockerfile: 檔案名稱
 &lt;/li&gt;
 &lt;/ul&gt;
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;app.py檔如下&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)


@app.route('/')
def hello():
 redis.incr('hits')
 return f"Hello Container World! I have been seen {redis.get('hits').decode('utf-8')} times and my hostname is {socket.gethostname()}.\n"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dockerfile如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker_compose.yml檔如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="docker" class="language-docker line-numbers"&gt;version: "3.8"

services:
 flask-demo:
 build:
 context: ./my_flask
 dockerfile: Dockerfile.data
 image: flask_demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 container_name: redis-demo
 image: redis:latest
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功畫面:&lt;br&gt;
&lt;img decoding="async" src="https://i.imgur.com/9wRyaGQ.png" alt="" /&gt;&lt;/p&gt;
&lt;h2 id="docker-compose-image-build-pull的指令差異.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="docker-compose_image_buildpull%E7%9A%84%E6%8C%87%E4%BB%A4%E5%B7%AE%E7%95%B0"&gt;&lt;/span&gt;docker-compose image build/pull的指令差異&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;p&gt;當docker-compose.yml檔內同時有要從dockerfile build的image與從dockerhub pull下來時，這兩種會不同結果&lt;/p&gt;
&lt;h3 id="docker-compose-build.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="docker-compose_build"&gt;&lt;/span&gt;docker-compose build&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;下方是利用docker_compose.yml檔執行的結果，只有build dockerfile，沒有redis image：&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/0WtFnrJ.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="docker-compose-pull.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="docker-compose_pull"&gt;&lt;/span&gt;docker-compose pull&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h3&gt;&lt;p&gt;下方是從dockerhub pull redis，因為dockerfile的關係所以馬上就是done，而pull則需等待下載:&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/oM8hTaq.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;可以看到，下方使用pull，只有一個redis的image&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/eeXIX8v.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="部分基礎的命令行基本使用.wp-block-heading"&gt;&lt;span class="ez-toc-section" id="%E9%83%A8%E5%88%86%E5%9F%BA%E7%A4%8E%E7%9A%84%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8"&gt;&lt;/span&gt;部分基礎的命令行基本使用&lt;span class="ez-toc-section-end"&gt;&lt;/span&gt;
&lt;/h2&gt;&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -d: 背景執行
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若想查看log可使用下方兩個指令&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 -f :持續動態的查看
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose logs
docker-compose logs -f&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看容器目前狀況:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose ps
 Name Command State Ports 
-----------------------------------------------------------------------------------------
my_flask_flask-demo_1 flask run -h 0.0.0.0 Up 0.0.0.0:8899-&amp;gt;5000/tcp
my_flask_redis-server_1 docker-entrypoint.sh redis ... Up 6379/tcp &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意:使用docker-compose ps時，要在yml檔的目錄底下才能使用，否則無法查詢&lt;/p&gt;
&lt;p&gt;將容器停止:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker-compose stop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;將已經停止的容器刪除:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose rm 
Going to remove my_flask_flask-demo_1, my_flask_redis-server_1
Are you sure? [yN] y
Removing my_flask_flask-demo_1 ... done
Removing my_flask_redis-server_1 ... done&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>[Docker-compose] Python Flask+Redis(練習2)</title><link>https://quietbo.com/2022/01/31/docker-compose-python-flaskredis%E7%B7%B4%E7%BF%922/</link><pubDate>Mon, 31 Jan 2022 12:28:54 +0000</pubDate><guid>https://quietbo.com/2022/01/31/docker-compose-python-flaskredis%E7%B7%B4%E7%BF%922/</guid><description>&lt;p&gt;yml的基本語法結構:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;services: # 容器
 servicename: # 服務名字，這個名字也是內部 bridge網絡可以使用的 DNS name
 image: # 鏡像的名字
 command: # 可選，如果設置，則會覆蓋默認鏡像裡的 CMD命令
 environment: # 可選，相當於 docker run裡的 --env
 volumes: # 可選，相當於docker run裡的 -v
 networks: # 可選，相當於 docker run裡的 --network
 ports: # 可選，相當於 docker run裡的 -p
 servicename2:

volumes: # 可選，相當於 docker volume create

networks: # 可選，相當於 docker network create&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 services&lt;br /&gt;對照:&lt;a href="https://docs.docker.com/compose/compose-file/"&gt;Compose and Docker compatibility&lt;/a&gt;
 &lt;/li&gt;
 &lt;li&gt;
 servicename&lt;br /&gt;與前一篇在docker時下指令的&amp;#8211;name flask-demo 一致
 &lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="練習.wp-block-heading"&gt;練習
&lt;/h2&gt;&lt;p&gt;以&lt;a class="link" href="https://quietbo.com/2022/01/22/docker-mac-python-flaskredis%e7%b7%b4%e7%bf%92/" target="_blank" rel="noopener"
 &gt;Python Flask+Redis(練習)&lt;/a&gt;：為例子，改造成一個docker-compose文件&lt;/p&gt;
&lt;p&gt;app.py檔案內容如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
 return 'hello'


if __name__ == "__main__":
 app.run(debug=True, host='0.0.0.0', port=5000)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;dockerfile如下：&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;FROM python:3.9.5-slim

RUN pip install flask redis &amp;&amp; \
 groupadd -r flask &amp;&amp; useradd -r -g flask flask &amp;&amp; \
 mkdir /src &amp;&amp; \
 chown -R flask:flask /src

USER flask

COPY app.py /src/app.py

WORKDIR /src

ENV FLASK_APP=app.py REDIS_HOST=redis

EXPOSE 5000

CMD ["flask", "run", "-h", "0.0.0.0"]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;docker-compose.yml內容如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;version: "3.8"

services:
 flask-demo:
 image: flask-demo:latest
 environment:
 - REDIS_HOST=redis-server
 networks:
 - demo-network
 ports:
 - 8899:5000

 redis-server:
 image: redis:latest
 networks:
 - demo-network

networks:
 demo-network: null&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 資料結構
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;.
├── app.py
├── docker-compose.yml
└── dockerfile&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 建立2個image
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 下載redis image
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image pull redis&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 建立flask-demo的image
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;docker image build -t flask-demo .&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 運行docker-compose
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose up 
Creating network "my_flask_demo-network" with the default driver
Creating my_flask_redis-server_1 ... done
Creating my_flask_flask-demo_1 ... done
Attaching to my_flask_redis-server_1, my_flask_flask-demo_1
redis-server_1 | 1:C 31 Jan 2022 12:26:05.447 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-server_1 | 1:C 31 Jan 2022 12:26:05.447 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis-server_1 | 1:C 31 Jan 2022 12:26:05.447 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-server_1 | 1:M 31 Jan 2022 12:26:05.447 * monotonic clock: POSIX clock_gettime
redis-server_1 | 1:M 31 Jan 2022 12:26:05.448 * Running mode=standalone, port=6379.
redis-server_1 | 1:M 31 Jan 2022 12:26:05.448 # Server initialized
redis-server_1 | 1:M 31 Jan 2022 12:26:05.449 * Ready to accept connections
flask-demo_1 | * Serving Flask app 'app.py' (lazy loading)
flask-demo_1 | * Environment: production
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | Use a production WSGI server instead.
flask-demo_1 | * Debug mode: off
flask-demo_1 | * Running on all addresses.
flask-demo_1 | WARNING: This is a development server. Do not use it in a production deployment.
flask-demo_1 | * Running on http://172.25.0.3:5000/ (Press CTRL+C to quit)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打開瀏覽器輸入&lt;br&gt;
127.0.0.1:8899&lt;figure class="wp-block-image"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img decoding="async" src="https://i.imgur.com/pES3Goo.png" alt="" /&gt; &lt;/figure&gt;&lt;/p&gt;</description></item><item><title>[Docker-compose] 安裝</title><link>https://quietbo.com/2022/01/23/docker-compose-%E5%AE%89%E8%A3%9D/</link><pubDate>Sun, 23 Jan 2022 15:01:47 +0000</pubDate><guid>https://quietbo.com/2022/01/23/docker-compose-%E5%AE%89%E8%A3%9D/</guid><description>&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 Mac在默認安裝了docker desktop以後，docker-compose隨之自動安裝，直接下指令來查詢目前docker-compose的版本:
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 Linux用戶需要自行安裝
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最新版本號可以在這裡查詢:&lt;a class="link" href="https://github.com/docker/compose/releases" target="_blank" rel="noopener"
 &gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 使用python的用戶，可以使用pip去安裝docker-Compose
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code class=""&gt;pip install docker-compose&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>