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時添加上面的命令
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章