[TOC]
## Dockerfile介紹
Dockerfile是docker構建鏡像的基礎,也是docker區別于其他容器的重要特征,正是有了Dockerfile,docker的自動化和可移植性才成為可能。
不論是開發還是運維,學會編寫Dockerfile幾乎是必備的,這有助于你理解整個容器的運行。
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, 則直接命令參數傳入
比如要有使容器為“掛起”狀態,否則容器運行不起,如果沒有命令使用,或者使用命令報錯,可以先用“/bin/bash” 或者 “sh”
>[info] - 盡量將一些常用不變的指令放到前面
> - CMD和ENTRYPOINT盡量使用json數組方式
**通過Dockerfile構建image**
# 構建
docker build -t allovince/php-helloworld:v1 .
# 運行并綁定端口8080
docker run -d -p 8080:8080 allovince/php-helloworld
## Dockerfile示例
#使用的基礎鏡像
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
#開放22、80、443端口
EXPOSE 22
EXPOSE 80
EXPOSE 443
#設置生成容器時需要執行的腳本
CMD ["/usr/local/nginx/sbin/nginx","start"]
構建鏡像
docker build -t nginx:v1 .
## 注意Dockerfile中的CD命令坑
- [RUN 中 cd 切換路徑失敗 的原因、解決](https://blog.csdn.net/jiangyu1013/article/details/82255353)
> 每一個?`RUN`?都會啟動一個容器、執行命令、然后提交存儲層文件變更。所以CD只能在當前“Run”中有效。
## 參考鏈接
* [dockerfile關鍵字筆記](https://www.jianshu.com/p/6bc1585552c9)