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 "%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规则控制着容器访问外网
Docker部署web环境之总结篇的更多相关文章
- Docker部署web环境之Lanmt
2. 案例二 整套项目多容器分离通过docker-compose部署lanmt环境 详细的安装准备环境,省略,配置以及部署参考案例一即可 即可实现批量创建web,也可以实现多web共用一个php或my ...
- Docker部署web环境之Lanmp
1. 案例一 整套项目多容器分离通过docker-compose部署lanmp环境 中方文档参考网址: docker/kubernets网址 http://www.dockerinfo.net/doc ...
- Docker部署SDN环境
2014-12-03 by muzi Docker image = Java class Docker container = Java object 前言 5月份的时候,当我还是一个大学生的时候,有 ...
- Docker部署web项目-jar包
一.Docker部署web项目-jar包 ①搜索mysql镜像 docker search mysql ②拉取镜像至本地仓库(本文选取的mysql镜像5.7版本) docker pull mysql/ ...
- docker部署-windows环境
docker部署-windows环境 1. docker windows 1.1. 安装 win7或者win8需要利用docker toolbox来安装,其是一个docker工具集,w ...
- Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)
上一篇讲了如何在linux搭建web环境,这边将如何部署项目. 1,打包项目包 2,上传项目包 将.war项目包通过xftp上传到tomcat目录wabapps目录下 3,启动项目 通过xshell命 ...
- Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)
上一篇介绍如何在linux系统下搭建ssh环境 这篇开始将如何搭建web服务器 1,下载文件 在官网下载好 tomcat.jdk.mysql的linux压缩包 后缀名为.tar.gz 并通过xftp上 ...
- 手把手docker部署java应用(初级篇)
本篇原创发布于 Flex 的个人博客:点击跳转 前言 在没有 docker 前,项目转测试是比较麻烦的一件事.首先会化较长的时间搭建测试环境,然后在测试过程中又经常出现测试说是 bug,开发说无法 ...
- Linux Ubuntu从零开始部署web环境及项目 -----快捷键设置(四)
上篇将了如何在linux部署web项目,这篇介绍如何设置常用快捷键 一.路径快捷键设置 临时快捷键设置: 执行XShel,输入: alias 'aa=cd /etc/sysconfig' ...
随机推荐
- 【记录】linux常用命令二
编辑文本时候删除文本数据 dd:删除游标所在的一整行(常用) ndd:n为数字.删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行 d1G:删除光标所在到第一行的所有数据 dG:删除光标 ...
- [js测试]JavaScript Web Quiz By davidshariff
Question1 var foo = function foo() { console.log(foo === foo); }; foo(); 输出是"true",因为foo就指 ...
- 力扣—Remove Duplicates from Sorted List(删除排序链表中的重复元素)python实现
题目描述: 中文: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2输出: 1->2 示例 2: 输入: 1->1->2 ...
- java 延时
Java中主要有两种方法来实现延迟,即:Thread和Timer 1.普通延时用Thread.sleep(int)方法,这很简单.它将当前线程挂起指定的毫秒数.如try{Thread.currentT ...
- php 安装zip模块
为php安装zip扩展 wget http://pecl.php.net/get/zip-1.13.5.tgz tar -zvxf zip-1.13.5.tgz cd zip-1.13.5 /home ...
- Springmvc中的一些问题解决
Spring mvc中的异常 做统一处理,全局异常处理器 异常处理类代码: 必须实现接口 然后返回值是ModelAndView 那就可以做个展示页面了 package com.toov5.mvc. ...
- JMS Activemq实战例子demo
上一篇已经讲了JMS的基本概念,这一篇来上手练一练,如果对JMS基本概念还不熟悉,欢迎参靠JMS基本概. 这篇文章所使用的代码已经不是我刚入手时的代码,已经经过我重构过的代码,便于理解,并且加了很多中 ...
- react — script引入 和 脚手架使用的区别
1.React 入门实例教程 :http://www.ruanyifeng.com/blog/2015/03/react.html ( 阮一峰的博客) 或 https://segmentfaul ...
- 用define 宏定义注释符号
上面对define 的使用都很简单,再看看下面的例子:#define BSC //#define BMC /*#define EMC */D),BSC my single-line commentE) ...
- QC10迁移到ALM11
转自原作者 http://blog.csdn.net/yhqun/article/details/6981250 服务器A:QC9或QC10服务器B:QC9或QC10 DB Server服务器C:AL ...