DOCKER 五月 25, 2023

docker file

文章字数 10k 阅读约需 9 mins. 阅读次数 0

docker file

容器镜像获取的方法

  1. dockerhub直接下载.
  2. 将操作系统中文件打包成容器镜像.
  3. 把正在运行的容器加工后打包成镜像.
  4. 通过dockerfile自定义生成镜像.

1. dockerhub直接下载

docker pull cennter:latest

2. 将操作系统打包成容器镜像

2.1.安装尽可能小的系统

2.2.将整个操作系统打成tar包

# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.6.tar /

2.3. 将tar包加载至本地容器镜像

# docker import centos7.6.tar centos7.6:v1

3. 将正在运行的容器加工后打包成镜像

3.1. 启动一个容器

# docker run -it centos7.6:v1 --name centos7 bash

3.2 在容器中安装应用

# yum -y install nginx

3.3 把正在运行的容器打包成镜像

# ctrl+q+p
# docker commit centos7 centos7hy:v1
# docker run -it centos7hy:v1 --nmae centos7my bash

4. 通过dockerfile生成镜像

4.1 创建一个文件夹(目录)

# mkdir nginxroot

4.2 在文件夹中创建dockerfile文件及其他文件

# cd nginxroot
# echo "my first webpage" >> index.html
# vim Dockerfile
FROM centos:centos7
MAINTAINER "konghenying"
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
ADD index.html /usr/share/nginx/html/
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx
:eq

4.3 使用docker build 命令构建镜像

# docker build -t centos7-nginx:v1 .

Dockerfile概念

Dockerfile是一种能够被Docker程序解释的剧本。Dockerfile由一条一条的指令组成,并且有自己的书写格式和支持的命令。当我们需要在容器镜像中指定自己额外的需求时,只需在Dockerfile上添加或修改指令,然后通过docker build生成我们自定义的容器镜像(image)。

Dockerfile基本构成

  • 基础镜像信息

  • 维护者信息

  • 镜像操作指令

  • 容器启动时执行指令

Dockerfile指令

分类

  • 构建类指令: 用于构建image,其指定的操作不会在运行image的容器上执行(FROM、MAINTAINER、RUN、ENV、ADD、COPY).
  • 设置类指令: 用于设置image的属性,其指定的操作将在运行image的容器中执行(CMD、ENTRYPOINT、USER 、EXPOSE、VOLUME、WORKDIR、ONBUILD)

指令简略

指令 描述
FROM 构建新镜像基于的基础镜像
LABEL 标签
RUN 构建镜像时运行的shell命令
COPY 拷贝文件或目录到镜像中
ADD 添加文件到镜像中
ENV 设置环境变量
USER 为容器指定运行用户
EXPORT 声明容器运行的端口
WORKDIR 设置工作目录.
CMD/ENTRYPOINT 运行容器时默认执行,有且只有最后一个指令生效
VOLUME 将宿主机里的目录与容器里的目录映射.

指令详解

FROM

FROM指令用于指定其后构建新镜像所使用的基础镜像。

FROM指令必是Dockerfile文件中的首条命令。

FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库,优先本地仓库。

格式: FROM {镜像名称}:{tag}

eg: FROM centos:latest

RUN

用于在构建镜像中执行命令,有两种格式:

  • shell:

    格式:RUN {命令}

    eg: RUN echo "Asia/Shanghai" > /etc/timezone

  • exec:

    格式: RUN ['可执行命令','参数1','参数2']

    eg: RUN ['/bin/bash','-c','echo "Asia/Shanghai" > /etc/timezone']

CMD

CMD用于指定在容器启动时所要执行的命令.

格式有三种:

  • 格式1:CMD ["executable","param1","param2"]
  • 格式2:CMD ["param1","param2"]
  • 格式3: CMD command param1 param2

ENTRYPOINT

与CMD非常类似.一个Dockerfile只写一条,如果写了多条,那么只有最后一条生效.且都是容器启动时才运行.

