欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么創(chuàng)建用于安裝應(yīng)用的Dockerfile-創(chuàng)新互聯(lián)

這篇文章主要介紹“怎么創(chuàng)建用于安裝應(yīng)用的Dockerfile”,在日常操作中,相信很多人在怎么創(chuàng)建用于安裝應(yīng)用的Dockerfile問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么創(chuàng)建用于安裝應(yīng)用的Dockerfile”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,包括成都網(wǎng)站設(shè)計、做網(wǎng)站、SEO優(yōu)化、網(wǎng)絡(luò)推廣、整站優(yōu)化營銷策劃推廣、電子商務(wù)、移動互聯(lián)網(wǎng)營銷等。創(chuàng)新互聯(lián)為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制及解決方案,創(chuàng)新互聯(lián)核心團(tuán)隊十年專注互聯(lián)網(wǎng)開發(fā),積累了豐富的網(wǎng)站經(jīng)驗,為廣大企業(yè)客戶提供一站式企業(yè)網(wǎng)站建設(shè)服務(wù),在網(wǎng)站建設(shè)行業(yè)內(nèi)樹立了良好口碑。

概念

什么是“傳統(tǒng)”應(yīng)用?

并沒有一個特定的定義能夠描述所有的傳統(tǒng)應(yīng)用,但它們有一些共同的特性:

  • 使用本地文件系統(tǒng)來持久化存儲,數(shù)據(jù)文件和應(yīng)用的文件混合在一起。

  • 在同一個服務(wù)器上運行很多服務(wù),比如 MySQL 數(shù)據(jù)庫,Redis 服務(wù)器,nginx web 服務(wù)器,一個 Ruby on Rails 應(yīng)用,以及一大堆定時任務(wù)

  • 使用大雜燴式的腳本和手工流程進(jìn)行安裝和升級(文檔也很簡陋)。

  • 配置是存儲在文件里的,通常散落在多個位置,并與應(yīng)用的文件混在一起。

  • 進(jìn)程間的通信是借助本地文件系統(tǒng)進(jìn)行的(比如在磁盤上放一個文件,另一個進(jìn)程來讀取),而不是TCP/IP。

  • 按照單個服務(wù)器上只運行一個應(yīng)用的示例的方式來設(shè)計的。

傳統(tǒng)應(yīng)用的缺點

  • 自動化部署很困難。

  • 如果需要運行應(yīng)用的多個不同的實例,很難讓多個實例在同一個服務(wù)器上“共存”。

  • 如果服務(wù)器停機(jī),由于需要手工流程所以需要較長的時間來恢復(fù)。

  • 部署新版本的過程基本是手動的,或者大部分是手動的,難以回滾。

  • 很有可能測試環(huán)境與生產(chǎn)環(huán)境有較大差異,導(dǎo)致一些生產(chǎn)環(huán)境問題不能在測試期間發(fā)現(xiàn)。

  • 很難通過增加新的實例來進(jìn)行橫向擴(kuò)展。

什么是容器化?

將應(yīng)用“容器化”的過程,就是讓應(yīng)用能夠運行在 Docker 容器或類似技術(shù)中,它們能將操作系統(tǒng)環(huán)境和應(yīng)用封裝在一起(完整的系統(tǒng)鏡像)。由于容器能給應(yīng)用提供近似于完整系統(tǒng)的環(huán)境,這就為在不修改,或者少量修改應(yīng)用的情況下,對應(yīng)用的部署進(jìn)行現(xiàn)代化改造提供了一種思路。這也是應(yīng)用的架構(gòu)持續(xù)能保持“云友好”的基礎(chǔ)。

