docker基础6——制作镜像(dockerfile)

2023-11-02

一、基本了解

  • Dockerfile 是一个文本格式的配置文件,可以使用Dockerfile 快速创建自定义镜像。
  • Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。
  • 可以通过 .dockerignore 文件(每一行添加一条匹配模式)来让Docker忽略路径下的目录和文件。
  • Dockerfile分为四部分:
    1. 基础镜像信息。
    2. 维护者信息。
    3. 镜像操作指令。
    4. 容器启动时默认要执行的指令。

1.1. 基于centos构建镜像

1.编写dockerfile。

cat Dockerfile

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: seancheng
# Command format: Instruction [arguments / command] ...

# 第一行必须指定基于的基础镜像
FROM centos:7

# 维护者信息
LABEL MAINTAINER='seancheng xianshangxian@126.com'
#
# # 镜像操作指令
RUN yum clean all && yum -y install epel-release
RUN yum -y install nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
#
# # 容器启动时默认要执行的指令
CMD /usr/sbin/nginx                    

2.构建镜像。

docker build -t nginx:v1 .

在这里插入图片描述
3.使用构建镜像启动容器,网页访问。

docker run -d -p 8080:80   nginx:v1

在这里插入图片描述

1.2 基于alpine制作镜像

  • 官网,需要学习安装包的相关命令。
    在这里插入图片描述

1.编写Dokckfile,需要提前上传nginx二进制安装包。

#基础镜像信息
FROM alpine

# 维护者信息
LABEL MAINTAINER="MQ <2571798411@qq.com>"

##定义变量
ENV version 1.24.0
ENV install_path /usr/local/src
ENV PATH $install_path/nginx/sbin:$PATH

#暴露端口
EXPOSE 80 443

# 镜像操作指令
ADD file/nginx-$version.tar.gz $install_path

WORKDIR $install_path/nginx-$version

RUN echo 'https://mirrors.ustc.edu.cn/alpine/v3.12/main/' > /etc/apk/repositories && \
    echo 'https://mirrors.ustc.edu.cn/alpine/v3.12/community/' >> /etc/apk/repositories && \
    addgroup -S nginx && \
    adduser -DHS -s /sbin/nologin -G nginx nginx && \
    apk add --no-cache gcc libc-dev make pcre-dev openssl-dev openssl gd-dev zlib-dev && \
    ./configure  --prefix=$install_path/nginx --user=nginx --group=nginx && make && make install

# 容器启动时默认要执行的指令
CMD ["-g", "daemon off;"]
ENTRYPOINT ["nginx"]

2.构建镜像。

docker build -t nginx:v1 /opt/nginx

在这里插入图片描述

3.使用该镜像启动一个容器。

docker run -d  --name qingjun1  nginx:v1

在这里插入图片描述

二、常用指令

指令 格式 释义
FROM FROM <image>或FROM <imagge>:<tag> 指定基础镜像。
同一个Dockerfile中创建多个镜像可以使用多个FROM指令。
LABEL MAINTAINER LABEL MAINTAINER <name email_address> 指定维护者信息。
RUN RUN <command>
RUN [“executable”,“param1”,“param2”]
指定要执行的命令。
推荐使用格式二。
CMD CMD [“executable”,“param1”,“param2”]
CMD command param1 param2
CMD [“param1”,“param2”]提供给ENTRYPOINT的默认参数
指定启动容器时默认要执行的命令。
会被docker run指定参数覆盖。
EXPOSE EXPOSE <port> [<port>…] 将容器内的应用端口信息显示出来,方便维护。
ENV ENV <key> <value> 指定环境变量,会被后续RUN指令使用,并在容器运行时保持。
ADD ADD <src> <dest> 将本地的<src>内容复制到容器中的<dest>。
<src>可以是Dockerfile所在目录的一个相对路径(文件或目录)、
一个URL、一个tar文件(会自动解压为目录)。
COPY COPY <src> <dest> 作用与ADD一样,区别是不会解压tar包,只是单纯复制。
ENTRYPOINT ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command param1 param2(在shell中执行)
指定启动容器时默认要执行的命令。
不会被docker run后面的指定参数覆盖,
并且这些参数会被传递给ENTRYPOINT指定的程序。
VOLUME VOLUME [“/data”] 创建一个可以从本地主机或其他容器挂载的挂载点,不实用。
USER USER daemon 指定运行容器时的用户名或UID,
后续的RUN也会使用指定用户。
WORKDIR WORKDIR /path/to/workdir 进入目录命令,作用与cd相同。
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
ONBUILD ONBUILD [INSTRUCTION] 配置当前创建的镜像作为其他镜像的基础镜像时,所执行的操作指令。
使用ONBUILD指令的镜像,需要给镜像标注明,方便别人使用,
例如ruby:1.9-onbuild。

