dockerfile,Docker镜像的创建

news2024/12/24 9:12:56

dockerfile:创建镜像,创建自定义的镜像。包括配置文件,挂载点,对外暴露的端口。设置环境变量。

docker的创建镜像的方式:

1、基于已有镜像进行创建。根据官方提供的镜像源,创建镜像,然后拉起容器。是一个白板,只能提供基础的功能,扩展性的功能还是需要自定义(进入容器进行操作)

(1)首先启动一个镜像,在容器里做修改
 docker run -it --name web centos:7 /bin/bash     #启动容器
 ​
 yum install -y epel-release  #安装epel源
 yum install -y nginx         #安装nginx
 yum install net-tools        #安装tools工具
 nginx                        #启动服务
 netstat -natp |grep 80       #查看端口是否开启
 ​
 docker ps -a   #查看容器ID
 ​
 (2)然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像
 docker commit -m "new nginx" -a "xxxx" 容器id nginx:centos7
 #常用选项:
 -m 指定说明信息;
 -a 指定作者信息;
 -p 生成过程中停止容器的运行。
 c7f4bc905c29  原容器ID。
 nginx:centos  生成新的镜像名称。
 ​
docker images    #查看生成的新镜像
docker run -itd nginx:centos7 bash          #使用新的镜像创建容器
docker ps -a                              #查看容器状态
docker exec -it 容器id bash           #进入容器
nginx                                       #启动nginx服务
netstat -natp |grep 80                      #查看80端口是否开启

2、基于模版进行创建。

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ 开源项目下载,下载地址为: 

 openvz.org/ Download/template/precreated

模板里面就是使用docker export 命令导出的容器文件
 ​

 #下载模板
 wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
 ​
 #导入为镜像,两种方法
 cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test  #方法一
 docker import debian-7.0-x86-minimal.tar.gz -- debian:test  #方法二
 ​
 #查看镜像
 docker images
 #使用导入的镜像创建容器
 docker run -itd debian:test bash
 docker ps -a

3、 dockerfile

联合文件系统(UnionFS),docker镜像的基础。
镜像通过分层来进行集成
特性:一次同时加载多个文件系统,但是从用户来看,就是一个文件系统。docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。每一层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是rootfs.
bootfs:宿主机提供的内核和引导程序,主要包含bootloader和kernel,bootloader主 要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。
rootfs:就是容器的操作系统,在dockerfile中,我们可以自己指定。包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等。

rootfs是多个基础镜像和应用镜像结合起来的只读层。镜像实际上就是一个只读文件。容器基于镜像实例,运行起来之后,容器变成可读可写层。

在dockerfile当中每创建一个指定都是一个镜像层。镜像层会被缓存和复用。
1-6
1-4失败
1-4将直接完成,继续运行5-6
一旦有一层镜像失败,那么所有的镜像层都会失败。镜像也不会创建。
镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件依然存在,但是在容器中看不见。

dockerfile的核心:用户个性化定制docker的镜像。

dockerfile的结构:

1、基础镜像信息
2、维护者信息
3、镜像的操作指令
4、容器启动时,执行的命令。

nginx:定义好了容器执行的命令/bin/bash,覆盖了容器内的标准输出。

dockerfile的语法:

FROM:指定基础镜像信息。指定容器的操作系统。
MAINTAINER:指定维护者信息(可有可无)
RUN:在基础的镜像上执行的命令,每一个run就是一层,分层越多,镜像越大。ENTRYPOINT:设置容器运行是的默认命令(容器内部运行的主程序。)

ENTRYPOINT

ENTRYPOINT ["要运行的程序","参数1","参数2"]

设定容器启动时第一个运行的命令及其参数。

两种格式:
exec格式(数值格式):ENTRYPOINT [“命令”,“选项”,“参数”]
shell格式:ENTRYPOINT 命令 选项 参数
复制代码

CMD:指定容器运行时的默认命令(docker run /bin/bash后面加了其他的命令。cmd的指令将会被覆盖。)

 两种格式:
 exec形式:CMD [“要运行的程序”,“参数1”, “参数2”]
 shell形式: CMD 命令 参数1 参数2 复制代码

EXPOSE:暴露端口(指定容器的运行端口)

