基于容器手动制作镜像步骤具体如下:

  1. 下载一个系统的官方基础镜像,如: CentOS 或 Ubuntu
  2. 基于基础镜像启动一个容器,并进入到容器
  3. 在容器里面做配置操作 安装基础命令 配置运行环境 安装服务和配置服务 放业务程序代码
  4. 提交为一个新镜像 docker commit
  5. 基于自己的的镜像创建容器并测试访问

Dockerfile 构建过程和指令总结
从基础镜像运行一个容器
执行一条指令,对容器做出修改
执行类似docker commit的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调
试和排错)
再基于刚提交的镜像运行一个新容器
执行Dockerfile中的下一条指令,直至所有指令执行完毕

Dockerfile 相关指令

ADD #复制并解压
COPY #复制
ENV #设置环境变量
EXPOSE
FROM #指定基础镜像
LABEL #指定作者等 镜像元数据
STOPSIGNAL
USER #指定用户
VOLUME
WORKDIR #指定容器需要挂载的目录

FROM: 指定基础镜像

#首行
FROM 指定基础镜像
范例:
FROM ubuntu

对于不同的软件官方都提供了相关的docker镜像,比如: nginx、redis、mysql、httpd、tomcat等服 务类的镜像,也有操作系统类,如: centos、ubuntu、debian等。建议使用官方镜像,比较安全。

LABEL: 指定镜像元数据

可以指定镜像元数据,如: 镜像作者等LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."

一个镜像可以有多个label ,还可以写在一行中,即多标签写法,可以减少镜像的的大小

RUN: 执行 shell命令
RUN 指令用来在构建镜像阶段需要执行 FROM 指定镜像所支持的Shell命令。 通常各种基础镜像一般都支持丰富的shell命令 注意: RUN 可以写多个,每一个RUN指令都会建立一个镜像层,所以尽可能合并成一条指令,比如将多 个shell命令通过 && 连接一起成为在一条指令 每个RUN都是独立运行的,和前一个RUN无关

