一.简介
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 .