docker笔记之构建nginx的Dockerfile

docker笔记之构建nginx的Dockerfile

从源码构建nginx应用,可以参考官方Dockerfile。 PS:这份Dockerfile使用了alpine作为基础镜像,非常有特点,但对于Jackie这样的小白来说区别不大。

基于ubuntu的Dockerfile

FROM ubuntu:14.04

MAINTAINER Jackie "www.jackieathome.net"
ENV NGINX_VERSION 1.10.3
ENV OPENSSL_VERSION 1.0.2k
ENV PCRE_VERSION 8.40
ENV ZLIB_VERSION 1.2.11
ENV BUILD_ROOT /usr/local/src/nginx

# 这里为了加快构建速度,使用了163的安装源
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak \
        && sed -i "s/archive\.ubuntu\.com/mirrors\.163\.com/g" /etc/apt/sources.list \
        && apt-get update \
        && apt-get -y install zip unzip curl make gcc g++ \
        && mkdir -p $BUILD_ROOT \
        && cd $BUILD_ROOT \
        && curl https://ftp.pcre.org/pub/pcre/pcre-$PCRE_VERSION.zip -o $BUILD_ROOT/pcre-$PCRE_VERSION.zip \
        && curl https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz -o $BUILD_ROOT/openssl-$OPENSSL_VERSION.tar.gz \
        && curl http://www.zlib.net/zlib-$ZLIB_VERSION.tar.gz -o $BUILD_ROOT/zlib-$ZLIB_VERSION.tar.gz \
        && curl https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o $BUILD_ROOT/nginx-$NGINX_VERSION.tar.gz \
        && tar vxzf nginx-$NGINX_VERSION.tar.gz \
        && unzip pcre-$PCRE_VERSION.zip \
        && tar vxfz zlib-$ZLIB_VERSION.tar.gz \
        && tar vxfz openssl-$OPENSSL_VERSION.tar.gz \
        && cd nginx-$NGINX_VERSION \
        && BUILD_CONFIG="\
            --prefix=/etc/nginx \
            --sbin-path=/usr/sbin/nginx \
            --conf-path=/etc/nginx/nginx.conf \
            --error-log-path=/var/log/nginx/error.log \
            --http-log-path=/var/log/nginx/access.log \
            --pid-path=/var/run/nginx.pid \
            --lock-path=/var/run/nginx.lock \
            --http-client-body-temp-path=/var/cache/nginx/client_temp \
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
            --with-openssl=$BUILD_ROOT/openssl-$OPENSSL_VERSION \
            --with-pcre=$BUILD_ROOT/pcre-$PCRE_VERSION \
            --with-zlib=$BUILD_ROOT/zlib-$ZLIB_VERSION \
            --with-http_ssl_module \
            --with-http_v2_module \ 
            --with-threads \
            " \
        && mkdir -p /var/cache/nginx \
        && ./configure $BUILD_CONFIG \
        && make && make install \
        && rm -rf $BUILD_ROOT \
        && apt-get -y remove zip unzip curl make gcc g++ \
        && apt-get -y autoremove \
        && rm -rf /var/lib/apt/lists/* \
        && cp /etc/apt/sources.list.bak /etc/apt/sources.list \
        && ln -sf /dev/stdout /var/log/nginx/access.log \
        && ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

基于centos的Dockerfile

FROM centos

MAINTAINER Jackie "www.jackieathome.net"
ENV NGINX_VERSION 1.10.3
ENV OPENSSL_VERSION 1.0.2k
ENV PCRE_VERSION 8.40
ENV ZLIB_VERSION 1.2.11
ENV BUILD_ROOT /usr/local/src/nginx

# 为了减小最终生成的镜像占用的空间,这里没有执行yum update命令,可能不是好的实践
# 为了加快构建速度,这里使用了163的安装源
#RUN yum -y update \
RUN     yum -y install curl \
        && mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
        && curl http://mirrors.163.com/.help/CentOS7-Base-163.repo -o /etc/yum.repos.d/CentOS7-Base-163.repo \ 
        && yum clean all \
        && yum makecache \
        && yum -y install gcc gcc-c++ make perl zip unzip \
        && mkdir -p $BUILD_ROOT \
        && cd $BUILD_ROOT \
        && curl https://ftp.pcre.org/pub/pcre/pcre-$PCRE_VERSION.zip -o $BUILD_ROOT/pcre-$PCRE_VERSION.zip \
        && curl https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz -o $BUILD_ROOT/openssl-$OPENSSL_VERSION.tar.gz \
        && curl http://www.zlib.net/zlib-$ZLIB_VERSION.tar.gz -o $BUILD_ROOT/zlib-$ZLIB_VERSION.tar.gz \
        && curl https://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o $BUILD_ROOT/nginx-$NGINX_VERSION.tar.gz \
        && tar vxzf nginx-$NGINX_VERSION.tar.gz \
        && unzip pcre-$PCRE_VERSION.zip \
        && tar vxfz zlib-$ZLIB_VERSION.tar.gz \
        && tar vxfz openssl-$OPENSSL_VERSION.tar.gz \
        && cd nginx-$NGINX_VERSION \
        && BUILD_CONFIG="\
            --prefix=/etc/nginx \
            --sbin-path=/usr/sbin/nginx \
            --conf-path=/etc/nginx/nginx.conf \
            --error-log-path=/var/log/nginx/error.log \
            --http-log-path=/var/log/nginx/access.log \
            --pid-path=/var/run/nginx.pid \
            --lock-path=/var/run/nginx.lock \
            --http-client-body-temp-path=/var/cache/nginx/client_temp \
            --http-proxy-temp-path=/var/cache/nginx/proxy_temp \
            --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
            --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
            --http-scgi-temp-path=/var/cache/nginx/scgi_temp \
            --with-openssl=$BUILD_ROOT/openssl-$OPENSSL_VERSION \
            --with-pcre=$BUILD_ROOT/pcre-$PCRE_VERSION \
            --with-zlib=$BUILD_ROOT/zlib-$ZLIB_VERSION \
            --with-http_ssl_module \
            --with-http_v2_module \ 
            --with-threads \
            " \
        && mkdir -p /var/cache/nginx \
        && ./configure $BUILD_CONFIG \
        && make && make install \
        && rm -rf $BUILD_ROOT \
        && yum -y remove gcc gcc-c++ make perl zip unzip \
        && yum clean all

EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]

笔记

.dockerignore

作用与git.gitignore文件类似。在Dockerfile的同级目录下增加.dockerignore,将不需要传递给docker的文件名配置进去,可以有效减少传递给docker命令的数据,提高构建效率。 文章Do not ignore .dockerignore.dockerignore的作用和使用方法有比较全面的介绍。

apt-get

apt-get运行时将在路径/var/lib/apt/lists/缓存数据,因此构建动作完成后,需要手工清理这个路径。 执行apt-get remove清理软件之后,可能存在一些无用的软件,因此不要忘记执行apt-get autoremove

yum

yum -y在运行时不需要用户确认,所有行为默认用户同意,比较适合在非交互模式比如在Dockerfile这种场景下使用。 yum命令在运行时会在路径/var/cache/yum产生缓存数据,执行yum clean all可以清理这些缓存,释放空间,减少最终镜像占用的空间。 yum update会更新系统,如果基础镜像版本旧的话,可能会下载、安装大量的软件,导致最终的镜像占用的空间比较大。

常用的命令

# 删除已停止的容器
sudo docker ps -q -a | xargs sudo docker rm
# 删除无效的镜像
sudo docker rmi $(sudo docker images | grep "^" | awk '{print $3}')

参考资料



查看原文:http://www.jackieathome.net/archives/483.html
Docker 是一种开源的容器化平台,它可以让开发者将应用程序及其依赖项打包到一个可移植的容器中,然后在任何支持 Docker 的平台上运行这些容器。本文将介绍 Docker 基础知识和使用方法。 ## 安装 Docker Docker 官方提供了不同平台的安装包,可以在官网上选择对应平台的安装包进行下载。安装完成后,可以在命令行中输入 `docker version` 命令来验证 Docker 是否安装成功。 ## 镜像和容器 Docker 的核心概念是镜像和容器。镜像是一个只读的模板,它包含了运行应用程序所需的所有信息,如代码、运行时环境、库文件、环境变量等。容器则是从镜像启动的运行实例,它可以被启动、停止、删除,并且可以与其他容器进行通信。 ### 镜像 Docker 镜像可以使用 `docker pull` 命令从 Docker Hub 上下载,也可以使用 `docker build` 命令从 Dockerfile构建。一个 Dockerfile 是一个包含构建 Docker 镜像所需的指令的文本文件。 例如,下面是一个构建一个基于 Ubuntu 操作系统的 Docker 镜像的 Dockerfile: ``` # 使用 Ubuntu 作为基础镜像 FROM ubuntu:latest # 设置镜像的作者 MAINTAINER yourname # 更新 Ubuntu 系统 RUN apt-get update # 安装必要的软件 RUN apt-get install -y nginx # 复制本地文件到镜像中 COPY index.html /var/www/html/ # 暴露容器端口 EXPOSE 80 # 设置容器启动命令 CMD ["nginx", "-g", "daemon off;"] ``` 使用 `docker build` 命令来构建 Docker 镜像: ``` $ docker build -t myimage . ``` ### 容器 使用 `docker run` 命令可以启动一个容器。例如,启动上面构建的 `myimage` 镜像: ``` $ docker run -d -p 8080:80 myimage ``` 其中 `-d` 表示在后台运行容器,`-p` 表示将容器的端口映射到主机的端口,`myimage` 是要启动的镜像名称。 使用 `docker ps` 命令可以查看当前正在运行的容器。使用 `docker stop` 命令可以停止容器。 ## Docker Compose Docker Compose 是一个工具,它可以定义和运行多个 Docker 容器。它使用 YAML 文件来配置应用程序的服务。例如,下面是一个简单的 Docker Compose 配置文件: ``` version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine" ``` 使用 `docker-compose up` 命令可以启动这个应用程序。使用 `docker-compose down` 命令可以停止应用程序并删除容器。 ## 总结 本文介绍了 Docker 的基础知识和使用方法,包括镜像、容器和 Docker Compose。希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小南家的青蛙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值