08-Docker創(chuàng)建鏡像

一、Dockerfile創(chuàng)建自定義Docker鏡像

1匕争、Dockerfile簡(jiǎn)介

1.1 Dockerfile概念

????Docker 鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序缸棵、庫(kù)码撰、資源、配置等文件外饱亮,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷讼庇、環(huán)境變量、用戶等)近尚。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變场勤。

????鏡像的定制實(shí)際上就是定制每一層所添加的配置戈锻、文件。如果我們可以把每一層修改和媳、安裝格遭、構(gòu)建、操作的命令都寫入一個(gè)腳本留瞳,用這個(gè)腳本來(lái)構(gòu)建拒迅、定制鏡像,那么之前提及的無(wú)法重復(fù)的問(wèn)題她倘、鏡像構(gòu)建透明性的問(wèn)題璧微、體積的問(wèn)題就都會(huì)解決。這個(gè)腳本就是 Dockerfile硬梁。

????Dockerfile 是一個(gè)文本文件前硫,其內(nèi)包含了一條條的指令(Instruction),每一條指令構(gòu)建一層荧止,因此每一條指令的內(nèi)容屹电,就是描述該層應(yīng)當(dāng)如何構(gòu)建阶剑。有了 Dockerfile,當(dāng)我們需要定制自己額外的需求時(shí)危号,只需在 Dockerfile 上添加或者修改指令牧愁,重新生成 image 即可,省去了敲命令的麻煩外莲。

1.2 關(guān)系圖

????通過(guò)上圖可以看出使用 Dockerfile 定義鏡像猪半,運(yùn)行鏡像啟動(dòng)容器。

1.3 Dockerfile作用

????1苍狰、對(duì)于開(kāi)發(fā)人員:可以為開(kāi)發(fā)團(tuán)隊(duì)提供一個(gè)完全一致的開(kāi)發(fā)環(huán)境办龄;

????2、對(duì)于測(cè)試人員:可以直接拿開(kāi)發(fā)時(shí)所構(gòu)建的鏡像或者通過(guò)Dockerfile文件構(gòu)建一個(gè)新的鏡像開(kāi)始工作了淋昭;

????3俐填、對(duì)于運(yùn)維人員:在部署時(shí),可以實(shí)現(xiàn)應(yīng)用的無(wú)縫移植翔忽。

1.4 Dockerfile組成

????DockerFile分為四部分組成:基礎(chǔ)鏡像信息英融、維護(hù)者信息、鏡像操作指令和容器啟動(dòng)時(shí)執(zhí)行指令歇式。一開(kāi)始必須要指明所基于的鏡像名稱驶悟,接下來(lái)一般會(huì)說(shuō)明維護(hù)者信息;后面則是鏡像操作指令材失,例如 RUN 指令痕鳍。每執(zhí)行一條RUN 指令,鏡像添加新的一層龙巨,并提交笼呆;最后是 CMD 指令,來(lái)指明運(yùn)行容器時(shí)的操作命令旨别。

1.5 Dockerfile常用命令

1.6 構(gòu)建鏡像

????docker build 命令會(huì)根據(jù)Dockerfile 文件及上下文構(gòu)建新 Docker 鏡像诗赌。構(gòu)建上下文是指 Dockerfile 所在的本地路徑或一個(gè)URL(Git倉(cāng)庫(kù)地址)。構(gòu)建上下文環(huán)境會(huì)被遞歸處理秸弛,所以構(gòu)建所指定的路徑還包括了子目錄铭若,而URL還包括了其中指定的子模塊。

????將當(dāng)前目錄做為構(gòu)建上下文時(shí)递览,可以像下面這樣使用docker build命令構(gòu)建鏡像:

????說(shuō)明:構(gòu)建會(huì)在 Docker 后臺(tái)守護(hù)進(jìn)程(daemon)中執(zhí)行叼屠,而不是CLI中。構(gòu)建前绞铃,構(gòu)建進(jìn)程會(huì)將全部?jī)?nèi)容(遞歸)發(fā)送到守護(hù)進(jìn)程环鲤。大多情況下,應(yīng)該將一個(gè)空目錄作為構(gòu)建上下文環(huán)境憎兽,并將 Dockerfile 文件放在該目錄下冷离。

