????????其實(shí)在Docker倉(cāng)庫(kù)中,存在nginx容器鏡像,但是我們?yōu)槭裁催€有自己來(lái)編寫(xiě)呢,是因?yàn)橛械臅r(shí)候倉(cāng)庫(kù)中的版本,并非我們?cè)谛枰陌姹剧R像,還有一點(diǎn)就因?yàn)榘踩珕?wèn)題,畢竟別人家的東西哪有自己家的東西用著安心呢。
????????Dockerfile是使用源代碼構(gòu)建docker的鏡像,編輯一個(gè)Dockerfile,而后根據(jù)此文件制作;docker可以自動(dòng)通過(guò)讀取Dockerfile中的指令,自動(dòng)構(gòu)建鏡像。Dockerfile是一個(gè)文本文檔包含所有用戶(hù)的命令,可以在命令行上調(diào)用組建一個(gè)鏡像。使用docker build命令的用戶(hù)可以讀取docker file中的連續(xù)指令,自動(dòng)構(gòu)建一個(gè)鏡像。
一,構(gòu)建nginx鏡像
創(chuàng)建目錄存放相關(guān)文件
mkdir nginxdockerfile
cd nginxdockerfile
echo "docker nginx build successful" > index.html
創(chuàng)建dockerfile文件
vi Dockerfile
FROM centos:7
LABEL version="nginx v1"
LABEL "emill"="243254384@qq.com"
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
WORKDIR /usr/local/src
ENV NG_VERSION=nginx-1.25.1
RUN yum -y install epel-release
RUN yum -y install wget
RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
RUN yum clean all
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/$NG_VERSION
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
ADD index.html /usr/local/nginx/html
VOLUME /usr/local/nginx/html
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80/tcp
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
構(gòu)建鏡像
docker build -t centos7:nginx .
運(yùn)行容器
docker run -d --name nginx -p 8080:80 centos7:nginx
訪(fǎng)問(wèn)即可
http://IP:8080
二,詳細(xì)介紹使用的模塊
#基準(zhǔn)鏡像
FROM centos:7
#作者信息
LABEL version="nginx v1"
LABEL "emill"="243254384@qq.com"
#調(diào)整系統(tǒng)時(shí)間差
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#工作目錄
WORKDIR /usr/local/src/
#定義環(huán)境變量
ENV NG_VERSION nginx-1.21.0
#安裝epel倉(cāng)庫(kù)
RUN yum -y install epel-release
#安裝wget
RUN yum -y install wget
#下載nginx文件并解壓
RUN wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz
#安裝編譯依賴(lài)包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
#清理倉(cāng)庫(kù)
RUN yum clean all
#創(chuàng)建nginx用戶(hù)
RUN useradd -M -s /sbin/nologin nginx
#切換工作目錄
WORKDIR /usr/local/src/$NG_VERSION
#編譯安裝nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
#復(fù)制測(cè)試頁(yè)面到容器中
ADD index.html /usr/local/nginx/html
#設(shè)置容器中要掛在到宿主機(jī)的目錄
VOLUME /usr/local/nginx/html
#設(shè)置sbin環(huán)境變量
ENV PATH /usr/local/nginx/sbin:$PATH
#暴露80端口
EXPOSE 80/tcp
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
#當(dāng)ENTRYPOINT和CMD連用時(shí),CMD的命令是ENTRYPOINT命令的參數(shù),兩者連用相當(dāng)于nginx -g "daemon off;"而當(dāng)一起連用的時(shí)候命令格式最好一致(這里選擇的都是json格式的是成功的,如果都是sh模式可以試一下)
1.FROM
功能為指定基礎(chǔ)鏡像,并且必須是第一條指令。 如果不以任何鏡像為基礎(chǔ),那么寫(xiě)法為:FROM scratch。 同 時(shí)意味著接下來(lái)所寫(xiě)的指令將作為鏡像的第一層開(kāi)始
2.RUN
功能為運(yùn)行指定的命令
注意:多行命令不要寫(xiě)多個(gè)RUN,原因是Dockerfile中每一個(gè)指令都會(huì)建立一層. 多少個(gè)RUN就構(gòu)建了多 少層鏡像,會(huì)造成鏡像的臃腫、多層,不僅僅增加了構(gòu)件部署的時(shí)間,還容易出錯(cuò)。 RUN書(shū)寫(xiě)時(shí)的換行 符是\
3.CMD
功能為容器啟動(dòng)時(shí)要運(yùn)行的命令
注意:補(bǔ)充細(xì)節(jié):這里邊包括參數(shù)的一定要用雙引號(hào),就是",不能是單引號(hào)。千萬(wàn)不能寫(xiě)成單引號(hào)。 原因是參數(shù)傳遞后,docker解析的是一個(gè)JSON array
4.RUN和CMD的區(qū)別
不要把RUN和CMD搞混了。 RUN是構(gòu)件容器時(shí)就運(yùn)行的命令以及提交運(yùn)行結(jié)果 CMD是容器啟動(dòng)時(shí)執(zhí)行的命 令,在構(gòu)件時(shí)并不運(yùn)行,構(gòu)件時(shí)緊緊指定了這個(gè)命令到底是個(gè)什么樣子
5.LABEL
功能是為鏡像指定標(biāo)簽,為鏡像寫(xiě)一些注釋信息
但是并不建議這樣寫(xiě),最好就寫(xiě)成一行,如太長(zhǎng)需要換行的話(huà)則使用\符號(hào) 如下:
注意:LABEL會(huì)繼承基礎(chǔ)鏡像種的LABEL,如遇到key相同,則值覆蓋
6.EXPOSE
功能為暴漏容器運(yùn)行時(shí)的監(jiān)聽(tīng)端口給外部 但是EXPOSE并不會(huì)vim 使容器訪(fǎng)問(wèn)主機(jī)的端口 如果想使得容器與主 機(jī)的端口有映射關(guān)系,必須在容器啟動(dòng)的時(shí)候加上 -P參數(shù)
注意:如果在端口號(hào)后面加/tcp,默認(rèn)為tcp協(xié)議,如果需要UDP端口需要添加/udp
7.ENV
功能為設(shè)置環(huán)境變量
8.ADD
一個(gè)復(fù)制命令,把文件復(fù)制到鏡象中。 如果把虛擬機(jī)與容器想象成兩臺(tái)linux服務(wù)器的話(huà),那么這個(gè)命令就類(lèi)似 于scp,只是scp需要加用戶(hù)名和密碼的權(quán)限驗(yàn)證,而ADD不用。
注意:盡量不要把寫(xiě)成一個(gè)文件夾,如果是一個(gè)文件夾了,復(fù)制整個(gè)目錄的內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)
9.WORKDIR
設(shè)置工作目錄,對(duì)RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在則會(huì)創(chuàng)建,也可以設(shè)置多次
10.VOLUME
可實(shí)現(xiàn)掛載功能,可以將內(nèi)部文件夾掛載到外部
11.ENTRYPOINT
該命令與CMD類(lèi)似,用于執(zhí)行命令使用,還可以與CMD命令一起拼合使用
它與CMD的區(qū)別: ? 相同點(diǎn):只能寫(xiě)一條,如果寫(xiě)多條,那么只有最后一條生效文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-685695.html
不同點(diǎn):CMD在創(chuàng)建容器時(shí),在后面添加其他的CMD指令,CMD會(huì)被覆蓋,但是ENTRYPOINT不會(huì)被覆蓋,如果兩個(gè)同時(shí)使用,CMD會(huì)變成ENTRYPOINT的參數(shù)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-685695.html
到了這里,關(guān)于使用Dockerfile編寫(xiě)源碼安裝Nginx鏡像的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!