Docker——部署(tomcat、nginx、负载均衡、常见问题)

Docker——部署(tomcat、nginx、负载均衡、常见问题)

Docker + Tomcat (基础)

# 拉取tomcat
docker pull tomcat

# 阿里云ECS如果启动较慢,需要加下面的JAVA_OPTS
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 (基础)

# 拉取 Nginx
docker pull nginx

# 前面的操作主要是为了方便后面进行文件映射
# 先随意启动一个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

# 正式启动 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 + Nginx (文档服务)

  • 修改配置文件 $ vim nginx/conf.d/default.conf
    server {
        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        charset utf-8;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            autoindex on; # 开启索引功能
            autoindex_exact_size off; # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
            autoindex_localtime on; # 显示本机时间而非 GMT 时间
            root   /usr/share/nginx/html/files; # 文档存放路径
            #root   /usr/share/nginx/html;
            #index  index.html index.htm;
        }
        // 省略……
    }
    
  • 重启 $ docker restart 6cc6d2ea4fee(容器ID)

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 太慢?
    # 添加JAVA_OPTS
    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;
    
    • 解决方式1(宿主机和容器的端口一致)
    # /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;
    }
    
    • 解决方式2(宿主机和容器的端口不一致)
    # /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
    # 或者在构建Dockerfile时添加上面的命令
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值