????在構(gòu)建上下文中使用的 Dockerfile 文件吵冒,是一個(gè)構(gòu)建指令文件。為了提高構(gòu)建性能西剥,可以通過(guò).dockerignore文件排除上下文目錄下不需要的文件和目錄痹栖。

????在 Docker 構(gòu)建鏡像的第一步绣硝,docker CLI 會(huì)先在上下文目錄中尋找.dockerignore文件路幸,根據(jù).dockerignore?文件排除上下文目錄中的部分文件和目錄爽待,然后把剩下的文件和目錄傳遞給 Docker 服務(wù)鸯旁。

????Dockerfile一般位于構(gòu)建上下文的根目錄下,也可以通過(guò)-f指定該文件的位置:

????構(gòu)建時(shí)松邪,還可以通過(guò)-t參數(shù)指定構(gòu)建成鏡像的倉(cāng)庫(kù)携狭、標(biāo)簽缸兔。

????例如:倉(cāng)庫(kù):標(biāo)簽?

1.7 鏡像標(biāo)簽

????如果存在多個(gè)倉(cāng)庫(kù)下旧找,或使用多個(gè)鏡像標(biāo)簽溺健,就可以使用多個(gè)-t參數(shù):

????在 Docker 守護(hù)進(jìn)程執(zhí)行 Dockerfile 中的指令前,首先會(huì)對(duì)Dockerfile 進(jìn)行語(yǔ)法檢查钮蛛,有語(yǔ)法錯(cuò)誤時(shí)會(huì)返回:

1.8 緩存

????Docker 守護(hù)進(jìn)程會(huì)一條一條的執(zhí)行Dockerfile 中的指令鞭缭,而且會(huì)在每一步提交并生成一個(gè)新鏡像,最后會(huì)輸出最終鏡像的ID魏颓。生成完成后岭辣,Docker 守護(hù)進(jìn)程會(huì)自動(dòng)清理你發(fā)送的上下文。

????Dockerfile文件中的每條指令會(huì)被獨(dú)立執(zhí)行甸饱,并會(huì)創(chuàng)建一個(gè)新鏡像沦童,RUN cd /tmp等命令不會(huì)對(duì)下條指令產(chǎn)生影響。

????Docker 會(huì)重用已生成的中間鏡像叹话,以加速docker build的構(gòu)建速度偷遗。以下是一個(gè)使用了緩存鏡像的執(zhí)行過(guò)程:

????構(gòu)建緩存僅會(huì)使用本地父生成鏈上的鏡像,如果不想使用本地緩存的鏡像渣刷,也可以通過(guò)--cache-from指定緩存。指定后將不再使用本地生成的鏡像鏈矗烛,而是從鏡像倉(cāng)庫(kù)中下載辅柴。

1.9 尋找緩存的邏輯

????Docker尋找緩存的邏輯其實(shí)就是樹(shù)型結(jié)構(gòu)根據(jù) Dockerfile 指令遍歷子節(jié)點(diǎn)的過(guò)程。下圖可以說(shuō)明這個(gè)邏輯瞭吃。

????大部分指令可以根據(jù)上述邏輯去尋找緩存碌嘀,除了 ADD 和 COPY 。這兩個(gè)指令會(huì)復(fù)制文件內(nèi)容到鏡像內(nèi)歪架,除了指令相同以外股冗,Docker 還會(huì)檢查每個(gè)文件內(nèi)容校驗(yàn)(不包括最后修改時(shí)間和最后訪問(wèn)時(shí)間),如果校驗(yàn)不一致和蚪,則不會(huì)使用緩存止状。

????除了這兩個(gè)命令烹棉,Docker并不會(huì)去檢查容器內(nèi)的文件內(nèi)容,比如?RUN apt-get -y update怯疤,每次執(zhí)行時(shí)文件可能都不一樣浆洗,但是Docker認(rèn)為命令一致,會(huì)繼續(xù)使用緩存集峦。這樣一來(lái)伏社,以后構(gòu)建時(shí)都不會(huì)再重新運(yùn)行apt-get -y update。

