当前位置: 首页 > news >正文

云原生技术与应用-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

 三.Dockerfile语法注意事项

1.指令书写规范

(1)大小写

    Dockerfile中的指令不区分大小写,但建议使用大写,以增强可读性。

(2)顺序

   指令的顺序非常重要,因为Docker会换顺序依次执行这些指令。合理安排指令顺序有助于提高构建效率和镜像的可维护性。

(3)注释

  可以使用#来添加注释,这有助于解释Dockerfile中各部分的作用,提高代码的可读性。

2.基础镜像选择
(1) 稳定性与安全性
  选择稳定、官方且维护良好的基础镜像,这样能保证镜像的安全性和可靠性。例如,官方的 ubuntu、alpine 等镜像都有较好的维护和更新机制。
(2) 镜像大小
  如果对镜像大小有严格要求,可选择轻量级的基础镜像,如 alpine 镜像,它体积小巧,适合构建资源占用少的容器。
3.文件操作注意
(1) COPY 与 ADD 的区别
  COPY 仅用于简单的文件和目录复制,语法清晰,性能较好,推荐优先使用。
  ADD 除复制功能外,还支持从 URL 下载文件和自动解压缩文件,但功能复杂可能带来安全风险和不可预测性,所以仅在确实需要这些额外功能时使用。
(3) 文件路径
  使用相对路径时要确保路径在构建上下文中是正确的。构建上下文是指执行 docker build 命令时指定的目录,只有该目录下的文件和子目录才能被复制到镜像中。
4.执行命令要点
(1) RUN 命令优化
  尽量将多个相关的命令合并成一个 RUN 指令,减少镜像的层数,从而减小镜像体积。例如,使用 && 连接多个命令。
(2) 清理临时文件和缓存
  要及时清理临时文件和缓存,避免将不必要的文件包含在镜像中。如上述示例中使用 rm -rf /var/lib/apt/lists/* 清理 APT 缓存。
(3) CMD 与 ENTRYPOINT 指令
  CMD 为容器提供默认执行命令,ENTRYPOINT 配置容器启动时执行的命令。当容器能被使用时,CMD 指令作为 ENTRYPOINT 的默认参数。
5.环境变量和参数设置
(1) ENV 与 ARG 的区别:
   ENV 设置的环境变量在容器运行时持续存在,可被容器内的应用程序使用,定义的参数还能在镜像构建过程有效,用于构建时的参数。
(4) 安全性
  避免在 ENV 或 ARG 中设置敏感信息(如密码、密钥等),若确实需要,可以在运行容器时通过环境变量传递。
(5) 网络和端口声明
  使用 EXPOSE 指令 - 只声明容器暴露的端口,不会进行实际的端口映射。在使用 docker run -p 选项时,会把容器中 EXPOSE 声明进行端口映射。
6.缓存利用与清理
(1) 缓存机制
  Docker 构建镜像时会利用缓存,若某条指令的内容未发生变化,会直接使用之前缓存的结果,加快构建速度;因此,将不常变动的指令放前面,可充分利用缓存。
(2) 缓存清理
   当需要强制重新构建镜像、不使用缓存时,可使用 docker build --no-cache 命令。

http://www.lryc.cn/news/584502.html

相关文章:

  • STM32之风扇模块(开关控制+PWM调速)
  • 相机:以鼠标点为中心缩放(使用OpenGL+QT开发三维CAD)
  • 动态物体滤除算法
  • 【读书笔记】如何画好架构图:架构思维的三大底层逻辑
  • CTFHub————Web{信息泄露[备份文件下载(vim缓存、.DS_Store)]}
  • UI前端与数字孪生结合案例分享:智慧城市的智慧能源管理系统
  • JAVA面试宝典 -《新潮技术:协程与响应式编程实践》
  • Java 中的多线程实现方式
  • 原创数学建模国赛半自动化辅助排版模板及国赛论文排版格式要求
  • 藏文识别技术的关键挑战与解决方案
  • Win11系统安装Anaconda环境极简教程
  • RV1126平台(Buildroot Linux)+ SunplusIT SPCA2688 USB摄像头 RTSP推流全流程复盘与问题解决记录
  • 反向传播notes
  • 用 ngrok + SSH 实现公网远程控制电脑
  • AI驱动的低代码革命:解构与重塑开发范式
  • Java观察者模式实现方式与测试方法
  • LUMP+NFS架构的Discuz论坛部署
  • 04-ES6
  • RuoYi-Cloud ruoyi-gateway 网关模块
  • 大数据时代UI前端的智能化升级:基于机器学习的用户意图预测
  • 在生信分析中,处理vcf 比较好用的python包推荐
  • 【PTA数据结构 | C语言版】顺序栈的3个操作
  • WebSocket实战:实现实时聊天应用 - 双向通信技术详解
  • Apache
  • AI探索 | 豆包智能助手跟扣子空间(AI办公助手)有什么区别
  • Java 与 MySQL 性能优化:MySQL连接池参数优化与性能提升
  • ClickHouse 查看正在执行的SQL查询
  • ClickHouse JSON 解析
  • 【图像处理基石】如何入门图像校正?
  • 线性探针是什么:是一种用于探测神经网络中特定特征的工具