一、Dockerfile介绍
Dockerfile是用来构建docker镜像的文件,是命令参数脚本。
构建步骤
1、编写一个Dockerfile文件。
2、docker build 构建成为一个镜像。文件名字任意 ,-f 指定文件,如果未使用-f 指定文件名字,会默认去找名字为Dockerfile的文件。推荐使用Dockerfile命名,这样便可以不用指定文件名。
3、docker run 运行镜像
4、docker push 发布镜像(发布到DockerHub、阿里云镜像仓库等)
docker hub官网,每个镜像都可点进去查看dockerfile源码
二、Dockerfile指令
Dockerfile执行流程
基础知识
1、每个命令都是大写字母
2、dockerfile执行从上向下依次执行
3、#代表注释
4、每行指令都会创建一个新的镜像层,并提交
注:从百度图片搜索图片可以更好的理解知识点。 很好的学习方法。
dockerfile镜像逐渐成为企业的交付标准,必须掌握。
Dockerfile:构建镜像的命令脚本
dockerImages:通过dockerfile构建生成的镜像。可通过命令,让启动容器后,自动运行指定程序
docker容器:容器就是镜像运行起来提供服务的。
Dockerfile指令
MAINTAINER:镜像的作者,一般是姓名+邮箱
ONBUILD:当构建一个被继的 DockerFile 时就会运行ONBUILD 的指令。是一个触发指令。
CMD:docker run 容器 ,启动容器时会自动运行CMD指定的命令。会被docker run 容器 命令 的命令覆盖CMD的命令运行。如果Dockerfile文件有多个CMD,构建时都会执行,但是镜像构建好,以后启动容器时,只有最后一个CMD会执行。
WORKDIR:镜像的工作目录。进入容器后,直接进入此目录。不指定默认根目录 /
RUN和CMD区别? RUN是镜像编译时运行命令,CMD是容器启动时运行命令。
CMD和ENTRYPOINT区别?启动容器后会运行的命令。docker run -it 镜像名 新命令。新命令就是容器启动后执行的命令,会覆盖CMD指定的指令,而新命令+ENTRYPOINT指定的指令会作为最终指令在容器启动后运行。
COPY和ADD区别?ADD会解压文件并导入,COPY不会解压,仅是导入。
CMD和ENTRYPOINT区别
测试CMD命令
(1)编写Dockerfile文件
[root@fang2 docker_lesson]# cat dockerfile_cmd_test FROM centos:centos7 CMD ["ls","-a"]
(2)构建镜像
[root@fang2 docker_lesson]# docker build -f dockerfile_cmd_test -t cmdtest . Sending build context to Docker daemon 4.096kB Step 1/2 : FROM centos:centos7 ... Successfully tagged cmdtest:latest
(3)从镜像启动容器
[root@fang2 docker_lesson]# docker run cmdtest .dockerenv ... var
(4)想追加一个 -l参数。即 ls -a -l
[root@fang2 docker_lesson]# docker run cmdtest -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
CMD情况下,-l替换了CMD ["ls","-a"]命令,而-l不是命令,所以报错。
测试ENTRYPONT(1)编写Dockerfile
[root@fang2 docker_lesson]# cat dockerfile_entrypoint_test FROM centos:centos7 ENTRYPOINT ["ls","-a"]
(2)构建镜像和上面相同。 此处省略。直接从镜像启动容器
-l直接追加到了ENTRYPOINT ["ls","-a"]命令,即ls -a -l。
[root@fang2 docker_lesson]# docker run entry -l total 12 drwxr-xr-x 1 root root 6 Mar 12 20:37 . 。。。 drwxr-xr-x 18 root root 238 Nov 13 2020 var
实战测试
Docker Hub 中99%镜像都是从这个基础镜像过来的 FROM scratch, 然后配置需要的软件和配置来构建自己的镜像。scratch类似于引导加载。
构建centos
docker hub上的centos进具备基础功能,vim、ipconfig等功能不具备。有时镜像需要这些命令,故构建。
(1)编写Dockerfile
文件名字任意 -f 指定文件,如果未使用-f 指定文件名字,会默认去找名字为Dockerfile的文件。推荐使用Dockerfile命名。
FROM centos:centos7 MAINTAINER fang<1542755282@qq.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "----end----" CMD /bin/bash
注:
- 如果镜像yum安装失败,是因为镜像里面基于的基础镜像Centos有问题,而不是宿主机有问题。
- 不要使用FROM centos,此时会默认下载centos最新版本centos8,centos8 yum安装软件时会遇见问题。
(2)build
0.1是版本号,不指定会默认latest
docker build -f mydockerfile-centos -t fang/centos:0.1 .
(3)运行镜像
官网镜像是没有vim、ifconfig功能的。新建镜像都有了。
docker run -it fang/centos:0.1 命令 。命令可以覆盖CMD指定的命令。命令是容器启动后执行的命令。上面的镜像CMD /bin/bash,因此容器启动后自动进入bash。
docker run -it fang/centos:0.1
(4)docker history 查看镜像构建历史
可以查看官网镜像的构建历史
构建tomcat
(1)准备镜像文件需要的Tomcat压缩包,jdk的压缩包。官网下载。tomcat和jdk解压后的文件路径需要知道,用来设置环境变量。
(2)编写dockerfile文件,官方命名
Dockerfile
,build
命令会自动寻找Dockerfile文件,就不需要 -f 指定了易错:jdk解压后的文件名字
FROM centos:centos7 MAINTAINER Fang<1542755282@qq.com> COPY ./reademe.txt /user/local/readme.txt ADD ./apache-tomcat-8.5.76.tar.gz /usr/local/ ADD ./jdk-8u311-linux-x64.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_311 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.76 ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.76 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-8.5.76/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.76/bin/logs/catalina.out
(3)构建镜像
docker build docker build -t mytomcat .
(4)运行镜像容器
docker run -d -p 8088:8080 -v /opt/docker_lesson/tomcat/webapps:/usr/local/apache-tomcat-8.5.76/webapps/ -v /opt/docker_lesson/tomcat/logs:/usr/local/apache-tomcat-8.5.76/logs mytomcat
(5)测试端口是否可访问 localhost:8088
(6)发布项目到容器
宿主机的webapps会自动同步到容器内部的webapps下。因此以后向容器tomcat发布项目可以直接放在宿主机webapps目录下即可。下面示例向宿主机放了test项目。
test文件夹包含WEB_INF文件夹,WEB_INF文件夹里面包含web.xml 和 index.jsp.为web项目最简单形式。
[root@fang2 WEB_INF]# cat index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> Hello world </body> </html>
[root@fang2 WEB_INF]# cat web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> </web-app> [root@a8b151536342 WEB_INF]# cat web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> </web-app>
(7)测试项目是否成功
目前一直失败 不知道什么原因
构建jar程序
1.编写jar程序
2.编写Dockerfile jar程序放在Dockerfile同级目录下
FROM java:7 ARG gitUrl="https://gitee.com/pan648540858" VOLUME /tmp ADD app.jar app.jar RUN bash -c 'touch /app.jar' EXPOSE 8080 WORKDIR /opt/wvp ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
3.docker服务器运行
docker build -t demoJar:7 文件名字任意 ,-f 指定文件,如果未使用-f 指定文件名字,会默认去找名字为Dockerfile的文件。推荐使用Dockerfile命名,这样便可以不用指定文件名。
4.启动容器