实验环境

# 机器 51 52 都有harbor 仓库 好传镜像

系统:centos7.9 ---注意换源

docker版本:1.20


dockerfile的原理

1、dockerfile 每个指令都会创造一个新的镜像层(注意: 是一个临时的容器) 执行完之后不在存在
再往后就重新进行创建和操作

2、镜像层将被缓存和利用(后续的镜像将基于前面的一层,每一层下面都有基层缓存)换言之,重新下载速度会比第一次快也是这个原因

3、dockerfile的指令更改之后,复制文件变化或者构建镜像指定变量不同,会影响到原先前面的镜像层
发生改变的行为,对应的镜像层缓存就会销毁

4、某一层的镜像缓存失效之后,他之后的缓存也都会消失
就像地基一样

5、容器修改不会影响到镜像,如果在某一层中添加一个文件,会在下一层删除它 
镜像中仍然会包含该文件

image.png

dockerfile的操作指令

image.png

这些较为基础,可以看截图理解  

dockerfile实战

nginx

我们尝试写一个nginx的dockerfile 来看看 实际操作下 dockerfcile 如何构建镜像的
mkdir /dockerfiles  
cd /dockerfiles 
mkdir /nginx-example
cd /root/dockerfiles/nginx-example

vim index.html  在里面写一个  nginx test is ok  
## 因为下面我们的dockerfile中写了 COPY index.html 所以文件夹里面需要有这个index.html文件的

vim  dockerfile-nginx-v1

------------------
FROM alpine:latest

MAINTAINER jichao

RUN apk add --update nginx \
    && rm -rf /var/cache/apk/* \
    && echo "daemon off;" >> /etc/nginx/nginx.conf
    && chown -R nginx:www-data /var/lib/nginx

COPY index.html /usr/share/nginx/html/index.html

EXPOSE 80

CMD ["nginx"]


-------------

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



也可以试试另一个 
cd /root/docker-file-example/docker-file-nginx-example

vim docker-file-nginx 

------------------------

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"]
CMD ["-c","/etc/nginx/nginx.conf"]


------------------- 
## 这快的 
FROM quay.io/centos/centos:stream9 最好用武功机器去下载好镜像然后推送到仓库 接着让 第二台机器
去拉取这个镜像,在进行构建 或者两台机器都可以武功,这样还省事了

docker build -t nginx:v2 -f docker-file-nginx .


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

image.png image.png image.png image.png

---------------
# 可以先出门把这个镜像拉下来
mkdir nginx
wget -P nginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
cd /root/nginx

FROM centos:7.6.1810
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
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;"]

image.pngimage.png image.png

docker run -d -P nginx:v1

image.png image.png

构建tomcat镜像

这个实验少个包
FROM centos:7.6.1810
MAINTAINER flyfish
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
ADD jdk1.8.0_201.tar.gz /usr/local/
ADD apache-tomcat-8.0.47.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-8.0.47
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.0.47/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.47/bin/logs/catalina.out

image.png

FROM tomcat:v1
MAINTAINER flyfish
ADD helloworld_war.war /usr/local/apache-tomcat-8.0.47/webapps/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/idk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:aaaaaaaaaaaaaaa$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.47
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
###暴露端口
CMD /usr/local/apache-tomcat-8.0.47/bin/startup.sh &&  tail -F /usr/local/apache-tomcat-8.0.47/bin/logs/catalina.out

image.pngimage.png

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

image.png

在根据这个镜像写个helloworld

vim helloworld-dockerfile
FROM tomcat:v1
MAINTAINER flyfish.
ADD helloworld_war.war/usr/local/apache-tomcat-8.0.47/webapps/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.47
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.47
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
###暴露端口
CMD /usr/local/apache-tomcat-8.0.47/bin/startup.sh&& tail -F /usr/local/apache-tomcat-8.0.47/bin/logs/catalina.out


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

image.png

hadoop

mkdir -p /root/dockerfiles/hadoop
vim dockerfile-hadoop-v1
ls

# 使用基础镜像
FROM centos:7.6.1810
MAINTAINER jc
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 hadoopfiles/core-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoopfiles/hdfs-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoopfiles/mapred-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoopfiles/yarn-site.xml /opt/bigdata/hadoop/etc/hadoop/
COPY hadoopfiles/hadoop-env.sh /opt/bigdata/hadoop/etc/hadoop/
WORKDIR /opt/bigdata/hadoop
RUN hdfs namenode -format
# 暴露端口
EXPOSE 8088 9870 50070


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





image.png image.png

# 创建容器
docker run -itd --name hadoop-test -h flink01 -h flink01 -p 8088:8088 -p 9870:9870 -p 50070:50070 hadoop:v1
# 进入容器
docker exec -it hadoop-test /bin/bash 
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  # 格式化
sbin/hadoop-daemon.sh start namenode
sbin/hadoop-daemon.sh start datanode
hdfs dfs -mkdir /test
hdfs dfs -put README.txt /test

image.pngimage.pngimage.png image.png image.png image.png

# 启动Hadoop的yarn
sbin/yarn-daemon.sh start resourcemanager
sbin/yarn-daemon.sh start nodemanager
# 访问8088接口


vim file1
hadoop spark
hue oozie
ds airflow
hadoop spark
oozie ds

hdfs dfs -put file1 /input

cd share/hadoop/mapreduce

yarn jar hadoop-mapreduce-examples-3.3.1.jar wordcount /input  /output 

image.pngimage.png

image.png image.png

# 成功之后测试一下
hdfs dfs -get /output

image.png image.png