摘要:不要用百度搜索中文資料,一定要看最新的英文資料。感謝感謝能容忍我無數次搞掛生產環境的老板。群蝸牛大神所建中文交流群,基本配置過程中遇到的問題都能得到解決。
前言
最近花了將近一個月的時間研究了 Docker 在生產環境中的使用,作為新手,期間走了無數的彎路,這里紀錄一下,希望給別人帶來微小的幫助。
前面幾部分,介紹了在搭建集群之前需要做的一些工作,后面 <集群實踐> 一塊結合實際應用,介紹如何架構 docker 集群。
修改存儲目錄生產環境中,鏡像多了之后很容易把硬盤寫滿造成服務器宕機,所以需要掛載一塊較大的硬盤,修改 docker 的默認存儲路徑,下面提供兩種方案。
方案一:軟連接
service docker stop mv /var/lib/docker /mnt/sdc/docker ln -s /mnt/sdc/docker /var/lib/docker
方案二:修改配置
配置 deamon 啟動時 -g 參數,可以直接改變存儲路徑。
Ubuntu 系統需要先修改 /lib/systemd/system/docker.service 文件:
... [Service] ExecStart=/usr/bin/docker -d $DOCKER_OPTS ... EnvironmentFile=-/etc/default/docker ...
其中 ExecStart 就是 deamon 的啟動命令,可以直接在后面加參數,也可以選擇上述 EnvironmentFile 配置 ,然后將啟動參數寫到 /etc/default/docker 文件中:
DOCKER_OPTS="-g /mnt/sdc/docker"
配置好之后,執行下面命令重新加載配置文件:
systemctl daemon-reload systemctl restart docker
參考:How do I change the Docker image installation directory?
Insecure Registry生產環境中部署 docker,需要在搭建一個私有 registry:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
啟動之后,沒法直接進行鏡像的 push/pull,因為默認要求配置 TLS。
為了圖方便,可以暫時把私有的 registry 加入為 insecure-registry 進行測試。
insecure-registry 也是通過添加 deamon 的啟動參數實現的,可在 /etc/default/docker 中配置:
DOCKER_OPTS="--insecure-registry 192.168.1.19:5000"
然后重啟即可。
參考:Deploying a plain HTTP registry
集群方案docker 集群部署目前有兩種方案,一般稱作 一代 swarm 和 二代 swarm。
一代 swarm官方文檔。
一代 swarm 是以容器的方式進行集群管理的,需要在每個節點上運行一個 swarm 容器,便可進行集群管理,簡單部署測試可參考: 在ubuntu上使用swarm搭建docker集群。
需要注意的是,一代 swarm 還需要自己手動運行 k/v 服務容器,參考,運行起來之后可能會遇到報錯:
Error response from daemon: datastore for scope "global" is not initialized
這其實是 deamon 沒有配置 cluster-advertise 和 cluster-store 所致,需要在/etc/default/docker 中配置這兩項,具體可參考 Nodes discovery。
二代 swarm官方文檔。
二代 swarm 直接將 swarm 模式集成在 docker 里面,只需要簡單的配置即可,參考:Create a swarm。
界面方案在之前的文章中,介紹過 ui-for-docker 作為管理的 web 界面,但是過于簡陋,后來有找到一個基于 ui-for-docker 實現的 portainer,支持 swarm mode,使用起來非常方便,也可以根據自己的需求修改。
集群實踐實踐過程中我分別嘗試了一代 swarm 和二代 swarm。
版本 | 配置過程 | 管理 | 擴容 |
---|---|---|---|
一代 | 1. 配置 k/v store。2. 宿主機 docker deamon 監聽某個端口。 3.在每臺宿主機上運行 swarm 容器。 | 在任何一個節點都可以進行集群的管理 | 手動擴容 |
二代 | 1. manager init swarm mode 2. worker join | 只能在 manager 節點進行管理 | 自動擴容 |
目前實現了把 Segmentfault 的 web 服務遷移到容器中,簡單的說就是一個 nginx + php 的環境,以下是具體步驟:
使用二代 swarm。
創建一個 overlay 網絡。
創建 nginx 服務。
創建 php 及 web 代碼服務。
需要明確的幾點:
二代 swarm 在同一個網絡下服務可以通過服務名發現其他服務。
二代 swarm 部署之后,將會監聽每個節點上 publish 的端口,收到的請求會負載均衡到所有的 tasks 中。
nginxnginx 服務只需選擇官方提供的鏡像,建議使用最輕量的 nginx:alpine 版本,自定義配置文件覆蓋原生的即可。
php鏡像直接基于官方發布的php版本版本創建。
注意: ubuntu 宿主機盡量使用 Debian 版本的基礎鏡像,其他的可能會遇到各種坑。
我在開始為了追求鏡像盡量小,使用了基于 alpine 的基礎鏡像,遇到了以下問題:
7.1.0RC5-fpm-alpine 版本,使用 session_set_save_handler 修改 session 的 save header 為 memached 之后沒法寫入 session,換成了 7.0.12-alpine 就好了。
web 代碼對 mount 到容器中的 www-data 用戶所屬的目錄沒有寫入權限,是因為 alpine 系統中默認 www-data 的 uid 是 82, 而宿主機 Ubuntu/Debian 的是 33,在 alpine 中 uid 是 33 的用戶是 xfs,所以 mount 之后容器內部看到的文件所屬用戶是 xfs,而 php-fpm 的執行用戶是 www-data, 所以才無法寫入。
解決辦法就是棄用 alpine,使用基于 Debian 的基礎鏡像,這樣帶來的代價就是鏡像大小翻了 10 倍。
RUN apk update && apk add ca-certificates && apk add tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
還有 php.ini 的時區配置。
DNS 服務docker 容器的 /etc/hosts 文件默認是不允許修改的,所以要自定義域名的解析就需要配置自己的內網 DNS 服務,推薦使用 dnsmsq, 然后將 deamon 的啟動參數修改為 --dns=192.168.x.x 自己的 DNS 服務器,就可以實現自定義域名解析的需求。
上述修改可解決服務器被墻導致谷歌、Facebook 等三方API無法使用的問題,也可以加速服務器訪問外網。
代碼更新作為 web 應用,代碼需要時常上線更新,又需要在集群中部署,如果使用目錄掛載的辦法將帶來額外的工作量,所以選擇把代碼直接打包到 php 容器中,每次上線重新構建鏡像,具體步驟:
代碼 push 到 gitlab,觸發 CI 或者 webhook,構建鏡像。
鏡像 push 到私有的 registry 倉庫中。
二代 swarm 提供 rolling update 的機制,執行相關命令即可。
一些經驗Docker 是進程容器,理論上一個容器只跑一個進程,杜絕當虛擬機使用。
要使用和宿主機一個體系的基礎鏡像。
國內使用建議搜索下 daocloud 鏡像加速,會提升幸福感。
DNS 服務器會默認使用 8.8.8.8,所以正式環境一定要配置 DNS 服務器,否則一些三方登錄的接口將會變得異常緩慢。
Docker 里面包含了很多新的思路,如果總是用老套路去思考,很可能就走入死胡同。
不要用百度搜索中文資料,一定要看最新的英文資料。
為了安全,確保 deamon 只監聽 /var/run/docker.sock。
感謝感謝能容忍我無數次搞掛生產環境的老板。
感謝每次走入死胡同后一句話點醒我的同事。
感謝群里每一位幫助我的朋友。
感謝自己的堅持。
參考官方文檔: 要想真的讓 docker 為你工作,這份文檔應當翻來覆去讀無數遍。
蝸牛問答錄: 蝸牛大神的問答錄,新手入門需要反復拜讀。
QQ 群: 325486037 蝸牛大神所建 docker 中文交流群,基本配置過程中遇到的問題都能得到解決。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26752.html
摘要:使用有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。目錄實踐一了解架構實踐二使用教程實踐三下構建開發環境實踐四環境容器化實踐五生產環境容器化實踐六容器監控實踐七提升幸福感實踐八構建開發環境實踐九生產環境優化參考源碼分析系列文章 使用 docker 有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。 系列文章發布在 SegmentFault 上我的專欄 Tairy,...
摘要:所以借鑒大家慣用的傳統運維思路,并配有一個與以前傳統對接的點,廣發銀行有如下幾個做法第一,操作系統。所以廣發使用了一個配置文件包。版本流程這是廣發銀行持續集總的框架。 數人云上海&深圳兩地容器之Mesos/K8S/Swarm三國演義的嘉賓精彩實錄第一彈來啦。今天是廣發銀行數據中心的運維老兵沈偉康關于傳統運維與容器適配的全方位分享,萬字長文傾情奉上~ 沈偉康,廣發銀行數據中心 運維中年人...
摘要:容器云架構方案。容器云架構方案基于容器技術,運維技術團隊開發了五阿哥網站的容器云平臺。多云對接私有云和公有云進行統一托管,包含網絡區域配置,實例開通及的環境初始化配置等。技術選型及實踐鏡像標準眾所周知,的鏡像是分層的。 前言 五阿哥鋼鐵電商平臺(www.wuage.com)是由鋼鐵行業第一的中國五礦與互聯網第一的阿里巴巴聯手打造,并充分運用雙方股東優勢資源,即:阿里巴巴在大數據、電商運...
摘要:導讀本文介紹了基于技術的企業級應用容器平臺,從云的定義云服務分類,到用友云基礎平臺平臺總體架構架構預覽部署架構平臺核心價值和核心競爭力,闡述基礎平臺成為廣大傳統企業數字化轉型的一把尖刀。 導讀:本文介紹了基于Docker技術的企業級應用容器平臺,從云的定義、云服務分類,到用友云PaaS基礎平臺、平臺總體架構、架構預覽、部署架構、平臺核心價值和核心競爭力,闡述PaaS基礎平臺成為廣大...
摘要:雖然可以使用相同的方式部署應用到云端,使用外部負載均衡器,但動態添加或者減少負載均衡節點依舊是痛點。這對使用外部負載均衡器幫助巨大。 數人云今天帶來的本篇文章將分享Docker在應用程序生命周期每個階段中所扮演的角色,以及遷移到Swarm集群時需要考慮的問題。 利用Docker來開發 Docker讓工作更輕松。如需要一個部署安裝MySQL數據庫,或者安裝Ghost,又或者Redis數據...
閱讀 1755·2021-09-23 11:34
閱讀 2477·2021-09-22 15:45
閱讀 12931·2021-09-22 15:07
閱讀 2232·2021-09-02 15:40
閱讀 4121·2021-07-29 14:48
閱讀 1078·2019-08-30 15:55
閱讀 3248·2019-08-30 15:55
閱讀 2194·2019-08-30 15:55