鏡像是容器的基礎,每次執行docker run的時候都會指定哪一個鏡像做爲容器運行的基礎,咱們以前的例子都是使用來自docker hub的鏡像。直接使用這些鏡像只能知足必定的需求,當鏡像沒法知足咱們的需求時,就得自定製這些鏡像。python
鏡像的定製就是定製每一層所添加的配置、文件。若是把每一層修改,安裝,構建,操做的命令都寫入到一個腳本,用腳原本構建、定製鏡像,這個腳本就是Dockerfile。mysql
Dockerfile是一個文本文件,其內部包含一條條指令, 每一條指令構建一層,所以每一條指令的內容,就是描述該層應當如何構建linux
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=「zouzou0214" #對於複雜的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 and COPY ADD hello / #把本地文件添加到鏡像中(和Dockerfile同級),把本地的hello可執行文件拷貝到鏡像的/目錄 ADD test.tar.gz / #添加到根目錄並解壓 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」]
1.先準備一段flask代碼sql
myflask.pydocker
from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker,i am is zouzou" if __name__=="__main__": app.run(host='0.0.0.0',port=8080)
2.準備傳到docker容器裏的文件shell
[root@HH tmp]# ls CentOS-Base.repo Dockerfile epel.repo myflask.py
3.製做Dockerfileflask
FROM centos LABEL maintainer="zouzou0214" ADD CentOS-Base.repo /etc/yum.repos.d/ ADD epel.repo /etc/yum.repos.d/ RUN yum clean all RUN yum install python-pip -y RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask COPY myflask.py /app/ WORKDIR /app/ EXPOSE 8081 CMD ["python","myflask.py"]
4.構建docker鏡像ubuntu
docker build -t zouzu0214/my-docker-flask .
注意:最後面有個.(點)表明從當前目錄buildvim
構建當前目錄的Dcokerfile,而後構建出一個名爲yuchao163/s14-flask-docker 這個的鏡像文件centos
-t tag參數,給鏡像加上標記名
dockerhub帳戶名:zouzou0214,dockerhub帳戶名/鏡像名 ,是爲了後面講docker鏡像,推送到dockerhub
5.查看鏡像是否構建成功:docker images
[root@HH tmp]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zouzu0214/my-docker-flask latest 845652a3022e 12 seconds ago 346MB centos latest 67fa590cfc1c 5 weeks ago 202MB
我本地是沒有centos鏡像的,會去先下載一個centos鏡像,而後基於該鏡像構建
6.運行鏡像
[root@HH tmp]# docker run -d -p 9000:8081 8456 bcd4e98ba419f5eaf3c9f43e64d9b1dd2558fddb2316be84b46fdf656318ab64
docker run -p 9000:8081 -d 8456
-p 映射9000端口到容器的8081
-d 後臺運行
8456 鏡像id
7.查看已經運行的docker實例
[root@HH tmp]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 44a53f62f533 76a7 "/sbin/tini -- /usr/…" 11 hours ago Up 11 hours 50000/tcp, 0.0.0.0:8000->8080/tcp MyJenkins