一、Dockerfile創(chuàng)建鏡像-Dockerfile格式
1. FROM //指定基于哪個(gè)基礎(chǔ)鏡像,必須要有的
格式 FROM <image> 或者 FROM <image>:<tag>, 比如
FROM centos
FROM centos:latest
2. MAINTAINER //指定作者信息,可以有或無(wú)。
格式 MAINTAINER <name> ,比如
MAINTAINER aming aming@aminglinux.com
3. RUN //鏡像操作指令
格式為 RUN <command> 或者 RUN [“executable”, “param1”, “param2”],比如
RUN yum install httpd
RUN ["/bin/bash", "-c", "echo hello"] //如果有命令,有選項(xiàng),有參數(shù)就寫(xiě)方括號(hào)這樣的形式,用逗號(hào)作為分隔符,用雙引號(hào)引起來(lái)。
4. CMD // 三種格式:
CMD ["executable", "param1", "param2"]
CMD command param1 param2 //CMD后直接寫(xiě)。
CMD ["param1", "param2"] //CMD后加方括號(hào),方括號(hào)內(nèi)寫(xiě)參數(shù)。
RUN和CMD看起來(lái)挺像,但是CMD用來(lái)指定容器啟動(dòng)時(shí)用到的命令,只能有一條。比如把nginx啟動(dòng),就可以寫(xiě)到CMD下:
CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
5. EXPOSE
格式為 EXPOSE <port> [<port>...] , 直接寫(xiě)端口,比如
EXPOSE 22 80 8443
這個(gè)用來(lái)指定要映射出去的端口,比如容器內(nèi)部我們啟動(dòng)了sshd和nginx,所以我們需要把22和80端口暴露出去。這個(gè)需要配合-P(大寫(xiě))來(lái)工作,也就是說(shuō)在啟動(dòng)容器時(shí),需要加上-P,讓它自動(dòng)分配,這樣宿主機(jī)的監(jiān)聽(tīng)端口會(huì)隨機(jī)分配一個(gè),如果想指定宿主機(jī)具體的端口,也可以使用-p(小寫(xiě))來(lái)指定。
6. ENV
格式 ENV <key> <value>, 比如
ENV PATH /usr/local/mysql/bin:$PATH
它主要是為后續(xù)的RUN指令提供一個(gè)環(huán)境變量,我們也可以定義一些自定義的變量
ENV MYSQL_version 5.6
7. ADD 格式 ADD <src> <dest>
//把一個(gè)資源添加到你的docker里,支持本地文件也支持遠(yuǎn)程鏈接。
將本地的一個(gè)文件或目錄拷貝到容器的某個(gè)目錄里。 其中src(源)為Dockerfile所在目錄的相對(duì)路徑,它也可以是一個(gè)url。比如
ADD <conf/vhosts> </usr/local/nginx/conf>
8. COPY
格式同add
使用方法和add一樣,不同的是,它不支持url遠(yuǎn)程下載。
9. ENTRYPOINT 格式類似CMD
容器啟動(dòng)時(shí)要執(zhí)行的命令,它和CMD很像,也是只有一條生效,如果寫(xiě)多個(gè)只有最后一條有效。和CMD不同是:
CMD 是可以被 docker run 指令覆蓋的,而ENTRYPOINT不能覆蓋。比如,容器名字為aming
我們?cè)贒ockerfile中指定如下CMD:
CMD ["/bin/echo", "test"]
啟動(dòng)容器的命令是 docker run aming 這樣會(huì)輸出 test
假如啟動(dòng)容器的命令是 docker run -it aming /bin/bash 什么都不會(huì)輸出,像這個(gè)/bin/bash是可以覆蓋掉CMD后面那條指令的。所以最后面一旦加了一條指令,CMD后面的指令就失效了。但是這個(gè)ENTRYPOINT就沒(méi)問(wèn)題,平常在用dockerfile時(shí)大部分都是在用ENTRYPOINT,很少用CMD。
ENTRYPOINT不會(huì)被覆蓋,而且會(huì)比CMD或者docker run指定的命令要靠前執(zhí)行
ENTRYPOINT ["echo", "test"]
docker run -it aming 123
則會(huì)輸出 test 123 ,這相當(dāng)于要執(zhí)行命令 echo test 123
10. VOLUME指定掛載點(diǎn)
格式 VOLUME ["/data"] 就相當(dāng)于docker -v后面跟的那個(gè)目錄
創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載點(diǎn)。
11. USER
格式 USER daemon
指定運(yùn)行容器的用戶,這個(gè)很少用,一般都是root。
12. WORKDIR
格式 WORKDIR /path/to/workdir
為后續(xù)的RUN、CMD或者ENTRYPOINT指定工作目錄。指定一個(gè)目錄,指定完后在這個(gè)目錄下進(jìn)行操作。
二、Dockerfile示例
先下載nginx的配置文件,也可以不下載,后面用ADD添加進(jìn)去。
# wget http://www.apelearn.com/study_v2/.nginx_conf# vim Dockerfile //內(nèi)容如下
## Set the base image to CentOS FROM centos # File Author / Maintainer MAINTAINER aming aming@aminglinux.com # Install necessary tools RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel # Install Nginx ADD http://nginx.org/download/nginx-1.8.0.tar.gz . RUN tar zxvf nginx-1.8.0.tar.gz RUN mkdir -p /usr/local/nginx RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install RUN rm -fv /usr/local/nginx/conf/nginx.conf #COPY .nginx_conf /usr/local/nginx/conf/nginx.conf ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf # Expose ports EXPOSE 80 # Set the default command to execute when creating a new container ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd沒(méi)有指定WORKDIR的位置,默認(rèn)就是在根目錄下。
如果是先下載的nginx的配置文件,就用COPY那一條,沒(méi)有下載,則用下面的ADD的一條。
說(shuō)明:ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd
//docker容器啟動(dòng)的時(shí)候要執(zhí)行的一條命令,當(dāng)執(zhí)行完 /usr/local/nginx/sbin/nginx這條命令后,nginx服務(wù)會(huì)啟動(dòng),但是當(dāng)這條命令執(zhí)行完,容器會(huì)自動(dòng)停止,所以當(dāng)加一條tail -f /etc/passwd,這條命令就永遠(yuǎn)執(zhí)行不完,容器就會(huì)一直運(yùn)行。
創(chuàng)建鏡像:
# docker build -t centos_dockerfile_nginx .//-t 指定新的鏡像名,后面的點(diǎn)表示路徑,在哪里找Dockerfile文件。
執(zhí)行過(guò)程可能出現(xiàn)錯(cuò)誤,我這里出現(xiàn)了容器無(wú)法聯(lián)網(wǎng),因?yàn)橹鞍惭b了第三方的pipework,把ens33和br0做了交換,而它這里還是在使用ens33的網(wǎng)絡(luò),所以無(wú)法聯(lián)網(wǎng),解決方法就是重啟docker服務(wù),讓它自動(dòng)去綁定br0。
重啟后,可以先檢查一下,為了保證后續(xù)build的工作順利進(jìn)行。檢查方法:先進(jìn)入一個(gè)之前的別的容器,看能不能聯(lián)網(wǎng),能聯(lián)網(wǎng),就說(shuō)明后續(xù)的build的操作問(wèn)題不大。
再次執(zhí)行build,可以看到一步一步的執(zhí)行過(guò)程。
# docker images //可以看到新建的鏡像 # docker run -itd -p 8088:80 centos_dockerfile_nginx bash安裝nginx
第二種方案:將nginx先在本機(jī)編譯好,然后再直接拷貝二進(jìn)制文件(/usr/local/nginx)到容器里,需要注意nginx可執(zhí)行文件依賴的庫(kù)文件是否需要跟著拷貝到容器里。
第三種方案:搞個(gè)新版的nginx rpm包,拷貝進(jìn)去直接安裝了。
三、用Docker compose部署服務(wù)
docker compose可以方便我們快捷高效地管理容器的啟動(dòng)、停止、重啟等操作,它類似于linux下的shell腳本,基于yaml語(yǔ)法,在該文件里我們可以描述應(yīng)用的架構(gòu),比如用什么鏡像、數(shù)據(jù)卷、網(wǎng)絡(luò)模式、監(jiān)聽(tīng)端口等信息。我們可以在一個(gè)compose文件中定義一個(gè)多容器的應(yīng)用比如jumpserver),然后通過(guò)該compose來(lái)啟動(dòng)這個(gè)應(yīng)用。
安裝compose方法如下:
# curl -L https://github.com/docker/compose/releases/download/1.17.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose # chmod 755 !$ # docker-compose version 查看版本信息Compose區(qū)分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。這里是+號(hào)的意思是1.6.0之后就是2版本。
Version 2支持更多的指令。Version 1沒(méi)有聲明版本默認(rèn)是"version 1"。Version 1將來(lái)會(huì)被棄用。
四、Docker compose示例
# vim docker-compose.yml version: "2" services: app1: image: centos_nginx ports: - "8081:80" networks: - "net1" volumes: - /data/:/data entrypoint: tail -f /etc/passwd app2: image: centos_with_net networks: - "net2" volumes: - /data/:/data1 entrypoint: tail -f /etc/passwd networks: net1: driver: bridge net2: driver: bridge解析:
services:接下來(lái)要操作的是容器或者鏡像相關(guān)的一些操作。一級(jí)目錄。
app1:容器的名字,二級(jí)目錄。
image:對(duì)應(yīng)的鏡像。
ports:也就是-p那個(gè)要映射的端口。
networks:使用的網(wǎng)絡(luò),net1,net1在下面定義。
driver:指定的模式。即使不寫(xiě),默認(rèn)就是bridge,可以寫(xiě)其他的,通常都是用bridge。這里官方不支持pipework,只能寫(xiě)shell腳本,bridge這里就寫(xiě)none,之后再額外給它分配一個(gè)IP就行了。
volumes:就是-v的選項(xiàng),把本地和容器的目錄做一個(gè)映射。
entrypoint:也支持entrypoint,寫(xiě)一個(gè)tail -f 是因?yàn)椋J(rèn)會(huì)用/bin/bash打開(kāi),這個(gè)容器就不能繼續(xù)運(yùn)行了,所以為了讓容器能一直運(yùn)行,要寫(xiě)一個(gè)這個(gè)。每個(gè)app最后都要寫(xiě)著一條。
# docker-compose up -d 可以啟動(dòng)兩個(gè)容器 # docker-compose --help # docker-compose ps/down/stop/start/rm # docker-compose ps 可以更清晰的看到用compose啟動(dòng)的容器up和down對(duì)等,down能把compose的容器全部刪除。
start和stop只是把容器啟動(dòng)或停止。
rm:把停止的容器清空。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站標(biāo)題:Dockerfile格式介紹-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://chinadenli.net/article32/descpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、ChatGPT、面包屑導(dǎo)航、網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)