DockerFile的指令集
注意:所有的指令都是大写
FROM 指明基础镜像
RUN 在镜像build时运行命令
COPY 复制宿主机文件到相应的容器内目录
ADD 复制宿主机文件到容器内,如果为.gz、.xz等压缩包则会自动解压
CMD 在镜像运行时执行的命令,可以覆盖前多个CMD命令
ENTRYPOINT 在镜像运行时执行的命令,可追加前面多个entrypoint命令
MAINTAINER 指明镜像作者
EXPOSE 指定容器默认暴露端口
ENV 指定镜像的环境变量,build完成后可继续引用
WORKDIR 指定工作目录
VOLUMES 挂载数据卷
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。所以可以使用&&来节约空间
自己创建一个redis镜像
改正后
因为build只能操作上下文路径中包含的文件,所以如果需要把宿主机的文件拷贝到镜像中,需要将目标文件拷贝到上下文路径下才可拷贝到镜像
Dockerfile
FROM centos
# 添加上下文路径中的压缩包到镜像并解压
ADD redis-4.0.0.tar.gz /usr/local/
MAINTAINER <2575437457@qq.com>
#设置环境变量
ENV MYDIR /usr/local
# 编译安装redis
RUN cd /usr/local/redis-4.0.0 \
&& mkdir /usr/local/redis \
&& yum makecache \
&& yum -y install gcc gcc-c++ kernel-devel make \
&& make \
&& make PREFIX=/usr/local/redis install
# 设置运行镜像后的工作目录
WORKDIR $MYDIR
# 设置镜像的默认数据卷
VOLUME ["myredis"]
# 设置默认暴露的端口号
EXPOSE 6379
CMD echo redis install successfully
开始生成docker镜像
docker build -t redis:01 .
# .代表上下文路径,build时docker会将宿主机该路径下的文件打包供build命令使用,这里使用当前路径
报错信息
没有配置镜像的DNS服务,添加dns解析服务器地址
至此完成自定义镜像的制作
注意CMD与ENTRYPOINT的区别
CMD后面的shell指令在运行容器时执行,如果运行镜像时自带有指令则会覆盖CMD指令,而ENTRYPOINT后的指令可以和用户输入的参数组成一个指令运行不会被覆盖,需要与docker run启动指令进行搭配,如果需要覆盖ENTRYPOINT指令需要在run的容器的时候接–entrypoint选项,覆盖dockerfile文件中的ENTYRPOINT后的指令。
举例
vim dockerfile
------------
...
CMD ['/bin/bash']
------------
# 交互启动时就可以不用接参数
docker run -it image
# 如果启动的同时还在后面添加了参数则CMD指令被覆盖
docker run -it image /bin/ps
# 使用entrypoint可以配合run -it 输入的参数使用
vim dockerfile
-----------------
...
ENTRYPOINT ["ls"]
-----------------
docker run -it image -l
# 相当于 docker run -it image ls -l
# 覆盖entrypoint指令
--------------
ENTRYPOINT ["./nginx"]
--------------
docker run -it --entrypoint="/bin/bash" --name nginx01 mynginx:new
实例2
** 编写Dockerfile文件自制编译安装nginx的镜像
FROM centos
RUN yum install -y pcre-devel zlib-devel make gcc gcc-c++ openssl-devel \
&& cd /root \
&& curl -O http://mirrors.sohu.com/nginx/nginx-1.19.2.tar.gz \
&& tar -xf nginx-1.19.2.tar.gz \
&& cd nginx-1.19.2 \
&& ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_ssl_module --with-stream \
&& make \
&& make install
ENV MYPATH /usr/local/nginx/sbin
WORKDIR $MYPATH
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]