目录

一.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.pswp.cn/news/913817.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913817.shtml
英文地址,请注明出处:http://en.pswp.cn/news/913817.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

澎湃系统webview加载h5弹窗显示异常

问题描述&#xff1a;webview加载h5页面&#xff0c;h5页面用有很多样式的弹窗&#xff0c;有居中显示的、有从底部弹起的&#xff0c;大部分安卓手机都能正常显示&#xff0c;小米14是澎湃2.0系统&#xff0c;弹窗可以出来、但是被压扁了、显示不全。解决方案&#xff1a;‌声…

Java连接Emqx实现订阅发布消息

一&#xff1a;前提 安装了Emqx开源版、MQTTX客户端 二&#xff1a;订阅发布实现步骤 1.引入依赖 <!--MQTT客户端--> <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><v…

ReactNative【实战系列教程】我的小红书 7 -- 消息(含弹窗菜单,右上角角标,空白页等)

最终效果弹窗菜单 点击右上角群聊按钮后&#xff0c;弹窗菜单无消息代码实现app/(tabs)/message.tsx import icon_no_collection from "/assets/icons/icon_no_collection.webp"; import FloatMenu, {FloatMenuRef, } from "/modules/message/components/FloatM…

Jenkins详细教程 - 从入门到精通

目录 1. 什么是Jenkins 1.1 简单理解 1.2 技术定义 1.3 核心特点 2. 为什么需要Jenkins 2.1 传统开发的痛点 手工发布的问题 真实场景举例 2.2 Jenkins的解决方案 自动化CI/CD流程 3. 核心概念解析 3.1 Job(任务) Job示例 3.2 Build(构建) 3.3 Pipeline(流水…

bash 判断 /opt/wslibs-cuda11.8 是否为软连接, 如果是,获取连接目的目录并自动创建

以下是实现该功能的 Bash 脚本&#xff1a; bash #!/bin/bash LINK_PATH“/opt/wslibs-cuda11.8” 检查是否为软链接 if [ -L "KaTeX parse error: Expected EOF, got # at position 24: …H" ]; then#̲ 获取软链接的绝对目标路径…(readlink -f “$LINK_PATH”) # …

【性能测试】jmeter+Linux环境部署和分布式压测,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、linux获取动态…

Java 17 新特性笔记

Java 17 是一个 长期支持版本&#xff08;LTS&#xff09;&#xff0c;于 2021 年 9 月发布&#xff0c;是继 Java 11 之后的重要里程碑。它整合了 Java 12~16 的众多特性&#xff0c;并引入新的语言增强、JDK API 改进、性能优化和安全增强。 Java 17 版本信息 发布时间&…

WWDC 25 风云再起:SwiftUI 7 Charts 心法从 2D 到 3D 的华丽蜕变

概述 在 iOS 开发这个波谲云诡的江湖中&#xff0c;SwiftUI 可谓是一位后起之秀&#xff0c;以其简洁明快的招式迅速在 UI 框架领域中崭露头角。 而其中的 Charts 框架&#xff0c;更是如同江湖中的 “数据可视化宝典”那样&#xff0c;让各位秃头少侠们能够轻松将复杂的数据转…

Vue+Element Plus 中按回车刷新页面问题排查与解决

VueElement Plus 中按回车刷新页面问题排查与解决原因分析解决方案方法一&#xff1a;阻止默认行为 submit.prevent方法二&#xff1a;只监听回车并触发搜索最终推荐写法如下&#xff1a;在使用 Vue 3 Element Plus 开发后台系统时&#xff0c;我们常常会通过 搭配 实现搜索功…

x86汇编语言入门基础(三)汇编指令篇3 位移运算

位移运算指令&#xff1a;SHL逻辑移位&#xff0c;SAR算术移位&#xff0c; ROR循环右移 1. SHL 逻辑移位 Shift Left, SHL代表向左移位&#xff0c;SHR代表向右移位 指令格式&#xff1a;shl op1, op2 目的操作数 op1&#xff1a;寄存器/内存地址源操作数 op2&#xff1a;寄…

Java-69 深入浅出 RPC 单体架构 垂直架构 分布式架构 微服务架构

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有…

Android 如何阻止应用自升级

问题背景 1.打开PlayStore,然后登陆账户 2.退出应用过几分钟后,应用会自动更新到新版本 3.再次打开应用,问题即可复现 一联网进入playStore应用并且登录谷歌账号,退出几分钟,在进入,发现应用版本号更新了,应用进行了自我升级,关键是升级之后谷歌商店就用不了了,就…

Docker-构建镜像并实现LNMP架构

一、搭建LNMP基础配置1、制作Nginx镜像制作dockerfilevim dockerfileFROM 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 z…

Python之--基本知识

基本输出语法结构: print(输出内容)print()函数完整的语法格出: print (value,...,sep,end\n,fileNone)只有字符串可以用连接基本输入语法结构: xinput(提示文字’)注意事项: 无论输入的数据是什么 x 的数据类型都是字符串类型示例&#xff1a;name input("Enter your na…

VS CodeC51 单片机开发环境搭建

文章目录前言1.安装插件2.创建EIDE项目&#xff08;51单片机&#xff09;3.配置工具链&#xff08;第一次使用需要配置&#xff09;4.编译与下载5.项目文件简介与串口调试工具6.推荐插件7.打包模板与导出模板8.51单片机串口无法识别问题前言 需要安装keil c51版本需要配置好C/…

国密算法(SM2/SM3/SM4)

文章目录国密算法&#xff08;SM2/SM3/SM4&#xff09;详解&#xff1a;从性能对比到Java手机号安全处理实战一、 国密核心算法简介二、 性能深度对比三、 Java实战&#xff1a;手机号的安全处理方案一&#xff1a;使用SM3哈希存储&#xff08;推荐用于验证场景&#xff09;方案…

从前端转go开发的学习路线

从前端开发转向 Go&#xff08;Golang&#xff09;后端开发&#xff0c;是一个非常可行也很实用的方向&#xff0c;特别是在做 高性能微服务、分布式系统、云原生&#xff08;如Kubernetes&#xff09; 等方面。以下是一份适合你&#xff08;有多年开发经验的前端开发者&#x…

node或浏览器上传文件到阿里云OSS

阿里云配置 进入阿里云OSS Bucket 列表的某个 Bucket 仓库下&#xff0c;点击访问控制 RAM 创建用户 勾上 创建 AccessKey ID 和 AccessKey Secret 复制 AccessKey 信息 用文档保存 创建角色 选择云账号 复制 ARN 用文档保存&#xff0c;然后 新增权限 搜索 oss 选择 AliyunOSS…

26考研物理复试面试常见问答问题汇总,物理专业保研推免夏令营面试问题汇总,物理本科知识专业面试最全攻略!

还在为物理考研复试面试发愁&#xff1f;还在为物理招聘的专业面试抓狂&#xff1f;还在为即将到来的物理夏令营面试不知从何下手、翻遍了厚厚的教材却抓不住重点&#xff1f;别慌&#xff0c;接下来我会从「考研的物理复试经历」「物理面试攻略」「物理面试基础问答题汇总很全…

(5)机器学习小白入门 YOLOv:数据需求与图像不足应对策略

(1)机器学习小白入门YOLOv &#xff1a;从概念到实践 (2)机器学习小白入门 YOLOv&#xff1a;从模块优化到工程部署 (3)机器学习小白入门 YOLOv&#xff1a; 解锁图片分类新技能 (4)机器学习小白入门YOLOv &#xff1a;图片标注实操手册 (5)机器学习小白入门 YOLOv&#xff1a;…