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