一、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-alpine,?9.5-alpine?(9.5/alpine/Dockerfile)
9.4.18-alpine,?9.4-alpine?(9.4/alpine/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ù)