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