docker build命令用于根据给定的Dockerfile构建Docker镜像
docker build语法:docker build -t nginx:v1 .常见选项说明:--build-arg,设置构建时的变量--no-cache,默认false。设置该选项,将不使用Build Cache构建镜像--pull,默认false。设置该选项,总是尝试pull镜像的最新版本--compress,默认false。设置该选项,将使用gzip压缩构建的上下文--disable-content-trust,默认true。设置该选项,将对镜像进行验证--file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’--isolation,默认--isolation="default",即Linux命名空间;其他还有process或hyperv--label,为生成的镜像设置metadata--squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag--network,默认default。设置该选项,Set the networking mode for the RUN instructions during build--quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success--force-rm,默认false。设置该选项,总是删除掉中间环节的容器--rm,默认--rm=true,即整个构建过程成功后删除中间环节的容器格式说明:命令要大写,"#"是注解。每一个指令后面需要跟空格,语法。FROM 命令是告诉docker 我们的镜像什么从哪里下载。MAINTAINER 是描述 镜像的创建人。RUN 命令是在镜像内部执行。就是说他后面的命令应该是针对镜像可以运行的命令。Dockerfile文件说明:FROM python:2.7-slim# 使用官方提供的 Python 开发镜像作为基础镜像# 指定"python:2.7-slim"这个官方维护的基础镜像,从而免去安装 Python 等语言环境的操作。:WORKDIR /app ---cd /app# 将工作目录切换为 /app,意思是在这一句之后,Dockerfile 后面的操作都以这一句指定的 /app 目录作为当前目录。ADD . /app# 将当前目录下的所有内容复制到 /app 下 Dockerfile 里的原语并不都是指对容器内部的操作。比如 ADD,指的是把当前目录(即 Dockerfile 所在的目录)里的文件,复制到指定容器内的目录当中。RUN pip install --trusted-host pypi.python.org -r requirements.txt# 使用 pip 命令安装这个应用所需要的依赖EXPOSE 80# 允许外界访问容器的 80 端口ENV NAME World# 设置环境变量CMD ["python", "app.py"]# 设置容器进程为:python app.py,即:这个 Python 应用的启动命令,这里app.py 的实际路径是 /app/app.py。CMD ["python", "app.py"] 等价于 "docker run python app.py"。实战练习:创建一个jenkins的Dockerfile准备工作:mkdir jenkinscd jenkins 上传jdk,maven,tomcat,jenkins的包vim DockerfileFROM centos:7ADD jdk-8u211-linux-x64.tar.gz /usr/local/ADD apache-tomcat-8.5.69.tar.gz /usr/local/ADD apache-maven-3.8.1-bin.tar.gz /usr/local/jdk1.8.0_211/ENV JAVA_HOME /usr/local/jdk1.8.0_211/ENV MAVEN_HOME /usr/local/jdk1.8.0_211/apache-maven-3.8.1/ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.69/ENV PATH $JAVA_HOME/bin:$MAVEN_HOME/bin:$TOMCAT_HOME/bin:$PATHRUN rm -rf /usr/local/apache-tomcat-8.5.69/webapps/*ADD jenkins.war /usr/local/apache-tomcat-8.5.69/webapps/EXPOSE 8080ENTRYPOINT ["/usr/local/apache-tomcat-8.5.69/bin/catalina.sh","run"]docker build -t jenkins:v1 .docker run -itd --name jenkins -p 8081:8080 jenkins:v1网页登录:http://localhost:8080/jenkinsCMD与ENTRYPOINT区别一、Dockerfile中的CMD1、每个Dockerfile中只能有一个CMD如果有多个那么只执行最后一个。2、CMD 相当于启动docker时候后面添加的参数看,举个简单例子:# docker run -itd --name test image(镜像) /bin/bash -ca、镜像名称后面跟了一个/bin/bash -c ,其实等价于在dockerfile中的CMD ["/bin/bash","-c"]。b、如果dockerfile中的CMD中有了CMD["/bin/bash","-c"],那么就不用在执行的时候再添加了,如果添加了参数的话那么就相当于要执行你添加的参数,默认的CMD中的参数就无效了。二、Dockerfile中的ENTRYPOINT1、一个Dockerfile中ENTRYPOINT也只能存在一个,若存在多个那么只执行最后一个,你可以理解为开机启动的意思,和CMD有点像,不过还是有区别。2、举个简单例子:a、Dockerfile中有ENTRYPOINT ["tail","-f","/var/log/nginx/access.log"],那么启动的时候镜像就执行了这个里面的内容,如果你像上面带参数的话就相当于在这个执行的内容后面再加入参数。案例:如果我们的dockerfile中有a中的这句话然后我们启动我们的docker:# docker run -itd --name test image(镜像名) /bin/bash -c此时就相当于我们启动docker的时候执行了:tail -f /var/log/nginx/access.log /bin/bash -c这个命令明显就不对参考链接:https://blog.csdn.net/k_520_w/article/details/111731198
