dockerfile,Docker镜像的创建

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.mzph.cn/news/221553.shtml

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

相关文章

Linux主机自动注册NPS客户端(脚本化)

参考官方对API使用方法的定义&#xff1a;https://ehang-io.github.io/nps/#/ 1、首先必须要在配置文件中开启 auth_key 并配置一个合适的密钥 2、修改脚本中的可变量参数&#xff0c;以适配自己的环境 #!/bin/bash # 脚本使用说明&#xff1a;# 脚本名称&#xff1a;npc_cr…

+0和不+0的性能差异

前几日&#xff0c;有群友转发了某位技术大佬的weibo。并在群里询问如下两个函数哪个执行的速度比较快&#xff08;weibo内容&#xff09;。 func g(n int, ch chan<- int) {r : 0for i : 0; i < n; i {r i}ch <- r 0 }func f(n int, ch chan<- int) {r : 0for …

基于Microchip 光伏逆变器方案

小编杂谈新能源已经完成了至少5期的博文了&#xff0c;Boss告诉小编&#xff0c;如果还不介绍我们的产品和方案&#xff0c;黄花菜都凉了&#xff0c;所以小编这期博文就重点介绍一下Microchip在储能上的产品介绍&#xff0c;重点聊聊Microchip储能中使用的光伏逆变器的解决方案…

期末数组函数加强练习

前言&#xff1a;由于时间问题&#xff0c;部分题解取自网友&#xff0c;但都是做过的好题。 对于有些用c实现的题目&#xff0c;可以转化成c实现&#xff0c;cin看成c的读入&#xff0c;可以用scanf&#xff0c;输出cout看作printf&#xff0c;endl即换行符 开胃菜&#xff…

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址&#xff1a;GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…

跨域的解决方式(java后端)

文章目录 一、跨域介绍1、什么是跨域2、为什么会产生跨域 二、简单请求和非简单请求1、简单请求2、非简单请求2.1、预检请求2.2、预检请求的回应2.3、浏览器的正常请求和回应 三、CrossOrigin注解1、CrossOrigin源码2、CorsRegistry方式3、CorsFilter过滤器4、自定义过滤器 一、…

Knowledge Distillation from A Stronger Teacher(NeurIPS 2022)论文解读

paper&#xff1a;Knowledge Distillation from A Stronger Teacher official implementation&#xff1a;https://github.com/hunto/dist_kd 前言 知识蒸馏通过将教师的知识传递给学生来增强学生模型的性能&#xff0c;我们自然会想到&#xff0c;是否教师的性能越强&…

【操作系统导论】内存篇——分页

引入 采用 「分段」 的方式&#xff0c;将空间切成 不同长度的分片&#xff0c;会出现 碎片化 问题&#xff0c;随着时间推移&#xff0c;分配内存会越来越困难。 因此&#xff0c;值得考虑「分页」的方法&#xff1a; 将空间分割成 固定长度的分片 &#xff1b; 将物理内存…

python列表的循环遍历

数据容器&#xff1a;一个可以存储多个元素的Python数据类型 有哪些数据容器&#xff1a;list&#xff08;列表&#xff09;&#xff0c;tuple&#xff08;元组&#xff09;&#xff0c;str&#xff08;字符串&#xff09;&#xff0c;set&#xff08;集合&#xff09;&#x…

第三方电脑小爱同学用快捷键唤醒

第三方电脑安装小爱同学-CSDN博客 请结合之前安装小爱同学的教程安装过程请提前取消windows更新 安装完成之后登录账号即可使用 Ahk2.0 下载地址&#xff1a;https://www.autohotkey.com/download/ahk-v2.zip 打开链接即可自动下载&#xff0c;下载后解压出来点击install.cmd安…

微信公众服务号升级订阅号

服务号和订阅号有什么区别&#xff1f;服务号转为订阅号有哪些作用&#xff1f;首先我们要知道服务号和订阅号有什么区别。服务号侧重于对用户进行服务&#xff0c;每月可推送4次&#xff0c;每次最多8篇文章&#xff0c;发送的消息直接显示在好友列表中。订阅号更侧重于信息传…

java飞翔的鸟游戏

A.准备工作 Bird类 Column类 BirdGame类 Ground类 B.中间过程 准备工作&#xff1a; 安装Java开发环境&#xff08;JDK&#xff09;。选择一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;如Eclipse、IntelliJ IDEA或NetBeans。 创建项目&#xff1a; 在IDE中创建一个…

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

一文了解java中volatile关键字

认识volatile volatile关键字的作用有两个&#xff1a;变量修改对其他线程立即可见、禁止指令重排。 第二个作用我们后面再讲&#xff0c;先主要讲一下第一个作用。通俗点来说&#xff0c;就是我在一个线程对一个变量进行了修改&#xff0c;那么其他线程马上就可以知道我修改…

树莓派zero w入坑指南

树莓派zero w入坑指南 入坑契机 说起创客不得不提到开源硬件Raspberry Pi(树莓派)。它是一款基于ARM的微型电脑主板&#xff0c;以MicroSD卡为硬盘&#xff0c;提供HDMI和USB等外部接口&#xff0c;可连接显示器和键鼠。以上部件全部整合在一张仅比信用卡稍大的主板上&#x…

pytorch_lightning 安装

在安装pytorch-lightning时一定注意自己的torch是pip安装还是conda安装&#xff0c;pytorch_lightning 安装方式要与torch的安装方式保持一致&#xff0c;否则也会导致你的torch版本被替换。 正确安装方式&#xff1a; pip方式&#xff1a; pip install pytorch-lightning版本…

issue unit

The Issue Unit issue queue用来hold住&#xff0c;已经dispatched&#xff0c;但是还没有执行的uops&#xff1b; 当一条uop的所有的operands已经ready之后&#xff0c;request请求会被拉起来&#xff1b;然后issue select logic将会从request bit 1的slot中&#xff0c;选择…

第十二章 React 路由配置,路由参数获取

一、专栏介绍 &#x1f436;&#x1f436; 欢迎加入本专栏&#xff01;本专栏将引领您快速上手React&#xff0c;让我们一起放弃放弃的念头&#xff0c;开始学习之旅吧&#xff01;我们将从搭建React项目开始&#xff0c;逐步深入讲解最核心的hooks&#xff0c;以及React路由、…

0基础学java-day19(IO流)

一、文件 1 什么是文件 2.文件流 3.常用的文件操作 3.1 创建文件对象相关构造器和方法 package com.hspedu.file;import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.Test;import java.io.File; import java.io.IOException;/*** author 林然* vers…

js根据数组对象中的某个值去重

原理&#xff1a;利用对象key-value进行去重 去重方法&#xff1a; // 数组对象根据某一个值去重 filterList(list[], key) {let obj {};list?.forEach(item>{obj[item[key]]item;});return Object.values(obj); }, 用法&#xff1a; let list [{id: 1, name: 1},{id…