运维八一 运维八一
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)

运维八一

运维,运维!
首页
运维杂记
编程浅尝
周积跬步
专栏
生活
关于
收藏
  • 分类
  • 标签
  • 归档
Source (opens new window)
  • 操作系统

  • 域名解析

  • 公有云

  • CI&CD

  • 数据库

  • 负载均衡&反向代理

  • 存储系统

  • 容器&容器编排

    • kubeadm安装k8s单点(centos系统)
    • kubeadm安装k8s单点(debian系统)
    • k8s单master集群部署
    • k8s安全策略
    • Dockerfile参数说明
      • 1. 最小的镜像
      • 2. base镜像
      • 3. 镜像版本选型说明
        • .NET镜像版本说明
        • node.js镜像版本说明
        • Java镜像版本说明
      • 1 、FROM (指定基础 image )
      • 2 、MAINTAINER (用来指定镜像创建者信息)
      • 3 、RUN (安装软件用)
      • 4 、CMD (设置 container 启动时执行的操作)
      • 5 、ENTRYPOINT(设置 container 启动时执行的操作)
      • 6 、 USER(设置 container 容器的用户)
      • 7 、EXPOSE (指定容器需要映射到宿主机器的端口)
      • 8 、 ENV (用于设置环境变量)
      • 9 、ADD (从 src 复制文件到 container 的 dest 路径)
      • 10 、 VOLUME (指定挂载点)
      • 11 、WORKDIR (切换目录)
      • 12 、 ONBUILD (在子镜像中执行)
    • Docker环境磁盘清理
    • docker常用命令
    • docker卷挂载
    • docker网络模式
    • kubectl命令补全
    • k8s ingress代理外部IIS服务
    • k8s安装ingress-nginx
    • harbor (docker compose)安装
    • k8s进行pod级的抓包tcpdump
    • k8s使用secret拉取私有仓库镜像
    • k8s常用命令
    • k8s内存使用及监控
    • openshift 3_11单节点all-in-one安装
    • k8s 1_26版本创建serviceaccount不会自动创建secret
    • ctr和crictl显示镜像不一致
    • alpine镜像集成常用数据库客户端
  • 批量管理

  • 邮件系统

  • 监控系统

  • Web服务

  • 虚拟化

  • 防火墙

  • 压测

  • 文件同步

  • 私有云

  • 日志系统

  • 代码仓库&版本管理

  • 安全审计

  • 远程拨号

  • 大数据

  • 统一认证

  • 消息队列

  • Apollo

  • 运维杂记
  • 容器&容器编排
lyndon
2022-06-08
目录

Dockerfile参数说明

# Dockerfile镜像参数说明

# 1. 最小的镜像

镜像是 Docker 容器的基石,容器是镜像的运行实例,有了镜像才能启动容器

hello-world - 最小的镜像
1

hello-world 是 Docker 官方提供的一个镜像,通常用来验证 Docker 是否安装成功。

通过 docker pull 从 Docker Hub 下载它

docker pull hello-world
1

用 docker images 命令查看镜像的信息。

docker images hello-world
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        3 months ago        13.3kB
1
2
3

通过 docker run 运行

docker run hello-world
Hello from Docker
1
2

hello-world 的 Dockerfile 内容只有短短三条指令:

FROM scratch        //此镜像是从白手起家,从 0 开始构建。
COPY hello /        //将文件“hello”复制到镜像的根目录。
CMD ["/hello"]      //容器启动时,执行 /hello
1
2
3

镜像 hello-world 中就只有一个可执行文件 “hello”,其功能就是打印出 “Hello from Docker ......” 等信息。/hello 就是文件系统的全部内容,连最基本的 /bin,/usr, /lib, /dev 都没有。hello-world 虽然是一个完整的镜像,但它并没有什么实际用途。

通常来说,我们希望镜像能提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。这样的镜像我们称作 base 镜像。

# 2. base镜像

base 镜像有两层含义:

  • 不依赖其他镜像,从 scratch 构建。
  • 其他镜像可以以base镜像为基础进行扩展。

