dockerfile文件创建镜像详解

              dockerfile文件构建容器

前言:在之前的时候有说过docker构建镜像有两种方式:

(1)docker cumin制作镜像;但是不利于用户之间的共享属于黑盒操作

(2)通过dockerfile文件创建容器;利于用户之间的共享;可以知道镜像之前做过什么样的改动

1:Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。相比image这种黑盒子,Dockerfile这种显而易见的脚本更容易被使用者接受,它明确的表明image是怎么产生的。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

2:docker的组成部分: (四部分)

#   注释信息,说明

(1)基础镜像信息   FROM

(2)维护者的信息   MAINTAINER

(3)镜像的操作指令 RUN

(4)容器启动时执行的指令 CMD

注:基础镜像信息一定要放在最前面;后面跟其他的命令

*在构建dockerfile文件的时候的指令分为两种:

构建指令   和   设置指令 

构建指令:表示在创建容器的时候所使用的命令

设置指令: 表示在容器里运行的时候所使用的命令

那么接下来说一说dockerfile的文件格式:

(1)FROM(指定基础image)

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

语法格式: FROM <image>:<tag>   也可省略后面的tag那将表示最新的image

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

构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。(本行内容可以省略但是在生产环境下要写,可以知道是谁创建的格式)
语法格式:MAINTAINER <name>

(3)RUN(安装软件用)

构建指令,RUN可以运行任何被基础image支持的命令

语法格式:RUN <command> (the command is run in a shell - `/bin/sh -c`)

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

设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令

语法格式:CMD command param1 param2  在  /bin/sh中执行,提供给需要交互的应用;


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

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

两种格式:

ENTRYPOINT ["executable", "param1", "param2"]

ENTRYPOINT command param1 param2  (shell中执行)。

配置容器启动后执行的命令,并且不可被  docker run  提供的参数覆盖。

每个 Dockerfile 中只能有一个  ENTRYPOINT  ,当指定多个时,只有最后一个起效。

(6)USER(设置container容器的用户,默认是root用户

设置指令格式为  USER daemon

指定运行容器时的用户名或 UID,后续的  RUN  也会使用指定用户。

当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户

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

格式为  EXPOSE <port> [<port>...]

设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。

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

构建指令,指定一个环境变量,会被后续  RUN  指令使用,并在容器运行时保持。
格式: ENV <key> <value>

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

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

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

如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);

如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;

如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下。
格式:ADD <src> <dest>

(10)COPY

构建指令:格式为 COPY <src><dest>

复制本地主机的<src>(为Dockerfile所在目录的相对路径)到容器中的<dest>。

 

(11)VOLUME(指定挂载点)

设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。

格式: VOLUME ["<mountpoint>"]

(12)WORKDIR(切换目录)

设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。为后续的  RUN、CMD、ENTRYPOINT  指令配置工作目录。
格式: WORKDIR /path/to/workdir

(13)ONBUILD(在子镜像中执行)

ONBUILD <Dockerfile关键字>

设置指令:ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。一般不使用此选项

格式为  ONBUILD [INSTRUCTION]  。

3:我们就根据上面的这些配置项,制作一个sshd的镜像模板并且提供http访问的应用:

(1)创建一个工作目录:

编写run.sh文件

#!/bin/sh

/usr/sbin/httpd -D DFOREGROUND

/usr/sbin/sshd -D

注:因为在docker中无法使用service和systemctl启动服务,所以只能使用服务的绝对路径启动服务

在主机上生成ssh秘钥对,并创建authorized_keys文件

将公钥导到新建的docker目录下方便后续的dockerfile调用

2:编写Dockerfile

以上选项的含义解释:

FROM docker.io/centos:latest选择一个已有的os镜像作为基础

MAINTAINER 镜像的作者

RUN yum install -y openssh-server sudo安装openssh-server和sudo软件包

添加测试用户admin,密码admin,并且将此用户添加到sudoers里

RUN useradd admin

RUN echo "admin:admin" | chpasswd

RUN echo "admin   ALL=(ALL)       ALL" >> /etc/sudoers

下面这两句比较特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

注意:centos7上必须要有,否则创建出来的容器sshd不能登录

RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key

RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key

将公钥信息上传到远程连接用户的宿主目录的.ssh下

ADD  authorized_keys /home/admin/.ssh/authorized_keys

启动sshd服务并且暴露22端口

RUN mkdir /var/run/sshd 

EXPOSE 22 80

CMD ["/run.sh"]   也可以写成这种方式CMD ["/usr/sbin/sshd", "-D"] 

在sshd_dockerfile目录下,使用docker  build命令来创建镜像,注意:在最后还有一个”.”,

执行docker images查看新生成的镜像

REPOSITORY   TAG       IMAGE ID            CREATED             SIZE

centos     httpdv1    4bb560917dd0        6 minutes ago       301.3 MB