#shell 格式: 相当于 /bin/sh -c <命令> 此种形式支持环境变量
RUN <命令>
#exec 格式: 此种形式不支持环境变量,注意:是双引号,不能是单引号
RUN ["可执行文件", "参数1", "参数2"]
#exec格式可以指定其它shell
RUN ["/bin/bash","-c","echo hello wang"]RUN yum -y install epel-release \&& yum -y install nginx \&& rm -rf /usr/share/nginx/html/*&& echo "<h1> docker test nginx </h1>" > /usr/share/nginx/html/index.html

ENV: 设置环境变量
ENV 可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过KEY或KEY或KEY或{KEY}进行引用,
并在容器运行时保持
如果运行容器时如果需要修改变量,可以执行下面通过基于 exec 机制实现
注意: 下面方式只影响容器运行时环境,而不影响构建镜像的过程,即只能覆盖docker run时的环境变量,
而不会影响docker build时环境变量的值

#变量赋值格式1
ENV <key> <value>   #此格式只能对一个key赋值,<key>之后的所有内容均会被视作其<value>的组成
部分
#变量赋值格式2
ENV <key1>=<value1> <key2>=<value2> \  #此格式可以支持多个key赋值,定义多个变量建议使用,
减少镜像层
<key3>=<value3> ...
#如果<value>中包含空格,可以以反斜线\进行转义,也可通过对<value>加引号进行标识;另外,反斜线也
可用于续行
#只使用一次变量
RUN <key>=<value> <command>#引用变量
RUN $key .....
#变量支持高级赋值格式
${key:-word}
${kye:+word}范例:
ENV VERSION=1.0 DEBUG=on NAME="Happy Feet"
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC
/usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

COPY: 复制文本
复制本地宿主机的 到容器中的 。

COPY hom* /mydir/
COPY hom?.txt /mydir/

ADD: 复制和解包文件
该命令可认为是增强版的COPY,不仅支持COPY,还支持自动解缩。可以将复制指定的 到容器中的

可以是Dockerfile所在目录的一个相对路径;也可是一个 URL;还可是一个 tar 文件(自动解压)
可以是绝对路径或者是 WORKDIR 指定的相对路径
如果是目录,只复制目录中的内容,而非目录本身
如果是一个 URL ,下载后的文件权限自动设置为 600
如果为URL且不以/结尾,则指定的文件将被下载并直接被创建为,如果以 / 结尾,则文件名URL指
定的文件将被直接下载并保存为/< filename>
如果是一个本地文件系统上的打包文件,如: gz, bz2 ,xz ,它将被解包 ,其行为类似于"tar -x"命令,
但是通过URL获取到的tar文件将不会自动展开
如果有多个,或其间接或直接使用了通配符,则必须是一个以/结尾的目录路径;如果不以/结尾,则
其被视作一个普通文件,的内容将被直接写入到

ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # adds "test" to /absoluteDir/
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

CMD: 容器启动命令(没有ENTRYPOINT就是自己是一条命令,有的话就是后面的参数)
一个容器中需要持续运行的进程一般只有一个,CMD 用来指定启动容器时默认执行的一个命令,且其运
行结束后,容器也会停止,所以一般CMD 指定的命令为持续运行且为前台命令.
如果docker run没有指定任何的执行命令或者dockerfile里面也没有ENTRYPOINT,那么开启容器
时就会使用执行CMD指定的默认的命令
前面介绍过的 RUN 命令是在构建镜像进执行的命令,注意二者的不同之处
每个 Dockerfile 只能有一条 CMD 命令。如指定了多条,只有最后一条被执行
如果用户启动容器时用 docker run xxx 指定运行的命令,则会覆盖 CMD 指定的命

# 使用 exec 执行,推荐方式,第一个参数必须是命令的全路径,此种形式不支持环境变量
CMD ["executable","param1","param2"]
# 在 /bin/sh 中执行,提供给需要交互的应用;此种形式支持环境变量
CMD command param1 param2
# 提供给 ENTRYPOINT 命令的默认参数
CMD ["param1","param2"]

ENTRYPOINT: 入口点
功能类似于CMD,配置容器启动后执行的命令及参数

ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加,即如果docker run 命令有参数,那
么参数全部都会作为ENTRYPOINT的参数
如果docker run 后面没有额外参数,但是dockerfile中的CMD里有(即上面CMD的第三种用
法),即Dockerfile中即有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参

如果docker run 后面有额外参数,同时Dockerfile中即有CMD也有ENTRYPOINT,那么docker run
后面的参数覆盖掉CMD参数内容,最终作为ENTRYPOINT的参数
可以通过docker run --entrypoint string 参数在运行时替换,注意string不要加空格
使用CMD要在运行时重新写命令本身,然后在后面才能追加运行参数,ENTRYPOINT则可以运行时
无需重写命令就可以直接接受新参数
每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个生效

# 使用 exec 执行
ENTRYPOINT ["executable", "param1", "param2"]
# shell中执行
ENTRYPOINT command param1 param2范例:
[root@ubuntu1804 dockerfile]#cat Dockerfile
FROM ubuntu:18.04
RUN apt update \
&& apt -y install  curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s","https://ip.cn"]

ARG: 构建参数
ARG指令在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变
如果和ENV同名,ENV覆盖ARG变量
可以用 docker build --build-arg <参数名>=<值> 来覆盖

#FROM指令支持由第一个FROM之前的任何ARG指令声明的变量
#示例:
ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras#示例:
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version

VOLUME: 匿名卷(后面接的是容器需要挂载的目录,只需要添加好就自动挂载好)
在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据
等,一般会将宿主机上的目录挂载至VOLUME 指令指定的容器目录。即使容器后期被删除,此宿主机
的目录仍会保留,从而实现容器数据的持久保存。
宿主机目录为

/var/lib/docker/volumes/<volume_id>/_data

注意:
Dockerfile中的VOLUME实现的是匿名数据卷,无法指定宿主机路径和容器目录的挂载关系
通过docker rm -fv <容器ID> 可以删除容器的同时删除VOLUME指定的卷

范例: 在容器创建两个/data/ ,/data2的挂载点

VOLUME [ "/data1","/data2" ]

EXPOSE: 暴露端口
指定服务端的容器需要对外暴露(监听)的端口号,以实现容器与外部通信。
EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射
因此,在启动容器时需要通过 -P 或-p ,Docker 主机才会真正分配一个端口转发到指定暴露的端口才可
使用
注意: 即使 Dockerfile没有EXPOSE 端口指令,也可以通过docker run -p 临时暴露容器内程序真正监
听的端口,所以EXPOSE 相当于指定默认的暴露端口,可以通过docker run -P 进行真正暴露

范例:
EXPOSE 80 443
EXPOSE 11211/udp 11211/tcp

WORKDIR: 指定工作目录(用了这个后每条命令完成后自动回到这个目录)
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内WORKDIR指定
的默认目录
WORKDIR 指定工作目录(或称当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存
在,WORKDIR 会自行创建

WORKDIR /path/to/workdir
范例:#两次RUN独立运行,不在同一个目录,
RUN cd /app
RUN echo "hello" > world.txt
#如果想实现相同目录可以使用WORKDIR
WORKDIR /app
RUN echo "hello" > world.txt

构建镜像docker build 命令
docker build命令使用Dockerfile文件创建镜像

docker build [OPTIONS] PATH | URL | -
说明:
PATH | URL | -     #可以使是本地路径,也可以是URL路径。若设置为 - ,则从标准输入获取
Dockerfile的内容
-f, --file string  #Dockerfile文件名,默认为 PATH/Dockerfile
--force-rm   #总是删除中间层容器,创建镜像失败时,删除临时容器
--no-cache   #不使用之前构建中创建的缓存
-q  --quiet=false  #不显示Dockerfile的RUN运行的输出结果
--rm=true   #创建镜像成功时,删除临时容器
-t --tag list   #设置注册名称、镜像名称、标签。格式为 <注册名称>/<镜像名称>:<标签>(标签默认为latest)
docker build -t nginx:v1 /usr/local/src/nginx
docker build -t nginx:v1 . #要在/usr/local/src/nginx文件目录下

docker -- dockerfile制作镜像相关推荐

  1. 基于Dockerfile制作镜像

    <基于Dockerfile制作镜像> 目录... 2 一.Dockerfile简介及书写规则... 3 1.FROM(指定基础image)... 3 2.MAINTAINER(用来指定镜像 ...

  2. Docker搭建个人网盘和私人仓库,创建Dockerfile制作镜像

    1.使用mysql:5.6和 owncloud 镜像,构建一个个人网盘. 2.安装搭建私有仓库 Harbor 3.编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1 ...

  3. 【Docker】镜像制作及使用Dockerfile制作镜像

    Docker镜像制作 1.镜像构成 2.使用容器制作镜像 Dockerfile是一个用于描述生产docker镜像的文件,它里面是一条条的指令,每条指令都会对镜像产生一定影响. 1.将springboo ...

  4. Docker Dockerfile 定制镜像

    使用 Dockerfile 定制镜像 Dockerfile 指令详解 FROM 指定基础镜像 RUN 执行命令 构建镜像 镜像构建上下文(Context) 其它 docker build 的用法 直接 ...

  5. ad如何镜像器件_使用 Dockerfile 制作镜像

    前面几篇文章已经给大家介绍了 Docker 的基本概念,相信大家也会使用 Docker 运行自己想要的容器了.但是只有学会制作镜像,才能将 Docker 应用到我们的项目中去.下面我们就来学习如何使用 ...

  6. 【5】dockerfile制作镜像

    dockerfile自己制作镜像 关键词 dockerfile自己制作镜像 docker build 一.简介 Docker 创建镜像主要有三种: 基于已有的镜像创建: 基于 Dockerfile 来 ...

  7. docker之制作镜像

    基于容器制作镜像 在docker中拉busybox的镜像 [root@localhost ~]# docker pull busybox Using default tag: latest lates ...

  8. 通过dockerfile制作镜像

    Dockerfile是一个用于构建Docker镜像的文本文件,其中包含了创建Docker镜像的全部指令.就是将我们安装环境的每个步骤使用指令的形式存放在一个文件中,最后生成一个需要的环境. Docke ...

  9. dockerfile制作镜像及k8s中应用

    以下制作nginx镜像过程,分以下几步 1.制作dockerfile文件 包括nginx.sh的nginx安装脚本 2.制作ngx-depoly.yaml文件 包括k8s service,deploy ...

最新文章

  1. SQL Server 一些重要视图3
  2. 小憩,味一二 ——08年3月编程手札
  3. Buffer的基本的原理
  4. 使软件可二次开发_基于C++的?UG二次开发
  5. Exchange Server2010部署完后的配置:CA、Outlook Anywhere、OWA域名简写
  6. linux路由内核实现分析(四)---路由缓存机制(3)
  7. 【微收藏】FourShadows.js – 时间感知的算法驱动的图标阴影JS库
  8. 深度探索C++对象模型读书笔记(2)
  9. git配置ssh私钥_GitLab 配置
  10. Windows XP 系统中内置的AT命令
  11. html代码大全字号,网页设计HTML代码大全
  12. Python 微博画像分析
  13. 想不想修真鸿蒙秘术,想不想修真鸿蒙秘诀怎么得 揭开想不想修真秘诀真面目...
  14. 只知道三角形三条边长不知道高是多少,用Python如何求三角形周长和面积,海伦公式帮你解决这个难题
  15. 【老生谈算法】matlab实现MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法源码——时隙分配算法
  16. 索引原理-索引数据结构
  17. Ajax异步请求之设置Content-Type
  18. PMP考试 变更管理专题
  19. oracle pdf response,AWR报告分析之二:ges inquiry response 过高
  20. 五种让你一键关机的技巧经验技巧

热门文章

  1. PD协议诱骗芯片使用浅谈
  2. 桔子浏览器抢票专版官方版
  3. 商城倒计时(时分秒倒计时、分秒毫秒倒计时)
  4. IOS状态栏和导航栏的控制问题
  5. Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Class
  6. nlp(贪心学院)——实体消歧、实体统一、指代消解、句法分析
  7. html语言语法骨架格式,0002 认识HTML(骨架、DOCTYPE、lang、charset)
  8. matlab在微积分中的应用
  9. 【论文阅读-TPAMI2021】Curriculum Learning(课程学习)综述
  10. 树莓派 linux pwm,树莓派使用pwm控制风扇