指定新镜像加载到Docker 时要开启的端口。

用于暴露端口,否则即使做了端口映射,外部也找不到。

ENV:设置环境变量,环境变量可以被RUN命令使用(声明容器运行需要的环境变量)

ADD:复制,解压。解压不支持.zip和.rar tar.gz tar.bz2支持url地址解压和复制(解压)COPY:复制文件,不能解压,而且只能复制本地文件。文件要和dockerfile在一个目录。(官方推荐复制用copy)
VOLUME:创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载。
USER:设置运行镜像时使用的用户或者UID(可以不加)
WORKDIR:为后续指令设置的工作目录。

ONBUILD:这个镜像可以被其他镜像引用,需要这个命令。

ARG:传参,用于创建容器时,传递参数。ENV用于容器运行时设置环境变量。

CMD和ENTRYPOINT的区别:

都是可以作为容器启动时的默认命令。
区别:
1、cmd可以把参数传给ENTRYPOINT。
2、多个entrypoint和多个cmd只会运行最后一个(一个dockerfile当中只会有一个entrypoint和cmd)
3、entryponit的指令不会被覆盖,CMD的指令如果在docker run的后面加上输出,会被覆盖。

4、entryponit和cmd的指令在容器启动时执行,都会成为容器的主进程。主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将终止运行。

RUN命令的优化:

主要是减少镜像的层数:把多个run命名写在一块。
&&符号:
RUN yum-y install nginx && make -j 4 && make install
前一个命令执行成功才会执行下一个命令。
;符号:
RUN yum-y install nginx ; make -j 4 ; make install
不管前一个命令是否成功,后面的命令都会执行。
||:
RUN yum-y install nginx || make -j 4
如果前面的命令执行失败,才会执行后面的操作

copy和add区别:

copy和add都可以把本地文件复制到镜像中但是官方推荐如果是复制,使用copy.
区别:
ADD可以解压,如果是一个压缩文件,add在复制之后会自动解压。(tar.gz和tar.bz2)可以支持URL下载源文件,支持下载,但是不能解压。通过URL拷贝的文件无法自动解压。

copy只能复制,不能解压,而且只能是本地文件,不支持URL路径。

Dockfile源码编译apache 

下载apr-1.6.2.tar.gz  apr-util-1.6.0.tar.gz  httpd-2.4.29.tar.bz2

vim Dockerfile
 
#基础镜像的指定
FROM centos:7
#作者信息
MAINTAINER this is my  my apache <xx-2023-11-24>
RUN yum install -y gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29/ &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
 make -j 4 && make install
 
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGRUOND"]
 
 
docker build -t apache:centos .

注意:容器里的服务必须为前台启动程序,否则会容器启动又关闭,无法正常提供服务。

所以在进行容器提供服务时,需要了解各种服务的前台运行,若该服务没有前台运行选项,则需要在容器中挂一个占用前台的运行指令,避免容器开启后有关闭。

本次apache的前台启动命令为apachectl -D FOREGROUND 

镜像容量过大的解决方案 

  1. 基础镜像尽量使用轻量级最小化的镜像。
  2. Dockerfile中尽量把RUN指令合并在一起,减少镜像的层数(因为每一个RUN指令就是一个镜像层)。
  3. 多级构建(拿Dockerfile构建好的镜像再构建一次)。

vim Dockerfile
#基层镜像
FROM centos:7 AS first
#镜像作者信息描述
MAINTAINER this is apache image <yh 2022-11-23 >
#指定的Linu执行脚本
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
#将源码编译的安装包安放到容器中并进行解压
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
#进行源码编译安装
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util && cd /opt/httpd-2.4.29 && ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make -j 4 && make install
#二阶段构建
FROM centos:7
#将一阶段的已安装好的包安防到二阶端中,并舍弃一阶段的其他无用资源
COPY --from=first  /usr/local/httpd  /usr/local/httpd
#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包
RUN yum install -y pcre pcre-devel expat-devel perl
EXPOSE 80
ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
 
docker build -t apache2:centos7 .

vim Dockerfile
 

Dockfile源码编译nginx

下载nginx-1.22.0.tar.gz

vim Dockerfile

