—、dockerfile 的概述

1.1 dockerfile 是什么

Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

dockerfie由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层

官网

https://hub.docker.com/r/docker/dockerfile

git最新版本1.9.0

https://github.com/moby/buildkit/tree/dockerfile/1.9.0

拉取镜像

docker pull docker/dockerfile


1.2 dockerfile的原理

dockerfile的原理就是镜像分层。
1、Dockerfile中的每个指令都会创建一个新的镜像层
(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
2、镜像层将被缓存和复用
(后续的镜像层将基于前面的一层,每一层都会有下面几层的缓存)
3、当dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了
(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(自动销毁)
4、某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效
(第一层不成功,那么第二层也不成功,相当于地基)。
5、容器的修改并不会影响镜像,如果在某一层中添加一个文件,在下一层中删除它,镜像中依然会包含该文件

第二十节  Dockerfile的容器编排_docker

镜像不是一个单一的文件,而是有多层构成。
容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。
如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。
Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

第二十节  Dockerfile的容器编排_docker_02

[root@lyc-80-28 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        1.20      0584b370e957   2 years ago   141MB
[root@lyc-80-28 ~]# docker history nginx:1.20

第二十节  Dockerfile的容器编排_nginx_03


二、dockerfile 的使用

2.1 dockerfile 的创建

dockerfile是由一组指令组成的文件
dockerfile每行支持一条指令,每条指令可携带多个参数,一条指令可以用&&方式,去写多条指令。
dockerfile支持以"#"为开头的注释

2.2 dockerfile的结构

基础镜像信息(Linux发行版:centos ubantu suse debian alpine redhat)
维护者信息(docker search可查看)
镜像操作指令(tar yum make)
容器启动时执行指令(cmd["/root/run.sh"]、entrypoint都是系统启动时,第一个加载的程序/脚本/命令)


2.3 构建镜像命令

PS:可以在构建镜像时指定资源限制

在编写Dockerfile时,有严格的格式需要遵循:

第一行必须使用FRON指令指明所基于的镜像名称;

之后使用MAINTAINER指令说明维护该镜像的用户信息;

然后是镜像操作相关指令,如RUN指令。

每运行一条指令,都会给基础镜像添加新的一层。

最后使用CMD指令指定启动容器时要运行的命令操作。

示例:
docker build-t nginx:test .

#基于dockerfile文件构建镜像命令

完整的写法:
docker build-f dockerfile-t nginx:new .
docker build :基于dockerfile 构建镜像
-f :指定dockerfile文件(默认不写的话指的是当前目录)
-t :(tag)打标签-》nginx:new
.  :专业说法:指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件

2.4 dockerfile的操作指令

第二十节  Dockerfile的容器编排_docker_04


三、dockerfile 编写实例

Dockerfile是用来构建Docker镜像的一种文本文件格式。

以下是编写一个Dockerfile文件的基本步骤:

1、选择基础镜像(Base Image):

在Dockerfile中,第一行指定了基础镜像,可以是任何已有的镜像,例如Ubuntu、Centos、Alpine等等。如果没有特殊需求,建议选择一个较小的基础镜像,以便加快构建速度和减小镜像体积。

2、安装依赖包(Install dependencies):

在构建过程中,可能需要安装一些依赖包,例如编译工具、库文件等等。这些依赖包可以在Dockerfile中使用RUN命令安装。

在安装完成之后,可以使用CLEAN命令清理临时文件和缓存,以减小镜像大小。

3、添加应用程序(Add application):

将应用程序添加到镜像中,可以使用COPY或ADD命令将应用程序从本地文件系统复制到容器中。

4、配置环境(Configure environment):

在容器中运行应用程序可能需要一些环境变量、配置文件等等。

可以使用ENV命令设置环境变量,使用RUN命令复制配置文件到容器中。

5、暴露端口(Expose ports):

容器中运行的应用程序可能需要监听某些端口。

可以使用EXPOSE命令暴露端口。

6、运行命令(Run command):

在容器启动后,需要运行一个命令来启动应用程序。

可以使用CMD或ENTRYPOINT命令来指定容器启动后要运行的命令。


nginx实例

构建nginx基础镜像

mkdir docker-file
cd docker-file

下载基础镜像
docker pull quay.io/centos/centos:stream9
vim nginx-dockerfile
-----------------------------------------
FROM quay.io/centos/centos:stream9
RUN yum -q -y update && yum -q -y upgrade \
	&&  yum install -y tzdata vim less ncurses telnet wget zip unzip traceroute procps net-tools iproute tcpdump nginx  \
	&&  ln -snf /usr/share/zoneinfo/Asia/Shanghai   /etc/localtime  \
	&&  yum clean all \
	&&  echo "alias ls='ls --color'" >> ~/.bashrc \
	&&  echo "alias ll='ls -l'" >> ~/.bashrc \
	&&  echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
ENTRYPOINT ["nginx","-g","daemon off;"]
CMD ["-c","/etc/nginx/nginx.conf"]
---------------------------------------------------------------
构建镜像
docker  build   -t    nginx:v3   -f  nginx-dockerfile  .  #注意有个点

第二十节  Dockerfile的容器编排_hadoop_05

docker run -itd --name nginx-test -p 80:80 nginx:v1

第二十节  Dockerfile的容器编排_docker_06

第二十节  Dockerfile的容器编排_docker_07

可以先把nginx压缩包先下载下来,再构建镜像

mkdir nginx
wget -P nginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
cd /root/nginx
#构建dockerfile文件
vim nginx-dockerfile2
-----------------------------
FROM quay.io/centos/centos:stream9
RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
ADD nginx-1.15.2.tar.gz /usr/src/
RUN cd /usr/src/nginx-1.15.2 \
&& mkdir /usr/local/nginx \
&& ./configure --prefix=/usr/local/nginx && make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
RUN rm -rf /usr/src/nginx-1.15.2
EXPOSE 80
EXPOSE 443
CMD ["nginx","-g","daemon off;"]
-------------------------------------
docker  build   -t    nginx:v2   -f  nginx-dockerfile2  .

第二十节  Dockerfile的容器编排_docker_08

docker run -itd --name nginx-test -p 80:80 nginx:v2

第二十节  Dockerfile的容器编排_hadoop_09

第二十节  Dockerfile的容器编排_docker_10

tomcat实例

cd /root/docker-file
mkdir tomcat-dockerfile
---------上传包到/root/docker-file
apache-tomcat-9.0.93.tar.gz
jdk1.8.0_201.tar.gz

vim tomcat-dockerfile
---------------------------------------
FROM quay.io/centos/centos:stream9
MAINTAINER liyingchun
ADD jdk1.8.0_201.tar.gz /usr/local/
ADD apache-tomcat-9.0.93.tar.gz /usr/local/
RUN yum -y install vim lrzsz git subversion gpm unzip net-tools
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA HOME /usr/local/idk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.93
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.93
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.93/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.93/bin/logs/catalina.out
---------------------------------------------

docker  build   -t    tomcat-test:v1   -f  tomcat-dockerfile  .

第二十节  Dockerfile的容器编排_nginx_11

运行
docker run -itd --name tomcat-test -p 8080:8080 tomcat-test:v1

第二十节  Dockerfile的容器编排_nginx_12

hadoop实例

mkdir -p /root/docker-file/hadoop
vim dockerfile-hadoop-v1
---------------------------------------------
FROM quay.io/centos/centos:stream9
MAINTAINER liyingchun
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
RUN yum install lrzsz git subversion gpm unzip zip net-tools wget vim curl epel-release -y && \
    yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
    libcurl-devel libjpeg-devel libpng-devel openssl-devel \
    libmcrypt-devel libxslt-devel libtidy-devel autoconf \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*
RUN mkdir -p /opt/bigdata

#安装jdk
ADD jdk1.8.0_201.tar.gz  /opt/bigdata
RUN  mv  /opt/bigdata/jdk1.8.0_201   /opt/bigdata/jdk
ENV JAVA_HOME /opt/bigdata/jdk
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

##安装hadoop
ADD   hadoop-3.3.1.tar.gz  /opt/bigdata/
RUN   mv  /opt/bigdata/hadoop-3.3.1  /opt/bigdata/hadoop
ENV HADOOP_HOME   /opt/bigdata/hadoop
ENV HADOOP_MAPRED_HOME   /opt/bigdata/hadoop
ENV PATH  $PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

#配置Hadoop
COPY core-site.xml   /opt/bigdata/hadoop/etc/hadoop/
COPY hdfs-site.xml   /opt/bigdata/hadoop/etc/hadoop/
COPY mapred-site.xml   /opt/bigdata/hadoop/etc/hadoop/
COPY yarn-site.xml   /opt/bigdata/hadoop/etc/hadoop/
COPY hadoop-env.sh   /opt/bigdata/hadoop/etc/hadoop/

WORKDIR   /opt/bigdata/hadoop

#暴露端口
EXPOSE   8088   9870  50070
--------------------------------------------------------------

docker build -t hadoop:v1 -f dockerfile-hadoop-v1 .

第二十节  Dockerfile的容器编排_nginx_13

# 创建容器
docker run  -itd   --name  flink01 -h flink01  -p  8088:8088   -p  50070:50070   -p  9870:9870   hadoop:v1
#-h  表示容器名字

# 进入容器
docker exec -it flink01 /bin/bash
测试环境
java -version
hadoop version

第二十节  Dockerfile的容器编排_hadoop_14

cd /opt/bigdata/hadoop/etc/hadoop
vim hadoop-env.sh 
vim mapred-env.sh
vim yarn-env.sh
# 都添加
export JAVA_HOME=/opt/bigdata/jdk

cd ..
cd .. 
bin/hdfs namenode -format  # 格式化

第二十节  Dockerfile的容器编排_hadoop_15

第二十节  Dockerfile的容器编排_nginx_16

启动Hadoop的hdfs
sbin/hadoop-daemon.sh start namenode
jps
sbin/hadoop-daemon.sh start secondarynamenode
jps
sbin/hadoop-daemon.sh start datanode
jps

启动Hadoop的yarn
sbin/yarn-daemon.sh start resourcemanager
jps
sbin/yarn-daemon.sh start nodemanager
jps



第二十节  Dockerfile的容器编排_hadoop_17

#查看端口状态
netstat -nultp |grep 8088
netstat -nultp |grep 9870
netstat -nultp |grep 50070

第二十节  Dockerfile的容器编排_hadoop_18

第二十节  Dockerfile的容器编排_hadoop_19

第二十节  Dockerfile的容器编排_nginx_20

测试hdfs文件存储是否正常
hdfs dfs -mkdir test

hdfs dfs -put README.txt /test

第二十节  Dockerfile的容器编排_docker_21

第二十节  Dockerfile的容器编排_nginx_22

感兴趣的可以测试wordcount案例,不再演示了

hdfs   dfs   -mkdir   /input
新建file01

hdfs   dfs   -put file01   /input/
hdfs   dfs   -mkdir   /output

cd  /opt/bigdata/hadoop/share/hadoop/mapreduce
yarn jar hadoop-mapreduce-examples-3.3.1.jar wordcount /input /output

第二十节  Dockerfile的容器编排_nginx_23