1.dockerfile介紹
鏡像分類:
- 基礎鏡像:例如centos、Ubuntu、alpine
- 環境鏡像:例如Java、php、go
- 項目鏡像:將項目與環境鏡像打包一起
2.Dockerfile常用指令
指令 描述
FROM 構建新鏡像是基於哪個鏡像
LABEL 標簽
RUN 構建鏡像時運行的shell命令
COPY 拷貝文件或目錄到鏡像中
ADD 解壓壓縮包並拷貝
ENV 設置環境變量
USER 為RUN、CMD和ENTRYPOINT執行命令指定運行用戶
EXPOSE 聲明容器運行的服務端口
WORKDIR 為RUN、CMD、ENTRYPOINT、COPY和ADD設置工作面目錄
CMD 運行容器時默認執行,如果有多個CMD指令,最后一個生效
ENTRYPOINT 如果與CMD一起用,CMD將作為ENTRYPOINT的默認參數
如果有多個ENTRYPOINT指令,最后一個生效
3.docker build構建鏡像
#docker bulid -t 鏡像名 -f 指定Dockerfile文件位置
#docker build -t test .
#docker build -t 鏡像名稱 -f /path/Dockerfile/path
#docker build -t 鏡像名稱 http://www.example.com/Dockerfile
#mkdir chao
#cd chao/
#touch a.txt
#cp /root/ansible-2.4.2.0-2.el7.noarch.rpm .
#vim Dockerfile
FROM centos:7
RUN yum -y install wget curl
COPY a.txt /opt
ADD ansible-2.4.2.0-2.el7.noarch.rpm /opt
ENV ABC=123
EXPOSE 80
WORKDIR /usr/local
CMD ["sleep","36000"]
#docker build -t test . 構建
- CMD與ENTRYPOINT區別
CMD用法:
CMD [“executable”,”參數1”,”參數2”]: exec形式(首選) executable可執行路徑,
CMD [“param1(參數1)”,”param2”]: 作為ENTRYPOINT的默認參數
CMD command param1 param2 : Shell形式
ENTRYPOINT用法
ENTRYPOINT [“executable”,”param1”,”param2”]
ENTRYPOINT command param1 param2
小結:
- CMD和ENTRYPOINT指令都可以用來定義運行容器時使用的默認命令
- Dockerfile至少指定一個CMD或ENTRYPOINT
- CMD可以用作ENTRYPOINT默認參數,或者用作容器的默認命令
- docker run指定<command>時,將會覆蓋CMD
- 如果是可執行文件,希望運行時傳參,應該使用ENTRYPOINT
5.前端項目鏡像構建與部署:nginx
FROM centos:7
RUN yum -y install wget curl gcc gcc-c++ make openssl-devel pcre-devel gd-devel \
iproute net-tools telnet && \
yum clean all && \
rm -rf /var/cache/yum/*
ADD nginx-1.15.5.tar.gz /
RUN cd nginx-1.15.5 && \
./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module && \
make -j 4 && make install && \
mkdir /usr/local/nginx/conf/vhost && \
cd / && rm -rf nginx* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/nginx/sbin
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
6.php項目鏡像構建
FROM centos:7
RUN yum -y install epel-release && \
yum -y install gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && yum clean all && \
rm -rf /var/cache/yum/*
ADD php-5.6.36.tar.gz /
RUN cd php-5.6.36 && \
./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm --enable-opcache \
--with-mysql --with-mysqli --with-pdo-mysql \
--with-openssl --with-zlib --with-curl --with-gd \
--with-jpeg-dir --with-png-dir --with-freetype-dir \
--enable-mbstring --with-mcrypt --enable-hash && \
make -j 4 && make install && 、
cp php.ini-production /usr/local/php/etc/php.ini && \
cp sapi/fpm/php-fpm.conf /usr/local/php/etc/php-fpm.conf && \
sed -i “90a \daemonize = no” /usr/local/php/etc/php-fpm.conf && \
mkdir /usr/local/php/log && \
cd / && rm -rf php* && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/php/sbin
COPY php.ini /usr/local/php/etc/
COPY php-fpm.conf /usr/local/php/etc/
WORKDIR /usr/local/php
EXPOSE 9000
CMD ["php-fpm"]
7.java項目鏡像構建tomcat
FROM centos:7
ENV VERSION=8.5.43
RUN yum -y install java-1.8.0-openjdk wget curl unzip iproute net-tools && \
yum clean all && \
rm -rf /var/cache/yum/*
ADD apache-tomcat-${VERSION}.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-${VERSION} /usr/local/tomcat && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"'
/usr/local/tomcat/bin/catalina.sh && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV PATH $PATH:/usr/local/tomcat/bin
WORKDIR /usr/local/tomcat
EXPOSE 8080
CMD ["catalina.sh","run"]
編寫Dockerfile最佳實踐
減少鏡像層:一次RUN指令形成新得一層,盡量Shell命令都寫在一行,減少鏡像層
優化鏡像大小:一個RUN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,都會帶到下一層,所以要在每一層清理對應的殘留數據,減少鏡像大小
減少網絡傳輸時間:例如軟件包、mvn倉庫等
多階段構建:代碼編譯、部署在一個dockerfile完成,只會保留部署階段產生的數據
選擇最小的基礎鏡像:例如alpine