FROM centos:7
MAINTAINER this is nginx <yzl>
ADD nginx-1.22.0.tar.gz /usr/local/
RUN yum install -y pcre-devel zlib-devel openssh-devel gcc gcc-c++ make ncurses ncurses-devel bison cmake gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel
RUN useradd -M -s /sbin/nologin nginx && \
cd /usr/local/nginx-1.22.0 && \
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
 
EXPOSE 80
 
CMD ["/usr/local/nginx/sbin/nginx", "-g","daemon off;"]

创建镜像

docker build -t centos7:nginx .

运行容器

docker run -d --name nginx -p 8080:80 centos7:nginx

访问 20.0.0.70:8080

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1310769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3分钟打造私人微信ChatGPT助手:新手友好指南!

接上文&#xff1a; https://mp.weixin.qq.com/s/RCqX0rx7TEu1gIwHEBBWKQ 本文适用于小白用户&#xff0c;技术大佬勿入&#xff01; 前言 这里教大家如何快速的拥有一个属于自己的微信GPT助手 我个人其实不是这么部署的&#xff0c;但是为了方便小白用户&#xff0c;探索了一个…

python算法例17 下一个稀疏数

1. 问题描述 如果一个数是稀疏数&#xff0c;则它的二进制表示中没有相邻的1&#xff0c;例如5&#xff08;二进制表示为101&#xff09;是稀疏数&#xff0c;但是6&#xff08;二进制表示为110&#xff09;不是稀疏数&#xff0c;本例将给出一个n&#xff0c;找出大于或等于n…

记深圳盐田IBM X3550 m4服务器board故障维修一例

故障服务器型号&#xff1a;ibm system x3550 m4 服务器故障问题&#xff1a;无法开机 面板叹号黄灯&#xff0c;小面板board故障亮灯 响应时效&#xff1a;当天工程师带配件到现场检修并恢复操作系统和业务系统 维修过程&#xff1a;工程师经过与用户的交流中大致判定了故障…

Unity与Android交互通信系列(1)

运行于Android平台的原生App直接调用Android接口&#xff0c;可以享受近水楼台先得月的优势&#xff0c;而使用Unity开发的Android应用App则像是二等公民&#xff0c;使用Android原生功能特性就要麻烦得多&#xff0c;比如WiFi、蓝牙等&#xff0c;特别是一些高级功能特性&…

ArrayList集合的两个实例应用,有趣的洗牌算法与杨辉三角

本节课的内容&#xff0c;就让我们来学习一下ArrayList集合的应用&#xff0c;ArrayList的本质就是一个顺序表&#xff0c;那下面一起来学习吧 目录 一、杨辉三角 1.题目详情及链接 2.剖析题目 3.思路及代码 二、洗牌算法 1.创造牌对象 2.创造一副牌 3.洗牌操作 4.发…

大数据笔记(待续)

mysql 缓存技术 数据库和缓存双写数据一致性问题常见的解决方案 常见方案通常情况下&#xff0c;我们使用缓存的主要目的是为了提升查询的性能。大多数情况下&#xff0c;我们是这样使用缓存的&#xff1a; 用户请求过来之后&#xff0c;先查缓存有没有数据&#xff0c;如果有…

学习笔记 -- CAN系统基础

一、CAN物理层 一个双节点CAN网络示意图如下&#xff0c;两颗120Ω终端电阻并联呈现总线电阻60Ω。 A、B两个节点的CAN收发器&#xff08;Transceiver&#xff09;&#xff0c;只负责电平转换。当总线静默时&#xff0c;收发器内部的2.5V电源经15KΩ电阻把CAN-H和CAN-L都拉到2.…

前端(一):HTML+CSS

参考课程&#xff1a;23最新版web前端开发_哔哩哔哩_bilibili 文档&#xff1a;GitHub - codeNiuMa/HTML-md-file: 学习HTML课程时的资料 目录 1 HTML 1.1 骨架 DOCTYPE html标签 head标签 body标签 title标签 meta标签 1.2 标签标题h1 1.3 段落p 1.4 水平线 1.5 图片img 1.6 …

【Android12】Android Framework系列--AMS启动Activity分析

