Docker部署web環境之總結篇


3. 問題總結

問題總結1: 數據庫容器時區問題以及環境變量的安全控制

  • docker-compose.yml文件中的環境變量,可以配置的變量方法有兩種:

方法一:docker-compose.yml文件中用environment的形式配置

environment:  
  TZ: Asia/Shanghai  
第一種適用於數據服務(也適用於其他)  

environment:  
  - TZ=Asia/Shanghai  
第二種適用於普通的服務.  
  yml文件中數據庫服務中僅能識別第一種形式"<key>: <value>",基於配置的統一用法方便記憶,所有的環境變量的配置又都識別第一種形式,所以選擇第一種  

方法二:docker-compose.yml文件利用變量文件的形式引入多個變量(比較安全,推薦)

# cat docker-compose.yml  
......   
  volumes:  
    - ./mysql/mysql5.7/conf:/etc/mysql/conf.d  
    - ./mysql/mysql5.7/data:/var/lib/mysql  
  command: --character-set-server=utf8  
  env_file:  
    - ./mysql/mysql5.7/conf/env  
  ......  

# cat ./mysql/mysql5.7/conf/env  
TZ=Asia/Shanghai  
MYSQL_ROOT_PASSWORD=admin  
MYSQL_USER=user  
MYSQL_PASSWORD=user123  

這里可以env文件中的配置root密碼相對安全,縮小密碼文件的權限即可  

優缺點:

方法一:會把密碼信息暴露出來,若非要使用的話,建議只配置初始化密碼,容器起來后立即修改root密碼    
方法二:會把比較敏感信息隱藏起來,放在文件中,比較安全(強烈推薦)



問題總結2: 反向代理中關於后端服務器訪問日志記錄客戶端IP的問題

附: 客戶端宿主機:          192.168.1.209
    docker宿主機:          192.168.1.210
    自定義容器網橋網關:     192.168.30.1 
    apache容器前端代理容器: 192.168.30.11
    nginx容器前端代理容器:  192.168.30.12
    tomcat后端服務器容器:  192.168.30.13

lamt反向代理中: 1.209(客戶端) --->  1.210:82(前端代理apache容器映射端口),那么tomcat容器訪問日志會隨着apache調用方式不同而不同,
                通過http協議調用tomcat,訪問日志則記錄客戶端IP;通過ajp協議調用tomcat,訪問日志則記錄前端代理IP。  

lnmp反向代理中: 1.209(客戶端) --->  1.210:83(前端代理nginx容器映射端口),那么tomcat容器訪問日志默認會記錄前端代理IP,
                若想要實現tomcat記錄客戶端真實IP,需要修改nginx+tomcat的配置文件,如下:

                nginx配置需要添加:  
                location / {
                    proxy_pass       http://lb_tomcat;
                    proxy_set_header Host       $host;
                    proxy_set_header X-Real-IP  $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                }

                tomcat配置需要添加:  
                修改server.xml 找到pattern行                     
                原內容: pattern="%h %l %u %t &quot;%r&quot; %s %b"  
                修改后  
                新內容: pattern="%{X-FORWARDED-FOR}i %l %u %t %r %s %b %D %q %{User-Agent}i" resolveHosts="false"  

重啟容器即可,此配置也適用於宿主機內的反向代理配置

問題總結3: 創建網絡的網橋命名太長

網橋的命名規則為: <docker-compose.yml 文件所在目錄的目錄名>_<網絡服務的網絡名>  
如果想改成自定義的網絡名,參考如下

自定義的網絡名稱中"_"下划線是去不掉的,要合理利用它,在docker-compose.yml文件所在目錄下,編輯 .env 文件
添加內容:

# cat  .env
COMPOSE_PROJECT_NAME="compose" 

問題總結4: 編排lnmp環境時,root目錄掛載問題

nginx服務名下面的root掛載目錄要和 php服務名下的root掛載目錄一致,否則,php找不到*.php文件,處理不了php文件的請求。

問題總結5: 控制宿主機內不同網段容器通信

默認創建的不同網段的橋接網絡,容器之間是可以互相通信的,為了避免不必要的麻煩,避免出現容器被作為肉雞情況,需要禁掉,添加配置如下:

# cat /etc/docker/daemon.json
  {"icc": false}

問題總結6: docker容器防火牆規則的維護

  • 防火牆DOCKER鏈

DNAT規則 查詢/新增/加載

iptables -t nat -nL DOCKER --line (注意查詢參數順序)
iptables -t nat -A DOCKER -p tcp --dport 90 -j DNAT --to-destination 192.168.30.11:81 (參考)
firewall-cmd --reload
注:
DNAT規則不需要管理,會隨着容器的啟動,而動態變化;
DNAT規則控制着外網訪問容器,在容器啟動后,一旦手動介入刪除掉規則,外網則訪問不到該容器的內容,需要加載下防火牆規則或添加規則均可.

  • 防火牆POSTROUTING鏈

SNAT規則 查詢/刪除/新增/加載

iptables -t nat -nL POSTROUTING --line (注意查詢參數順序)
iptables -t nat -D POSTROUTING 3
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -j MASQUERADE (參考)
firewall-cmd --reload

eg:MASQUERADE  all  --  192.168.20.0/24      0.0.0.0/0

POSTROUTING鏈規則,無需手動添加,一開始創建網絡時,docker會自動創建此規則. 
若后期手動誤操作刪除了此規則,可以進行加載防火牆出現 
若用網橋命令將網橋刪掉后,對應的規則會保留,需要重啟docke服務和加載防火牆規則,方能徹底刪除棄用的規則。 
SNAT規則控制着容器訪問外網



 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM