Docker(四) 通过DockerFile自定义镜像

简介: Docker(四) 通过DockerFile自定义镜像

一、概述



从应用的角度来看,DockerFile、Images和Container分别代表软件的三个不同阶段。


DockerFile:软件的原材料(镜像构建脚本),面向开发

Images:软件交付产品,交付标准

Container:软件的运行状态,设计部署与运维

640.png

DokcerFile-image-container关系图


二、dockerfile保留字



  1. FROM:指定当前镜像是基于哪个镜像,即指定父镜像(相当于java extends 指定父类),第一条指令必须为 FROM 指令。并且,如果在同一个Dockerfile中创建多个镜像时,可以使用多个 FROM 指令(每个镜像一次)。


FROM 或FROM :


FROM centos


  1. MAINTAINER:指定镜像维护者名称和邮箱

MAINTAINER javacfox<javacfox@sina.com>


  1. RUN:容器构建时需要运行的命令

RUN

RUN ["executable", "param1", "param2"]


RUN yum -y install vim


  1. EXPOSE:指定当前容器对外暴露的端口

EXPOSE[...]


EXPOSE 8080


  1. WORKDIR:指定终端默认登录目录,通常和ENV搭配使用,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径

WORKDIR /path/to/workdir


WORKDIR /usr/local/tomcat


  1. ENV:用来在镜像构建过程中设置环境变量

ENV


ENV MYPATH /usr/local/tomcat
WORKDIR $MYPATH


  1. ADD:将宿主机目录的文件复制到镜像中,自动URL处理和解压tar压缩包

ADD [宿主机目录或文件地址] [容器地址]


ADD tomcat.tar.gz  /usr/local/tomcat


  1. COPY:拷贝宿主机文件和目录到镜像中

COPY [宿主机目录或文件地址] [容器地址]


COPY /opt/docker/host.txt /usr/local/tomcat/container.txt


将主机的host.txt文件内容复制到容器中container.txt中 9. VOLUME:创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等


VOLUME [容器内路径]


VOLUME /usr/local/tomcat/webapps


  1. CMD:指定一个容器启动时要执行的命令(Dockerfile中可以有多条,但只有一条生效,且会被docker run之后的参数替换)

CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;

CMD /usr/local/tomcat/bin/startup.sh && tail -f -n 200 /usr/local/tomcat/logs/catalina.out


==注意==:指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令


  1. ENTRYPOINT:指定一个容器启动时要执行的命令(Docker run参数添加加到指令中,重新组合成新的指令)

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2(shell中执行)


ENTRYPOINT /usr/local/tomcat/bin/startup.sh


  1. ONBUILD:当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承时触发

ONBUILD [INSTRUCTION]


ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src


三、构建tomcat镜像



  1. 创建DockerFile,编写脚本


# 基于镜像centos
FROM centos
# 镜像维护者及其邮箱
MAINTAINER javacfox<javacfox@sina.com>
# 把jdk和tomcat添加并解压到容器/usr/local路径中
ADD jdk-1.8-linux.tar.gz /usr/local
ADD tomcat.tar.gz /usr/local
# 安装vim编辑器
RUN yum install vim
# 设置环境变量
ENV PATH /usr/local
# 设置登录目录
WORKDIR $PATH
# 配置jdk与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/tomcat
ENV CATALINA_BASE /usr/local/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 暴漏端口
EXPOSE 8080
# 启动时运行tomcat
CMD /usr/local/tomcat/bin/startup.sh && tail -f -n 200 /usr/local/tomcat/logs/catalina.out


  1. 创建镜像
[root@localhost opt]# docker build -f /opt/DockerFile javacfox/mytomcat


  1. 创建容器并运行
[root@localhost ~]# docker run -d -p 8080:8080 --name tomcat01 javacfox/mytomcat
目录
相关文章
|
3天前
|
Ubuntu NoSQL 开发工具
《docker基础篇:4.Docker镜像》包括是什么、分层的镜像、UnionFS(联合文件系统)、docker镜像的加载原理、为什么docker镜像要采用这种分层结构呢、docker镜像commit
《docker基础篇:4.Docker镜像》包括是什么、分层的镜像、UnionFS(联合文件系统)、docker镜像的加载原理、为什么docker镜像要采用这种分层结构呢、docker镜像commit
112 70
|
18天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
182 75
|
2天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
41 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
6天前
|
Ubuntu NoSQL 关系型数据库
《docker基础篇:6.本地镜像发布到私有库》包括本地镜像发布到私有库流程、docker regisry是什么、将本地镜像推送到私有库
《docker基础篇:6.本地镜像发布到私有库》包括本地镜像发布到私有库流程、docker regisry是什么、将本地镜像推送到私有库
65 29
|
25天前
|
NoSQL PHP MongoDB
docker push推送自己搭建的镜像
本文详细介绍了如何搭建和复盘两个Web安全挑战环境:人力资源管理系统和邮件管理系统。首先,通过Docker搭建MongoDB和PHP环境,模拟人力资源管理系统的漏洞,包括nosql注入和文件写入等。接着,复盘了如何利用这些漏洞获取flag。邮件管理系统部分,通过目录遍历、文件恢复和字符串比较等技术,逐步绕过验证并最终获取flag。文章提供了详细的步骤和代码示例,适合安全研究人员学习和实践。
45 3
docker push推送自己搭建的镜像
|
29天前
|
Docker 容器
|
Kubernetes 应用服务中间件 Docker
Docker——自定义网络实现
Docker——自定义网络实现
522 0
|
3月前
|
Docker 容器
docker中创建自定义网络
【10月更文挑战第7天】
77 6
|
3月前
|
安全 NoSQL Redis
Docker自定义网络
Docker自定义网络
47 11
|
3月前
|
Docker 容器
docker中自定义网络
【10月更文挑战第5天】
52 3