所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。

我们以 CentOS 为例考察 base 镜像包含哪些内容。

下载镜像:

docker pull centos
1

查看镜像信息:

docker images centos
1

镜像大小不到 200MB。

Linux 操作系统由内核空间和用户空间组成:

  • bootfs:内核空间是 kernel,Linux 刚启动时会加载 bootfs 文件系统,之后 bootfs 会被卸载掉;
  • rootfs:用户空间的文件系统,包含我们熟悉的/dev,/proc,/bin等目录。

对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。相比其他 Linux 发行版,CentOS 的 rootfs 已经算臃肿的了,alpine 还不到 10MB。我们平时安装的 CentOS 除了 rootfs 还会选装很多软件、服务、图形桌面等,需要好几个 GB 就不足为奇了。base 镜像提供的是最小安装的 Linux 发行版。

CentOS 镜像的 Dockerfile 的内容:

FROM scratch
ADD centos-7-docker.tar.gz /
CMD ["/bin/bash"]
1
2
3

第二行 ADD 指令添加到镜像的 tar 包就是 CentOS 7 的 rootfs。在制作镜像时,这个 tar 包会自动解压到 / 目录下,生成 /dev, /porc, /bin 等目录。可在 Docker Hub 的镜像描述页面中查看 Dockerfile 。

支持运行多种 Linux OS,不同 Linux 发行版的区别主要就是 rootfs。

比如 Ubuntu 14.04 使用 upstart 管理服务,apt 管理软件包;而 CentOS 7 使用 systemd 和 yum。这些都是用户空间上的区别,Linux kernel 差别不大。

所以 Docker 可以同时支持多种 Linux 镜像,模拟出多种操作系统环境。

base 镜像只是在用户空间与发行版一致,kernel 版本与发型版是不同的。

例如 CentOS 7 使用 3.x.x 的 kernel,如果 Docker Host 是 Ubuntu 16.04(比如我们的实验环境),那么在 CentOS 容器中使用的实际是是 Host 4.x.x 的 kernel。====

  • ① Host kernel 为 4.4.0-31
  • ② 启动并进入 CentOS 容器
  • ③ 验证容器是 CentOS 7
  • ④ 容器的 kernel 版本与 Host 一致

容器只能使用 Host 的 kernel,并且不能修改。

所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。如果容器对 kernel 版本有要求(比如应用只能在某个 kernel 版本下运行),则不建议用容器,这种场景虚拟机可能更合适。

# 3. 镜像版本选型说明

# .NET镜像版本说明

开发语言类型 镜像名称 镜像说明
runtime .NET Core Runtime 部署 .NET Core控制台程序
sdk .NET Core SDK 构建 .NET Core(或ASP .NET Core应用程序)
aspnet ASP .NET Core Runtime 部署ASP .NET Core应用程序

若需构建 .NET Core应用程序,例如dockerfile中包含“RUN dotnet restor”指令的,请使用 .NET Core SDK 若需运行 .NET Core应用程序,例如dockerfile中包含“ENTRYPOINT ["dotnet", "xxx.dll"]”指令的,请使用 .NET Core Runtime 或 ASP .NET Core Runtime

# node.js镜像版本说明

镜像名称 镜像说明
node: 基于Debian,官方默认镜像,可以用作构建源码使用,体积较大
node:-slim ==基于==Debian,删除了很多默认公共的软件包,只有node运行的最小环境
node:-alpine 基于alpine, 比Debian小的多。如果想要最小的镜像,可以选择这个做为base。需要注意的是,alpine使用musl代替glibc。一些c环境的软件可能不兼容,但大部分没问题

# Java镜像版本说明

Java vs OpenJDK 推荐使用 openjdk,开源,社区活跃

JRE vs JDK JRE即Java 运行时环境(Java Runtime Environment),包含了运行 Java 程序所需要的环境,即 JVM,run 阶段使用 JRE 作为基础镜像 JDK即Java开发工具包(Java Development Kit),既包含了 JRE,也包含了开发 Java 程序所需的工具,即 Java 编译器,build 阶段使用 JDK 作为基础镜像

