文章目录
Dockerfile是什么
- DockerFile是构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
- 步骤:
- 编写Dockerfile文件
- docker build
- docker run
DockerFile内容的基础知识
- 每条保留字指令必须为大写字母且后面跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交。
大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit 的操作提交一个新的镜像层
- docker 再基于刚提交的镜像运行一个容器
- 执行dockerfile中的下一条指令直到所有指令执行完成
dockerfile、docker镜像、docker容器对比
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
-
Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
-
Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
-
Docker容器,容器是直接提供服务的。
dockerfile体系结构
- FROM :基础镜像,当前镜像是基于那个镜像
- MAINRAINER :镜像维护者的姓名与邮箱
- RUN :容器构建时需要运行的命令
- EXPOSE: 当前容器对外暴露出的端口号
- WORKER: 指定在创建容器后,终端默认登陆的
- ENV:用来在构建镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
- VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要执行的命令,dockerfile中可以存在多个CMD,但是只有最后一个生效,前面会被覆盖 - ENTRYPOINT:指定一个容器启动时要执行的命令,和CMD一样,都是在指定容器启动程序和参数
- ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发(父镜像被执行)
案例
base镜像(scratch)
Docker hub 中百分之九十九镜像都是在base镜像中安装和配置需要的软件构件出来的
自定义镜像mycentos
1.编写
-
自定义mycentos目的使我们自己的镜像具备如下:
登陆后的默认路径
vim编辑器
查看网络配置ifconfig支持 -
准备编写Dockerfile文件:新建一个Dockerfile文件
-
MyCentos内容的Dockerfile:
FROM centos MAINTAINER zzyy<zzyy167@126.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 "success--------------ok" CMD /bin/bash
2.构建
docker build -f [dockerfile文件目录] -t [新镜像名字:TAG]
3.运行
docker run -it [新镜像名字:TAG]
4.列出镜像的变更历史
docker histrory [镜像名]
CMD/ENTRYPOINT 镜像实例
- 都是指定一个容器启动时要执行的命令
- CMD(会被覆盖):
Dockerfile可以有多个CMD命令,但只有最后一个生效,CMD会被docker run 之后的参数替代 - ENTRYPOINT(会被追加组合):
docker run 之后的参数会被当做多个参数传递给ENTRYPOINT ,与新的命令组合。
自定义镜像tomcat9
- mkdir -p /mydockerfile/tomcat9
- touch c.txt
- 将JDK和tomcat安装的压缩包拷贝到上一步的目录: cp [安装包目录] .
- 在上面目录先新建Dockerfile文件:
FROM centos
MAINTAINER liu<liu@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin
- 构建
docker build -f [dockerfile文件目录] -t [新镜像名字] - run
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true
(Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
解决办法:在挂载目录后多加一个–privileged=true参数即可) - 登录端口验证
- 结合此前的容器卷知识将测试的web服务test发布
在主机下操作(因为数据卷与tomcat容器中同步):
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>test</display-name>
</web-app>
a.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
-----------welcome------------
<%="i am in docker tomcat self "%>
<br>
<br>
<% System.out.println("=============docker tomcat self");%>
</body>
</html>
然后重启tomcat,更改宿主机内jsp文件内容,测试数据卷同步。