centos     httpd      204f2669758a        18 minutes ago      301.3 MB

centos     ssh        ecc0972a6319        About an hour ago   301.3 MB

在宿主主机打开一个终端,连接刚才新建的容器

 

注:admin用户是容器中的用户,192.168.1.102地址是宿主机的地址。

测试sudo执行授权命令:

 


时间: 2024-11-08 06:41:58

dockerfile文件创建镜像详解的相关文章

Dockerfile常用指令详解&镜像缓存特性

Dockerfile简介 Dockerfile 是Docker中用于定义镜像自动化构建流程的配置文件.在Dockerfile中,包含了构建镜像过程中需要执行的命令和其他操作.通过Dockerfile可以更加清晰,明确的给定Docker镜像的制作过程,由于仅是简单,小体积的文件,在网络等介质中传递的速度快,能够更快的实现容器迁移和集群部署.Dockerfile是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 相对于提交容器修改在进行镜像迁

DockerFile 编译语法详解(5)

title: DockerFile 编译语法详解(5) date: 2018-12-16 16:53:20 tags: Docker categories: Docker copyright: true --- Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何接口,Docker诞生于2013年年初,最初发起者是dotCloud公

Docker学习历程(三):Docker镜像详解

一.镜像的组成解析: 分层镜像:底层bootfs,上层rootfs:启动容器时,两层都以只读方式挂载 bootfs类型可以是btrfs.aufs.lxc,除此之外还需要一个内核,该内核仅用于启动容器中的用户控件 rootfs具体表现为一个根文件系统,包含基本的文件和目录 构建镜像的基本流程: 预备一个bootfs 安装最小系统 按需部署应用 镜像的读写机制: 镜像俱为只读属性 启动容器后在镜像基础上新增当前容器的专用层,该层可进行写入 容器被删除后,专用读写层会随之删除,所以容器默认无法实现数据

使用dockerfile文件创建镜像时docker build没有反应

问题: 执行docker build -t jdk_8u191:20190307 . jdk_dockerfile  时都没有反应 jdk_dockerfile文件内容 # 以此镜像作为基础镜像构建新的镜像FROM centos:7 # 维护者信息 MAINTAINER chen # 将jdk-8u191-linux-x64.tar.gz文件添加到新的镜像的的/usr/local/路径下,使用ADD指令会直接对jdk-8u144-linux-x64.tar.gz进行解压缩,不用再单独的tar解压

DOCKER学习_012:Dockerfile配置指令详解

1 Dockerfile结构 基础镜像信息 镜像操作指令 容器启动时执行指令 2 FROM 指定基础镜像,用于继承其他镜像使用的 FROM ubuntu:14.06 FROM centos FROM nginx:latest 3 LABEL 镜像创建者的基本信息 4 ENV 定义Docker容器内的环境变量 ENV # 只能设置一个变量 ENV = … # 允许一次设置多个变量 ENV <key> <value> 指定一个环境变量,会被后续RUN指令使用,并在容器运行时保持 示例:

dockerfile学习与详解

1,什么是dockerfile? dockerfile是相当于docker使用的一个脚本,用语docker build [OPTIONS] PATH ,只需要制定dockerfile文件的地址就行了,目前据我所知dockerfile文件的名字只能是Dockerfile dockerfile的作用是便于实现自定义的镜像image,用语docker build -t newImagesName [options] PATH ... 2,如何使用dockerfile? 参考博客:http://blog

Dockerfile ONBUILD命令详解

5. 使用ONBUILD镜像 ONBUILD该指令的作用就是,它后面往往放的一些可执行的命令,但是它进行镜像构建时,ONBUILD后面的命令不会执行,而是别人把它构建的镜像作为基础镜像拿来再构建镜像时,就会执行ONBUILD后面的指令.下面以实验说明: (1)父镜像的Dockerfile文件内容如下: FROM node:0.12.6 RUN mkdir -p /usr/src/app WORKDIR /usr/src/app ONBUILD COPY package.json /usr/src

Dockerfile详解,以及构建自定义镜像

Dockerfile使用 前面的操作我们一直下载下载官方已经构建好的镜像,直接下载后就可以run,如果我们想要在镜像中添加自己的应用,比如在tomcat中添加自己的app,构建一个自定义的镜像,那么我们应该怎么做,这个时候就用到了Dockerfile.Dockerfile是由一系列命令和参数构成的脚本,Docker可以根据这个脚本基于某个基础镜像创建一个新的定制化的镜像,大大提高了我们部署的效率,使用Dockfile最终的结果是帮助我们定制化自己的镜像. Dockerfile初体验 下面就基于t

Docker(三):Dockerfile 命令详解

上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dockerfile 指令详解 1 FROM 指定基础镜像 FROM 指令用于指定其后构建新镜像所使用的基础镜像.FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像. FROM语法格式为: FROM <i