但如果用户启动容器时候指定了运行的命令,ENTRYPOINT不会被运行的命令覆盖.

格式有两种:

  • 格式1:ENTRYPOINT ["executable", "param1", "param2"]
  • 格式2:ENTRYPOINT command param1 param2

VOLUME

声明容器中的目录作为匿名卷,只指定挂载点,docker宿主机映射的目录为自动生成的。

在docker run 启动时用户忘记挂载目录时,能在安装目录下的指定目录下面生成一个目录来绑定容器的匿名卷(eg:/var/lib/docker/volumes/{容器ID}),为数据的持久化做保障.

格式: VOLUME ["{持久化目录}"]

特性:

  • volume-v指令一样,容器被删除以后映射在主机上的文件不会被删除。
  • 如果-vvolume指定了不同的位置,会以-v 为准

USER

设置启动容器的用户(像hadoop需要hadoop用户操作,oracle需要oracle用户操作),可以是用户名或UID

格式: USER {用户名称}/{用户id}

eg: USER hadoop / USER 1001

WORKDIR

设置工作目录,类似于cd命令

格式: WORKDIR {绝对路径}

eg: WORKDIR /root

EXPOSE

指定容器在运行时监听的端口,方便镜像使用者了解守护进程相关的端口. 如果要对外访问还需要docker run -p来映射对外端口. 也可以通过docker run -P来随机映射所有监听的端口.

格式: EXPOSE {端口} [...]

eg: EXPOSE 80 8080

ENV

指定一个环境变量

格式1: ENV {key} {value}

格式2: ENV {key}={value}

eg: ENV JAVA_HOME /usr/local/jdkxxxx/

ADD

把外部文件拷贝到镜像中.

外部文件可以时本地文件也可以是网址.如果是网址就类似于wget命令.

目标路径可以是相对于工作路径,也可以是绝对路径.

格式: ADD {来源} {目标}

eg: ADD index.html /data/nginx/index.html / ADD https://xxx.com/download/index1.html /data/nginx/index.html

copy

把宿主机上的文件拷贝到镜像中

格式: COPY {来源} {目标}

指令优化

减少镜像分层

Dockerfile中包含多种指令,如果涉及到部署最多使用的算是RUN命令了,使用RUN命令时,不建议每次安装都使用一条单独的RUN命令,可以把能够合并安装指令合并为一条,这样就可以减少镜像分层,减少构建时文件拷贝对磁盘与事件的消耗.

FROM centos:latest
MAINTAINER konghenying
RUN yum install epel-release -y 
RUN yum install -y gcc gcc-c++ make -y
RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz
RUN tar zxf php-5.6.36.tar.gz
RUN cd php-5.6.36
RUN ./configure --prefix=/usr/local/php 
RUN make -j 4 
RUN make install
EXPOSE 9000
CMD ["php-fpm"]



################## 优化后 ####################

FROM centos:latest
MAINTAINER konghenying
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php && \
    make -j 4 && make install
EXPOSE 9000
CMD ["php-fpm"]

清理无用数据

一次RUN形成新的一层,如果没有在同一层删除,无论文件是否最后删除,都会带到下一层,所以要在每一层清理对应的残留数据,减小镜像大小, 比如将生产镜像过程中产生的安装包在使用过后就及时删除,不要带到下一层.

FROM centos:latest
MAINTAINER konghenhying
RUN yum install epel-release -y && \
    yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
    libcurl-devel libjpeg-devel libpng-devel openssl-devel \
    libmcrypt-devel libxslt-devel libtidy-devel autoconf \
    iproute net-tools telnet wget curl && \
    yum clean all && \
    rm -rf /var/cache/yum/*

RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
    tar zxf php-5.6.36.tar.gz && \
    cd php-5.6.36 && \
    ./configure --prefix=/usr/local/php \
    make -j 4 && make install && \
    cd / && rm -rf php*

多阶段构建镜像

0%