基于alpine用dockerfile创建的nginx镜像

Posted 一本正经的搞事情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于alpine用dockerfile创建的nginx镜像相关的知识,希望对你有一定的参考价值。

1、下载alpine镜像

[root@docker43 ~]# docker pull alpine
Using default tag: latest
Trying to pull repository docker.io/library/alpine ...
latest: Pulling from docker.io/library/alpine
4fe2ade4980c: Pull complete
Digest: sha256:621c2f39f8133acb8e64023a94dbdf0d5ca81896102b9e57c0dc184cadaf5528
Status: Downloaded newer image for docker.io/alpine:latest
[root@docker43 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/alpine    latest              196d12cf6ab1        3 weeks ago         4.41 MB

2、编写dockerfile(一)

2.1.创建存放文件目录

[root@docker43 ~]# cd /opt/
[root@docker43 opt]# mkdir alpine_nginx && cd alpine_nginx && touch Dockerfile && touch nginx.conf && touch nginx.vh.default.conf
[root@docker43 alpine_nginx]# ll
总用量 16
-rw-r--r-- 1 root root 5652 10月  4 18:15 Dockerfile
-rw-r--r-- 1 root root  638 10月  4 15:23 nginx.conf
-rw-r--r-- 1 root root  472 10月  4 15:24 nginx.vh.default.conf

2.2. 准备nginx.conf文件

[root@docker43 alpine_nginx]# cat nginx.conf 
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  10240;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

2.3.准备nginx.vh.default.conf文件

[root@docker43 alpine_nginx]# cat nginx.vh.default.conf 
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

2.4.dockerfile文件

# 基础镜像
FROM alpine

# 作者信息
MAINTAINER NGINX Docker Maintainers "1024331014@qq.com"

# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \\
    echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories

# 安装需要的软件
RUN apk update && \\
    apk add --no-cache ca-certificates && \\
    apk add --no-cache curl bash tree tzdata && \\
    cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 设置变量	
ENV NGINX_VERSION 1.14.0

# 编译安装nginx
RUN GPG_KEYS=B0F4253373F8F6F510D42178520A9993A1C052F8 \\
	&& CONFIG="\\
		--prefix=/etc/nginx \\
		--sbin-path=/usr/sbin/nginx \\
		--modules-path=/usr/lib/nginx/modules \\
		--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 \\
		--user=nginx \\
		--group=nginx \\
		--with-http_ssl_module \\
		--with-http_realip_module \\
		--with-http_addition_module \\
		--with-http_sub_module \\
		--with-http_dav_module \\
		--with-http_flv_module \\
		--with-http_mp4_module \\
		--with-http_gunzip_module \\
		--with-http_gzip_static_module \\
		--with-http_random_index_module \\
		--with-http_secure_link_module \\
		--with-http_stub_status_module \\
		--with-http_auth_request_module \\
		--with-http_xslt_module=dynamic \\
		--with-http_image_filter_module=dynamic \\
		--with-http_geoip_module=dynamic \\
		--with-threads \\
		--with-stream \\
		--with-stream_ssl_module \\
		--with-stream_ssl_preread_module \\
		--with-stream_realip_module \\
		--with-stream_geoip_module=dynamic \\
		--with-http_slice_module \\
		--with-mail \\
		--with-mail_ssl_module \\
		--with-compat \\
		--with-file-aio \\
		--with-http_v2_module \\
	" \\
	&& addgroup -S nginx \\
	&& adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx \\
	&& apk add --no-cache --virtual .build-deps \\
		gcc \\
		libc-dev \\
		make \\
		openssl-dev \\
		pcre-dev \\
		zlib-dev \\
		linux-headers \\
		curl \\
		gnupg \\
		libxslt-dev \\
		gd-dev \\
		geoip-dev \\
	&& curl -fSL http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o nginx.tar.gz \\
	&& curl -fSL http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc  -o nginx.tar.gz.asc \\
	&& export GNUPGHOME="$(mktemp -d)" \\
	&& found=\'\'; \\
	for server in \\
		ha.pool.sks-keyservers.net \\
		hkp://keyserver.ubuntu.com:80 \\
		hkp://p80.pool.sks-keyservers.net:80 \\
		pgp.mit.edu \\
	; do \\
		echo "Fetching GPG key $GPG_KEYS from $server"; \\
		gpg --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$GPG_KEYS" && found=yes && break; \\
	done; \\
	test -z "$found" && echo >&2 "error: failed to fetch GPG key $GPG_KEYS" && exit 1; \\
	gpg --batch --verify nginx.tar.gz.asc nginx.tar.gz \\
	&& rm -r "$GNUPGHOME" nginx.tar.gz.asc \\
	&& mkdir -p /usr/src \\
	&& tar -zxC /usr/src -f nginx.tar.gz \\
	&& rm nginx.tar.gz \\
	&& cd /usr/src/nginx-$NGINX_VERSION \\
	&& ./configure $CONFIG --with-debug \\
	&& make -j$(getconf _NPROCESSORS_ONLN) \\
	&& mv objs/nginx objs/nginx-debug \\
	&& mv objs/ngx_http_xslt_filter_module.so objs/ngx_http_xslt_filter_module-debug.so \\
	&& mv objs/ngx_http_image_filter_module.so objs/ngx_http_image_filter_module-debug.so \\
	&& mv objs/ngx_http_geoip_module.so objs/ngx_http_geoip_module-debug.so \\
	&& mv objs/ngx_stream_geoip_module.so objs/ngx_stream_geoip_module-debug.so \\
	&& ./configure $CONFIG \\
	&& make -j$(getconf _NPROCESSORS_ONLN) \\
	&& make install \\
	&& rm -rf /etc/nginx/html/ \\
	&& mkdir /etc/nginx/conf.d/ \\
	&& mkdir -p /usr/share/nginx/html/ \\
	&& install -m644 html/index.html /usr/share/nginx/html/ \\
	&& install -m644 html/50x.html /usr/share/nginx/html/ \\
	&& install -m755 objs/nginx-debug /usr/sbin/nginx-debug \\
	&& install -m755 objs/ngx_http_xslt_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_xslt_filter_module-debug.so \\
	&& install -m755 objs/ngx_http_image_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_image_filter_module-debug.so \\
	&& install -m755 objs/ngx_http_geoip_module-debug.so /usr/lib/nginx/modules/ngx_http_geoip_module-debug.so \\
	&& install -m755 objs/ngx_stream_geoip_module-debug.so /usr/lib/nginx/modules/ngx_stream_geoip_module-debug.so \\
	&& ln -s ../../usr/lib/nginx/modules /etc/nginx/modules \\
	&& strip /usr/sbin/nginx* \\
	&& strip /usr/lib/nginx/modules/*.so \\
	&& rm -rf /usr/src/nginx-$NGINX_VERSION \\
	\\
	# Bring in gettext so we can get `envsubst`, then throw
	# the rest away. To do this, we need to install `gettext`
	# then move `envsubst` out of the way so `gettext` can
	# be deleted completely, then move `envsubst` back.
	&& apk add --no-cache --virtual .gettext gettext \\
	&& mv /usr/bin/envsubst /tmp/ \\
	\\
	&& runDeps="$( \\
		scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst \\
			| awk \'{ gsub(/,/, "\\nso:", $2); print "so:" $2 }\' \\
			| sort -u \\
			| xargs -r apk info --installed \\
			| sort -u \\
	)" \\
	&& apk add --no-cache --virtual .nginx-rundeps $runDeps \\
	&& apk del .build-deps \\
	&& apk del .gettext \\
	&& mv /tmp/envsubst /usr/local/bin/ \\
	\\
	# forward request and error logs to docker log collector
	&& ln -sf /dev/stdout /var/log/nginx/access.log \\
	&& ln -sf /dev/stderr /var/log/nginx/error.log

# 将目录下的文件copy到镜像中
COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx.vh.default.conf /etc/nginx/conf.d/default.conf

# 开放80端口
EXPOSE 80

STOPSIGNAL SIGTERM

# 启动nginx命令
CMD ["nginx", "-g", "daemon off;"]

2.5.创建镜像

[root@docker43 alpine_nginx]# docker build -t alpine:nginx .

2.6.创建容器

# 不进行宿主配置文件日志文件挂载
docker run -tid --name zjznginx  -p 80:80 -m 2048m  --memory-swap=2048m  --cpu-shares=256 alpine:nginx

# 挂载配置文件和日志
docker run -tid --name zjznginx  -p 80:80 -v /opt/Webs/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/Webs/nginx/logs/:/var/log/nginx -m 2048m  --memory-swap=2048m  --cpu-shares=256 alpine:nginx

 查看容器

[root@docker43 alpine_nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
27c9ed6664ba        alpine:nginx        "nginx -g \'daemon ..."   1 second ago        Up 1 second         0.0.0.0:80->80/tcp   zjznginx

3、编写dockerfile(二)

3.1.创建存放文件目录

[root@docker43 ~]# cd /opt/
[root@docker43 opt]# mkdir alpine_nginx && cd alpine_nginx && touch Dockerfile && touch nginx.conf && touch nginx.vh.default.conf
[root@docker43 alpine_nginx]# ll
总用量 16
-rw-r--r-- 1 root root 5652 10月  4 18:15 Dockerfile
-rw-r--r-- 1 root root  638 10月  4 15:23 nginx.conf
-rw-r--r-- 1 root root  472 10月  4 15:24 nginx.vh.default.conf

3.2.准备nginx.conf文件

[root@docker43 alpine_nginx]# cat nginx.conf 
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  10240;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

3.3. 准备nginx.vh.default.conf文件

[root@docker43 alpine_nginx]# cat nginx.vh.default.conf 
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

3.4.dockerfile文件

# 基础镜像
FROM alpine

# 作者信息
MAINTAINER NGINX Docker Maintainers "1024331014@qq.com"

# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories && \\
    echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >> /etc/apk/repositories

# 安装需要的软件
RUN apk update && \\
    apk add --no-cache ca-certificates && \\
    apk add --no-cache curl bash tree tzdata && \\
    cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 设置变量	
ENV NGINX_VERSION 1.14.0

# 编译安装nginx
RUN GPG_KEYS=B0F4253373F8F6F510D42178520A9993A1C052F8 \\
	&& CONFIG="\\
		--prefix=/etc/nginx \\
		--sbin-path=/usr/sbin/nginx \\
		--modules-path=/usr/lib/nginx/modules \\
		--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 \\
		--user=nginx \\
		--group=nginx \\
		--with-http_ssl_module \\
		--with-http_realip_module \\
		--with-http_addition_module \\
		--with-http_sub_module \\
		--with-http_dav_module \\
		--with-http_flv_module \\
		--with-http_mp4_module \\
		--with-http_gunzip_module \\
		--with-http_gzip_static_module \\
		--with-http_random_index_module \\
		--with-http_secure_link_module \\
		--with-http_stub_status_module \\
		--with-http_auth_request_module \\
		--with-http_xslt_module=dynamic \\
		--with-http_image_filter_module=dynamic \\
		--with-http_geoip_module=dynamic \\
		--with-threads \\
		--with-stream \\
		--with-stream_ssl_module \\
		--with-stream_ssl_preread_module \\
		--with-stream_realip_module \\
		--with-stream_geoip_module=dynamic \\
		--with-http_slice_module \\
		--with-mail \\
		--with-mail_ssl_module \\
		--with-compat \\
		--with-file-aio \\
		--with-http_v2_module \\
	" \\
	&& addgroup -S nginx \\
	&& adduser -D -S -h /var/cache/nginx -s /sbin/nologin -G nginx nginx \\
	&& apk add --no-cache --virtual .build-deps \\
		gcc \\
		libc-dev \\
		make \\
		openssl-dev \\
		pcre-dev \\
		zlib-dev \\
		linux-headers \\
		curl \\
		gnupg \\
		libxslt-dev \\
		gd-dev \\
		geoip-dev \\
	&& curl -fSL http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz -o nginx.tar.gz \\
	&& curl -fSL http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz.asc  -o nginx.tar.gz.asc \\
	&& export GNUPGHOME="$(mktemp -d)" \\
	&& found=\'\'; \\
	for server in \\
		ha.pool.sks-keyservers.net \\
		hkp://keyserver.ubuntu.com:80 \\
		hkp://p80.pool.sks-keyservers.net:80 \\
		pgp.mit.edu \\
	; do \\
		echo "Fetching GPG key $GPG_KEYS from $server"; \\
		gpg --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$GPG_KEYS" && found=yes && break; \\
	done; \\
	test -z "$found" && echo >&2 "error: failed to fetch GPG key $GPG_KEYS" && exit 1; \\
	gpg --batch --verify nginx.tar.gz.asc nginx.tar.gz \\
	&& rm -r "$GNUPGHOME" nginx.tar.gz.asc \\
	&& mkdir -p /usr/src \\
	&& tar -zxC /usr/src -f nginx.tar.gz \\
	&& rm nginx.tar.gz \\
	&& cd /usr/src/nginx-$NGINX_VERSION \\
	&& ./configure $CONFIG --with-debug \\
	&& make -j$(getconf _NPROCESSORS_ONLN) \\
	&& mv objs/nginx objs/nginx-debug \\
	&& mv objs/ngx_http_xslt_filter_module.so objs/ngx_http_xslt_filter_module-debug.so \\
	&& mv objs/ngx_http_image_filter_module.so objs/ngx_http_image_filter_module-debug.so \\
	&& mv objs/ngx_http_geoip_module.so objs/ngx_http_geoip_module-debug.so \\
	&& mv objs/ngx_stream_geoip_module.so objs/ngx_stream_geoip_module-debug.so \\
	&& ./configure $CONFIG \\
	&& make -j$(getconf _NPROCESSORS_ONLN) \\
	&& make install \\
	&& rm -rf /etc/nginx/html/ \\
	&& mkdir /etc/nginx/conf.d/ \\
	&& mkdir -p /usr/share/nginx/html/ \\
	&& install -m644 html/index.html /usr/share/nginx/html/ \\
	&& install -m644 html/50x.html /usr/share/nginx/html/ \\
	&& install -m755 objs/nginx-debug /usr/sbin/nginx-debug \\
	&& install -m755 objs/ngx_http_xslt_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_xslt_filter_module-debug.so \\
	&& install -m755 objs/ngx_http_image_filter_module-debug.so /usr/lib/nginx/modules/ngx_http_image_filter_module-debug.so \\
	&& install -m755 objs/ngx_http_geoip_module-debug.so /usr/lib/nginx/modules/ngx_http_geoip_module-debug.so \\
	&& install -m755 objs/ngx_stream_geoip_module-debug.so /usr/lib/nginx/modules/ngx_stream_geoip_module-debug.so \\
	&& ln -s ../../usr/lib/nginx/modules /etc/nginx/modules \\
	&& strip /usr/sbin/nginx* \\
	&& strip /usr/lib/nginx/modules/*.so \\
	&& rm -rf /usr/src/nginx-$NGINX_VERSION \\
	\\
	# Bring in gettext so we can get `envsubst`, then throw
	# the rest away. To do this, we need to install `gettext`
	# then move `envsubst` out of the way so `gettext` can
	# be deleted completely, then move `envsubst` back.
	&& apk add --no-cache --virtual .gettext gettext \\
	&& mv /usr/bin/envsubst /tmp/ \\
	\\
	&& runDeps="$( \\
		scanelf --needed --nobanner /usr/sbin/nginx /usr/lib/nginx/modules/*.so /tmp/envsubst \\
			| awk \'{ gsub(/,/, "\\nso:", $2); print "so:" $2 }\' \\
			| sort -u \\
			| xargs -r apk info --installed \\
			| sort -u \\
	)" \\
	&& apk add --no-cache --virtual .nginx-rundeps $runDeps \\
	&& apk del .build-deps \\
	&& apk del .gettext \\
	&& mv /tmp/envsubst /usr/local/bin/ \\
	\\
	# forward request and error logs to docker log collector
	&& ln -sf /dev/stdout /var/log/nginx/access.log \\
	&& ln -sf /dev/stderr /var/log/nginx/error.log

# 将目录下的文件copy到镜像中
COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx.vh.default.conf /etc/nginx/conf.d/default.conf


# 将启动命令搞成个脚本通过脚本启动
RUN echo "/usr/sbin/nginx" >>/etc/start.sh

# 开放80端口
EXPOSE 80

STOPSIGNAL SIGTERM

# 启动nginx命令
CMD ["/bin/sh","/etc/start.sh"]

3.5.创建镜像

[root@docker43 alpine_nginx]# docker build -t alpine:nginx .

3.6.创建容器

# 不进行宿主配置文件日志文件挂载
docker run -ti --restart=always --name zjznginx  -p 80:80 -m 2048m  --memory-swap=2048m  --cpu-shares=256 alpine:nginx bash

# 挂载配置文件和日志
docker run -ti --restart=always --name zjznginx  -p 80:80 -v /opt/Webs/nginx/nginx.conf:/etc/nginx/nginx.conf -v /opt/Webs/nginx/logs/:/var/log/nginx -m 2048m  --memory-swap=2048m  --cpu-shares=256 alpine:nginx bash

PS:因为用的是脚本命令的方式启动的,没有守护进程 ,最后使用bash或者sh进入容器启动然后ctrl+p ctrl+q 退出

具体的解释:docker运行nginx为什么要使用 daemon off

启动nginx

[root@docker43 alpine_nginx]# docker run -ti --restart=always --name zjznginx  -p 80:80 -m 2048m  --memory-swap=2048m  --cpu-shares=256 alpine:nginx bash
bash-4.4# /bin/sh /etc/start.sh 

查看容器

[root@docker43 alpine_nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
0da349afebff        alpine:nginx        "bash"              21 seconds ago      Up 20 seconds       0.0.0.0:80->80/tcp   zjznginx

4、测试

 

 

以上是关于基于alpine用dockerfile创建的nginx镜像的主要内容,如果未能解决你的问题,请参考以下文章

基于alpine用dockerfile创建的ssh镜像

基于Alpine 编写Haproxy的Dockerfile

Docker -- 自定义镜像(Dockerfile)基于Ubuntu镜像构建一个新镜像基于java:8-alpine镜像将一个Java项目构建为镜像

linux12企业实战 -- 06alpine Linux简介alpine制作jdk镜像jre镜像 Alpine 命令

docker制作alpine初始镜像

Alpine Dockerfile --no-cache Vs 的优势。 rm /var/cache/apk/*