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
目录
相关文章
|
12天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
383 28
|
8天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
13天前
|
应用服务中间件 PHP nginx
Docker-compose 编排lnmp(dockerfile) 完成Wordpress
通过使用Docker Compose,我们可以轻松编排LNMP环境并部署WordPress。本文详细介绍了各组件的Dockerfile和配置文件编写,并通过docker-compose.yml文件实现了整个环境的自动化部署。这种方法不仅简化了部署过程,还提高了环境的可移植性和一致性。希望本文能帮助你更好地理解和使用Docker Compose来管理和部署复杂的应用程序。
39 3
|
14天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
84 2
|
16天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
29 1
|
8天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
25 0
|
Kubernetes 应用服务中间件 Docker
Docker——自定义网络实现
Docker——自定义网络实现
498 0
|
1月前
|
Docker 容器
docker中创建自定义网络
【10月更文挑战第7天】
25 6
|
1月前
|
安全 NoSQL Redis
Docker自定义网络
Docker自定义网络
|
1月前
|
Docker 容器
docker中自定义网络
【10月更文挑战第5天】
20 3