【微服务实战之Docker容器】第七章-Dockerfile解析

文章目录


高阶篇:

docker安装mysql、redis集群

docker-compose,dockerfile一键部署多个实例

docker微服务实战

docker网络、集群化部署

Dockerfile简介

Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。

构建三步骤: 编写Dockerfile文件--> docker build命令构建镜像 --> docker run依镜像运行容器实例

官网:https://docs.docker.com/engine/reference/builder/

Dockerfile基础知识

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

2:指令按照从上到下,顺序执行。

3:#表示注释。

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

Docker执行Dockerfile的大致流程

(1)docker从基础镜像运行一个容器。

(2)执行一条指令并对容器作出修改。

(3)执行类似docker commit的操作提交一个新的镜像层。

(4)docker再基于刚提交的镜像运行一个新容器。

(5)执行dockerfile中的下一条指令直到所有指令都执行完成。

DockerFile关键字介绍

先看一下:

参考tomcat8的dockerfile: https://github.com/docker-library/tomcat/blob/master/10.0/jdk8/corretto/Dockerfile

红色的都是保留关键字

FROM: 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是FROM。

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

RUN:

容器构建(build)时就会运行的命令,两种格式,

shell格式: 就是命令行模式,跟shell语句一

bash 复制代码
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

exec格式

bash 复制代码
RUN ["/bin/bash", "-c", "echo hello"]

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

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

可以检测一下,我们启动镜像

bash 复制代码
docker run -it -p 8080:8080 30ef4019761d bash

USER: 指定该镜像以什么样的用户去执行,如果都不指定,默认是root。

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

ENV MY_PATH /usr/mytest这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量, 比如:WORKDIR $MY_PATH。

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

COPY:类似ADD,拷贝文件和目录到镜像中。

将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

bash 复制代码
COPY src dest
COPY ["src", "dest"]
<src源路径>:源文件或者源目录
<dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

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

CMD:

指定容器启动后的要干的事情

注意: 1. Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。

  1. 就是说,我们使用docker run 会覆盖配置中的CMD。

它和前面RUN命令的区别:CMD是在docker run 时运行。RUN是在 docker build时运行。

ENTRYPOINT:

也是用来指定一个容器启动时要运行的命令

类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,

而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

优点:在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。

缺点: 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

实战案例

自定义镜像mycentosjava8

先下载一个centos的7版本的镜像(8版本的解除了docker中一些命令的支持)

bash 复制代码
docker pull centos:7

等待下载完成

启动镜像

bash 复制代码
docker run -it eeb6ee3f44bd /bin/bash

进入命令行执行页面,测试下执行以下命令,发现都没有,这是因为docker是最小安装,下载的centos不包含任何其他程序。

bash 复制代码
vim
ifconfig
java

接下来,我们让Centos7镜像具备vim+ifconfig+jdk8

先下载一个jdk8的镜像(自己准备其他的也可,只要是Linux下的就可以)

下载地址:https://mirrors.yangxingzhen.com/jdk/

编写Dockerfile文件,构建符合我们要求的centos

Dockerfile准备

新建一个myfile文件夹

bash 复制代码
mkdir myfile

进入myfile,上传jdk包

编写Dockerfile

bash 复制代码
vim Dockerfile
i

Dockerfile内容

bash 复制代码
# 基础的镜像名
FROM centos:7
# 作者
MAINTAINER zzyy<zzyybs@126.com>
# 环境变量目录,供后边引用
ENV MYPATH /usr/local
# 默认目录,/usr/local
WORKDIR $MYPATH

# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig
RUN yum -y install net-tools
# 安装Java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
# ADD是相对路径jar,把jdk-8u11-linux-x64.tar.gz添加到容器中,安装包要和Dockerfile文件同目录/myfile)
ADD jdk-8u11-linux-x64.tar.gz /usr/local/java
# 配置Java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_11
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jat:$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

保存退出

接下来构建新的镜像(注意:末尾的.表示的是当前目录)

bash 复制代码
docker build -t centosjava8:1.5 .

编译完成

如遇失败,请检查报错的信息和给出的执行出错的命令行,进行检查。

接着,允许我们新构建的镜像

bash 复制代码
docker run -it 0bd14140e5a5 /bin/bash

再次测试vim、ifconfig、java等命令,发现都已经构建完成了!

虚悬镜像

仓库名、标签都是的镜像,俗称dangling image。

bash 复制代码
docker images

镜像构建时或删除时出现错误可能会产生虚悬镜像。

单独查看虚悬镜像

bash 复制代码
docker image ls -f dangling=true

虚悬镜像没有意义,还可能对系统造成影响,通常我们使用命令进行删除

bash 复制代码
 docker image prune

输入y,会将所有虚悬镜像删除

如果出现使用该命令删除不掉,可以使用以下命令进行强制删除镜像,最后跟的时镜像ID

bash 复制代码
docker rmi -f b435e161fedc

自己练习

作业

使用ubuntu构建一个新镜像,Dockerfile如下

相关推荐
陌上阳光4 小时前
docker搭建ray集群
docker·容器·ray
这就是佬们吗5 小时前
初识 docker [上]
java·开发语言·笔记·docker·容器
BigBigHang5 小时前
【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
数据库·docker·容器
云道轩5 小时前
使用Docker在Rocky Linux 9.5上在线部署LangFlow
linux·人工智能·docker·容器·langflow
伟大的大威5 小时前
Docker 部署 Supabase并连接
运维·docker·容器
杰克逊的日记6 小时前
k8s的csi对接GPFS
云原生·容器·kubernetes·存储·gpfs
容器魔方10 小时前
「中科类脑」正式加入 Karmada 用户组!携手社区共建多集群生态
云原生·容器·云计算
终端行者10 小时前
k8s之ingress定义https访问方式
容器·https·kubernetes
小醉你真好11 小时前
7、Docker 常用命令大全
docker·容器·eureka
随风fraya12 小时前
<七> CentOS 8 安装最新版本Docker
运维·docker·容器