鏡像的定製就是定製每一層所添加的配置、文件。若是能夠吧每一層修改、安裝、構建、操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是dockerfile。
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令 構建一層,所以每一條指令的內容,就是描述該層應當如何構建。
#指定一個基礎鏡像 FROM scratch #製做base image 基礎鏡像,儘可能使用官方的image做爲base image FROM centos #使用base image FROM ubuntu:14.04 #帶有tag的base image LABEL version=「1.0」 #容器元信息,幫助信息,Metadata,相似於代碼註釋 LABEL maintainer=「yc_uuu@163.com" #對於複雜的RUN命令,避免無用的分層,多條命令用反斜線換行,合成一條命令! RUN yum update && yum install -y vim \ Python-dev #反斜線換行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME」 WORKDIR /root #至關於linux的cd命令,改變目錄,儘可能使用絕對路徑!!!不要用RUN cd WORKDIR /test #若是沒有就自動建立 WORKDIR demo #再進入demo文件夾 RUN pwd #打印結果應該是/test/demo
#ADD是添加文件,從物理機本地,添加到容器空間內 ADD and COPY ADD hello / #把本地文件添加到鏡像中,把本地的hello可執行文件拷貝到鏡像的/目錄 ADD test.tar.gz /tmp #將物理環境下的test添加到容器tmp目錄並解壓,可是建議使用copy WORKDIR /root ADD hello test/ #進入/root/ 添加hello可執行命令到test目錄下,也就是/root/test/hello 一個絕對路徑 COPY hello test/ #等同於上述ADD效果 ADD與COPY - 優先使用COPY命令 -ADD除了COPY功能還有解壓功能 添加遠程文件/目錄使用curl或wget ENV #環境變量,儘量使用ENV增長可維護性 ENV MYSQL_VERSION 5.6 #設置一個mysql常量 RUN yum install -y mysql-server=「${MYSQL_VERSION}」 VOLUME and EXPOSE 存儲和網絡 RUN and CMD and ENTRYPOINT RUN:執行命令並建立新的Image Layer CMD:設置容器啓動後默認執行的命令和參數 ENTRYPOINT:設置容器啓動時運行的命令 Shell格式和Exec格式 RUN yum install -y vim CMD echo 」hello docker」 ENTRYPOINT echo 「hello docker」 Exec格式 RUN [「apt-get」,」install」,」-y」,」vim」] CMD [「/bin/echo」,」hello docker」] ENTRYPOINT [「/bin/echo」,」hello docker」] 經過shell格式去運行命令,會讀取$name指令,而exec格式是僅僅的執行一個命令,而不是shell指令 cat Dockerfile FROM centos ENV name Docker ENTRYPOINT [「/bin/echo」,」hello $name」]#這個僅僅是執行echo命令,讀取不了shell變量 ENTRYPOINT [「/bin/bash」,」-c」,」echo hello $name"] CMD 容器啓動時默認執行的命令 若是docker run指定了其餘命令(docker run -it [image] /bin/bash ),CMD命令被忽略 若是定義多個CMD,只有最後一個執行 ENTRYPOINT 讓容器以應用程序或服務形式運行 不會被忽略,必定會執行 最佳實踐:寫一個shell腳本做爲entrypoint COPY docker-entrypoint.sh /usr/local/bin ENTRYPOINT [「docker-entrypoint.sh] EXPOSE 27017 CMD [「mongod」] [root@master home]# more Dockerfile FROm centos ENV name Docker #CMD ["/bin/bash","-c","echo hello $name"] ENTRYPOINT ["/bin/bash","-c","echo hello $name」]
[root@localhost ~]# cd /opt/ [root@localhost opt]# mkdir mydocker [root@localhost opt]# cd mydocker/ [root@localhost mydocker]# touch myflask.py [root@localhost mydocker]# vim myflask.py
寫入一下內容python
#coding:utf8 from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080)
拷貝本地的yum倉庫到容器內部空間mysql
[root@localhost mydocker]# cp /etc/yum.repos.d/CentOS-Base.repo . [root@localhost mydocker]# cp /etc/yum.repos.d/epel.repo . [root@localhost mydocker]# ll 總用量 12 -rw-r--r--. 1 root root 2523 3月 14 19:29 CentOS-Base.repo -rw-r--r--. 1 root root 664 3月 14 19:30 epel.repo -rw-r--r--. 1 root root 176 3月 14 19:19 myflask.py
建立Dockerfile文件,必須大寫的D開頭linux
[root@localhost mydocker]# touch Dockerfile
寫入內容sql
FROM centos #指定一個基礎鏡像 COPY CentOS-Base.repo /etc/yum.repos.d/ #拷貝本地的yum倉庫,到容器空間內 COPY epel.repo /etc/yum.repos.d/ RUN yum clean all #清除yum緩存 RUN yum install python-setuptools -y RUN easy_install flask #linux默認使用python2,想要使用python3使用RUN 執行命令安裝 COPY myflask.py /opt/ WORKDIR /opt EXPOSE 8080 #暴露容器的8080端口,供給物理機去映射訪問,myflask.py 設置的端口 CMD ["python","myflask.py"] #cmd表明執行命令
[root@localhost mydocker]# ls CentOS-Base.repo Dockerfile epel.repo myflask.py
確保文件在同一目錄docker
[root@localhost mydocker]# ll 總用量 16 -rw-r--r--. 1 root root 2523 3月 14 19:29 CentOS-Base.repo -rw-r--r--. 1 root root 281 3月 14 20:47 Dockerfile -rw-r--r--. 1 root root 664 3月 14 19:30 epel.repo -rw-r--r--. 1 root root 176 3月 14 19:19 myflask.py
[root@localhost mydocker]# docker build . 會去執行當前目錄中的Dockerfile文件
構建了一個ID爲a7f439ad8953 的鏡像 ---> a7f439ad8953 Successfully built a7f439ad8953
[root@localhost mydocker]# docker tag a7f myflask [root@localhost mydocker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE myflask latest a7f439ad8953 3 minutes ago 346MB
運行鏡像,生成容器實例shell
[root@localhost mydocker]# docker run -p 8080:8080 -d a7f e6e1721be1c346f05c8913c2efed6bb3f3564f97ff6b2e64caad18d64c6a5e32 [root@localhost mydocker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e6e1721be1c3 a7f "python myflask.py" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp thirsty_swanson
查看容器的映射狀態flask
[root@localhost mydocker]# docker port e6e 8080/tcp -> 0.0.0.0:8080
訪問windowsubuntu
http://192.168.11.174:8080/