Dockerfile 介绍
Dockerfile 是 docker 构建镜像的基础,也是 docker 区别于其他容器的重要特征,正是有了 Dockerfile,docker 的自动化和可移植性才成为可能。
不论是开发还是运维,学会编写 Dockerfile 几乎是必备的,这有助于你理解整个容器的运行。
FROM , 从一个基础镜像构建新的镜像
FROM ubuntu
MAINTAINER , 维护者信息
MAINTAINER William <wlj@nicescale.com>
ENV , 设置环境变量
ENV TEST 1
RUN , 非交互式运行 shell 命令
RUN apt-get -y update
RUN apt-get -y install nginx
ADD , 将外部文件拷贝到镜像里,src 可以为 url
ADD http://nicescale.com/ /data/nicescale.tgz
# 将 index.php 复制到容器内的 /var/www 目录下
# 会自动解压 tar 包
ADD index.php /var/www/
# 用 copy 而不用 add,因为 ADD 指令会自动解压 tar 文件
COPY redis.tgz /home/redis.tgz
# 设置工作目录,exec 进入容器就直接进入到这个目录中
WORKDIR /path/to/workdir
WORKDIR /var/www
USER , 设置用户 ID
USER nginx
# 设置 volume, 声明一个数据卷, 可用于挂载, [] 里面是路径
# 出于可移植和分享的考虑,用于 - v 主机目录: 容器目录这种方法不能够直接在 DockerFile 中实现
# 可自行创建软链接实现特定目录挂载
VULUME <#dir>
VOLUME ['/data']
EXPOSE , 暴露哪些端口
EXPOSE 80 443
ENTRYPOINT ["executable", "param1","param2"] 执行命令
ENTRYPOINT ["/usr/sbin/nginx"]
# 一般只用 cmd 就可以了
CMD ["param1","param2"]
CMD ["start"]
docker 创建、启动 container 时执行的命令
# 如果设置了 ENTRYPOINT,则 CMD 将作为参数
# 如果没有设置 ENTRYPOINT, 则直接命令参数传入
[info] – 尽量将一些常用不变的指令放到前面
- CMD 和 ENTRYPOINT 尽量使用 json 数组方式
通过 Dockerfile 构建 image
# 构建
docker build -t allovince/php-helloworld:v1 .
# 运行并绑定端口 8080
docker run -d -p 8080:8080 allovince/php-helloworld
Dockerfile 示例
# 使用的基础镜像
FROM centos
#作者信息
MAINTAINER by caiwen (xiaogang.zhou@qq.com)
WORKDIR /usr/local/src
#安装 wget
RUN yum install -y wget
#下载并解压源码包
RUN wget http://nginx.org/download/nginx-1.8.0.tar.gz
RUN tar -zxvf nginx-1.8.0.tar.gz
WORKDIR nginx-1.8.0
#编译安装 nginx
RUN yum install -y gcc make pcre-devel zlib-devel
RUN ./configure --prefix=/usr/local/nginx --with-pcre
RUN make
RUN make install
#修改 Nginx 配置文件, 以非 daemon 方式启动
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
#开放 22、80、443 端口
EXPOSE 22
EXPOSE 80
EXPOSE 443
#设置生成容器时需要执行的脚本
CMD ["/usr/local/nginx/sbin/nginx","start"]
构建镜像
docker build -t nginx:v1 .