Dockerfile是docker構建鏡像的基礎,也是docker區別於其餘容器的重要特徵,正是有了Dockerfile,docker的自動化和可移植性才成爲可能。php
不管是開發仍是運維,學會編寫Dockerfile幾乎是必備的,這有助於你理解整個容器的運行。nginx
FROM , 從一個基礎鏡像構建新的鏡像 FROM ubuntu MAINTAINER , 維護者信息 MAINTAINER William <wlj@nicescale.com> ENV , 設置環境變量 ENV TEST 1 RUN , 非交互式運行shell命令 RUN apt-get -y update RUN apt-get -y install nginx ADD , 將外部文件拷貝到鏡像裏,src能夠爲url ADD http://nicescale.com/ /data/nicescale.tgz # 將index.php複製到容器內的/var/www目錄下 # 會自動解壓tar包 ADD index.php /var/www/ # 用copy而不用add,由於ADD指令會自動解壓tar文件 COPY redis.tgz /home/redis.tgz # 設置工做目錄,exec進入容器就直接進入到這個目錄中 WORKDIR /path/to/workdir WORKDIR /var/www USER , 設置用戶ID USER nginx # 設置volume, 聲明一個數據卷, 可用於掛載, []裏面是路徑 # 出於可移植和分享的考慮,用於-v主機目錄:容器目錄這種方法不可以直接在DockerFile中實現 # 可自行建立軟連接實現特定目錄掛載 VULUME <#dir> VOLUME ['/data'] EXPOSE , 暴露哪些端口 EXPOSE 80 443 ENTRYPOINT ["executable", "param1","param2"]執行命令 ENTRYPOINT ["/usr/sbin/nginx"] # 通常只用cmd就能夠了 CMD ["param1","param2"] CMD ["start"] docker建立、啓動container時執行的命令 # 若是設置了ENTRYPOINT,則CMD將做爲參數 # 若是沒有設置ENTRYPOINT, 則直接命令參數傳入
[info] - 儘可能將一些經常使用不變的指令放到前面redis
- CMD和ENTRYPOINT儘可能使用json數組方式
經過Dockerfile構建imagedocker
# 構建 docker build -t allovince/php-helloworld:v1 . # 運行並綁定端口8080 docker run -d -p 8080:8080 allovince/php-helloworld
#使用的基礎鏡像 FROM centos #做者信息 MAINTAINER by caiwen (xiaogang.zhou@qq.com) WORKDIR /usr/local/src #安裝wget RUN yum install -y wget #下載並解壓源碼包 RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz RUN tar -zxvf nginx-1.8.0.tar.gz WORKDIR nginx-1.8.0 #編譯安裝nginx RUN yum install -y gcc make pcre-devel zlib-devel RUN ./configure --prefix=/usr/local/nginx --with-pcre RUN make RUN make install #修改Nginx配置文件,以非daemon方式啓動 RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf #開放2二、80、443端口 EXPOSE 22 EXPOSE 80 EXPOSE 443 #設置生成容器時須要執行的腳本 CMD ["/usr/local/nginx/sbin/nginx","start"]
構建鏡像shell
docker build -t nginx:v1 .