Docker——部署(tomcat、nginx、負載均衡、常見問題)
Docker + Tomcat (基礎)
docker pull tomcat
docker run -d -p 23333:8080 \
-v /opt/docker_file_map/tomcat/webapps:/usr/local/tomcat/webapps \
-v /opt/docker_file_map/tomcat/logs:/usr/local/tomcat/logs \
-e JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" \
--name my_tomcat \
tomcat
Docker + Nginx (基礎)
docker pull nginx
docker run -d -p 10086:80 --name my_nginx nginx
mkdir /opt/docker_file_map/nginx/
mkdir /opt/docker_file_map/nginx/log
docker cp 1371ff25a668:/etc/nginx/nginx.conf /opt/docker_file_map/nginx/
docker cp 1371ff25a668:/etc/nginx/conf.d /opt/docker_file_map/nginx/
docker cp 1371ff25a668:/usr/share/nginx/html /opt/docker_file_map/nginx/
docker ps
docker stop 1371ff25a668
docker rm 1371ff25a668
docker run -d -p 10086:80 \
-v /opt/docker_file_map/nginx/log:/var/log/nginx \
-v /opt/docker_file_map/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/docker_file_map/nginx/conf.d:/etc/nginx/conf.d \
-v /opt/docker_file_map/nginx/html:/usr/share/nginx/html \
--name my_nginx \
nginx
Docker + Nginx 文檔服務
Docker + Nginx + Tomcat (負載均衡、動靜分離)
- 編輯Nginx配置
$ vim nginx/conf.d/default.conf
# 負載均衡
# 注意:tomcatserver中不能有下劃線
upstream tomcatserver {
# 負載均衡用server,可以繼續在後面添加,weight是權重
# 此處IP:Port使用的是docker內部的(動態),重啓tomcat後可能會變,你可以使用其他方式
server 172.17.0.2:8080 weight=10;
server 172.17.0.3:8080 weight=10;
}
# 服務
server {
listen 80;
server_name localhost;
#charset koi8-r;
charset utf-8; # utf-8防止亂碼
#access_log /var/log/nginx/host.access.log main;
# 此處是文檔服務
location ^~ /files {
autoindex on; # 開啓索引功能
autoindex_exact_size off; # 關閉計算文件確切大小(單位bytes),只顯示大概大小(單位kb、mb、gb)
autoindex_localtime on; # 顯示本機時間而非 GMT 時間
root /usr/share/nginx/html/;
}
# 靜態文件攔截,以/static開頭的
location ^~ /static {
root /usr/share/nginx/html/;
index index.html index.htm;
}
# 靜態文件攔截,以xx結尾的
#location ~* \.(gif|jpg|jpeg|png|css|js|ico) {
# root /usr/share/nginx/html/res/;
#}
# 圖標攔截
location /favicon.ico {
root /usr/share/nginx/html/;
}
# 反向代理
location / {
proxy_pass http://tomcatserver;
}
#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;
}
}
- 編輯Nginx配置
$ vim nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll; # 使用epoll
}
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;
server_tokens off; # 隱藏Nginx版本
absolute_redirect off; # 使用相對位置重定向
include /etc/nginx/conf.d/*.conf;
}
- 啓動 Tomcat
docker run -d -p 8080:8080 \
-v /opt/docker_file_map/tomcat/webapps:/usr/local/tomcat/webapps \
-v /opt/docker_file_map/tomcat/logs:/usr/local/tomcat/logs \
-e JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" \
--name my_tomcat \
tomcat
- 啓動 Nginx
docker run -d -p 10086:80 \
-v /opt/docker_file_map/nginx/log:/var/log/nginx \
-v /opt/docker_file_map/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/docker_file_map/nginx/conf.d:/etc/nginx/conf.d \
-v /opt/docker_file_map/nginx/html:/usr/share/nginx/html \
--name my_nginx \
nginx
常見問題
- 阿里雲上啓動docker + tomcat 太慢?
docker run -d -p 23333:8080 -e JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" tomcat
- Docker + Nginx 斜槓和端口的問題
- 注意,修改完成後測試時,記得清空瀏覽器緩存
- 幾個參數解釋
# 爲on時,使用絕對位置重定向
# 爲off時,使用相對位置重定向,並且下面兩個配置失效
absolute_redirect on;
# 爲off時,以當前服務器的IP地址進行拼接URL;
# 爲on時,先查找server中配置的server_name,如果沒有找到,查找請求頭的HOST字段,如果還沒有,則以當前服務器的IP進行拼接。
server_name_in_redirect off;
# 爲off時,那麼始終按照默認的80端口
# 爲on時,那麼將會使用當前正在監聽的端口(即server中配置的listen)
port_in_redirect on;
# /etc/nginx/conf.d/default.conf
server {
listen 10086;
server_name localhost;
# 省略
}
# nginx.conf
http {
# 省略
# 使用絕對位置重定向
absolute_redirect on;
server_name_in_redirect off;
port_in_redirect on;
include /etc/nginx/conf.d/*.conf;
}
# /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
# 省略
}
# nginx.conf
http {
# 省略
# 使用相對位置重定向,其他兩個配置失效
absolute_redirect off;
include /etc/nginx/conf.d/*.conf;
}
- 容器時區不對?
docker exec -it e8650f9fe9fe /bin/bash
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone