云原生技术与应用-Docker高级管理--Dockerfile镜像制作
目录
一.Docker镜像管理
1.Docker镜像结构
2.Dockerfile介绍
二.Dockerfile实施
1.构建nginx容器
2.构建Tomcat容器
3.构建mysql容器
三.Dockerfile语法注意事项
1.指令书写范围
2.基础镜像选择
3.文件操作注意
4.执行命令要点
5.环境变量和参数设置
6.缓存利用与清理
一.Docker镜像管理
Docker 镜像除了是 Docker 的核心技术之外,也是应用发布的标准格式。一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行,在 Docker 的整个使用过程中,进入一个已经定型的容器之后,就可以在容器中进行操作,最常见的操作就是在容器中安装应用服务。 如果要把已经安装的服务进行迁移,就需要把环境以及搭建的服务生成新的镜像。本案例将介绍如何创建 Docker 镜像。
1.Docker镜像结构
镜像不是一个单一的文件,而是有多层构成。可以通过 docker history 命令查看镜像中各层内容及大小,每层对应着 Dockerfile 中的一条指令 。Docker 镜像默认存储在 /var/lib/docker/<storage-driver> 目录中。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker 使用存储驱动管理镜像每层内容及可读写层的容器层。Docker 镜像是分层的,下面这些知识点非常重要。
-
Dockerfile 中的每个指令都会创建一个新的镜像层;
-
镜像层将被缓存和复用;
-
当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
-
某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
-
镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。
2.Dockerfile介绍
Dockerfile 是一个用于构建 Docker 镜像的文本文件,它由一系列指令和参数组成。通过 Dockerfile,可以自动化地创建自定义镜像,无需手动干预每个步骤。
二.Dockerfile实施
1.构建nginx容器
(1)拉取centos镜像
[root@localhost ~ ]# docker pull centos:7
(2)创建dockerfile工作目录
[root@localhost ~ ]# mkdir /opt/nginx
[root@localhost ~ ]# cd /opt/nginx
(3)创建dockerfile
[root@localhost nginx]# vim dockerfile
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
#RUN yum makecache
RUN yum -y install net-tools pcre-devel zlib-devel zlib gcc* make
ADD nginx-1.19.5.tar.gz /root
WORKDIR /root/nginx-1.19.5
RUN ./configure --prefix=/usr/local/nginx && make && make install
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
EXPOSE 80
EXPOSE 443
#RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
WORKDIR /root/nginx
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
(4)编写nginx启动脚本
[root@localhost nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
(5)用dockerfile创建镜像
[root@localhost nginx]# docker build -t mynginx .
(6)启动容器
[root@localhost ~]# mkdir /nginx
[root@localhost~]# cp /opt/nginx/nginx.conf /nginx
[root@localhost nginx]# docker run -dit
-p 8083:80
-v /www/html:/web
-v /nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
--name nginx04
mynginx
/bin/bash -c /run.sh[root@localhost nginx]# echo "web test">/www/html/index.html
(7)访问nginx网站
http://192.168.10.101:8003
2.构建Tomcat容器
(1)创建工作目录
[root@localhost ~ ]# mkdir /opt/tomcat/
[root@localhost ~ ]# cd /opt/tomcat
(2)创建dockerfile文件
[root@localhost tomcat ]# vim dockerfile
FROM centos:7
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV JAVA_BIN /usr/local/jdk1.8.0_91
ENV JRE_HOME /usr/local/jdk1.8.0_91ENV PATH $PATH:/usr/local/jdk1.8.0_91/bin:/usr/local/jdk1.8.0_91/jre/bin
ENV CLASSPATH /usr/local/jdk1.8.0_91/jre/bin:/usr/local/jdk1.8.0_91/lib:/usr/local/jdk1.8.0_91/jre/lib/charsets.jar
ADD apache-tomcat-8.5.16.tar.gz /
RUN mv /apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]
(3)创建启动脚本
[root@localhost tomcat ]# vim run.sh
#!/bin/bash
export JAVA-OPTS ="-Xms2048m -Xmx4096m"
ulimit -n 65536
/usr/local/tomcat/bin/startup.sh
tailf /usr/local/tomcat/logs/catalina.out
(4)用dockerfile生成镜像
[root@localhost tomcat ]# docker build -t mytomcat .
(5)运行容器
[root@localhost tomcat ]# docker run -d -i -p 8080:8080 --name tomcat01 mytomcat
(6)访问tomcat网站
httpd://192.168.10.101:8080
3. 构建mysql容器
(1)创建工作目录
[root@localhost ~ ]# mkdir /opt/mysql
(2)创建dockerfile文件
[root@localhost ~ ]# cd /opt/mysql
[root@localhost mysql ]# vim dockerfile
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum clean all
RUN yum -y install mariadb mariadb-server
RUN chown -R mysql:mysql /var/lib/mysql
ADD init.sh /init.sh
RUN chmod 775 /init.sh
RUN /init.sh
EXPOSE 3306
CMD ["mysqld_safe"]
(3)编写mysql初始化脚本
[root@localhost mysql ]# vim init.sh
#!/bin/bash
mysql_install_db --user=mysql
sleep 3
mysqld_safe &
sleep 3
mysqladmin -u "root" password "123456"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'%' identified by '123456';"
mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"
mysql -uroot -p123456 -e "flush privileges;"
(4)生成镜像
[root@localhost mysql ]# docker build -t mysql .
(5)创建容器
[root@localhost mysql ]# docker run -tid -p 3306:3306 mysql
[root@localhost mysql ]# dnf -y install mysql
[root@localhost mysql ]# mysql -uroot -p123456 -h 192.168.10.101 -P 3306