容器化的好處

  • 部署容易多了:使用新的容器鏡像直接替換整個老版本。

  • 自動化部署也相對容易,甚至可以完全由 CI(Continuous Integration, 持續(xù)集成)來驅(qū)動。

  • 部署失敗時的回滾只要切換到之前的鏡像。

  • 應(yīng)用升級非常容易,因為現(xiàn)在沒有可能出錯的“中間步驟”了(不管它是否影響整個部署過程的成功)。

  • 相同的容器鏡像可以在不同的環(huán)境中充分測試,再直接部署到生產(chǎn)環(huán)境。這可以確保測試態(tài)與生產(chǎn)態(tài)的產(chǎn)品是完全一致的。

  • 系統(tǒng)更容易從宕機(jī)中恢復(fù),因為可以迅速在新硬件資源上啟動裝有這個應(yīng)用的新容器,并附加到同一數(shù)據(jù)源上。

  • 開發(fā)人員能在本地以容器的形式,在更逼真的環(huán)境里測試新功能。

  • 硬件資源的利用更高效,在單一主機(jī)上現(xiàn)在可以運行多個容器應(yīng)用,而以前不能。

  • 容器化是支持零停機(jī)升級、金絲雀部署、高可用和橫向擴(kuò)展的堅實基礎(chǔ)。

容器化之外的選擇

  • 用 Puppet 和 Chef 之類的配置管理工具,能解決一部分的“傳統(tǒng)”問題,比如環(huán)境一致性等。但它們不能支持“原子”部署,以及對應(yīng)用+環(huán)境的完整回滾。而一種無法方便回滾的部署方案,仍然會在部署中途充滿風(fēng)險。

  • 虛擬機(jī)鏡像是能實現(xiàn)部分上述能力的另一種方法,而且在有些情形中,相對于容器,使用完整的虛機(jī)進(jìn)行“原子地”部署會更合適。但使用虛機(jī)的主要問題是,它對硬件的利用率更低效。因為虛機(jī)需要一些獨占的資源(CPU、內(nèi)存和磁盤等),而容器之間可以共享主機(jī)的資源。

如何容器化


一、準(zhǔn)備工作

列出存儲數(shù)據(jù)的文件系統(tǒng)位置

由于部署新版本應(yīng)用是通過替換 Docker 鏡像實現(xiàn)的,所以任何持久化的數(shù)據(jù)都應(yīng)該存儲在容器之外。如果運氣不錯的話,可能遇到應(yīng)用已經(jīng)將所有數(shù)據(jù)都寫入了特定位置,不過多數(shù)傳統(tǒng)應(yīng)用常將它們的數(shù)據(jù)往磁盤上到處亂寫,還有可能與應(yīng)用本身的文件混在一起。Docker 的可加載存儲卷(volume)讓主機(jī)的文件系統(tǒng)能暴露給容器用作特定路徑,這樣數(shù)據(jù)可以在容器之間留存。所以,我們無論是哪種情況,我們都需要列出用于存儲數(shù)據(jù)的位置。

現(xiàn)在你可以考慮考慮讓應(yīng)用里所有輸出的數(shù)據(jù)寫入到文件系統(tǒng)的同一目錄去了,這樣能明顯簡化容器化版本的部署工作。不過,如果修改應(yīng)用難以達(dá)成,這也并不是必須的。

找出會隨部署環(huán)境變化的配置數(shù)據(jù)

為了確保一致性,同一個鏡像要在多套環(huán)境中使用(比如,測試和生產(chǎn)),因此必須要列出所有在不同環(huán)境中會變化的配置值,在啟動容器的時刻再設(shè)置值。容器中的程序到時候可以從環(huán)境變量,或者從配置文件中獲取這些配置的值。

你可以現(xiàn)在就考慮修改應(yīng)用并支持從環(huán)境變量中讀取配置,以便簡化容器化的過程。同樣的,如果不好修改應(yīng)用,這也是不一定是必要的。

找出容易移出去的服務(wù)

在同一機(jī)器上,我們的應(yīng)用可能要依賴一些其他服務(wù),它們?nèi)绻毩⑿员容^高、使用 TCP/IP 通信,就很容易能移出去。舉例來說,如果在同一機(jī)器上運行 MySQL 或 PostgreSQL 數(shù)據(jù)庫,或者類似 Redis 的緩存,那就容易移出去了??赡芡瑫r還需要調(diào)整配置,才能支持指定機(jī)器名(hostname)和端口(port)而不是直接認(rèn)為應(yīng)用運行在 localhost。

二、創(chuàng)建容器鏡像

