docker file
容器镜像获取的方法
- dockerhub直接下载.
- 将操作系统中文件打包成容器镜像.
- 把正在运行的容器加工后打包成镜像.
- 通过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
指令一样,容器被删除以后映射在主机上的文件不会被删除。- 如果
-v
和volume
指定了不同的位置,会以-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*