Docker 06 - Dockerfile

Docker 06 - Dockerfile

Dockerfile是什么 ?

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

构建的三个步骤 :

  • 编写 DockerFile 文件
  • docker build
  • docker run

观察一下 centos 的 dockerfile 文件 :

FROM scratch
ADD centos-7-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="20190305"

CMD ["/bin/bash"]

Dockerfile构建过程解析 ?

Dockerfile 内容基础知识 ?
  • 每条指令都必须为大写字母而且后面要跟随至少一个参数
  • 指令按照从上到下 顺序执行
  • # 表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程 ?
  1. Docker 从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似 docker commit 的操作提交一个新的镜像层
  4. docker 再基于刚提交的镜像运行一个新的容器
  5. 执行 DockerFile 中的下一条指令直到所有指令都执行完成
总结 ?

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

* Dockerfile是软件的原材料

* Docker镜像是软件的交付品

* Docker容器则可以认为是软件的运行态。

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

  1. Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
  2. Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
  3. Docker容器,容器是直接提供服务的。

Dockerfile体系结构(保留字指令) ?

在这里插入图片描述

#基础镜像 当前镜像是基于哪个镜像的
FROM

#镜像维护者的姓名和邮箱
MAINTAINER

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

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

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

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

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

#类似 ADD , 拷贝文件和目录到镜像中 
#将从构建上下文目录中 <源路径文件/目录> 复制到新的一层的镜像内的 <目标文件/目录>
COPY src dest
COPY["src","dest"]

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

#指定一个容器启动时要运行的命令
#DockerFile中有很多CMD指令,但是只有最后一个生效,CMD会被docker run 之后的参数替换
CMD

#指定一个容器要运行的命令
#DockerFile中可以有多个CMD指令,都是在指定容器中启动程序及参数,但是区别于CMD的是他不会覆盖原有的指令
ENTRYPOINT

#当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的 onbuild 被触发
ONBUILD

例子 ?

前言 :

Docker hub 中的 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构造出来的.

自定义镜像 Centos :

原来的centos

在这里插入图片描述

目标 :

登录后的默认路径为 /usr

带有vim编辑器

有查看网络配置的功能

编写
FROM centos
MAINTAINER lifanyu
ENV BASE_PATH /usr
WORKDIR $BASE_PATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo "===success==="
CMD bin/bash
构建
# 执行命令前必须文件名必须为 DockerFile
docker build -t lfy/centos_vim_net:1.0 . 

在这里插入图片描述

运行
ifconfig
vim a.txt

在这里插入图片描述

列出镜像的变更历史

在这里插入图片描述

CMD/ENTRYPOINT 镜像案例 :
CMD

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

以tomcat为例 :

docker run -it -p 8888:8080 tomcat ls -l
# ls-l 指令会替换 CMD ["catalina.sh", "run"]
FROM openjdk:7-jre

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME
 ..........
https://archive.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc
EXPOSE 8080
CMD ["catalina.sh", "run"]

在这里插入图片描述

ENTRYPOINT

docker run 之后的参数会传递给 ENTRYPOINT,之后形参新的命令组合.

制作CMD版可以查询IP信息的容器 :

curl 命令 :

curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。

如果系统没有curl可以使用yum install curl安装,也可以下载安装。

curl是将下载文件输出到stdout

使用命令:curl http://www.baidu.com

执行后,www.baidu.com的html就会显示在屏幕上了

这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数 -i

目的 : 我们希望显示 HTTP 请求头的信息, 需要加上 -i 参数 .

编写
FROM centos
RUN yum -y install curl
ENTRYPOINT ["crul","-s","http://ip.cn"]
构建
docker build /lfy/centos_ip .
运行
docker run 66ea3174112e

在这里插入图片描述

加上参数运行测试
docker run 66ea3174112e -i

在这里插入图片描述

加上参数的 DockerFile 变成了这样 :

FROM centos
RUN yum -y install curl
ENTRYPOINT ["crul","-s","-i","http://ip.cn"]
错误 :

Docker报错 WARNING: IPv4 forwarding is disabled. Networking will not work.

解决 :

  1. vim /usr/lib/sysctl.d/00-system.conf

  2. 添加如下代码:

    net.ipv4.ip_forward=1

  3. 重启network服务 :

    systemctl restart network

  4. 完成以后,删除错误的容器,再次创建新容器,就不再报错了。

在这里插入图片描述

自定义 tomcat9
编写
FROM centos
MAINTAINER lfy
# 把宿主机的 test.txt 拷贝到容器的 /usr/local 路径下
COPY test.txt /usr/local/test.txt
# 把 java 和 tomcat 添加到容器中
ADD jdk-8u211.tar.gz /usr/local
ADD tomcat-9.0.19.tar.gz /usr/local
# 安装 vim 编辑器
RUN yum -y install vim
# 设置基础路径
ENV BASE_PATH = /usr/local
# 使用设置的基础路径为落脚点
WORKDIR $BASE_PATH
# 配置 tomcat 和 jdk 的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_211
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.19
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.19
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 容器运行时监听的端口
EXPOSE 8080
# 启动时运行 tomcat
## ENTRYPOINT ["/usr/local/tomcat-9.0.19/bin/startup.sh"]
## CMD ["/usr/local/tomcat-9.0.19/bin/startup.sh","run"]
CMD /usr/local/apache-tomcat-9.0.19/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.19/logs/catalina.out
构建
docker build -t lfy/mytomcat01 .