創(chuàng)建用于安裝應(yīng)用的 Dockerfile

如果已經(jīng)有基于腳本或者 Chef、Puppet 之類的配置管理工具的自動化安裝能力,那這個過程就很簡單了。挑選一個喜歡的系統(tǒng)鏡像、安裝所有依賴,然后運行自動化腳本就行了。

如果目前的安裝過程是手動的,就需要寫一些腳本了。不過,由于鏡像的狀態(tài)是已知的,在這兒編寫腳本要比基于可能存在不一致性的原生系統(tǒng)來的容易。

如果提前找出了要移出去的服務(wù),那么在腳本里就不應(yīng)該安裝它們了。

下面是一個簡單的示例 Dockerfile:

# 基于官方 Ubuntu 16.04 Docker 鏡像
FROM ubuntu:16.04
# 安裝所依賴的 Ubuntu 軟件包
RUN apt-get install -y <REQUIRED UBUNTU PACKAGES> \ 
   && apt-get clean \ 
   && rm -rf /var/lib/apt/lists/*
# 將應(yīng)用的文件復(fù)制到鏡像里
ADD . /app
# 運行安裝腳本
RUN /app/setup.sh
# 切換到應(yīng)用的目錄
WORKDIR /app
# 指定應(yīng)用的啟動腳本
COMMAND /app/start.sh

制作用于配置的啟動腳本

如果應(yīng)用已經(jīng)在使用環(huán)境變量中讀取配置值了,那這一步可以跳過了。如果要從文件里讀取特定環(huán)境相關(guān)的配置值,那啟動腳本就要能從環(huán)境變量里讀取配置值,并將這些值更新到配置文件中去。

這里有一個啟動腳本的例子:

#!/usr/bin/env bash
set -e
# 把環(huán)境變量 $MYAPPCONFIG 的值添加到配置文件中
cat >>/app/config.txt <<END
my_app_config = "${MYAPPCONFIG}"
END
# 用環(huán)境變量 $MYAPPARG 作為應(yīng)用的啟動參數(shù)
/app/bin/my-app --my-arg="${MYAPPARG}"

推送鏡像

鏡像生成之后(使用 docker build),需要推送到 Docker 倉儲(Registry)中才能從部署機(jī)器上拉取到(如果要在生成鏡像的同一臺機(jī)器上運行,就不需要)。

可以使用 Docker Hub 來存儲鏡像(用付費賬號可以創(chuàng)建私有倉庫),大多數(shù)云服務(wù)商也提供容器倉儲(比如 Amazon ECR)。

給鏡像設(shè)置標(biāo)簽(比如 docker tag myimage mycompany/myimage:mytag)之后,就可以推送到倉庫了(比如 docker push mycompany/myimage:mytag)。每次在應(yīng)用新版本生成鏡像時打上新的標(biāo)簽,這樣既能明確當(dāng)前所運行的版本,還能保留舊版本的鏡像以便回滾。

三、如何部署

部署容器是個很大的話題,接下來只關(guān)注直接使用 docker 命令運行容器的部分。在現(xiàn)實世界中,應(yīng)該考慮使用 docker-compose(對于所有容器都運行在同一機(jī)器上的簡單情形)和 Kubernetes (在集群中編排容器)之類的工具。

被移出來的服務(wù)

提前移出來的服務(wù)可以運行在單獨的 Docker 容器中,然后鏈接(link)到我們的應(yīng)用所在容器。另外,還可以用云上托管的服務(wù)。舉個例子,在 AWS 上,可以使用 RDS 作為數(shù)據(jù)庫、用 Elasticache 作為緩存,這樣可以極大地簡化你的工作,因為他們能為你解決后期維護(hù),高可用和備份等需求。

運行 Postgres 數(shù)據(jù)庫容器的例子:

docker run -d \
    --name db \
    -v /usr/local/postgresql/data:/var/lib/postgresql/data \
    postgres

容器化之后的應(yīng)用

要在 Docker 容器中運行一個應(yīng)用,只要用一個命令行:

docker run -d \
    -p 8080:80 \
    --name myapp \
    -v /usr/local/myappdata:/var/lib/myappdata \
    -e MYAPPCONFIG=myvalue \
    -e MYAPPARG=myarg \
    --link db:db \
    myappimage:mytag

其中的 -p 參數(shù)將容器里的 80 端口公開并映射到主機(jī)上的 8080 端口,-v 參數(shù)設(shè)置要在容器里加載的、用于持久化數(shù)據(jù)的存儲卷(格式是 主機(jī)上的路徑:容器中的路徑)-e 參數(shù)設(shè)置一個用于配置的環(huán)境變量值(這些參數(shù)可以指定多次,從而設(shè)置多個卷和環(huán)境變量),而 --link參數(shù)將數(shù)據(jù)庫所在容器以鏈接的方式傳入,這樣應(yīng)用就可以與數(shù)據(jù)庫通信了。容器會根據(jù) Dockerfile 中的 COMMAND 指令指定的腳本來啟動。

對應(yīng)用進(jìn)行升級

如果要升級到應(yīng)用的新版本,只要停掉舊版的容器(比如 docker rm -f myapp),并用新的鏡像標(biāo)簽啟動新的容器就可以了(可能有短暫的停機(jī)時間)?;貪L操作也類似,只要換用舊版的鏡像標(biāo)簽。

更多相關(guān)考量


“init” 進(jìn)程(PID 1)

傳統(tǒng)應(yīng)用通常有多個進(jìn)程,如果沒有 “init” 守護(hù)進(jìn)程(PID 1)的清理,就容易出現(xiàn)孤兒進(jìn)程(orphan processes)發(fā)生累積的情況了。Docker 默認(rèn)并不提供這樣的守護(hù)進(jìn)程,所以推薦自己用 ENTRYPOINT 在 Dockerfile 里添加一個。dumb-init 是眾多初始守護(hù)進(jìn)程中的比較輕量級的一個。phusion/baseimage 是一個包含 init 初始守護(hù)進(jìn)程和其他一些服務(wù)的全功能基準(zhǔn)鏡像。 請查看我們博客上關(guān)于這個主題的文章:Docker 守護(hù)進(jìn)程:PID-1, 孤兒進(jìn)程, 僵尸進(jìn)程和信號。

守護(hù)進(jìn)程和定時任務(wù)

在使用 Docker 容器時,一般只會在每個容器中運行一個進(jìn)程。理想情況下,所有守護(hù)進(jìn)程和定時任務(wù)都應(yīng)該移到其他容器中去,不過對于傳統(tǒng)應(yīng)用來,這也不一定都行得通,主要是經(jīng)常要求對應(yīng)用進(jìn)行重新設(shè)計。要運行多個進(jìn)程也不是一定不行,但確實會需要一些額外的一些配置,因為標(biāo)準(zhǔn)的基準(zhǔn)鏡像里并不包含進(jìn)程管理和調(diào)度能力。小型進(jìn)程管理程序,比如 runit,比 systemd 之類的完整功能的子系統(tǒng)更適合在容器中用。phusion/baseimage 是一個包含 runit 和定時能力和其他一些服務(wù)的全功能基準(zhǔn)鏡像。

存儲卷的權(quán)限

在容器里,所有進(jìn)程通常都以 root 身份運行(不過也不是必須的)。傳統(tǒng)的應(yīng)用對用戶的需求通常復(fù)雜一些,可能要用其他用戶來運行(或者用不同的用戶運行多個進(jìn)程)。這可能給存儲卷的使用帶來一些麻煩,因為 Docker 默認(rèn)讓加載的卷的所有權(quán)指向 root,也就是說非 root 進(jìn)程就不能寫入到這些卷了。有兩個方法可以解決這個問題:

第一種方式是在在創(chuàng)建容器之前,先在主機(jī)上創(chuàng)建好目錄,由有正確的 UID/GID 的用戶持有所有權(quán)。注意,由于容器里和主機(jī)上的用戶不能匹配,所以需要用容器里用戶的 UID/GID,而不僅僅是用戶名要一致。

另一種方式是在容器里,在啟動過程中調(diào)整加載點的所有權(quán)。這就需要在切換到用來啟動應(yīng)用的非 root 用戶之前,還在以 root 身份運行期間處理。

數(shù)據(jù)庫遷移

數(shù)據(jù)庫結(jié)構(gòu)遷移在部署工作中經(jīng)常是一大挑戰(zhàn),因為數(shù)據(jù)庫結(jié)構(gòu)通常與應(yīng)用是嚴(yán)格耦合的,這對遷移的時機(jī)提出了要求,而且這也讓回滾到舊版本變得更難,因為數(shù)據(jù)庫遷移并不一定容易回滾。

完成這種遷移的方法是引入一個過渡步驟。如果需要對數(shù)據(jù)庫結(jié)構(gòu)做出與舊版本不兼容的變更,那就將這個變更分為兩次部署。比如,如果想將數(shù)據(jù)移到另一處,兩個步驟是:

將數(shù)據(jù)同時寫入舊的位置和的位置,并只從新的位置讀取。這意味著,如果把應(yīng)用回滾到前一個版本,在回滾之前新產(chǎn)生的新數(shù)據(jù)是不會丟的。

不再向舊的位置寫入數(shù)據(jù)。 要注意的是,如果希望部署期間沒有停機(jī)時間,就意味著在同一時間會有應(yīng)用的多個版本在運行,相應(yīng)的也會帶來更多挑戰(zhàn)。

數(shù)據(jù)備份

對容器化的應(yīng)用進(jìn)行備份通常比較簡單。數(shù)據(jù)文件可以從主機(jī)上備份,而不需要擔(dān)心數(shù)據(jù)會與應(yīng)用程序的文件混在一起,因為它們已經(jīng)嚴(yán)格地分開了。如果將數(shù)據(jù)庫遷移到了像 RDS 這樣的托管服務(wù),他們就會處理好備份(至少自己的工作會簡化一些)。

遷移已有數(shù)據(jù)

在生產(chǎn)環(huán)境中,要把現(xiàn)有應(yīng)用遷向容器化的版本,就需要對舊的已有數(shù)據(jù)進(jìn)行遷移。這個工作往往因地制宜,不過最簡單的就是停掉舊版本,把數(shù)據(jù)備份直接恢復(fù)給新版本用。這個過程應(yīng)該提前做好,也不可避免地會需要一定的停機(jī)時間。

到此,關(guān)于“怎么創(chuàng)建用于安裝應(yīng)用的Dockerfile”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

名稱欄目:怎么創(chuàng)建用于安裝應(yīng)用的Dockerfile-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://aaarwkj.com/article44/ieche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)用戶體驗、靜態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)、商城網(wǎng)站、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)
人人妻人人澡人人爽人人精品| 亚洲精品一级理论片对面| 午夜影院免费在线观看五分钟| 自拍偷拍亚洲丝袜大秀| 欧美精品一区二区三区色| 亚洲欧洲日产国码一区| 欧美日韩另类综合91| 日韩欧美国产麻豆91在线精品| 中文字幕乱码一区二区欧美| 91一区二区三区在线| 青青草成人免费在线公开视频| 日本色网一区二区三区四区| 国产精品第一区第二区| 久久久久久国产精品亚洲| 海角社区av在线播放| 国产不卡视频观看网站| 日本高清精品视频免费| 国产欧美日韩一区二区三区不卡 | 国产精品成人av在线网站| 免费精品黑人一区二区三区| 人妻一本久道久久综合鬼色| 人妻中文字幕av资源| 有码不卡中文字幕在线视频| 日韩黄色一级片免费看 | 国产精品综合久久久久久| 日本欧美精品一区二区精选| 日韩欧美中文字幕区| 久久人体午夜激情视频| 欧美日韩另类中文字幕| 欧美亚洲五月婷婷激情| 国产黄色免费精品网站| 久视频这里只有精品99| 久久蜜臀av一区三区| 粗长挺进新婚人妻诗岚| 国产精品久久久久久爽| 亚洲av中文久久精品国内| 欧美夫妻成人性生活视频| 午夜日本大胆裸体艺术| 精品久久久久久蜜臀av| 中文字幕在线一区国产精品| 中文字幕在线不卡精品视频|