????如果Docker沒(méi)有找到當(dāng)前指令的緩存塔淤,則會(huì)構(gòu)建一個(gè)新的鏡像摘昌,并且之后的所有指令都不會(huì)再去尋找緩存。

2高蜂、 Dockerfile官方實(shí)踐

2.1 Dockerfile官方資料

Docker與PostgreSQL

調(diào)研發(fā)現(xiàn)聪黎,目前Docker 官方Hub已經(jīng)提供PostgreSQL各個(gè)版本的鏡像。

網(wǎng)址:https://hub.docker.com/_/postgres/

獲取方式:docker pull postgres

支持的PostgreSQL版本有:

10.4,?10,?latest?(10/Dockerfile)

10.4-alpine,?10-alpine,?alpine?(10/alpine/Dockerfile)

9.6.9,?9.6,?9?(9.6/Dockerfile)

9.6.9-alpine,?9.6-alpine,?9-alpine?(9.6/alpine/Dockerfile)

9.5.13,?9.5?(9.5/Dockerfile)

9.5.13-alpine,?9.5-alpine?(9.5/alpine/Dockerfile)

9.4.18,?9.4?(9.4/Dockerfile)

9.4.18-alpine,?9.4-alpine?(9.4/alpine/Dockerfile)

9.3.23,?9.3?(9.3/Dockerfile)

9.3.23-alpine,?9.3-alpine?(9.3/alpine/Dockerfile)

問(wèn)題提交地址:

https://github.com/docker-library/postgres/issues

目前由PostgreSQL

Docker社區(qū)維護(hù)妨马,地址https://github.com/docker-library/postgres

支持的架構(gòu)有:

IBM z Systems (s390x):https://hub.docker.com/u/s390x/

ARMv7 32-bit (arm32v7):https://hub.docker.com/u/arm32v7/

Windows x86-64 (windows-amd64):https://hub.docker.com/u/winamd64/

Linux x86-64 (amd64):https://hub.docker.com/u/amd64/

Other architectures built by official images:(butnotofficially supported by Docker, Inc.)

IBM POWER8 (ppc64le):https://hub.docker.com/u/ppc64le/

x86/i686 (i386):https://hub.docker.com/u/i386/

ARMv8 64-bit (arm64v8):https://hub.docker.com/u/arm64v8/

ARMv6 32-bit (arm32v6):https://hub.docker.com/u/arm32v6/(RaspberryPi 1, Raspberry Pi Zero)

ARMv5 32-bit (arm32v5):https://hub.docker.com/u/arm32v5/

2.2對(duì)官網(wǎng)10.4,?10,?latest?(10/Dockerfile)的理解

?????對(duì)官網(wǎng)10.4,?10,?latest?(10/Dockerfile)的理解這部分內(nèi)容如下所示:

FROM debian:stretch-slim

# set -ex 其中 e 代表 若指令傳回值不等于0(指令成功返回0挺举,不成功返回值不是0),立刻退出shell? ; x 代表 執(zhí)行指令后烘跺,會(huì)先顯示該指令及所下的參數(shù)

RUN set -ex; \

# command -v gpg 是用來(lái)判斷是否存在gpg這個(gè)命令(這個(gè)命令是用來(lái)對(duì)密鑰進(jìn)行操作的湘纵,生成密鑰、列出密鑰等)滤淳,

# 梧喷! 代表取反,也就是說(shuō)脖咐,這個(gè)判斷條件在當(dāng)? gpg這個(gè)命令不存在的時(shí)候成立铺敌,會(huì)執(zhí)行then后面的內(nèi)容

if ! command -v gpg > /dev/null; then \

# apt-get 是 Ubuntu中安裝包的命令,等同于? centos中的? yum屁擅, 這里? 就相當(dāng)于先更新所有本機(jī)器上的包

apt-get update; \

