Dockerfile介紹
Dockerfile是docker構建鏡像的基礎,也是docker區別於其他容器的重要特徵,正是有了Dockerfile,docker的自動化和可移植性才成爲可能。
不論是開發還是運維,學會編寫Dockerfile幾乎是必備的,這有助於你理解整個容器的運行。
FROM , 從一個基礎鏡像構建新的鏡像
FROM ubuntu
MAINTAINER , 維護者信息
MAINTAINER William <[email protected]>
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] - 儘量將一些常用不變的指令放到前面
- 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 ([email protected])
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 .