Docker使用Dockerfile來創(chuàng)建鏡像
本文學(xué)習(xí)Dcokerfile的基本命令,并且創(chuàng)建一個(gè)支持ssh服務(wù)的鏡像.
1.Dockerfile
1.1基本案例
dockerfile可以說是docker的描述符,該文件定義了docker鏡像的所能擁有哪些東西.基本格式如下:
第一行指定該鏡像基于的基礎(chǔ)鏡像(必須) FROM java:8 維護(hù)者信息 MAINTAINER quding niudear@foxmail.com 鏡像操作指令 RUN echo $JAVA_HOME 啟動時(shí)操作的命令 CMD ./usr/sbin/nginx
該文件說明從Java8這個(gè)基礎(chǔ)鏡像創(chuàng)建一個(gè)新的鏡像,輸出Java路徑,啟動成功則啟動nginx服務(wù),這也是一個(gè)Dockerfile需要包含的操作步驟.
1.2指令詳解
1.FROM:格式為 FROM <image>或FROM<image>:<tag>第一條指令必須是FROM指令。并且,如果在同一個(gè)Dockerfile中創(chuàng)建多個(gè)鏡像時(shí),可以使用多個(gè)FROM指令(每個(gè)鏡像一次)。
2.MAINTAINER:格式為MAINTAIER,指定維護(hù)者信息。
3.RUN:格式為RUN <command>或者RUN [“executable”,“param1”,“param2”]。前者將在shell終端中運(yùn)行的命令,即/bin/sh–c;后者則使用exec執(zhí)行。指定使用其他終端可以通過第二種方式實(shí)現(xiàn),例如RUN[“/bin/bash”,“-c”,“echohello”]。每條RUN指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像。當(dāng)命令較長時(shí)可以使用\來換行。這實(shí)際上就是在容器構(gòu)建時(shí)需要執(zhí)行哪些指令,例如容器構(gòu)建時(shí)需要下拉代碼,但是默認(rèn)啟動的容器中是沒有Git指令的,就需要下載,可以執(zhí)行:RUN apt-get install -y git,然后RUN git clonexxxx
4.CMD:指定容器啟動后執(zhí)行的命令
命令格式為:
sh格式: CMD <命令>
exec格式:CMD [“可執(zhí)行文件”,”參數(shù)1”,”參數(shù)2”]
一般都是早就寫好的腳本或者啟動一個(gè)服務(wù),例如:CMD[“/run.sh”]。注意:如果Dockerfile中指定了多條命令,只有最后一條會被執(zhí)行。如果用戶啟動時(shí)候加了運(yùn)行的命令,則會覆蓋掉CMD指定的指令。
這里有一個(gè)問題,很多時(shí)候我們想要docker一直在后臺運(yùn)行,但是往往docker啟動后就停止.原因就在于此.
比如執(zhí)行CMD serice MySQL start,那么翻譯過來的話是CMD ["sh","-c","serice mysql start"],那么對于docker來說CMD主進(jìn)程為sh,那么sh執(zhí)行完該命令就結(jié)束,所以導(dǎo)致docker停止.所以要改成直接啟動文件形式CMD ["mysql","-g",""daemon off;],指定前臺運(yùn)行.
5.EXPOSE:告訴Docker服務(wù)端容器需要暴露的端口號,供互聯(lián)系統(tǒng)使用。在啟動容器時(shí)需要通過-P(注意是大寫),Docker主機(jī)會自動分配一個(gè)端口轉(zhuǎn)發(fā)到指定的端口;使用-p,則可以具體指定哪個(gè)本地端口映射過來。
例如:我在elasticsearch鏡像的Dockerfile中指定了暴露出9200和9300端口,我可以在Dockerfile中寫:EXPOSE 9200 9300
6.ENV:創(chuàng)建的時(shí)候給容器中加上個(gè)需要的環(huán)境變量。指定一個(gè)值,為后續(xù)的RUN指令服務(wù)
7.COPY:復(fù)制本地的文件或目錄到容器中。目標(biāo)路徑不存在時(shí),會自動創(chuàng)建。
8.ENTRYPOINT:配置容器啟動后執(zhí)行的命令,并且不可被docker run 提供的參數(shù)覆蓋。
每個(gè)Dockerfile中只能有一個(gè)ENTRYPOINT,當(dāng)指定多個(gè)ENTRYPOINT時(shí),只有最后一個(gè)生效
9.VOLUME:創(chuàng)建一個(gè)掛在點(diǎn),可以從本機(jī)或其他容器掛載的掛載點(diǎn)。意思就是從容器中暴露出一部分,和外界共享這塊東西,一般放數(shù)據(jù)庫的數(shù)據(jù)或者是代碼。在容器啟動運(yùn)行的時(shí)候,如果需要將volume暴露的東西和本地的一個(gè)文件夾進(jìn)行映射,想要通過本地文件直接訪問容器中暴露的部分,可以在運(yùn)行的時(shí)候進(jìn)行映射:
10.USER:指定運(yùn)行容器時(shí)的用戶名或者UID,后續(xù)的RUN也會使用指定的用戶。當(dāng)服務(wù)不需要管理員權(quán)限時(shí),可以通過該命令指定運(yùn)行用戶。并且可以在之前創(chuàng)建所需要的用戶。
要臨時(shí)獲取管理員權(quán)限的時(shí)候要使用gosu,不推薦使用sudo。如果不指定,容器默認(rèn)是root運(yùn)行。
11.WORKDIR:定義工作目錄,如果容器中沒有此目錄,會自動創(chuàng)建
創(chuàng)建指令docker build 路徑,該命令會讀取路徑下的Dockerfile文件和其他文件,然后發(fā)送給服務(wù)端,由服務(wù)端創(chuàng)建鏡像.
2.創(chuàng)建SSH服務(wù)鏡像
2.1準(zhǔn)備Java8環(huán)境
后續(xù)教程需要利用到Java8環(huán)境,因此先下載一個(gè)官方的Java8鏡像作為基礎(chǔ)鏡像.直接執(zhí)行如下命令.可以利用之前的教程,啟動容器查看下java路徑.
docker pull java:8
2.2編寫Dockerfile
ssh服務(wù)主要是openssh-server來提供,因此需要在容器中安裝該服務(wù).
Dockerfile:
#顯示該鏡像是基于java8鏡像 FROM java:8 #維護(hù)人信息 MAINTAINER quding niudear@foxmail.com #更新源 RUN apt-get update #安裝軟件 RUN apt-get install -y openssh-server RUN mkdir -p /var/run/sshd RUN mkdir -p /root/.ssh #取消pam限制 RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd #復(fù)制配置文件到相應(yīng)位置 COPY authorized_keys /root/.ssh/authorized_keys COPY run.sh /run.sh #賦予腳本權(quán)限 RUN chmod 755 /run.sh #開放端口 EXPOSE 22 #設(shè)置啟動命令 CMD ["/run.sh"]
run.sh
#!/bin/bash /usr/sbin/sshd -D
拷貝本機(jī)的id_ras
cat ~/.ssh/id_rsa.pub >authorized_keys //用來免密的
執(zhí)行構(gòu)建
docker build -t sshd:java .
構(gòu)建成功后使用docker images
即可查看,然后像上篇一樣啟動容器,暴露出端口,再使用ssh連接,和一般Linux系統(tǒng)就沒什么差別了.
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker鏡像發(fā)布到Docker?Hub的實(shí)現(xiàn)方法
本文主要介紹了Docker鏡像發(fā)布到Docker?Hub的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Docker在Windows環(huán)境的搭建和使用詳解
這篇文章主要介紹了Docker在Windows環(huán)境的搭建和使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03