Dockerfile镜像创建

本文详细介绍了Dockerfile的概念和结构,包括如何基于Dockerfile创建镜像,以及镜像分层的原理,如AUFS、overlay/overlay2。此外,文章还探讨了CMD和ENTRYPOINT指令在Dockerfile中的使用及其区别。
摘要由CSDN通过智能技术生成

目录

一、Dockerfile概念

二、Docker镜像的创建

2.1 基于已有的镜像创建

2.2 基于本地模板创建

2.3 基于dockerfile创建

dockerfile结构

构建镜像的命令

三、镜像分层的原理

3.1 docker镜像分层(基于AUFS构建)

3.2 bootfs内核空间

3.3 rootfs内核空间

3.4 AUFS与overlay/overlay2

overlay结构

3.5 联合文件系统(UnionFS)

3.6 镜像加载原理

四、dockerfile操作指令

4.1 CMD和ENTRYPOINT介绍

exec和shell模式的区别

exec模式下传入命令

4.2  使用exec模式无法输出环境变量

4.3 shell模式


一、Dockerfile概念

Docker是一个文本文件,文件中包含了一条条的指令(instruction),用于构建镜像。每一条指定构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建

  • dockerfile是自定义镜像的一套规则
  • docker由多条指定构成,docker的每一条指令都会对应于docker镜像中的每一层

dockerfile的原理就是镜像分层。

① Dockerfile中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)。
② 镜像层将被缓存和复用(后续的镜像层将基于前面的一层,每一层都会有下面几层的缓存)
③ 当dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(自动销毁)。
④ 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效(第一层不成功,那么第二层也不成功,相当于地基)。
⑤ 容器的修改并不会影响镜像,如果在某一层中添加一个文件,在下一层中删除它,镜像中依然会包含该文件。

二、Docker镜像的创建

创建镜像的三种办法

  • 基于已有镜像的创建
  • 基于本地模板创建
  • 基于Dockerfile创建

2.1 基于已有的镜像创建

原理:将容器里面运行的程序及运行环境打包生成新的镜像

docker commit [选项] [容器id] 仓库名:标签

常用选项

选项 描述
-m 说明信息
-a 作者信息
-p 生成过程中停止容器的运行

2.2 基于本地模板创建

原理:通过导入操作系统模板文件生成新的镜像

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
#使用wget命令导入为本地镜像

docker import debian-7.0-x86-minimal.tar.gz -- debian:v1
或
cat debian-7.0-x86-minimal.tar.gz |docker import - debian:v1
#生成镜像

docker images
#查看镜像

docker run -itd debian:v1 bash
#创建并启动容器

2.3 基于dockerfile创建

  • dockerfile是一组指令组成的文件
  • dockerfile每行支持一条指令,每条指令可携带多个参数,一条指令可以用&&方式,去写多条指令
  • dockerfile支持以"#"为开头的注释

dockerfile结构

  • 基于镜像信息(linux发行版:比如centos、ubuntu、suse、debian、alpine、redhat)
  • 维护者信息(docker search可查看)
  • 镜像操作指令(tar yum make)
  • 容器启动时执行指令(cmd [“/root/run/sh”]、entrypoint、都是系统启动时,第一个加载的程序/脚本/命令)

构建镜像的命令

可以在构建镜像时指定资源限制

在编写Docker时,需要遵守严格的格式

  • 第一行必须使用FROM
Dockerfile 是一种文本格式的脚本,可以用来自动化构建 Docker 镜像创建 Docker 镜像的步骤如下: 1.编写 Dockerfile 文件,包括镜像的基础操作系统、安装软件、配置环境等; 2.在 Dockerfile 文件所在的目录中执行 docker build 命令,构建 Docker 镜像; 3.使用 Docker run 命令启动 Docker 容器,可以使用该容器。 例如,创建一个基于 Ubuntu 18.04 的 Docker 镜像,安装 nginx、PHP 和 MySQL,可以按照下面的步骤进行: 1.创建一个名为 Dockerfile 的文件,并在其中添加以下内容: ``` FROM ubuntu:18.04 RUN apt-get update \ && apt-get install -y nginx php-fpm php-mysql mysql-server \ && rm -rf /var/lib/apt/lists/* COPY nginx.conf /etc/nginx/nginx.conf COPY php.ini /etc/php/7.2/fpm/php.ini CMD ["/usr/sbin/nginx", "-g", "daemon off;"] ``` 2.在 Dockerfile 文件所在的目录中创建一个名为 nginx.conf 的文件,并添加以下内容: ``` user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } } } ``` 3.在 Dockerfile 文件所在的目录中创建一个名为 php.ini 的文件,并添加以下内容: ``` date.timezone = Asia/Shanghai ``` 4.执行 docker build 命令,构建 Docker 镜像: ``` docker build -t myimage:latest . ``` 5.使用 Docker run 命令启动 Docker 容器: ``` docker run --name mycontainer -d myimage:latest ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值