dockerfile主要组成部分:
#基础镜像信息
FROM openjdk:8-jdk-slim-bullseye
#暴露端口
EXPOSE 8080
#容器启动时执行指令
CMD ["catalina.sh", "run"]
dockerfile常用指令:
-
FROM 这个镜像的父亲是谁?(指定基础【base】镜像)
-
MAINTAINER 告诉别人,它的作者?(指定维护者信息,可以没有)
-
RUN 容器构建时需要运行的命令(在命令前面加上RUN即可 ps:用来执行shell 命令)
-
ADD 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
-
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点(设置当前工作目录)
-
VOLUME 容器数据卷,用于数据保存和持久化工作(设置卷,挂载主机目录)
-
EXPOSE 当前容器对外暴露出的端口(指定对外的端口)
-
CMD 指定容器启动后的要干的事情
- Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
-
COPY 复制文件 (从容器外 复制到容器内,ps:建议同一目录下)
-
ENV 用来在构建镜像过程中设置环境变量
-
USER 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
-
ENTRYPOINT 容器启动后执行的命令
- 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给
ENTRYPOINT
指令指定的程序 - 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
- ENTRYPOINT可以和CMD一起用,一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
当指定了ENTRYPOINT后,CMD的含义就发生了变化,不再是直接运行其命令而是将CMD的内容作为参数传递给ENTRYPOINT指令
- 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当作参数送给
创建第一个Dockerfile文件
FROM centos
MAINTAINER xxx
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
#暴露端口
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
基础镜像的选择
- 一是 应当尽量选择官方镜像库里的基础镜像;
- 二是 应当选择轻量级的镜像做底包
就典型的Linux基础镜像来说,大小关系如下:
Ubuntu>CentOS>Debian
因此相比 Ubuntu,其实更推荐使用最轻量级的 Debian镜像,而且它也是一个完整的Release版,可以放心使用
ADD 与 COPY 指令的正确使用虽然两者都可以添加文件到镜像中,但在一般用法中,还是推荐以COPY指令为首选,原因在于ADD指令并没有COPY指令来的纯粹,ADD会添加一些额外功能,典型的如下 ADD 一个压缩包时,其不仅会复制,还会自动解压,而有时我们并不需要这种额外的功能。
启动守护式容器(后台服务器)问题:然后docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail
),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,
我们配置启动服务只需要启动响应的service即可。例如service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,
常见就是命令行模式,表示我还有交互 *** 作,别中断
#nginx 的处理方式 dockerfile中
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d
指定容器的后台运行模式。
docker run -d 容器名
-
前台交互式启动
docker run -it redis:6.0.8
-
后台守护式启动
docker run -d redis:6.0.8
tomcat的dockerfile
https://github.com/docker-library/tomcat
samba
https://github.com/dperson/samba
参考
https://github.com/CentOS/CentOS-Dockerfiles
总之 参考常见开源的,就对了,学学大佬写的!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)