您好,登錄后才能下訂單哦!
今天小編給大家分享一下Docker如何使用Dockerfile來創建鏡像的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1.dockerfile
1.1基本案例
dockerfile可以說是docker的描述符,該文件定義了docker鏡像的所能擁有哪些東西.基本格式如下:
第一行指定該鏡像基于的基礎鏡像(必須) from java:8 維護者信息 maintainer quding niudear@foxmail.com 鏡像操作指令 run echo $java_home 啟動時操作的命令 cmd ./usr/sbin/nginx
該文件說明從java8這個基礎鏡像創建一個新的鏡像,輸出java路徑,啟動成功則啟動nginx服務,這也是一個dockerfile需要包含的操作步驟.
1.2指令詳解
1.from:格式為 from <image>或from<image>:<tag>第一條指令必須是from指令。并且,如果在同一個dockerfile中創建多個鏡像時,可以使用多個from指令(每個鏡像一次)。
2.maintainer:格式為maintaier,指定維護者信息。
3.run:格式為run <command>或者run [“executable”,“param1”,“param2”]。前者將在shell終端中運行的命令,即/bin/sh–c;后者則使用exec執行。指定使用其他終端可以通過第二種方式實現,例如run[“/bin/bash”,“-c”,“echohello”]。每條run指令將在當前鏡像基礎上執行指定命令,并提交為新的鏡像。當命令較長時可以使用\來換行。這實際上就是在容器構建時需要執行哪些指令,例如容器構建時需要下拉代碼,但是默認啟動的容器中是沒有git指令的,就需要下載,可以執行:run apt-get install -y git,然后run git clonexxxx
4.cmd:指定容器啟動后執行的命令
命令格式為:
sh格式: cmd <命令>
exec格式:cmd [“可執行文件”,”參數1”,”參數2”]
一般都是早就寫好的腳本或者啟動一個服務,例如:cmd[“/run.sh”]。注意:如果dockerfile中指定了多條命令,只有最后一條會被執行。如果用戶啟動時候加了運行的命令,則會覆蓋掉cmd指定的指令。
這里有一個問題,很多時候我們想要docker一直在后臺運行,但是往往docker啟動后就停止.原因就在于此.
比如執行cmd serice mysql start,那么翻譯過來的話是cmd ["sh","-c","serice mysql start"],那么對于docker來說cmd主進程為sh,那么sh執行完該命令就結束,所以導致docker停止.所以要改成直接啟動文件形式cmd ["mysql","-g",""daemon off;],指定前臺運行.
5.expose:告訴docker服務端容器需要暴露的端口號,供互聯系統使用。在啟動容器時需要通過-p(注意是大寫),docker主機會自動分配一個端口轉發到指定的端口;使用-p,則可以具體指定哪個本地端口映射過來。
例如:我在elasticsearch鏡像的dockerfile中指定了暴露出9200和9300端口,我可以在dockerfile中寫:expose 9200 9300
6.env:創建的時候給容器中加上個需要的環境變量。指定一個值,為后續的run指令服務
7.copy:復制本地的文件或目錄到容器中。目標路徑不存在時,會自動創建。
8.entrypoint:配置容器啟動后執行的命令,并且不可被docker run 提供的參數覆蓋。
每個dockerfile中只能有一個entrypoint,當指定多個entrypoint時,只有最后一個生效
9.volume:創建一個掛在點,可以從本機或其他容器掛載的掛載點。意思就是從容器中暴露出一部分,和外界共享這塊東西,一般放數據庫的數據或者是代碼。在容器啟動運行的時候,如果需要將volume暴露的東西和本地的一個文件夾進行映射,想要通過本地文件直接訪問容器中暴露的部分,可以在運行的時候進行映射:
10.user:指定運行容器時的用戶名或者uid,后續的run也會使用指定的用戶。當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶。
要臨時獲取管理員權限的時候要使用gosu,不推薦使用sudo。如果不指定,容器默認是root運行。
11.workdir:定義工作目錄,如果容器中沒有此目錄,會自動創建
創建指令docker build 路徑,該命令會讀取路徑下的dockerfile文件和其他文件,然后發送給服務端,由服務端創建鏡像.
2.創建ssh服務鏡像
2.1準備java8環境
后續教程需要利用到java8環境,因此先下載一個官方的java8鏡像作為基礎鏡像.直接執行如下命令.可以利用之前的教程,啟動容器查看下java路徑.
docker pull java:8
2.2編寫dockerfile
ssh服務主要是openssh-server來提供,因此需要在容器中安裝該服務.
dockerfile:
#顯示該鏡像是基于java8鏡像 from java:8 #維護人信息 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 #復制配置文件到相應位置 copy authorized_keys /root/.ssh/authorized_keys copy run.sh /run.sh #賦予腳本權限 run chmod 755 /run.sh #開放端口 expose 22 #設置啟動命令 cmd ["/run.sh"]
run.sh
#!/bin/bash /usr/sbin/sshd -d
拷貝本機的id_ras
cat ~/.ssh/id_rsa.pub >authorized_keys //用來免密的
執行構建
docker build -t sshd:java .
構建成功后使用docker images
即可查看,然后像上篇一樣啟動容器,暴露出端口,再使用ssh連接,和一般linux系統就沒什么差別了.
以上就是“Docker如何使用Dockerfile來創建鏡像”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。