三、制作httpd镜像

1.文件结构,需要准备httpd离线安装包。

wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz
wget https://downloads.apache.org/apr/apr-util-1.6.3.tar.gz
wget https://downloads.apache.org/httpd/httpd-2.4.57.tar.gz

在这里插入图片描述

2.编写Dockerfile。

//编写dockerfile
cat Dockerfile 

FROM alpine
ENV PATH /usr/local/apache/bin:$PATH
COPY file /usr/src/
COPY script /tmp/
WORKDIR /usr/src/

RUN /bin/sh /tmp/install.sh && \
    rm -rf /tmp/*

EXPOSE 80 443
CMD ["-X"]
ENTRYPOINT ["httpd"]


//编写脚本。
cat script/install.sh 
#!/bin/sh
echo 'https://mirrors.ustc.edu.cn/alpine/v3.12/main/' > /etc/apk/repositories && \
echo 'https://mirrors.ustc.edu.cn/alpine/v3.12/community/' >> /etc/apk/repositories && \
apk update && \
apk add --no-cache -U gcc g++ make openssl-dev pcre-dev expat-dev libtool && \
addgroup -S apache && \
adduser -DHS -s /sbin/nologin -G apache apache && \
tar xf apr-1.7.4.tar.gz && \
tar xf apr-util-1.6.3.tar.gz && \
tar xf httpd-2.4.57.tar.gz && \
sed -i '/$RM "$cfgfile"/d' apr-1.7.4/configure && \
cd apr-1.7.4 && \
./configure --prefix=/usr/local/apr && make && make install && \
cd ../apr-util-1.6.3 && \
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr &&
make && make install && \
cd ../httpd-2.4.57 && \
./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork && \
make && make install && \
sed -i '/^#ServerName/s/#//g' /etc/httpd24/httpd.conf && \
rm -rf /usr/src/* /var/cache/* && \
apk del gcc g++ make

3.构建镜像。

docker build -t httpd:v2 apache

4.使用构建的镜像部署容器。

docker run -d --name httpd2  httpd:v2

5.查看容器IP,访问容器IP。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker基础6——制作镜像(dockerfile) 的相关文章

  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • 如何从 docker 运行 Maven 包装器?

    我必须从 dockerfile 运行 Maven 包装器命令 但我不知道该怎么做 当我尝试这样写时 RUN mvnw s settings xml clean install 这个命令不起作用 我有错误mvnw not found 我的泊坞
  • “docker-compose run”命令后卷更改不持久(Django 的collectstatic)

    我有一个使用 Docker Compose 创建的 Django 环境 我正在尝试使用manage py collectstatic将我网站的静态文件复制到容器中的目录中 该目录 usr src app static 也是一个 Docker
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • docker-compose 容器在多个项目中使用错误的容器

    我有两个项目 需要两个不同的docker环境 容器 我有两个docker compose yml两个不同项目中的文件 foo项目和bar项目 foo src website docker compose yml 1 foo version
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 从 docker 中的脚本创建 SQL Server 数据库

    我希望这是一个简单的问题 我在任何地方都找不到任何东西 如何在Microsoft SQL Server Docker容器 Dockerfile 我正在看以下内容Dockerfile FROM microsoft mssql server w
  • 如何设置Java线程的CPU核心亲和力?

    我搜索了以前关于类似主题的帖子 但找不到合适的答案 因此提出这个问题 非常感谢您帮助回答 我知道在 Linux 中通过任务集命令设置进程与特定 CPU 核心的关联性 但我想设置 Java 线程与特定 cpu 核心的亲和力 以便属于同一进程的
  • .m2 的 Docker 缓存在本地不起作用

    考虑这个 gitlab ci yml variables MAVEN OPTS Dmaven repo local root m2 repository cache key M2 paths root m2 repository 当直接在
  • 在 EB 上的 Docker 中运行的应用程序拒绝连接到自身

    我有一个 Play 2 Web 应用程序 我使用 Docker 将其部署到 Elastic Beanstalk 在此 Web 应用程序中 我启动了一个 Akka 集群 启动过程涉及将自动伸缩组中的所有节点添加为种子节点 包括其自身 第一次部
  • 使用c在linux上分块读写

    我有一个 ASCII 文件 其中每一行都包含一个可变长度的记录 例如 Record 1 15 characters Record 2 200 characters Record 3 500 characters Record n X cha
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • Docker Compose - 如何执行多个命令?

    我想做这样的事情 我可以在以下代码中运行多个命令 db image postgres web build command python manage py migrate command python manage py runserver
  • Docker nginx 代理到主机

    简短的介绍 Nginx 运行在 docker 上 如何配置 nginx 以便将调用转发到主机 详细描述 我们有一个 Web 应用程序与几个后端通信 假设为rest1 rest2 和rest3 我们负责rest1 让我们考虑一下我开始rest
  • 在 docker 镜像中包含层有哪些优点?

    假设我有两个不同的 Dockerfile 图像一名为 nudoc my base image 1 1 FROM ubuntu 16 10 COPY test war 图像二名为 nudoc my testrun image 1 1 FROM
  • 为什么默认情况下不启用 arp 忽略/通告 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个需要经验才能回答的具体问题 为什么 arp ignore arp announce 在 Linux 安装 例如 debian 上默认不启用 有
  • 比较linux中的两个未排序列表,列出第二个文件中的唯一项

    我有 2 个包含号码列表 电话号码 的文件 我正在寻找一种列出第二个文件中第一个文件中不存在的数字的方法 我尝试过各种方法 comm getting some weird sorting errors fgrep v x f second
  • 运行 shell 命令并将输出发送到文件?

    我需要能够通过 php 脚本修改我的 openvpn 身份验证文件 我已将我的 http 用户设置为免通 sudoer 因为这台机器仅在我的家庭网络中可用 我目前有以下命令 echo shell exec sudo echo usernam
  • Consul 未取消注册僵尸服务

    我正在使用 marathon 部署一个简单的 hello world nginx 容器 一切似乎都运行良好 除了我有 6 个容器不会从 consul 注销 docker ps显示没有容器正在运行 我尝试使用 v1 catalog dereg

随机推荐

  • 关于Java的那些安全框架

    前言 在Java开发中 安全是一项至关重要的特性 不仅仅是因为它保护我们的数据和系统免受恶意攻击 还因为它保护着我们和我们的用户的隐私 因此 Java安全框架的选择至关重要 在本篇博客中 我们将探讨一些常见的Java安全框架 以及如何使用它
  • 微服务发展趋势

    目录 云原生网关逐步成型 服务网格回归理性 微服务架构分层逐渐清晰 微服务技术标准逐步形成 数据面 SidecarProxy 与 Proxyless 模式的融合 服务治理数据面透明化 控制面标准化 分布式事务从多样化到标准化 多语言解决方案
  • Android混合开发全解析

    现在的app都开始流行混合开发了 这是一个app开发的新技术 作为android程序猿的我们也应该要了解并且掌握他 那么在使用之前 我们一定要搞清楚 我们的哪些场景使用混合开发好一些呢 这个问题一定要搞清楚 因为现在的混合开发还不成熟 We
  • 测开基础知识02

    1 软件测试 软件测试 软件测试是软件研发的一部分 不止是找出软件错误的活动 是软件开发每一环节中一些列质量活动的总称 包括软件研发过程的改进 软件质量评定 需要参与到每一环关键的决策 发现程序中的错误 根据需求 分析执行软件的全过程 保证
  • lol英雄全皮肤爬取

    如何实现英雄联盟全皮肤 作为英雄联盟资深老玩家 想必大家都希望自己能拥有一套全皮肤 那么今天 小编就带着大家用网络爬虫的方式 爬取一套属于自己的全皮肤 冲 第一步 首先 打开我们全皮肤所在的网站 https 101 qq com hero
  • c#和c++的opencv位图数据参数互换问题解决方法

    1 C 调用vc dll 传递参数的问题 Bitmap 转换为 opencv mat 保存后图片不一样 vc 代码 bool Recognize Point 2F arr uchar b Mat src cv Mat 415 770 CV
  • 网络基础:网络协议及数据报格式

    网络应用程序设计模式 网络分层模型 两台计算机通过TCP IP协议通讯过程 协议格式 以太网帧格式 ARP探测的概念及数据报格式 ip段格式 UDP数据报格式 TCP数据报格式 TCP IP数据包封装 NAT映射与打洞机制 概念说明
  • 6950有史以来最经典玩机宝典/软件包/导航

    http www diypda com forum php mod viewthread tid 116274 教程 6950有史以来最经典玩机宝典 软件包 导航 复制链接 新支点6950玩机宝典 作为论坛资深认证商家和6950的改卡开发商
  • Linux进程

    目录 进程基本概念 描述进程PCB task struct内容分类 通过系统调用创建进程 fork 进程状态 Z zombie 僵尸进程 孤儿进程 进程优先级 进程基本概念 书上的概念是 进程是程序的一个执行实例 正在执行的程序等 在内核的
  • Python 回调函数实现异步处理

    说到异步处理大家应该会联想到Ajax 处理 那我们先来说说什么是Ajax 请求 Ajax 就相当于是模拟了一个信息发送请求 你可以在很多网站上注册的时候会发现 比如用户名输入 123 那么它可能会提示你该用户已经存在 而给你的感觉是页面并没
  • windows、Ubuntu安装QT时经常出现“无法下载存档……”解决办法

    说明 以windows为例 ubuntu操作一样 下载好exe执行文件 双击执行时 经常出现下图提示 无法下载存档 是由于默认使用的是境外源 有两种解决方式 方式一 挂魔法在线安装 方式二 使用国内源 清华大学 https mirrors
  • 读阮一峰ES6对象解构赋值小细节

    最近看阮一峰的ES6发现了个地方有点不懂 理解之后 特意记录下来 let obj let arr foo obj prop bar arr 0 foo 123 bar true obj prop 123 arr true 就是上面这块 首先
  • NavicatPremium连接MySQL出现异常Authentication plugin ‘caching_sha2_password‘ cannot be loaded的解决方案

    一 出现异常原因 由于个人本机安装的mysql是8 0 在使用Navicat连接数据库时 出现Authentication plugin caching sha2 password cannot be loaded异常 通过搜集资料得知my
  • 几种常用的无源滤波器的特征

    无源滤波器的缺点 带负载能力差 无放大作用 特性不理想 边沿不陡峭 各级相互影响 滤波器是一种通过一定频率的信号而阻止或衰减其他频率信号的部件 分类 按照处理信号形式 模拟滤波器和数字滤波器 按功能分 低通 高通 带通 带阻 按电路组成分
  • Visio中实现任意两点之间的连线

    参考博客01 https blog csdn net wanzhen4330 article details 84837279 想实现的效果 如下图所示 想要实现的是像下面图中 让箭头线段多次弯折 最终连接两个矩形方框 二 做法 在Visi
  • SQLServer数据库密码已过期问题 处理

    Sqlserver在设置登录账户信息的时候 有个复选框信息会被默认勾上 即强制实施密码策略 默认勾选上的还有强制密码过期 如果勾上了这个强制密码过期后 则你的账户密码在一定时间登录后会提示Sqlserver登录密码已过期请重新设置密码 如果
  • docker-management遇到的一些问题

    一个mysql节点 两个cloudstack management节点 先启动mysql节点 如果cloudstack management容器节点无法访问mysql节点 注意docker宿主机的iptables规则 启动cloudstac
  • 总结一波安卓组件化开源方案

    摘要 为了让大家能快速对android组件化有个整体的认识 本文将从多个维度对目前网上一些有代表性的开源组件化开发方案进行对比 从而更好的区分各组件化方案的特点 快速选择适合自己使用的方案深入学习并使用 在面试中被问到时也能做到心中有数 前
  • PCL 从深度图像中提取边界

    一 图像边界 深度图像边界 计从前景跨越到背景的位置定义为边界 具体有 物体边界 这是物体的最外层和阴影边界的可见点集 阴影边界 毗邻与遮挡的背景上的点集 Veil点集 在被遮挡物边界和阴影边界之间的内插点 它们是有激光雷达获取的3D距离数
  • docker基础6——制作镜像(dockerfile)

    文章目录 一 基本了解 1 1 基于centos构建镜像 1 2 基于alpine制作镜像 二 常用指令 三 制作httpd镜像 一 基本了解 Dockerfile 是一个文本格式的配置文件 可以使用Dockerfile 快速创建自定义镜像