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