八、Dockerfile**
8.1 什么是Dockerfile
8.1.1 介紹
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本,這些命令應(yīng)用于基礎(chǔ)鏡像并最終創(chuàng)建一個(gè)新的鏡像
- 對(duì)于開(kāi)發(fā)人員:可以為開(kāi)發(fā)團(tuán)隊(duì)提供一個(gè)完全一致的開(kāi)發(fā)環(huán)境
- 對(duì)于測(cè)試人員:可以直接拿開(kāi)發(fā)時(shí)所構(gòu)建的鏡像或者通過(guò)Dockerfile文件構(gòu)建一個(gè)新的鏡像開(kāi)始工作
- 對(duì)于運(yùn)維人員:在部署時(shí),可以實(shí)現(xiàn)應(yīng)用的無(wú)縫移植
8.1.2 Dockerfile構(gòu)建步驟
- 編寫Dockerfile文件
- docker build
- docker run
8.1.3 Dockerfile文件內(nèi)容
以熟悉的centos為例:https://hub.docker.com/_/centos/
8.2 DockerFile 構(gòu)建過(guò)程解析
8.2.1 Dockerfile內(nèi)容基礎(chǔ)知識(shí)
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個(gè)參數(shù)
- 指令按照從上到下,順序執(zhí)行
- #表示注釋
- 每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層,并對(duì)鏡像進(jìn)行提交
8.2.2 Docker執(zhí)行Dockerfile大致流程
- docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
- 執(zhí)行一條指令并對(duì)容器作出修改
- 執(zhí)行類似docker commit的操作提交一個(gè)新的鏡像層
- docker再基于剛提交的鏡像運(yùn)行一個(gè)新容器
- 執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
8.3 常用命令
8.3.1 FROM
指明構(gòu)建的新鏡像是來(lái)自于哪個(gè)基礎(chǔ)鏡像,例如:
FROM centos: latest
8.3.2 MAINTAINER
指明鏡像維護(hù)著及其聯(lián)系方式(一般是郵箱地址),例如:
MAINTAINER JC Zhang zhangsan@163.com
不過(guò),MAINTAINER并不推薦使用,更推薦使用LABEL來(lái)指定鏡像作者,例如
LABEL maintainer=“zhangsan.cn”
8.3.3 RUN
構(gòu)建鏡像時(shí)運(yùn)行的Shell命令,例如:
RUN [“yum”, “install”, “httpd”]
RUN yum install httpd
8.3.4 CMD
啟動(dòng)容器時(shí)執(zhí)行的Shell命令,例如:
CMD ["-C", “/start.sh”]
CMD ["/usr/sbin/sshd", “-D”]
CMD /usr/sbin/sshd -D
8.3.5 EXPOSE
聲明容器運(yùn)行的服務(wù)端口,例如:
EXPOSE 80 443
8.3.6 ENV
設(shè)置環(huán)境內(nèi)環(huán)境變量,例如:
ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45
8.3.7 ADD
拷貝文件或目錄到鏡像中,PS:如果是URL或壓縮包,會(huì)自動(dòng)下載或自動(dòng)解壓,例如:
ADD …
ADD html.tar.gz /var/www/html
ADD https://xxx.com/html.tar.gz /var/www/html
8.3.8 COPY
拷貝文件或目錄到鏡像中,用法同ADD,只是不支持自動(dòng)下載和解壓,例如:
COPY ./start.sh /start.sh
8.3.9 ENTRYPOINT
啟動(dòng)容器時(shí)執(zhí)行的Shell命令,同CMD類似,只是由ENTRYPOINT啟動(dòng)的程序不會(huì)被docker run命令行指定的參數(shù)所覆蓋,而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)傳遞給ENTRYPOINT指定指定的程序。
ENTRYPOINT ["/bin/bash", “-C”, “/start.sh”]
ENTRYPOINT /bin/bash -C ‘/start.sh’
PS:Dockerfile文件中也可以存在多個(gè)ENTRYPOINT指令,但僅有最后一個(gè)會(huì)生效。
8.3.10 VOLUME
指定容器掛載點(diǎn)到宿主機(jī)自動(dòng)生成的目錄或其他容器,例如:
VOLUME ["/var/lib/mysql"]
PS:一般不會(huì)在Dockerfile中用到,更常見(jiàn)的還是在docker run的時(shí)候指定-v數(shù)據(jù)卷。
8.3.11 WORKDIR
為RUN、CMD、ENTRYPOINT以及COPY和AND設(shè)置工作目錄,例如:
WORKDIR /data
**8.4 **使用腳本創(chuàng)建鏡像
8.4.1 編寫Dockerfile
創(chuàng)建目錄
mkdir -p /export/docker/jdk8
將jdk-8u241-linux-x64.tar.gz上傳到服務(wù)器(虛擬機(jī))中的/export/docker/jdk8目錄
創(chuàng)建文件Dockerfile
cd /export/docker/jdk8/
vi Dockerfile
#依賴鏡像名稱和id
FROM centos:latest
#指定鏡像創(chuàng)建者信息
MAINTAINER ITCAST
#切換工作目錄
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相對(duì)路徑j(luò)ar,把java添加到容器中
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java
#配置java環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JAR_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
8.4.2 構(gòu)建鏡像
docker build -t=‘jdk1.8’ .
注意后面的空格和點(diǎn),不要省略,點(diǎn)表示當(dāng)前目錄
8.4.3 查看鏡像是否構(gòu)建完成
8.5 自定義鏡像mycentos
8.5.1 編寫 Dockerfile
Hub默認(rèn)centos鏡像
準(zhǔn)備編寫DockerFile文件vim Dockerfile
FROM centos:latest
MAINTAINER zhangjc
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
8.5.2 構(gòu)建鏡像
docker build -t mycentos:1.1 .
8.5.3 運(yùn)行鏡像
docker run -it mycentos:1.1
九、Docker私有倉(cāng)庫(kù)
在 Docker 中,當(dāng)我們執(zhí)行docker pull xxx的時(shí)候 ,它實(shí)際上是從 registry.hub.docker.com這個(gè)地址去查找,這就是Docker公司為我們提供的公共倉(cāng)庫(kù)。
在工作中,不可能把企業(yè)項(xiàng)目push到公有倉(cāng)庫(kù)進(jìn)行管理。為了更好的管理鏡像,Docker不僅提供了一個(gè)中央倉(cāng)庫(kù),同時(shí)允許搭建本地私有倉(cāng)庫(kù)。介紹registry、harbor兩種私有倉(cāng)庫(kù)搭建。
9.1 registry搭建
9.1.1 搭建
Docker 官方提供了一個(gè)搭建私有倉(cāng)庫(kù)的鏡像 registry ,只需把鏡像下載下來(lái),運(yùn)行容器并暴露5000端口,就可以使用了。
docker pull registry:2
docker run -di -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2
Registry服務(wù)默認(rèn)會(huì)將上傳的鏡像保存在容器的/var/lib/registry,將主機(jī)的/opt/registry目錄掛載到該目錄,即可實(shí)現(xiàn)將鏡像保存到主機(jī)的/opt/registry目錄了。
瀏覽器訪問(wèn)http://node1.itcast.cn:5000/v2/_catalog,出現(xiàn)下面情況說(shuō)明registry運(yùn)行正常
9.1.2 驗(yàn)證
現(xiàn)在通過(guò)push鏡像到registry來(lái)驗(yàn)證一下。
查看本地鏡像
docker images
要通過(guò)docker tag將該鏡像標(biāo)志為要推送到私有倉(cāng)庫(kù):
docker tag nginx:latest localhost:5000/nginx:latest
通過(guò)docker push命令將nginx鏡像push到私有倉(cāng)庫(kù)中:
docker push localhost:5000/nginx:latest
訪問(wèn) http://node1.itcast.cn:5000/v2/_catalog 查看私有倉(cāng)庫(kù)目錄,可以看到剛上傳的鏡像了:
- 下載私有倉(cāng)庫(kù)的鏡像,使用如下命令:
docker pull localhost:5000/鏡像名:版本號(hào)
docker pull localhost:5000/nginx:latest
9.2 Docker鏡像推送到阿里云鏡像倉(cāng)庫(kù)
首先需要有一個(gè)阿里云的賬號(hào)
鏡像倉(cāng)庫(kù)申請(qǐng)地址:https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
9.2.1 容器鏡像服務(wù)控制臺(tái)概覽
9.2.2 創(chuàng)建鏡像倉(cāng)庫(kù)
9.2.3 選擇本地倉(cāng)庫(kù)
9.2.4 點(diǎn)擊管理
9.2.5 Docker登錄阿里云容器鏡像倉(cāng)庫(kù)
$ sudo docker login --username=xxx@aliyun.com registry.cn-hangzhou.aliyuncs.com
9.2.6 推送創(chuàng)建的oracle11g_ centos7鏡像到阿里云鏡像倉(cāng)庫(kù)
-
開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
370瀏覽量
40836 -
前端
+關(guān)注
關(guān)注
1文章
192瀏覽量
17749 -
Docker
+關(guān)注
關(guān)注
0文章
457瀏覽量
11846
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論