侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

DockerFile

coydone
2022-10-29 / 0 评论 / 0 点赞 / 422 阅读 / 3,841 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

DockerFile概述

DockerFile 是用来构建 Docker 镜像的构建文件,是由一系列的命令和参数构成的脚本。

DokcerFile的构建步骤:

1、编写Dokcerfile文件

2、docker build 生成新的镜像

3、docker run 运行镜像

以Centos的镜像为例来说明 https://hub.docker.com/_/centos。

#Centos的Dockerfile
FROM scratch
ADD centos-7.8.2003-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20200504" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-05-04 00:00:00+01:00"

CMD ["/bin/bash"]

DockerFile构建过程

基础知识

1、每条保留字指令都必须为大写字母后面要跟随至少一个参数。

2、指令从上到下顺序执行。

3、#表示注释。

4、每条指令都会创建一个新的镜像层,并对镜像进行提交。

大致流程

1、Docker从基础镜像运行一个容器。

2、执行一条指令并对容器进行修改。

3、执行类似于docker commit的操作提交一个新的镜像。

4、Docker再基于刚提交的新的镜像运行一个新的容器。

5、执行dockerfile的下一个指令再人生第2点直到没有指令。

总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:Dockerfile是软件的原材料,Docker镜像是软件的交付品,Docker容器则可以认为是软件的运行态。

Dockerfile 面向开发,Docker 镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当 Docker 体系的基石。

1、Dockerfile,需要定义一个Dockerfile,Dockerfile 定义了进程需要的一切东西。

Dockerfile 涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace 的权限控制)等等;

2、Docker镜像,在用 Dockerfile 定义一个文件之后,docker build 时会产生一个 Docker 镜像,当运行 Docker 镜像时,会真正开始提供服务;

3、Docker 容器,容器是直接提供服务的。

DockerFile体系结构

FROM:基础镜像,当前新镜像是基于哪个镜像的。

MAINTAINER:镜像维护者的姓名和邮箱地址。

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

EXPOSE:当前容器对外暴露的端口。

WORKDIR:指定在创建容器后,终端默认登陆进来的工作目录。

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

ADD:将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理URL和解压tar包。

COPY:类似ADD,拷贝文件和目录到镜像中,语法COPY src dest COPY [''src","dest"]

VOLUME:容器数据卷,用于数据保存和持久化工作。

CMD:指定一个容器启动时要运行的命令格式。shell:CMD <命令>exec CMD ['可执行文件',"参数1","参数2"],DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。

ENTEYPONT:指定一个容器启动时要运行的命令。ENTRYPOINT 的目地和 CMD 一样,都是在指定容器启动程序及参数。

OBBUILD:当构建一个被继承的 Dockerfile 时运行命令,父镜像在被子镜像继承后触发父镜像的 onbuild 。

自定义mycentos镜像

docker Hub上99%的镜像都是通过 base 镜像中安装和配置需要的软件构建出来的。

目的:设置登陆后的默认路径、vim编辑器。

# 进入mydocker目录创建DockerFile文件编写
[root@localhost ~]# mkdir dockerfile
[root@localhost ~]# cd dockerfile/
[root@localhost dockerfile]# pwd
/root/dockerfile
[root@localhost dockerfile]# mkdir mycentos
[root@localhost dockerfile]# cd mycentos/
[root@localhost mycentos]# pwd
/root/dockerfile/mycentos
[root@localhost mycentos]# touch Dockerfile
[root@localhost mycentos]# chmod 777 Dockerfile
[root@localhost mycentos]# vim Dockerfile

#基于centos镜像
FROM centos
#设置作者和邮箱
MAINTAINER coydone<coydone@qq.com>
#声明变量
ENV MYPATH /usr/local
#设置工作目录
WORKDIR $MYPATH
#安装VIM -y表示所有的确认的地方全部yes
RUN yum -y install vim
#设置对外暴露的端口,提示作用
EXPOSE 80
#打开一个终端
CMD echo $MYPATH
CMD echo "success---------ok"
CMD /bin/bash

#使用docker build命令构建镜像
[root@localhost mycentos]# docker build -t mycentos:1.0 .
#使用docker run命令运行
[root@localhost mycentos]# docker run -it mycentos:1.0 /bin/bash

#列出镜像的变更历史
docker history 镜像名:TAG

Dockerfile 中可以有多个CMD的命令,但只有最后一个生效,CMD会被docker run之后的参数替换掉。

使用ENTRYPOINT来运行命令,在run 运行的参数会追加到新的命令后面。

自定义项目Docker

打Jar包镜像

准备工作:创建一个SpringBoot项目并打Jar包,把Jar包拷贝到Linux的/mydocker/myjarproject目录下。

# 编写Dockerfile
FROM openjdk:8u181-jdk-alpine
ARG workdir=/app
VOLUME ${workdir}
WORKDIR ${workdir}
ADD coydone.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

#构建镜像
docker build -t myapp:1.0 .

#运行镜像
docker run -it --name 'myapp' -p 8888:8080 myapp:1.0

打War包镜像

准备工作:把上面的项目改成War项目打War包放到Linux。

#编写Dockerfile

#基于tomcat
FROM tomcat:alpine
#作者信息
MAINTAINER  coydone<coydone@qq.com>
#声明环境变量
ENV TOMCATPATH=/usr/local/tomcat
#设置工作目录
WORKDIR ${TOMCATPATH}/webapps
#删除webapps下面的所有项目
RUN  rm -rf * 
#添加war包到当前的工作目录下的webapps
COPY coydone.war ./coydone.war
#更改war包的名字
RUN mv ./coydone.war ./ROOT.war
#显示webapps下面的文件
RUN ls -lh ./
#解压war包
RUN unzip ./ROOT.war -d ./
#删除ROOT.war包
RUN rm -rf ./ROOT.war
EXPOSE 8080
CMD ["bin/catalina.sh", "run"]

#构建镜像
docker build -t mywarapp:1.0 .

#运行镜像
docker run -it -p 8888:8080 mywarapp:1.0 
0

评论区