Dockerfile是一个文本文件,其内包含了一行行的指令和参数,每一行指令构建一层,所以每一行指令的内容,就是描述该层应当如何构建;它们极大简化了从头至尾流程上的部署工做;Dockerfile从FROM命令开始,紧接着跟随者各类方法,命令和参数,并最终产出一个新的能够用于建立容器的镜像。html
指令mysql |
描述linux |
示例nginx |
FROMc++ |
必须为第一个命令,指定基础镜像sql |
FROM centos:latestdocker |
MAINTAINERshell |
这个命令用于声明做者,应该放在FROM的下一行apache |
MAINTAINER wzscentos |
RUN |
构建镜像时执行的shell命令,是Dockerfile执行命令的核心部分;
|
RUN yun install httpd RUN [“yum”,”install ”,”httpd”] |
CMD |
与RUN命令类似,都是执行shell命令;和RUN不一样的是,RUN在构建镜像过程当中执行,CMD是在用镜像构建容器后被调用;若是咱们在 docker run时指定了命令或者有entrypoint,那么CMD会被覆盖;Dockerfile中多个CMD命令仅最后一个生效 |
用法一:不带中括号 CMD echo "hello cmd!" 用法二:带中括号,默认无任何shell CMD ["/bin/bash", "-c", "echo 'hello cmd!'"] 用法三:传参给ENTRYPOINT CMD [“-l”] |
ENTRYPOINT |
与CMD命令类似,都是运行容器时执行的shell命令;与CMD不一样的是,CMD能够在执行docker run的时候指定命令覆盖,ENTRYPOINT则只有使用--entrypoint才能覆盖;CMD和ENTRYPOINT能够搭配使用,ENTRYPOINT用作固定命令,CMD用作ENTRYPOINT中命令携带的可变参数 |
用法一:不使用[]任何run和CMD都不能被传入,也会覆盖CMD ENTRYPOINT /bin/bash -c ‘start.sh’ 用法二:使用[]可传入CMD中的-l参数,即ls -l CMD [“-l”] ENTRYPOINT [“ls”] |
EXPOSE |
暴露容器的端口;还能够指定端口是侦听TCP仍是UDP,默认为TCP |
EXPOSE 80,443 EXPOSE 80/udp |
ENV |
设置容器内的环境变量,能够在启动容器时--env <key>=<value>修改环境变量的值 |
ENV MYSQL_ROOT_PASSWD 123456 |
ADD |
拷贝文件或目录到镜像,若是是URL或压缩包会自动下载或解压 |
ADD https://xxx.com/html.tar.gz /var/www/html ADD html.tar.gz /var/www/html |
COPY |
拷贝文件或目录到镜像 |
COPY ./test.txt /tmp/test.txt |
USER |
为RUN、CMD、ENTRYPOINT、COPY、ADD执行命令指定运行用户 |
USER wzs |
WORKDIR |
为RUN、CMD、ENTRYPOINT、COPY、ADD设置工做目录 |
WORKDIR /data |
ARG |
在构建镜像时指定一些参数 |
ARG user USER $user |
说明:因CMD和ENTRYPOINT的用法比较复杂,这里举几个案例对CMD、ENTRYPOINT的区别和用法进行解读
案例一:CMD用法1
docker build -t cmd:v1 -f /var/Dockerfile/cmd-1.txt /var/Dockerfile/
使用Dockerfile构建cmd:v1镜像后,执行docke run cmd:v1能够看到使用了Dockfile中的CMD echo “123” 命令
执行docke run cmd:v1 echo “abc” 会将Dockfile中的CMD命令覆盖
案例二:CMD用法2
docker build -t cmd:v2 -f /var/Dockerfile/cmd-2.txt /var/Dockerfile/
使用[]中括号方式;这时,命令没有再任何shell终端环境下,若是咱们要执行shell,必须把shell加入到中括号的参数中
执行docker run cmd:v2 ls /tmp/ 会将Dockfile中的CMD命令覆盖
案例三:CMD用法3,ENTRYPOINT用法1
CMD的第三种用法用于传参,不携带任何命令;因此要配合ENTRYPOINT使用
Dockefile文件中ENTRYPOINT中的echo 做为命令,CMD的 “hello cmd”做为传参,执行后以下:
也能够在docker run时携带参数 “hello entrypoint” 覆盖CMD的内容
案例四:CMD用法3,ENTRYPOINT用法2
当Dockerfile中的ENTRYPOINT不使用中括号后,会覆盖CMD的内容;docker run只会执行ENTRYPOINT
docker run时携带任何参数或命令都没法被传入到entrypoint里
案例1、tomcat部署
首先建立一个制定tomcat镜像的目录,存放镜像所需的安装包和Dockerfile文件
Dockerfile文件内容
#使用基础镜像
FROM centos:latest
#注明做者
MAINTAINER wzs
#建立目录
RUN mkdir -p /usr/local
#添加安装包到镜像
ADD apache-tomcat-7.0.93.tar.gz /usr/local/
ADD jdk-8u221-linux-x64.tar.gz /usr/local/
#定义环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CATALINA_HOME /usr/local/apache-tomcat-7.0.93
ENV PATH $CATALINA_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#暴露端口
EXPOSE 8080
#启动时运行tomcat进程
CMD ["/usr/local/apache-tomcat-7.0.93/bin/catalina.sh","run"]
使用Dockerfile构建镜像
docker build -t tomcat:v1 -f ./Dockfile.txt ./
使用镜像建立并运行容器
docker run -itd --name tomcat-docker -p 8081:8080 tomcat:v1
案例2、nginx部署
建立一个制定nginx镜像的目录,存放镜像所需的安装包和Dockerfile文件
Dockerfile文件内容
#使用基础镜像
FROM centos:latest
#声明做者
MAINTAINER wzs
#安装依赖库
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssh-devel zlib
#添加安装包到镜像
ADD nginx-1.8.0.tar.gz /usr/local
#编译部署
RUN cd /usr/local/nginx-1.8.0 && \
./configure --prefix=/usr/local/nginx && \
make && \
make install
#删除安装包文件
RUN rm -rf /usr/local/nginx-1.8.0
#暴露端口
EXPOSE 80
#定义工做目录
WORKDIR /usr/local/nginx
#启动时运行nginx
CMD ["./sbin/nginx","-g","daemon off;"]
使用Dockerfile文件构建镜像
docker build -t nginx:v1 -f ./Dockerfile.txt ./
使用镜像建立运行容器
docker run -itd --name nginx-docker -p 81:80 nginx:v1
案例3、mysql部署
建立一个制定tomcat镜像的目录,由于mysql使用yum安装;因此这里只有Dockerfile文件
Dockerfile文件内容
#使用基础镜像
FROM centos:latest
#做者
MAINTAINER wzs
#添加mysql用户
RUN useradd -d /opt/mysql mysql
#下载mysql的yum安装包文件
ADD http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm /opt/
RUN rpm -ivh /opt/mysql-community-release-el7-5.noarch.rpm
#安装mysql-server
RUN yum install -y mysql-server
#mysql初始化
RUN mysql_install_db --user=mysql --basedir=/usr/ --ldata=/var/lib/mysql/
#暴露端口
EXPOSE 3306
#这里使用CMD和ENTRYPOINT组合,ENTRYPOINT中为mysql服务启动的固定命令,CMD指定mysql的运行用户,所在docker run时能够覆盖修改
CMD ["--user=mysql"]
ENTRYPOINT ["/usr/sbin/mysqld"]
使用Dockerfile构建mysql镜像
docker build -t mysql:v1 -f ./Dockerfile ./
使用镜像建立运行容器
docker run -itd --name mysql-docker mysql:v1