摘要:為了證明模板,我們可以使用環(huán)境變量配置讓這個(gè)變成一個(gè)更通用的代理服務(wù)器。我們將定義環(huán)境變量作為一個(gè)站點(diǎn)的代理。當(dāng)這個(gè)容器使用這個(gè)環(huán)境變量啟動(dòng),將使用它來(lái)生成一個(gè)的路徑。
一種 Dockerize 應(yīng)用的簡(jiǎn)單方式
標(biāo)簽(空格分隔): Docker dockerize
作者是 jasonwilder。原文地址是 A Simple Way to Dockerize Applications
Dockerizing 一個(gè)應(yīng)用是轉(zhuǎn)化一個(gè)應(yīng)用運(yùn)行在 Docker 容器中的過程。雖然 dockering 大部分應(yīng)用是簡(jiǎn)單的,但是這里每次都有一些問題圍繞著工作。每次工作的時(shí)候有幾個(gè)問題都需要待解決。
在 dockerization 時(shí)兩個(gè)常見的問題是:
當(dāng)它依賴于配置文件時(shí),使得應(yīng)用使用環(huán)境變量
發(fā)送應(yīng)用日志到 STDOUT/STDERR,當(dāng)它默認(rèn)記錄在 Docker 的文件系統(tǒng)
這篇文章介紹一個(gè)新工具:dockerize ,它簡(jiǎn)化了這兩個(gè)常見的問題。
問題 配置許多應(yīng)用使用配置文件來(lái)控制它們?cè)趺垂ぷ鳎煌倪\(yùn)行環(huán)境有不同的值。比如,對(duì)于一個(gè)開發(fā)環(huán)境的數(shù)據(jù)庫(kù)連接細(xì)節(jié)將與生產(chǎn)環(huán)境的不同。類似的,API keys 和其他的敏感細(xì)節(jié)在不同環(huán)境將不同。
使用 docker 容器有幾個(gè)方法可以處理這些環(huán)境變量的問題:
在鏡像中嵌入所有的環(huán)境變量細(xì)節(jié)和使用一個(gè)控制環(huán)境變量變量來(lái)指出在運(yùn)行時(shí)使用哪個(gè)文件。(比如:APP_CONFIG=/etc/dev.config)
在運(yùn)行時(shí),使用卷來(lái)掛載綁定配置文件的數(shù)據(jù)
使用封裝腳本,使用工具像 sed 那些環(huán)境變量來(lái)修改配置數(shù)據(jù)
嵌入所有的環(huán)境變量細(xì)節(jié)是不理想的,因?yàn)榄h(huán)境變量的改變應(yīng)該不需要重新構(gòu)建一個(gè)鏡像。它也缺少安全,因?yàn)槊舾袛?shù)據(jù) API keys, login 證書等等,作為環(huán)境變量被存儲(chǔ)在鏡像中。私發(fā)一個(gè)開發(fā)環(huán)境可能會(huì)泄露生產(chǎn)環(huán)境細(xì)節(jié)。有些類型的細(xì)節(jié)在任何鏡像中都應(yīng)該避免的。
使用 volumes 保持這些細(xì)節(jié)在鏡像外面,但會(huì)使得部署更復(fù)雜,因?yàn)槟悴粌H部署鏡像。你必須使配置文件的變更和鏡像協(xié)調(diào)。
注入環(huán)境變量到普通文件中也不是重要的。你可能有時(shí)會(huì)制作一個(gè) sed 命令或?qū)懸恍┢胀ǖ哪_本給它,但這是重復(fù)性的工作。這確實(shí)產(chǎn)生了一個(gè)鏡像,但在 Docker 生態(tài)系統(tǒng)中工作的很好。
LoggingDocker 容器日志記錄到 STDOUT 和 STDERR 更容易故障排解,監(jiān)控和融入一個(gè)中央日志系統(tǒng)。日志可以通過 docker logs 命令和 Docker 日志 API 調(diào)用來(lái)直接訪問。這也有許多工具可以自動(dòng)拉取 docker 日志和運(yùn)送它們?nèi)绻罩居涗涍M(jìn) STDOUT 和 STDERR。
不幸地是,默認(rèn),許多應(yīng)用日志記錄一個(gè)或多個(gè)文件到文件系統(tǒng)上。雖然這通常可以圍繞工作,計(jì)算出每個(gè)應(yīng)用的日志配置的細(xì)微差別是乏味的。
使用 Dockerizedockerize 是一個(gè)小型的 Golang 應(yīng)用,可以通過以下簡(jiǎn)化 dockerization 過程:
在啟動(dòng)時(shí)使用模板生成配置文件和容器環(huán)境變量
tail 任意的日志文件到 STDOUT 和 STDERR
啟動(dòng)一個(gè)進(jìn)程,運(yùn)行在容器里面
一個(gè)示例為了證明它怎樣工作,我們將詳細(xì)講述使用 dockerize 來(lái) dockerizing 一個(gè)一般的 nginx 的過程。
FROM ubuntu:14.04 # Install Nginx. RUN echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" > /etc/apt/sources.list.d/nginx-stable-trusty.list RUN echo "deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >> /etc/apt/sources.list.d/nginx-stable-trusty.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C RUN apt-get update RUN apt-get install -y nginx RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD nginx
下一步,我們將安裝 dockerize 和通過它運(yùn)行 nginx:
FROM ubuntu:14.04 # Install Nginx. RUN echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" > /etc/apt/sources.list.d/nginx-stable-trusty.list RUN echo "deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >> /etc/apt/sources.list.d/nginx-stable-trusty.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C RUN apt-get update RUN apt-get install -y wget nginx RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN wget https://github.com/jwilder/dockerize/releases/download/v0.0.1/dockerize-linux-amd64-v0.0.1.tar.gz RUN tar -C /usr/local/bin -xvzf dockerize-linux-amd64-v0.0.1.tar.gz ADD dockerize /usr/local/bin/dockerize EXPOSE 80 CMD dockerize nginx
默認(rèn) Nginx 在 /var/log/nginx 目錄下記錄兩個(gè)不同的文件。如果你交互式的運(yùn)行這個(gè)容器,這將有 nginx 的 access and error 日志流到控制臺(tái),或者是你運(yùn)行 docker logs nginx,因此你可以看到發(fā)生了什么。
我們可以通過傳遞 -stdout
CMD dockerize -stdout /var/log/nginx/access.log -stderr /var/log/nginx/error.log nginx
現(xiàn)在當(dāng)你運(yùn)行容器,nginx 日志通過 docker logs nginx 是可用的。
為了證明模板,我們可以使用環(huán)境變量配置讓這個(gè)變成一個(gè)更通用的代理服務(wù)器。我們將定義環(huán)境變量 PROXY_URL 作為一個(gè)站點(diǎn)的代理 URL。
PROXY_URL="http://jasonwilder.com"
當(dāng)這個(gè)容器使用這個(gè)環(huán)境變量啟動(dòng),dockerize 將使用它來(lái)生成一個(gè) nginx 的location 路徑。
這是模板:
server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.htm; # Make site accessible from http://localhost/ server_name localhost; location / { access_log off; proxy_pass {{ .Env.PROXY_URL }}; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
這時(shí)我們最后的 Dockerfile 將看起來(lái)這樣:
FROM ubuntu:14.04 # Install Nginx. RUN echo "deb http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" > /etc/apt/sources.list.d/nginx-stable-trusty.list RUN echo "deb-src http://ppa.launchpad.net/nginx/stable/ubuntu trusty main" >> /etc/apt/sources.list.d/nginx-stable-trusty.list RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C RUN apt-get update RUN apt-get install -y wget nginx RUN echo "daemon off;" >> /etc/nginx/nginx.conf RUN wget https://github.com/jwilder/dockerize/releases/download/v0.0.1/dockerize-linux-amd64-v0.0.1.tar.gz RUN tar -C /usr/local/bin -xvzf dockerize-linux-amd64-v0.0.1.tar.gz ADD default.tmpl /etc/nginx/sites-available/default.tmpl EXPOSE 80 CMD dockerize -template /etc/nginx/sites-available/default.tmpl:/etc/nginx/sites-available/default -stdout /var/log/nginx/access.log -stderr /var/log/nginx/error.log nginx
-template
使用下面命令運(yùn)行容器:
$ docker run -p 80:80 -e PROXY_URL="http://jasonwilder.com" --name nginx -d nginx
然后你可以通過 http://localhost 訪問,它將代理到這個(gè)站點(diǎn)。
這是一個(gè)簡(jiǎn)化的例子,但是使用嵌入的 split 函數(shù)和 range 聲明使它可以很容易的被擴(kuò)展來(lái)處理多個(gè)代理值和其他選項(xiàng)。這里有一些其他的可用模板函數(shù)示例。
總結(jié)雖然這個(gè)例子有點(diǎn)簡(jiǎn)單,許多應(yīng)用需要一些 shims 來(lái)使得在 Docker 中運(yùn)行的更好。dockerize 是一個(gè)通用的工具來(lái)幫助你處理這個(gè)過程。
你可以在 jwilder/dockerize 找到代碼。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/26356.html
摘要:上一篇容器化開發(fā)環(huán)境已經(jīng)簡(jiǎn)單的介紹了如何容器化開發(fā)環(huán)境。學(xué)會(huì)斷點(diǎn)調(diào)試容器中的應(yīng)用,再也不用為我那烏黑亮麗的頭發(fā)著急啦原文鏈接 上一篇容器化開發(fā)環(huán)境已經(jīng)簡(jiǎn)單的介紹了如何容器化開發(fā)環(huán)境。在開發(fā)過程中,很多時(shí)候都需要通過斷點(diǎn)的方式來(lái)調(diào)試程序或定位BUG,那么如何斷點(diǎn)調(diào)試運(yùn)行在容器中的應(yīng)用呢??? 容器就像一個(gè)虛擬機(jī),就像一個(gè)遠(yuǎn)程的服務(wù)器,要斷點(diǎn)調(diào)試容器中的應(yīng)用,就像要斷點(diǎn)調(diào)試虛擬機(jī)和遠(yuǎn)程的服...
摘要:上一篇容器化開發(fā)環(huán)境數(shù)據(jù)庫(kù)連接和遷移分享了關(guān)于如何給容器中的應(yīng)用創(chuàng)建數(shù)據(jù)庫(kù)連接,接下來(lái)將分享一下如何將數(shù)據(jù)庫(kù)從應(yīng)用容器中分離出來(lái)。 上一篇容器化開發(fā)環(huán)境 - 數(shù)據(jù)庫(kù)連接和遷移分享了關(guān)于如何給容器中的應(yīng)用創(chuàng)建數(shù)據(jù)庫(kù)連接,接下來(lái)將分享一下如何將數(shù)據(jù)庫(kù)從應(yīng)用容器中分離出來(lái)。 為什么要進(jìn)行分離?當(dāng)應(yīng)用和數(shù)據(jù)庫(kù)在同一個(gè)容器中運(yùn)行時(shí),也就意味著,應(yīng)用和數(shù)據(jù)庫(kù)的生命周期捆綁在了一起,應(yīng)用和數(shù)據(jù)庫(kù)的運(yùn)...
摘要:為了不讓別人痛苦,更不想讓自己痛苦,請(qǐng)容器化開發(fā)環(huán)境吧,讓我們享受一鍵部署開發(fā)環(huán)境的痛快吧。接下的例子依賴的環(huán)境和,請(qǐng)移步自行安裝。 有沒有過項(xiàng)目之間各種Java版本開發(fā)環(huán)境切換的場(chǎng)景;有沒有過github上clone回來(lái)的代碼庫(kù),由于各種開發(fā)環(huán)境依賴無(wú)法運(yùn)行的問題;有沒有過進(jìn)入一個(gè)新項(xiàng)目時(shí)各種配開發(fā)環(huán)境到深夜的經(jīng)歷...Come On!為什么會(huì)這樣,一切都是開發(fā)環(huán)境問題。為了不讓別人...
摘要:在容器化開發(fā)環(huán)境中分享了如何容器化本地的開發(fā)環(huán)境。對(duì)于一個(gè)應(yīng)用,數(shù)據(jù)庫(kù)似乎是必不可少的東西。下面會(huì)通過例子來(lái)介紹一下如何一個(gè)容器中的數(shù)據(jù)庫(kù)。例子將會(huì)使用的技術(shù)棧在目錄下新建文件,用于控制數(shù)據(jù)庫(kù)的啟動(dòng)。 在 容器化開發(fā)環(huán)境 中分享了如何容器化本地的開發(fā)環(huán)境。對(duì)于一個(gè)Web應(yīng)用,數(shù)據(jù)庫(kù)似乎是必不可少的東西。下面會(huì)通過例子來(lái)介紹一下如何Setup一個(gè)容器中的數(shù)據(jù)庫(kù)。例子將會(huì)使用的技術(shù)棧: ...
閱讀 2967·2021-11-25 09:43
閱讀 3633·2021-08-31 09:41
閱讀 1237·2019-08-30 15:56
閱讀 2119·2019-08-30 15:55
閱讀 2993·2019-08-30 13:48
閱讀 2816·2019-08-29 15:15
閱讀 984·2019-08-29 15:14
閱讀 2657·2019-08-28 18:26