# 创建镜像方式

有三种方法:

  • 1、基于已有镜像的容器创建
  • 2、基于本地模板导入
  • 3、基于 Dockerfile 创建

# Dockerfile 指令

根据作用可以分为两种:

  • 构建指令

    构建指令用于构建image,其指定的操作不会在运行 image 的容器上执行;

  • 设置指令

    设置指令用于设置 image 的属性,其指定的操作将在运行 image 的容器中执行。

# 1 、FROM (指定基础 image )

构建指令,必须指定且需要在 Dockerfile 文件中其他指令的前面。后续的指令都依赖于该指令指定的 image。FROM 指令指定的基础 image 可以是官方远程仓库中的,也可以位于本地仓库。

格式:FROM 镜像 | FROM 镜像:tag

# 2 、MAINTAINER (用来指定镜像创建者信息)

构建指令,用于将 image 的制作者相关的信息写入到 image 中。当我们对该 image 执行 docker inspect 命令时,输出中有相应的字段记录该信息。

# 3 、RUN (安装软件用)

构建指令,RUN 可以运行任何被基础 image 支持的命令。如基础 image 选择 ubuntu,那么软件管理部分只能使用 ubuntu 的命令。

# 4 、CMD (设置 container 启动时执行的操作)

设置指令,用于 container(容器)启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。

# 5 、ENTRYPOINT(设置 container 启动时执行的操作)

设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效。

# 6 、 USER(设置 container 容器的用户)

设置指令,设置启动容器的用户,默认是 root 用户。

# 7 、EXPOSE (指定容器需要映射到宿主机器的端口)

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。

当你需要访问容器的时候,可以不使用容器的 IP 地址而是使用宿主机器的 IP 地址和映射后的端口。要完成整个操作需要两个步骤,首先在 Dockerfile 使用 EXPOSE 设置需要映射的容器端口,然后在运行容器的时候指定-p 选项加上 EXPOSE 设置的端口,这样 EXPOSE 设置的端口号会被随机映射成宿主机器中的一个端口号。也可以指定需要映射到宿主机器的那个端口,这时 要确保宿主机器上的端口号没有被使用。EXPOSE 指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p 选项。

# 8 、 ENV (用于设置环境变量)

构建指令,在 image 中设置一个环境变量。

设置了后,后续的 RUN 命令都可以使用,container 启动后,可以通过 docker inspect 查看这个环境变量,也可以通过在 docker run --env key=value 时设置或修改环境变量。

假如你安装了 JAVA 程序,需要设置 JAVA_HOME,那么可以在 Dockerfile 中这样写:ENV JAVA_HOME /path/to/java/dirent

# 9 、ADD (从 src 复制文件到 container 的 dest 路径)

构建指令,所有拷贝到 container 中的文件和文件夹权限为 0755,uid 和 gid 为 0。

如果是一个目录,那么会将该目录下的所有文件添加到 container 中,不包括目录;

如果文件是可识别的压缩格式,则 docker 会帮忙解压缩(注意压缩格式);如果是文件且中不使用斜杠结束,则会将视为文件,的内容会写入;如果是文件且中使用斜杠结束,则会文件拷贝到目录下。

# 10 、 VOLUME (指定挂载点)

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。

我们知道容器使用的是 AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在 Dockerfile 中使用该指令。

# 11 、WORKDIR (切换目录)

设置指令,可以多次切换(相当于 cd 命令),对 RUN,CMD,ENTRYPOINT 生效。

# 12 、 ONBUILD (在子镜像中执行)

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。

上次更新: 2022/06/12, 15:48:09
k8s安全策略
Docker环境磁盘清理

← k8s安全策略 Docker环境磁盘清理→

最近更新
01
ctr和crictl显示镜像不一致
03-13
02
alpine镜像集成常用数据库客户端
03-13
03
create-cluster
02-26
更多文章>
Theme by Vdoing | Copyright © 2015-2024 op81.com
苏ICP备18041258号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式