AMS启动Activity分析 通过ActivityManagerService(AMS)提供的方法&#xff0c;可以启动指定的Activity。比如Launcher中点击应用图标后&#xff0c;调用AMS的startActivity函数启动应用。 AMS提供的服务通过IActivityManager.aidl文件定义。 // frameworks/base/core/java/an…

【AI底层逻辑】——数学与机器学习:优雅的智慧之舞

目录 “宝藏网站” 聊聊数学 “华尔兹” “智慧之舞” 后续的章节我们将迎来新的篇章&#xff0c;新的切入点探索AI的奥秘&#xff0c;通过揭示高数、矩阵、概率论等数学知识与机器学习的关系来深入理解AI的奥秘&#xff01; “宝藏网站” 开头先给大家上几个宝藏网站&am…

【离散数学】——期末刷题题库(欧拉图和哈密顿图)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

java中,用函数对象表示策略

简而言之&#xff0c;函数指针的主要用途就是实现策略(Strategy)模式。 Java没有提供函数指针&#xff0c;但是可以用对象引用实现相同的功能。调用对象上的方法通常是执行该对象上某项操作。 在Java中&#xff0c;使用函数对象&#xff08;Function Object&#xff09;表示策…

《数据结构、算法与应用C++语言描述》-机器调度-最长处理时间(LPT)

机器调度 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_28LongestProcessingTime 问题描述 一个工厂具有 m台一模一样的机器。我们有n 个任务需要处理。设作业i的处理时间为 t i t_i ti​&#xff0c;这个时间包括把作业放入机器…

Amazon Aurora Limitless Database:数据库管理的全新境界

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 在当今数亿用户、PB级数据和数百万交易的业务环境中&#xff0c;数…

12.14_黑马数据结构与算法笔记Java

目录 120 二叉搜索树 min max 121 二叉搜索树 put 122 二叉搜索树 前任后任1 123 二叉搜索树 前任后任2 124 二叉搜索树 删除1 125 二叉搜索树 删除2 126 二叉搜索树 删除3 127 二叉搜索树 删除 递归1 128 二叉搜索树 删除 递归2 129 二叉搜索树 范围查询 130 二叉搜…

KUKA机器人如何隐藏程序或程序段?

KUKA机器人如何隐藏程序或程序段? 如下图所示,新建一个示例程序进行说明, 如下图所示,如果红框中的动作指令不想让别人看到,想隐藏起来,如何做到? 如下图所示,在想要隐藏的程序或程序段的前后,分别添加 ;fold 和 endfold指令(这里要注意是英文状态下的输入法), 如…

国标GB28181安防监控系统/磁盘阵列EasyCVR(V.3.4)新亮点:免保活功能

TSINGSEE青犀近日发布了EasyCVR安防管理平台的V.3.4版本&#xff0c;其中一大亮点就是很多朋友都在咨询的“免保活”功能&#xff0c;那么&#xff0c;什么是“免保活”功能&#xff1f;又该如何配置呢&#xff1f; 在EasyCVR平台有个【按需直播】按钮&#xff0c;顾名思义&…

如何部署Portainer容器管理工具+cpolar内网穿透实现公网访问管理界面

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 本文主要介绍如何本地安装Portainer并结合内网穿透工具实现任意浏览器远程访问管理界面。Portainer 是一个轻量级…

大象elephant目标检测数据集VOC+YOLO格式2300张

大象是长鼻目象科的哺乳动物&#xff0c;有两个属&#xff0c;是世界上最大的陆生动物。其像柱子一样的四肢和宽厚的脚掌可以稳稳支撑住庞大的身体。巨大的头上长有蒲扇状的大耳朵和长且有弹性的鼻子。象耳上有丰富的血管&#xff0c;可以有效散热。鼻子和上唇合而为一的象鼻由…

YB9225是一种固定工作频率的高效率电流模式升压转换器。

YB9225B 1.2 MHz。峰值5A 电流&#xff0c;升压转换器 概述 &#xff1a; YB9225是一种固定工作频率的高效率电流模式升压转换器。YB9225集成了一个非常低的 Rds-on NMOSFTET&#xff0c;以减少功率损耗和实现高效率。最高效率可达93% 。功率 MOSFET 的峰值电流限制在5 A。1.…