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 "%r" %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 --reloadeg:MASQUERADE all -- 192.168.20.0/24 0.0.0.0/0
POSTROUTING鏈規則,無需手動添加,一開始創建網絡時,docker會自動創建此規則.
若后期手動誤操作刪除了此規則,可以進行加載防火牆出現
若用網橋命令將網橋刪掉后,對應的規則會保留,需要重啟docke服務和加載防火牆規則,方能徹底刪除棄用的規則。
SNAT規則控制着容器訪問外網