🐳Docker新鮮乾貨
😵💫好亂好亂,有空再整理
網路教學文章收集或碎念
Docker或綜合(Dockerfile+Compose)
- 組合命令
- 或
-w指定工作目錄 出處
- 或
- 前後端容器API透過Docker網路溝通
- 「它在我的容器是可以執行的啊」
- docker太神辣 裡面的參考文章也可以看
- Docker 實戰系列(一):一步一步帶你 dockerize 你的應用
- 使用 Docker Compose 摻在一起做懶人包
- 利用 pm2 管理 node 服務,結合 Docker Image 達到持續交付
- 恆逸>10個你應該用Docker的理由
- 有多少后端开发环境不用docker的?
- Day5: 實作撰寫第一個 Dockerfile
- Laravel多服務範例
- Nginx與Docker
- Docker版Nginx log為空
- 官方似乎推崇使用Docker日誌,但還是喜歡看舊日誌的人可以照著討論選個喜歡的方法改掉
- 看看這pm2 log issue...
- 喔天啊原來在容器內改掛載的檔案,本機檔案也會變...
- 不用重啟容器檔案就會變了,但像nginx設定檔異動就得進容器內reload
- 從Windows掛設定檔進去,有時尾端會出現^M很討厭,似乎不會影響功能?但介意的話可能要用Dockerfile
RUN處理(compose command是也行,但寫起來要注意一些接續啟動的細節) - 不知道是什麼Docker神奇網路魔法之類的(?),在nginx設定檔指docker container_name,會自動被替換成container_name的地址
- 有的映象檔有裝vim有的沒有-需要就自己寫Dockerfile裝
- 直接RUN chown是無效的,如果有需要得寫一個shell額外執行
- 跟Docker比較無關的:讓PHP Composer問句不阻止pipeline的方法
- 說實話log也不是想不想掛的問題-不vol的話下次開進容器看就不見了好嗎...又不像容器內改設定檔還可以commit(雖然這種造成混淆的麼法行為是不該做的)
- Docker中各個容器掛進去的文件預設都是root擁有
架設Laravel的話,權限這樣是行得通的:nginx的使用者是nginx,php-fpm的使用者是www 專案目錄使用者是www- Docker兩個容器一為php-fpm一為nginx,這邊似乎是用網路通信?所以不會被擁有者 執行者等文件系統的設定影響,stackoverflow則有共用uid一說...
待求證- 權限理解困難症
- log資料夾權限相關:1
- 類似的問題但是是寄信緩存的儲存%20no%20such%20file%20or%20directory%20swiftmailer%20laravel) 例外解說 相似問題
- 最後是靠這篇Swiftmail doesn't send mail but no error, symfony on docker container解決,但有個要點就是還要在storage建一個tmp資料夾才會生效(記得
chmod 777 tmp),不然他似乎還是會去找主機上的暫存資料夾,偏偏容器根目錄有這個夾但不能用- 神奇Linux小知識:tmp資料夾的drwxrwxrwt
- 最後是靠這篇Swiftmail doesn't send mail but no error, symfony on docker container解決,但有個要點就是還要在storage建一個tmp資料夾才會生效(記得
- Docker兩個容器一為php-fpm一為nginx,這邊似乎是用網路通信?所以不會被擁有者 執行者等文件系統的設定影響,stackoverflow則有共用uid一說...
- 不錯的Laraval範例)
- "高山"映像檔跟一般版的差別
- DB改用Docker架設後原本Dockerfile的
RUN composer install會遇到"php_network_getaddresses getaddrinfo failed name or service not known"這個錯誤,但進容器裡執行沒有問題@@
前端篇
- 前端docker範例
- 如果要用pm2得改用pm2-runtime
- 為啥要dockerize
- dockerfile->build image這段在
docker-compose.yml可以直接帶入
Dockerfile
- Dockerfile詳解
- 單獨複製package.json為了效能 相似討論1 相似討論2 相似討論3
- php擴充元件安裝範例
- 對照名稱:超棒的gist!!
- 多重Dockerfile
- build壞又明顯知道問題的image乾脆容器跟映像都砍掉重build好了...在那邊RUN RUN RUN曲線救國沒效率
- WORKDIR
- 容我說說這東西是不是每次RUN之前都要重指一次...難怪更多人喜歡用
&&連接一堆指令
- 容我說說這東西是不是每次RUN之前都要重指一次...難怪更多人喜歡用
- build出來的容器裡面亂碼@@
- 更詳細的教學
- 說實話好像不影響頁面呈現,但是看著噁心,而且如果有需要在容器內編輯的場合便很嚴重了
- 疑似是要改
root/.vimrc的內容,但我目前進容器內看到root資料夾是空的待考
Docker Compose
# 在有docker-compose.yml的目錄下
docker compose up
- 新掛檔案進去要down再up才會生效(不用重build image,兩回事);但如果是目錄就沒有這個現象
@@ - depends on
- 談 docker compose 的 depends_on 設定怎麼使用
- 有效迴避AP起服務時遇到DB也在起服務報錯的問題!!
- php-fpm看到zz docker config是啥
- compose: build context解釋
- 重啟政策
- 雖然說不建議在生產環境用pm2,不過pm2重啟機制很難關,加上Docker有時只能說雪上加霜(我只是想看個error log
-.-) - 看不到log但根據經驗推測又是pm2版本不對在搞
- 雖然說不建議在生產環境用pm2,不過pm2重啟機制很難關,加上Docker有時只能說雪上加霜(我只是想看個error log
- 掛MySQL設定檔會用到
Windows桌面版安裝踩坑錄
如果你是Windows家用版,Docker桌面版無法啟動,不用激動學網路上殺去Docker家-SwitchDaemon
這會導致切換成Windows Container,問題是家用版不可以用,所以打開軟體後會看有錯誤訊息+提示引擎中止,然後你想要再下一次-SwitchDaemon切回來WSL2時它跟你說500 error了,這時候重新安裝比較快
不用想說重新安裝要看到使用WSL2的選項——因為根本不會有
那為什麼一開始啟動會一直轉圈圈無法進入呢?要做的只有關閉Docker桌面版,對它圖示按右鍵用系統管理員執行,其實只是權限不足而已= =|||
另外就是Compose只能用Cli啟動,啟動後GUI可以看到
附錄:新鮮乾貨 待補
僅供參考,因為主要還是依專案實際情況改變,直接貼上可能是不太能用的
另外應該先設計好你的docker-compose.yml結構,才知道哪些須要Dockerfile,畫圖是蠻好的方法
前端Dockerfile跟docker-compose.yml範例(沒用pm2或Nginx)
docker-compose.yml
version: '3'
services:
node:
build:
context: .
dockerfile: ./vue/Dockerfile
container_name: node
restart: always
tty: true
ports:
- 80:80
volumes: # 橋接原則:常改的、要保存的、要讀的
- .:/你前端專案在容器居住的家
- ./node_modules:node_modules家
- log的橋接(如果有的話,尤其像是用pm2之類的)
- 設定檔的橋接(如果有的話)
networks:
- 網路組A
networks:
網路組A:
name: 網路組A
driver: 非bridge要寫
volumes:
這邊可以定義全域卷:
Dockerfile
FROM node:14
COPY . /你前端專案在容器居住的家
RUN npm install 如果有什麼額外的東西要裝@x.y.z -g
WORKDIR /你前端專案在容器居住的家
RUN npm install
# 如果需要build的話,我先假裝你package.json有這個命令
RUN npm run build
EXPOSE 80
CMD ["啟動命令", "一個element代表中間有空格"]
- 可能會遇到npm install失敗的問題 詳盡的討論
- 其他語言也有類似問題,總之就是compose的卷蓋上去了
- MySQL官方Dockerfile解釋為啥他不會被compose的使用者寫的卷蓋掉 引用這篇的原文
- 理論上不存在的目錄會新建一個=空的=蓋掉主機上的,但他Dockerfile的掛起產生了神奇的作用
- 常見寫法
Nginx+php-fpm
掛log有學問 掛錯會變成生成目錄
=_=- 如果在宿主機有先定義好,倒是不會?
掛進去的設定檔如果本機沒寫,會導致掛空得進去,導致服務啟動失敗
- 反向思考如果掛目錄,它會不會先把東西吐回來,到時候再改...?
待考
- 反向思考如果掛目錄,它會不會先把東西吐回來,到時候再改...?
如果是用Docker網路進行前後端通信,如果進入route前有domain判斷要留意其實host會改變(可以
dd($_SERVER['HTTP_HOST']))會變成Docker網路的(如:容器名稱:port)- 這牽涉到網路架構設計的問題,一般情境前端跟API在同台主機用Docker網路通信(這樣API無法透過瀏覽器訪問,因為傳入的domain變成網址列的..),如果有對外API變成要給前端吃了發出去,更正確的做法應該是給API買個domain綁好後,前端是從domain進去,這樣瀏覽器也能直接從API domain看到回應
- 補充:HTTPS是防止中間人攻擊的好方法;但今天這情境比較像Java跟JSP的關係很安全吧囧
- 這牽涉到網路架構設計的問題,一般情境前端跟API在同台主機用Docker網路通信(這樣API無法透過瀏覽器訪問,因為傳入的domain變成網址列的..),如果有對外API變成要給前端吃了發出去,更正確的做法應該是給API買個domain綁好後,前端是從domain進去,這樣瀏覽器也能直接從API domain看到回應
-
- 這篇比較簡單,就是掛linux crontab設定檔~
- 這個影片留言區有人提到在宿主機
crontab -e寫:
* * * * * docker exec -it dash_laravel.test_1 php artisan schedule:run >> /dev/null 2>&1
我也有想過
- 這邊討論也有提到 延伸問題:「這很不Docker」
- 經典Nginx掛憑證+轉HTTPS
常用命令
docker compose up -d # 背景開啟
docker ps # 看運行中的容器
docker exec -it 容器名稱或ID /bin/sh # 進入容器
docker compose down # 關閉
docker image ls # 看映像列表
docker rmi -f image名稱或ID # 刪除映像
docker compose build --no-cache # 無緩存重build
docker compose build 容器名稱 --no-cache # 指build單個容器
docker kill 容器名稱 # 刪除特定容器
上版策略murmur
- 用掛的->因為依賴(.m2或node_moudle這種)不是在宿主機上裝的,宿主機上沒有對應資料夾,所以會變成把容器內的資料夾蓋成又空又新的
- ➡️是可以透過改目錄結構跟掛法改良,這樣就可能實現git pull容器內也實時改變的效果
- 用cache build image:目前測試程式跟設定檔方面可以生效,不過如果一直有問題可能還是得採用
--no-cache- 發現如果後面他發現指令有變,就不會用cache,所以大家才建議安裝依賴跟複製專案分開寫,以及注重順序
- 其實這樣有個好處是至少容器內不會git衝突
-.-
- 直接進容器裡面pull?!這樣不能寫成宿主機的shell~<-是可以在容器內寫shell執行,但有點複雜化?
目前想到的步驟
sudo docker compose build 異動的容器名稱
# sudo docker compose up -d # 重啟->欸不是啊這樣大家一起下去欸
sudo docker restart 異動的容器名稱
# 可以整理成單行
sudo docker compose build 異動的容器名稱 && sudo docker restart 異動的容器名稱
延伸閱讀:滾動更新<-顯然現在服務會中止不是嘛-.-
Laravel COPY時遇到的坑
我有個php-fpm容器,內容物沒清空,宿主機專案資料夾搞壞,決定rm -r再clone,重新跑Dockerfile時會再複製一份進去,但服務出現各種異常(類似這樣),應該是快取檔案對不上的關係?所以清除即可
好難~_~