在这里插入图片描述

运行
docker run -p 8080:8080 容器id

在这里插入图片描述

测试

在这里插入图片描述

总结 ?

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Docker是一种容器化技术,用于隔离应用程序和它们的依赖,并以轻量级和可移植的方式进行分发和部署。而Docker Compose和DockerfileDocker生态系统中常用的工具,用于管理和构建多个容器化应用程序。 Docker Compose是一个命令行工具,通过一个简单的文本文件(通常是YAML格式)来定义、配置和运行多个Docker容器。它提供了一种非常简便的方式来描述和管理各个容器之间的关联性,同时还能够一次性启动、停止和删除整个应用程序的所有容器。通过Docker Compose,我们可以轻松地创建和管理包含多个服务的复杂应用程序,例如前端应用程序和后端数据库。 Dockerfile是一个用于定义Docker镜像的文本文件,其中包含了构建镜像所需的指令和配置。通过编写Dockerfile,我们可以描述应用程序的运行环境、依赖关系和启动命令等信息。Docker通过读取Dockerfile并按照其中的指令逐步构建镜像,最终生成一个可执行的容器化应用程序。对于一个基于Nginx的Web应用程序,我们可以使用Dockerfile来定义Nginx的配置和静态资源,然后通过构建镜像来打包应用程序。 综上所述,docker-compose、Dockerfile和Nginx可以结合使用,实现多个容器之间的协同工作和复杂应用程序的构建。我们可以使用Docker Compose来管理包含Nginx容器的应用程序,通过Dockerfile来定义Nginx镜像的构建过程,最终实现一个可部署的Nginx容器化应用程序。这种方式能够提高应用程序的可移植性、可复用性和易于管理性,为开发人员和运维人员带来许多便利。 ### 回答2: docker-compose是一个可以管理多个容器的工具,它使用一个YAML文件来定义容器的配置信息。dockerfile是用来构建镜像的脚本文件,它包含了一系列的命令来描述容器的构建过程。nginx是一个开源的高性能的Web服务器和反向代理服务器。 使用docker-compose可以很方便地定义和管理多个容器之间的关系和依赖。可以在docker-compose.yaml文件中定义多个服务,每个服务对应一个容器,而这些容器可以通过互联网络进行通信。例如,可以定义一个nginx服务,同时还可以定义一个后端应用程序的服务,并且将两个服务连接在一起。使用docker-compose up命令可以启动所有定义的服务,并且可以使用docker-compose logs命令来查看日志信息。 dockerfile是一个用来描述构建镜像过程的文件,它包含了一系列的命令来指定容器中的操作。在dockerfile中可以使用FROM命令指定基础镜像,然后使用RUN命令来执行一些操作,比如安装软件包、配置环境等。对于nginx这个容器,可以使用dockerfile来构建自定义的镜像,并且可以在其中配置nginx的相关设置,例如端口、路由规则等。 通过使用docker-compose和dockerfile,可以很轻松地将nginx部署到容器中,并且可以定义nginx和其他服务之间的联系和依赖关系。这样可以更加方便地进行应用程序的部署和管理,同时也可以通过容器的隔离性和易于移植性来提高应用程序的安全性和可靠性。 ### 回答3: Docker Compose和Dockerfile是两个与Docker相关的重要概念,而Nginx则是一款常用的高性能Web服务器和反向代理服务器软件。 Docker Compose是一个用于定义和运行多个Docker容器的工具。它通过一个单独的YAML配置文件,可以定义容器之间的关系和依赖,并且可以一键式地启动、停止和管理这些容器。使用Docker Compose,我们可以方便地把多个服务组合在一起,比如前端应用、后端应用和数据库等。 Dockerfile是一个用于构建Docker镜像的文本文件。它包含一系列的指令,用于告诉Docker引擎如何构建镜像。通过Dockerfile,我们可以自定义镜像的内容和配置,包括基础镜像选择、软件安装、文件复制、环境变量设置等。Dockerfile的编写可以帮助我们实现镜像的自动化构建和版本管理。 Nginx是一款轻量级的高性能Web服务器和反向代理服务器软件。它具有占用资源少、处理并发请求能力强等特点,被广泛用于构建高性能的Web应用架构。通过使用Nginx,我们可以实现负载均衡、反向代理、静态文件缓存、SSL加密等功能。 结合这三个概念,我们可以运用Docker Compose来定义和管理多个容器,比如前端应用容器和Nginx容器。通过Dockerfile,我们可以定义Nginx容器的自定义镜像,包括选择基础镜像、安装Nginx和相关依赖、设置Nginx配置文件等。然后,通过Docker Compose一键式地启动这些容器,实现前端应用和Nginx服务器的整合。 总之,Docker Compose、Dockerfile和Nginx是三个在Docker应用开发和部署中非常重要的概念和工具。它们可以帮助我们方便地管理和构建容器,实现应用的快速部署和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值