Dockerfile基础
1、Dockerfile
1.1 Docker镜像的来源
Dockerfile就是用一个包含了构建镜像所需的指令和说明的文本文件来帮助构建Docker镜像的。Docker镜像的来源主要有三种:DokcerHub、Dockerfile以及由容器制作而来。
1、在Docker Hub上找镜像
这种方法是在Docker Hub官网上去直接搜索需要的Docker镜像,通过Docker pull拉取到本地使用。想ubuntu、php、Apache、tomcat、myslq等都有官网制作的镜像,可以直接使用。
此外还可以在装有docker的环境中,使用docker CLI 客户端直接搜索docker sreach xxx, 获取Docker镜像。
2、由运行的容器制作镜像
在运行的容器上进行修改,从而制作我们自己的Docker镜像。以在官方ubuntu Docker镜像基础上安装软件(Vim为例),进行说明。
- 首先,下载官方ubuntu 镜像: docker pull ubuntu
- 其次,使用ubuntu镜像启动一个docker 容器:docker run -idt ubuntu /bin/bash
- 进入容器:docker exec -it 容器ID bash
- 在容器中执行:apt-get update && apt-get install vim
- 安装完vim软件后,退出容器,在宿主机执行: docker commit -a="xxx" -m="commit test" b529b0cd120a tomcat:v1 (执行完成后应该能使用docker images 来查看刚刚新建的容器了。)
- -a: 作者信息 -m:描述信息
- -p :在commit时,将容器暂停。
- -c :使用Dockerfile指令来创建镜像;
- 再执行:docker tag tomcat:v1 xxx/xxx/tomcat:v1
- 推送新的docker 镜像到镜像仓库
- 拉取制作好的新镜像到本地进行测试
3、使用Dockerfile生成Docker镜像
使用Dockerfile构建docker镜像的步骤,主要分为以下:
- 编写Dockerfile文件
- 使用Dockerfile构建镜像,执行命令:docker build -t name:tag .
- 本地测试:docker run
- 从新打标签:docker tag name:tag xxxxx/newname:newtag
- 上传到docker hub: docker push xxxxx/newname:newtag
- 测试从Dockers Hub拉去启动镜像: docker pull xxxxx/newname:newtag
1.2 Dockerfile格式要求
以一个例子来说明Dockerfile制作镜像的过程和编写Dockerfile时需要注意的点。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
# Base image to use, this must be set as the first line
FROM ubuntu
# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com
# Commands to update the image
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# Commands when creating a new container
CMD /usr/sbin/nginx
Dockerfile注意事项:😎
- 文件名: 一般是Dockerfile,如果是自定义文件名,在构建镜像时需要使用参数-f指定dockerfile名称。
- 指令名不区分大小写,但为了方便和参数区分,通常使用大写字母。
- 指令按从上到下顺序依次执行。
- 需要调用的文件必须跟 dockerfile 文件在同一目录或者其子目录下,其它路径无效。
- 注释以#开头
2、Dockerfile指令集
官网参考手册:https://docs.docker.com/engine/reference/builder/
2.1 基本指令
FROM: 基础镜像, 必须是Dockerfile的首行命令。
LABEL:用于给镜像添加一些以键值对形式的元数据metadata。如:
- LABEL maingainer = "blackwin@gmail.com"
MAINTAINER(已弃用): 镜像维护者姓名、邮箱地址
HEALTHCHECK:健康检测指令, 用于判断容器服务的运行状态。格式:
-
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
-
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
-
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
2.2 环境变量
USER: 用于指定执行后续命令的用户和用户组,切换到相应的用户。 格式:USER <用户名>[:<用户组>]
VOLUME: 定义匿名数据卷,在启动容器时顽疾挂载数据卷会自动挂载到匿名卷
EXPOSE: 申明端口。
WORKDIR: 指定工作目录,用WORKDIR指定的工作目录会在构建镜像的每一层中都存在。
ENV:设置环境变量。格式:ENV
ARG: 构建参数,与ENV作用一致,作用域不同。ARG仅对Dockerfile内有效(即执行Docker build)。
2.3 核心命令
RUN:用于执行后面跟着的命令行命令,有两种格式:
- RUN ["可执行文件", "参数1","参数2"]
- RUN <命令行命令>
COPY: 从上下文目录中复制文件或目录到容器里指定路径 。
ADD:作用同COPY类似,优点在于执行源文件为tar文件时会自动复制并解压到目标路径
CMD:类似与RUN,用于运行程序,但时间点不同。RUN是在docker build时运行,CMD是在执行docker run时运行。CMD中指定的参数可能被RUN命令指定的参数覆盖。变参会用到CMD。
ENTRYPOINT:类似与CMD,但不会被docker run命令参数覆盖。且参数会送给ENTROYPOINT指令指定的程序。
2.4 其他指令
ONBUILD: 用于延迟构建命令的执行,
STOPSIGNAL: 指令设置将被发送到容器退出的系统调用信号.。
3、Dockerfile实战
以在ubuntu环境中安装Apache2服务器为例。以下是Dockerfile:
FROM ubuntu
LABEL authotr = "blackwin"
LABEL Data = "2022-12-26"
LABEL maintainer = "hanxin@gmail.com"
RUN apt-get update; \
DEBIAN_FRONTEND=noninteractive apt-get install apache2 -y
RUN echo "\n\nServerName localhost:80;" >> /etc/apache2/apache2.conf
EXPOSE 80
CMD ["service", "apache2","start"]
遇到的问题:设置ubuntu软件源
直接修改/etc/apt/sources.list文件:RUN echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse" >>/etc/apt/sources.list
遇到的问题2:解决在脚本中参数安装软件时的交互问题
- 可以使用-y参数设置默认的选项
- 使用RUN sh -c '/bin/echo -e "参数1 参数2 ..." | sh xxx-install.sh'来设置参数
- 在ubuntu中可以在需要执行的命令前添加DEBIAN_FRONTEND=noninteractive来根据环境选择默认的配置
https://goodmemory.cc/debian_frontend选项/

浙公网安备 33010602011771号