Docker 安裝配置 Nginx伺服器(詳細)
方法一、docker pull nginx(推薦)
查詢 Docker Hub 上的 nginx 映象
[email protected]:~/nginx$ docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 3260 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 674 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 207 [OK] million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 67 [OK] maxexcloo/nginx-php Docker framework container with Nginx and ... 57 [OK] webdevops/php-nginx Nginx with PHP-FPM 39 [OK] h3nrik/nginx-ldap NGINX web server with LDAP/AD, SSL and pro... 27 [OK] bitnami/nginx Bitnami nginx Docker Image 19 [OK] maxexcloo/nginx Docker framework container with Nginx inst... 7 [OK] ...
這裡我們拉取官方的映象
[email protected]:~/nginx$ docker pull nginx
等待下載完成後,我們就可以在本地映象列表裡查到 REPOSITORY 為 nginx 的映象。
[email protected]:~/nginx$ docker images nginx REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 555bbd91e13c 3 days ago 182.8 MB
方法二、通過 Dockerfile 構建(不推薦)
建立 Dockerfile
首先,建立目錄 nginx, 用於存放後面的相關東西。
ru[email protected]:~$ mkdir -p ~/nginx/www ~/nginx/logs ~/nginx/conf
www: 目錄將對映為 nginx 容器配置的虛擬目錄。
logs: 目錄將對映為 nginx 容器的日誌目錄。
conf: 目錄裡的配置檔案將對映為 nginx 容器的配置檔案。
進入建立的 nginx 目錄,建立 Dockerfile 檔案,內容如下:
FROM debian:stretch-slim
LABEL maintainer="NGINX Docker Maintainers < [email protected]>"
ENV NGINX_VERSION 1.14.0-1~stretch
ENV NJS_VERSION 1.14.0.0.2.0-1~stretch
RUN set -x \
&& apt-get update \
&& apt-get install --no-install-recommends --no-install-suggests -y gnupg1 apt-transport-https ca-certificates \
&& \
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
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 $NGINX_GPGKEY from $server"; \
apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
done; \
test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* \
&& dpkgArch="$(dpkg --print-architecture)" \
&& nginxPackages=" \
nginx=${NGINX_VERSION} \
nginx-module-xslt=${NGINX_VERSION} \
nginx-module-geoip=${NGINX_VERSION} \
nginx-module-image-filter=${NGINX_VERSION} \
nginx-module-njs=${NJS_VERSION} \
" \
&& case "$dpkgArch" in \
amd64|i386) \
# arches officialy built by upstream
echo "deb https://nginx.org/packages/debian/ stretch nginx" >> /etc/apt/sources.list.d/nginx.list \
&& apt-get update \
;; \
*) \
# we're on an architecture upstream doesn't officially build for
# let's build binaries from the published source packages
echo "deb-src https://nginx.org/packages/debian/ stretch nginx" >> /etc/apt/sources.list.d/nginx.list \
\
# new directory for storing sources and .deb files
&& tempDir="$(mktemp -d)" \
&& chmod 777 "$tempDir" \
# (777 to ensure APT's "_apt" user can access it too)
\
# save list of currently-installed packages so build dependencies can be cleanly removed later
&& savedAptMark="$(apt-mark showmanual)" \
\
# build .deb files from upstream's source packages (which are verified by apt-get)
&& apt-get update \
&& apt-get build-dep -y $nginxPackages \
&& ( \
cd "$tempDir" \
&& DEB_BUILD_OPTIONS="nocheck parallel=$(nproc)" \
apt-get source --compile $nginxPackages \
) \
# we don't remove APT lists here because they get re-downloaded and removed later
\
# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies
# (which is done after we install the built packages so we don't have to redownload any overlapping dependencies)
&& apt-mark showmanual | xargs apt-mark auto > /dev/null \
&& { [ -z "$savedAptMark" ] || apt-mark manual $savedAptMark; } \
\
# create a temporary local APT repo to install from (so that dependency resolution can be handled by APT, as it should be)
&& ls -lAFh "$tempDir" \
&& ( cd "$tempDir" && dpkg-scanpackages . > Packages ) \
&& grep '^Package: ' "$tempDir/Packages" \
&& echo "deb [ trusted=yes ] file://$tempDir ./" > /etc/apt/sources.list.d/temp.list \
# work around the following APT issue by using "Acquire::GzipIndexes=false" (overriding "/etc/apt/apt.conf.d/docker-gzip-indexes")
# Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)
# ...
# E: Failed to fetch store:/var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages Could not open file /var/lib/apt/lists/partial/_tmp_tmp.ODWljpQfkE_._Packages - open (13: Permission denied)
&& apt-get -o Acquire::GzipIndexes=false update \
;; \
esac \
\
&& apt-get install --no-install-recommends --no-install-suggests -y \
$nginxPackages \
gettext-base \
&& apt-get remove --purge --auto-remove -y apt-transport-https ca-certificates && rm -rf /var/lib/apt/lists/* /etc/apt/sources.list.d/nginx.list \
\
# if we have leftovers from building, let's purge them (including extra, unnecessary build deps)
&& if [ -n "$tempDir" ]; then \
apt-get purge -y --auto-remove \
&& rm -rf "$tempDir" /etc/apt/sources.list.d/temp.list; \
fi
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]
通過 Dockerfile 建立一個映象,替換成你自己的名字。
docker build -t nginx .
建立完成後,我們可以在本地的映象列表裡查詢到剛剛建立的映象
[email protected]:~/nginx$ docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 555bbd91e13c 3 days ago 182.8 MB
使用 nginx 映象
執行容器
[email protected]:docker run -p 9090:80 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -v $PWD/conf/nginx-conf:/etc/nginx/nginx-conf -d nginx
45c89fab0bf9ad643bc7ab571f3ccd65379b844498f54a7c8a4e7ca1dc3a2c1e
[email protected]:~/nginx$
命令說明:
-
-p 9090:80:將容器的80埠對映到主機的80埠(因此配置容器的nginx的監聽埠時,一定要配置為80埠)
-
--name mynginx:將容器命名為mynginx
-
-v $PWD/www:/www:將主機中當前目錄下的www掛載到容器的/www(配置容器的nginx的靜態檔案根路徑也為/www)
-
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:將主機中當前目錄下的nginx.conf掛載到容器的/etc/nginx/nginx.conf
-
-v $PWD/logs:/wwwlogs:將主機中當前目錄下的logs掛載到容器的/wwwlogs
-
記得進入容器,執行命令nginx -s reload
-
如果發現在瀏覽器中輸入url無法訪問到頁面,首先應該進入容器,檢視是否配置正確,可以執行命令nginx -T檢查,主要檢視埠,靜態檔案的根路徑是否和容器中的一致(不是和宿主機的一致)
目錄結果如下:
.
├── conf
│ ├── nginx-conf
│ │ └── erp_manage.conf
│ └── nginx.conf
├── logs
└── www
└── index.html
nginx的配置檔案如下:
$PWD/conf/nginx.conf
worker_processes 4;
worker_rlimit_nofile 10000;
#worker_shutdown_timeout 300;
error_log /var/log/nginx/error.log debug;
#error_log /var/log/nginx/nitice.log notice;
#error_log /var/log/nginx/info.log info;
#pid logs/nginx.pid;
#user charlie staff;
events {
worker_connections 1024;
multi_accept on;
# use epoll;
}
http {
access_log /var/log/nginx/access.log combined;
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
reset_timedout_connection on;
client_body_timeout 200s; # Use 5s for high-traffic sites
client_header_timeout 200s;
include mime.types;
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 900;
keepalive_requests 10000;
types_hash_max_size 2048;
#proxy_buffering off;
proxy_connect_timeout 1600;
proxy_send_timeout 1600;
proxy_read_timeout 1600;
send_timeout 1600;
default_type application/octet-stream;
gzip on;
gzip_disable "msie6";
server_names_hash_max_size 1024;
include nginx-conf/*;
}
$PWD/conf/nginx-conf/erp_manage.conf
server {
listen 80;
server_name html.com www.html.com;
root /www;
index index.html index.htm index.php;
access_log /var/log/nginx/customer.access.log;
error_log /var/log/nginx/customer.error.log;
#error_log /etc/nginx/logs/erp_platform.error.log;
rewrite_log on;
error_page 404 /404.html;
location = /404.html {
return 404 'sorry, file not found!';
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/nginx/html;
}
location / {
try_files $uri @rewrite;
}
location @rewrite {
set $static 0;
if ($uri ~ \.(css|js|jpg|jpeg|png|gif|ico|woff|eot|svg|css\.map|min\.map)$) {
set $static 1;
}
if ($static = 0) {
rewrite ^/(.*)$ /index.php?s=/$1 last ;
}
}
location ~ /Uploads/.*\.php$ {
deny all;
}
location ~ \.php/ {
if ($request_uri ~ ^(.+\.php)(/.+?)($|\?)) { }
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_NAME $1;
fastcgi_param PATH_INFO $2;
fastcgi_param SCRIPT_FILENAME $document_root$1;
}
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
檢視容器啟動情況
[email protected]:~/nginx$ docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
45c89fab0bf9 nginx "nginx -g 'daemon off" ... 0.0.0.0:80->80/tcp, 443/tcp mynginx
f2fa96138d71 tomcat "catalina.sh run" ... 0.0.0.0:81->8080/tcp tomcat
通過瀏覽器訪問
參考連結: