一.简介

Dockerfile是一个文本文件,可以使用命令自定义构建镜像。

常用命令:

指令

描述

FROM

指定基础镜像,必填项。如FROM centos:7

MAINTAINER

描述Dockerfile的维护者信息。如MAINTAINER alibaby007  123456@163.com 与LABEL命令作用相似

LABEL

描述镜像的信息。如version="1.0"  description="lnmp_nginx"  by="alibaby007" 中间空格隔开

RUN

在镜像中制作docker image build过程中运行的shell命令。有2种写法,

一种JSON字符串的格["xxx","xxx"],一种如yum install -y gcc gcc-c++ make

CMD

容器启动时docker run需要运行的shell命令,放到最后。如CMD ["catalina.sh", "run"]

EXPOSE

容器运行时应用监听的端口。如EXPOSE 80   镜像制作完成后,运行镜像还需要暴漏如docker run -p 8880:80

ENV

基础镜像中设置环境变量。如ENV GOSU_VERSION=1.14  设置完成后可以引用如$GOSU_VERSION

ADD

从宿主机拷贝文件或目录到镜像,带自动解压,被拷贝对象要与dockerfile文件一个目录。

如ADD php-5.6.31.tar.gz /tmp/ 

COPY

从宿主机拷贝文件或目录到镜像,不带解压,被拷贝对象要与dockerfile文件一个目录。

如COPY CentOS-Base.repo /etc/yum.repos.d/

VOLUME

为容器创建并声明挂载点,避免容器删除时数据也被删除。如VOLUME ["/data"]

WORKDIR

指定当前工作目录,或切换到指定的目录。如WORKDIR /data 

ENTRYPOINT

与CMD作用一样,其可以传参。

USER

指定后续操作命令的用户和组。如 USER apache:apache

HEALTHCHECK

健康检查,检查容器服务的健康状态。

如HEALTHCHECK –interval=10s –timeout=3s –retries=3 CMD curl http://ip

...

...

二.Dockerfile制作nginx镜像

首先将宿主机的CentOS-Base.repo拷贝到与Dockerfile同一目录下;

1.Dockerfile文件编写:

FROM centos:7
MAINTAINER alibaby007
RUN gzip /etc/yum.repos.d/CentOS-*
COPY CentOS-Base.repo /etc/yum.repos.d/
RUN yum install -y wget gcc gcc-c++ make openssl-devel pcre-devel
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
ENV NGINX_DOWNLOAD_URL=https://nginx.org/download/nginx-1.14.2.tar.gz
RUN wget -P /tmp $NGINX_DOWNLOAD_URL
WORKDIR /tmp  
RUN tar xf nginx-1.14.2.tar.gz
RUN cd /tmp/nginx-1.14.2 && \
    ./configure --prefix=/usr/local/nginx && \
    make -j 4 && \
    make install
RUN rm -rf /tmp/nginx-1.14.2* && yum clean all
WORKDIR /usr/local/nginx
EXPOSE 80
CMD ["./sbin/nginx", "-g", "daemon off;"]

2.Dockerfile所在路径下构建nginx镜像

docker image build -t nginx:v1.14 .

3.运行nginx容器

docker run -itd --name nginx-test -p 8880:80  nginx:v1.4

4.访问测试

curl 127.0.0.1:8880

三.排错

问题现象:

FROM centos7的基础镜像的yum源可能无法访问,报错如下

Determining fastest mirrors

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was

14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"

解决:

1.排查宿主机可以正常上网

2.ip_forward的值也为1  cat /proc/sys/net/ipv4/ip_forward

3.也配置了DNS解析 cat /etc/resolv.conf

4.将宿主机的/etc/yum.repos.d/CentOS-Base.repo文件拷贝到与Dockerfile所在的目录下

cp /etc/yum.repos.d/CentOS-Base.repo .

在yum命令使用之前,在Dockerfile中添加

RUN gzip /etc/yum.repos.d/CentOS-*
COPY CentOS-Base.repo /etc/yum.repos.d/

然后重新构建

docker image build -t nginx:v1.14 .