# no-install-recommends參數(shù)用來(lái)避免安裝非必須的文件偿凭,從而最小化安裝所需要的包,下面安裝的包是和密鑰gpg命令相關(guān)的包

apt-get install -y --no-install-recommends \

gnupg \

dirmngr \

; \

# 刪除下載的安裝包

rm -rf /var/lib/apt/lists/*; \

fi

# explicitly set user/group IDs

# 創(chuàng)建postgres用戶組派歌,組id設(shè)置為999弯囊,在用戶組postgres中創(chuàng)建用戶postgres,用戶id設(shè)置為999

RUN groupadd -r postgres --gid=999 && useradd -r -g postgres --uid=999 postgres

# grab gosu for easy step-down from root

# 設(shè)置全局變量 相當(dāng)于shell中的? GOSU_VERSION=1.10

ENV GOSU_VERSION 1.10

# 等同于第四行胶果, x 代表 執(zhí)行指令后匾嘱,會(huì)先顯示該指令及所下的參數(shù)

RUN set -x \

# 安裝 ca-certificates 證書相關(guān)的包 和? wget 從url下載文件的包,安裝完刪除安裝包

&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget && rm -rf /var/lib/apt/lists/* \

# 從github 下載gosu 早抠, https://github.com/tianon/gosu/ 這個(gè)是gosu這個(gè)項(xiàng)目的網(wǎng)站霎烙,其功能是為了替代su和sudo,因?yàn)閟u和sudo在執(zhí)行的時(shí)候需要TTY和信號(hào)轉(zhuǎn)發(fā)的動(dòng)作。

# 具體詳情可以查看 https://github.com/tianon/gosu/ 上的功能介紹

# wget -O 保存下載文件的路徑? 下載地址

&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture)" \

&& wget -O /usr/local/bin/gosu.asc "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$(dpkg --print-architecture).asc" \

# 設(shè)置環(huán)境變量 GUNPGHOME , 這個(gè)是臨時(shí)設(shè)置的悬垃,如果系統(tǒng)重啟后游昼,這個(gè)環(huán)境變量就會(huì)失效 (如果想要設(shè)置永久的環(huán)境變量需要寫入到文件里)

&& export GNUPGHOME="$(mktemp -d)" \

# 這是配置了公鑰,原文說(shuō)是為了驗(yàn)證下載

&& gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4 \

# 驗(yàn)證下載的版本

&& gpg --batch --verify /usr/local/bin/gosu.asc /usr/local/bin/gosu \

# 刪除臨時(shí)目錄和密鑰文件

&& rm -rf "$GNUPGHOME" /usr/local/bin/gosu.asc \

# 給命令? /usr/local/bin/gosu 設(shè)置可執(zhí)行權(quán)限

&& chmod +x /usr/local/bin/gosu \

# 切換到nobody用戶

&& gosu nobody true \

# 刪除剛剛安裝的包 ca-certificates 和 wget? 盗忱,? purge 是卸載并清除軟件包的配置酱床,auto-remove是卸載所有自動(dòng)安裝且不再使用的軟件包

&& apt-get purge -y --auto-remove ca-certificates wget

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default

# set命令? e 代表指令返回值不為0則退出shell;u當(dāng)執(zhí)行時(shí)使用到未定義過(guò)的變量趟佃,顯示錯(cuò)誤信息扇谣;x執(zhí)行指令后,會(huì)先顯示該指令及所下的參數(shù)

RUN set -eux; \

# 判斷是否有? /etc/dpkg/dpkg.cfg.d/docker 這個(gè)文件闲昭,如果有則執(zhí)行后面的語(yǔ)句

if [ -f /etc/dpkg/dpkg.cfg.d/docker ]; then \

# if this file exists, we're likely in "debian:xxx-slim", and locales are thus being excluded so we need to remove that exclusion (since we need locales)

# grep是抓取命令罐寨, -q代表不輸出結(jié)果,這個(gè)意思其實(shí)是判斷? /etc/dpkg/dpkg.cfg.d/docker 文件中是否存在? '/usr/share/locale' 這個(gè)內(nèi)容序矩,

# 可以用? echo $? 來(lái)輸出返回值鸯绿,如果存在則返回值是0,如果不存在返回是1簸淀,又由于最開(kāi)頭設(shè)置了? set -eux瓶蝴,所以如果不存在,則后續(xù)指令直接退出

grep -q '/usr/share/locale' /etc/dpkg/dpkg.cfg.d/docker; \

# 刪除 /etc/dpkg/dpkg.cfg.d/docker 文件中存在? /usr/share/locale 這個(gè)內(nèi)容的一行

sed -ri '/\/usr\/share\/locale/d' /etc/dpkg/dpkg.cfg.d/docker; \

# 租幕!代表取反舷手,這個(gè)就是驗(yàn)證是否刪除完成

! grep -q '/usr/share/locale' /etc/dpkg/dpkg.cfg.d/docker; \

fi; \

# 更新,升級(jí)劲绪。安裝locales包男窟,刪除下載的安裝包

apt-get update; apt-get install -y locales; rm -rf /var/lib/apt/lists/*; \

# -i 設(shè)置語(yǔ)言環(huán)境, -c 代表即使報(bào)錯(cuò)贾富,仍強(qiáng)制執(zhí)行歉眷, -f 設(shè)置字符符號(hào)的語(yǔ)言?

localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

# 設(shè)置環(huán)境變量,設(shè)置語(yǔ)言為英語(yǔ)颤枪,字符集為utf-8

ENV LANG en_US.utf8

# 創(chuàng)建目錄 /docker-entrypoint-initdb.d

RUN mkdir /docker-entrypoint-initdb.d

# set命令? e 代表指令返回值不為0則退出shell汗捡;x執(zhí)行指令后,會(huì)先顯示該指令及所下的參數(shù)

RUN set -ex; \

# pub? 4096R/ACCC4CF8 2011-10-13 [expires: 2019-07-02]

#? ? ? Key fingerprint = B97B 0AFC AA1A 47F0 44F2? 44A0 7FCC 7D46 ACCC 4CF8

# uid? ? ? ? ? ? ? ? ? PostgreSQL Debian Repository

key='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8'; \

export GNUPGHOME="$(mktemp -d)"; \

gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \

gpg --export "$key" > /etc/apt/trusted.gpg.d/postgres.gpg; \

rm -rf "$GNUPGHOME"; \

apt-key list

ENV PG_MAJOR 10

ENV PG_VERSION 10.4-1.pgdg90+1

RUN set -ex; \

\

# 獲取系統(tǒng)內(nèi)核位數(shù)

dpkgArch="$(dpkg --print-architecture)"; \

case "$dpkgArch" in \

amd64|i386|ppc64el) \

# arches officialy built by upstream

# 如果輸出結(jié)果在? amd64, i386, ppc64el的話畏纲,執(zhí)行后面的命令

echo "deb http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main $PG_MAJOR" > /etc/apt/sources.list.d/pgdg.list; \

apt-get update; \

;; \

*) \

# we're on an architecture upstream doesn't officially build for

# let's build binaries from their published source packages

# 如果版本不在 amd64, i386, ppc64el 中的話扇住,執(zhí)行下面命令

echo "deb-src http://apt.postgresql.org/pub/repos/apt/ stretch-pgdg main $PG_MAJOR" > /etc/apt/sources.list.d/pgdg.list; \

\

tempDir="$(mktemp -d)"; \

cd "$tempDir"; \

\

savedAptMark="$(apt-mark showmanual)"; \

\

# build .deb files from upstream's source packages (which are verified by apt-get)

apt-get update; \

apt-get build-dep -y \

postgresql-common pgdg-keyring \

"postgresql-$PG_MAJOR=$PG_VERSION" \

; \

DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)" \

apt-get source --compile \

postgresql-common pgdg-keyring \

"postgresql-$PG_MAJOR=$PG_VERSION" \

; \

# we don't remove APT lists here because they get re-downloaded and removed later

\

# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies

# (which is done after we install the built packages so we don't have to redownload any overlapping dependencies)

apt-mark showmanual | xargs apt-mark auto > /dev/null; \

apt-mark manual $savedAptMark; \

\

# create a temporary local APT repo to install from (so that dependency resolution can be handled by APT, as it should be)

ls -lAFh; \

dpkg-scanpackages . > Packages; \

grep '^Package: ' Packages; \

echo "deb [ trusted=yes ] file://$tempDir ./" > /etc/apt/sources.list.d/temp.list; \

# work around the following APT issue by using "Acquire::GzipIndexes=false" (overriding "/etc/apt/apt.conf.d/docker-gzip-indexes")

#? Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)

#? ...

#? E: Failed to fetch store:/var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages? Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)

apt-get -o Acquire::GzipIndexes=false update; \

;; \

esac; \

\

# 安裝postgresql-common包

apt-get install -y postgresql-common; \

# 修改 /etc/postgresql-common/createcluster.conf 文件的參數(shù)

sed -ri 's/#(create_main_cluster) .*$/\1 = false/' /etc/postgresql-common/createcluster.conf; \

# 安裝 postgresql

apt-get install -y \

"postgresql-$PG_MAJOR=$PG_VERSION" \

; \

\

rm -rf /var/lib/apt/lists/*; \

\

if [ -n "$tempDir" ]; then \

# if we have leftovers from building, let's purge them (including extra, unnecessary build deps)

apt-get purge -y --auto-remove; \

rm -rf "$tempDir" /etc/apt/sources.list.d/temp.list; \

fi

# make the sample config easier to munge (and "correct by default")

# 配置默認(rèn)的配置文件? postgresql.conf

# mv -v 這里表示移動(dòng)postgresql.conf.sample 到/usr/share/postgresql/文件夾下, -v 表示顯示命令執(zhí)行的信息

RUN mv -v "/usr/share/postgresql/$PG_MAJOR/postgresql.conf.sample" /usr/share/postgresql/ \

# ln -sv , -s 代表設(shè)置軟連接霍骄,-v 代表顯示詳細(xì)的處理過(guò)程

&& ln -sv ../postgresql.conf.sample "/usr/share/postgresql/$PG_MAJOR/" \

# 修改postgresql.conf.sample中的 listen_addresses參數(shù)

&& sed -ri "s!^#?(listen_addresses)\s*=\s*\S+.*!\1 = '*'!" /usr/share/postgresql/postgresql.conf.sample

# 創(chuàng)建 /var/run/postgresql目錄台囱,將目錄的所屬用戶和用戶組設(shè)置為postgres淡溯,將目錄賦予可執(zhí)行權(quán)限

RUN mkdir -p /var/run/postgresql && chown -R postgres:postgres /var/run/postgresql && chmod 2777 /var/run/postgresql

# 設(shè)置將postgresql目錄設(shè)置到環(huán)境變量中

ENV PATH $PATH:/usr/lib/postgresql/$PG_MAJOR/bin

ENV PGDATA /var/lib/postgresql/data

# 創(chuàng)建目錄環(huán)境變量中使用到的目錄读整,并賦予777權(quán)限

RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 777 "$PGDATA" # this 777 will be replaced by 700 at runtime (allows semi-arbitrary "--user" values)

# 掛載目錄為? /var/lib/postgresql/data

VOLUME /var/lib/postgresql/data

# 將docker-entrypoint.sh 腳本考入到容器內(nèi)的/usr/local/bin 目錄下

COPY docker-entrypoint.sh /usr/local/bin/

# 將 /usr/local/bin/docker-entrypoint.sh 這個(gè)腳本軟連到 / 目錄下

RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat

# ENTRYPOINT這個(gè)命令需要在? docker run啟動(dòng)運(yùn)行的時(shí)候執(zhí)行,類似于開(kāi)機(jī)啟動(dòng)腳本

ENTRYPOINT ["docker-entrypoint.sh"]

# 容器內(nèi)部端口地址為5432

EXPOSE 5432

# 開(kāi)機(jī)啟動(dòng)的執(zhí)行命令

CMD ["postgres"]

3 Dockerfile實(shí)踐

3.1 以Postgressql10.3為例

當(dāng)前安裝的流程是源碼安裝

如果要用yum安裝的話咱娶。區(qū)別如下:

????1.沒(méi)辦法將安裝文件指定目錄

????2.yum會(huì)自己將依賴包進(jìn)行安裝米间,不再需要手動(dòng)安裝

????3.yum安裝完成后會(huì)自動(dòng)配置好環(huán)境變量强品,不再需要手動(dòng)配置

????4.yum安裝完成后會(huì)自動(dòng)創(chuàng)建出默認(rèn)的初始化的庫(kù)

二、手工集成自定義Docker鏡像

1屈糊、Docker集成HGDB

1.1部署流程圖

1.2具體操作

1)啟動(dòng)Docker服務(wù)

2)下載centos鏡像

3)用centos鏡像創(chuàng)建容器

4)進(jìn)入容器

5)安裝HGDB

6)將容器打包成鏡像

7)初始化宿主機(jī)數(shù)據(jù)庫(kù)

8)啟動(dòng)鏡像映射至宿主機(jī)5458端口的榛,并掛載本地磁盤節(jié)點(diǎn)到容器上

9)進(jìn)入到容器后,啟動(dòng)應(yīng)用

10)登錄數(shù)據(jù)庫(kù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逻锐,一起剝皮案震驚了整個(gè)濱河市夫晌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昧诱,老刑警劉巖晓淀,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盏档,居然都是意外死亡凶掰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門蜈亩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)懦窘,“玉大人,你說(shuō)我怎么就攤上這事稚配〕┩浚” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵药有,是天一觀的道長(zhǎng)毅戈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)愤惰,這世上最難降的妖魔是什么苇经? 我笑而不...
    開(kāi)封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宦言,結(jié)果婚禮上扇单,老公的妹妹穿的比我還像新娘。我一直安慰自己奠旺,他們只是感情好蜘澜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著响疚,像睡著了一般鄙信。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忿晕,一...
    開(kāi)封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天装诡,我揣著相機(jī)與錄音,去河邊找鬼。 笑死鸦采,一個(gè)胖子當(dāng)著我的面吹牛宾巍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渔伯,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顶霞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锣吼?” 一聲冷哼從身側(cè)響起选浑,我...
    開(kāi)封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玄叠,沒(méi)想到半個(gè)月后鲜侥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诸典,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年描函,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狐粱。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舀寓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肌蜻,到底是詐尸還是另有隱情互墓,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布蒋搜,位于F島的核電站篡撵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豆挽。R本人自食惡果不足惜育谬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帮哈。 院中可真熱鬧膛檀,春花似錦、人聲如沸娘侍。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)憾筏。三九已至嚎杨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氧腰,已是汗流浹背枫浙。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工翠胰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人自脯。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像斤富,于是被迫代替她去往敵國(guó)和親膏潮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,725評(píng)論 1 21
  • 實(shí)例來(lái)源:tofar 摘錄來(lái)源:Docker — 從入門到實(shí)踐 歡迎大家添加自己的實(shí)例 (email: yun_...
    molscar閱讀 419評(píng)論 1 1
  • 五满力、Docker 端口映射 無(wú)論如何焕参,這些 ip 是基于本地系統(tǒng)的并且容器的端口非本地主機(jī)是訪問(wèn)不到的。此外油额,除了...
    R_X閱讀 1,738評(píng)論 0 7
  • 在前面兩節(jié)我們學(xué)習(xí)了如何安裝以及簡(jiǎn)單的運(yùn)行管理docker容器叠纷,在本節(jié)我們將會(huì)更多的探討關(guān)于docker鏡像的知識(shí)...
    井底蛙蛙呱呱呱閱讀 4,082評(píng)論 0 5
  • Docker docker常用命令: sudo docker images // 查看本機(jī)已有的鏡像 docker...
    neo_ng閱讀 598評(píng)論 0 1