Linux的铜墙铁壁:防火墙之iptables

未分类

来源

所谓防火墙,实质上是指由软硬件组合成的一个在内外网之间构造的一种保护屏障,它是一种隔离技术。因此从物理上区分,可以分为软件和硬件防火墙,从逻辑上区分,可以分为主机和网络防火墙,而我们现在要讲到的iptables,是属于防火墙中的软件防火墙的范畴,但它只是一个命令行工具或者说是一种客户端代理,并不是真正的防火墙,用户通过这个代理,把安全设定执行到真正的防火墙框架中,这个框架叫做Netfilter

原理

Netfilter是Linux中的一个子项目,它的主要功能是进行数据包过滤、连接跟踪、地址转换等,而iptables则是netfilter提供的对用户数据包进行过滤、修改等操作的一种命令行工具,当数据包通过网卡进入进入内核时,它得先经过iptables的五条链,这些链都有相应的处理数据包的规则,而我们正是通过在这些链上设置规则来控制管理数据包,从而达到防火墙的功能。每当数据包到达一个链时,iptables就会从链中的所有规则逐一开始校验该数据包是否符合规则中限定的条件。若满足,系统就会根据每个规则定义的方法来处理该数据包;若不满足,iptables则继续检查下一条规则,如果该数据包不符合链中的任意规则,iptables则会该链的默认策略去处理该数据包。

四个表

iptables的结构是由tables组成,而tables是由链组成,链又是由具体的规则组成。因此我们在编写iptables的规则时,通过要先指定表,再指定链。tables的作用是区分不同功能的规则,并且存储这些规则。

tables的类型分别有:

未分类

五条链

链,也称为钩子函数,它是一系列规则的一个组合,当数据包经过这些狗子函数时,她必须完全匹配每一个钩子函数中的所有规则,方能进入下一个钩子函数。

钩子函数的类型分别有:

未分类

语法规则

语法:iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

1)常用的命令选项:

  • -t:指定要操纵的表(四个表);

  • -A:向规则链中添加条目;

  • -D:从规则链中删除条目;

  • -i:向规则链中插入条目;

  • -R:替换规则链中的条目;

  • -L:显示规则链中已有的条目;

  • -F:清楚规则链中已有的条目;

  • -Z:清空规则链中的数据包计算器和字节计数器;

  • -N:创建新的用户自定义规则链;

  • -P:定义规则链中的默认目标;

  • -h:显示帮助信息;

  • -p:指定要匹配的数据包协议类型;

  • -s:指定要匹配的数据包源

2)常用的处理动作:

  • ACCEPT:允许数据包通过

  • DROP:直接丢弃数据包,不给任何回应信息

  • REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应的信息

  • LOG:在/var/log/messages文件中记录日志然后将数据包传递给下一条规则

  • REDIRECT: 端口映射

  • SNAT :源地址转换,修改包来源IP为某IP或IP范围,做内网和公网之间的转换

  • DNAT::目标地址转换。 修改数据包目的地IP为某 Ip 或 IP 范围

3)常用的条件匹配:

1、状态匹配:-m state –state 连接状态

  • NEW:与任何连接无关的

  • ESTABLISHED:响应请求或已建立连接的

  • RELATED:与已有连接有相关性的,如FTP数据连接

2、MAC地址匹配:-m mac –mac-source MAC地址

eg:iptables -A INPUT -m mac --mac-source f0:1b:12:12:22:4f -j DROP

3、IP范围匹配:-m iprange –src-range IP范围

eg:iptables -A FORWARD -p tcp -m iprange --src-range 192.168.0.1-192.168.0.10 -j ACCEPT

4、多端口匹配:-m multiport –sports 源端口列表 和 -m multiport –sports 目的端口列表

eg:iptables -A INPUT -p tcp -m multiport --dport 11,29,116,121 -j ACCEPT

4)常用的一些iptables策略:

1、拒绝转发来自192.168.2.33主机的数据

iptables -A FORWARD -s 192.168.2.33 -j REJECT 

2、允许转发来自192.168.2.1/99网段的数据

iptables -A FORWARD -s 192.168.2.1/99 -j ACCEPT

3、允许本机开放从TCP端口20-1024提供的应用服务。

iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT 

iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT

4、只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。

iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT 

iptables -A INPUT -p tcp --dport 22 -j DROP

5、 允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。

iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT 

iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT

6、屏蔽ip 110.1.1.1的访问

iptables -I INPUT -s 110.1.1.1 -j DROP

7、屏蔽从123.0.0.1到123.255.255.254iptables -I INPUT -s 123.0.0.0/8 -j DROP

8、屏蔽从从123.45.0.1到123.45.255.254iptables -I INPUT -s 124.45.0.0/16 -j DROP

9、屏蔽从从123.45.6.1到123.45.6.254iptables -I INPUT -s 123.45.6.0/24 -j DROP

10、允许所有本机向外的访问iptables -A OUTPUT -j ACCEPT

11、允许访问22端口iptables -A INPUT -p tcp –dport 22 -j ACCEPT

5)常用的iptables命令:

1、查看当前 IPTABLES 规则

service iptables status

2、 将所有iptables以序号标记显示

iptables -L -n --line-numbers

3、 比如要删除INPUT里序号为22的规则

iptables -D INPUT 22

docker – 启动具有多个网络接口的容器

容器启动后,您可以使用 docker network connect 进行操作,但这意味着该进程已经在运行,可能会错过新的.

这个问题是关于码头和多个网络接口的搜索.虽然不是所需的版本在我离开这里的一些信息:

使用Docker 1.12,可以向docker容器添加多个网络接口,但首先需要创建容器,然后在启动容器之前附加第二个(和后续的)网络NIC:

$docker create --network=network1 --name container_name containerimage:latest
$docker network connect network2 container_name
$docker start container_name

需要先创建网络:

$docker network create --driver=bridge network1 --subnet=172.19.0.0/24
$docker network create --driver=bridge network2 --subnet=172.19.1.0/24

此外,您可以使用docker运行中的–network = host参数启动Dockerhost网络接口的容器:

$docker run --net=host containerimage:latest

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/34110416/start-container-with-multiple-network-interfaces

Win10下使用Docker运行redis

在windows下安装一些服务器的开发组件并不是很方便,通常都会用到虚拟机。

Docker 是个好东西,有现成的镜像直接可以使用。不用费时费力在windows上折腾服务器需要的环境。

只要几步就能搞定,非常方便

  1. 注册账号,安装Docker
  2. 获取Redis
  3. 运行Redis
    OK

安装Docker

1、注册一个Docker账号
2、下载并安装Docker

官网下载Docker: https://www.docker.com/get-started

安装完成后,在托盘里有个小鲸鱼图标。在命令行cmd下输入 docker version,可以看到相关信息

D:>docker version
Client:
 Version:           18.06.1-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        e68fc7a
 Built:             Tue Aug 21 17:21:34 2018
 OS/Arch:           windows/amd64
 Experimental:      false

Server:
 Engine:
  Version:          18.06.1-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       e68fc7a
  Built:            Tue Aug 21 17:29:02 2018
  OS/Arch:          linux/amd64
  Experimental:     false

获取Redis

运行命令行(cmd)工具,直接下载 redis镜像。

d:> docker pull redis

从服务器上拉取redis镜像包,可以使用docker images查看现有的镜像。

D:>docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
redis                      latest              e1a73233e3be        5 weeks ago         83.4MB

运行Redis 并进行端口映射和持久化

一条语句就搞定

docker run -d --name myredis -p6379:6379 -v /d/dockerdata/redis/data:/data redis-server --appendonly yes

参数说明:

  • -d —— 后台运行
  • –name —— 实例运行后的名字 myredis
  • -p6379:6379 —— 端口映射,冒号前面是windows下的端口,后面是虚拟机的端口
  • -v /d/dockerdata/redis/data:/data —— 保存数据的位置。

  • d:dockerdataredisdata 前面是windows下的实际保存数据目录

  • /data 虚拟机内的目录

  • redis-server –appendonly yes —— 在容器执行redis-server启动命令,并打开redis持久化配置。

第一次映射时,会提示需要输入windows的密码,直接输入即可。

查看运行状态和执行命令

执行完成后,可以使用docker ps查看运行状态

D:>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
443ea1afa978        redis               "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:6379->6379/tcp   myredis

可以看到myredis在运行。

在docker下运行redis客户端,就能使用命令来测试

docker exec -it myredis redis-cli

D:>docker exec -it myredis redis-cli
127.0.0.1:6379> info
# Server
redis_version:4.0.11
redis_git_sha1:00000000
redis_git_dirty:0
... ...

重新恢复启动容器

电脑关闭重启或重启docker后,如果没有设置自动启动容器。通过docker ps -a可以看到所有关闭的容器,启动容器。

docker ps -a #看到关闭的容器
docker start your_container_name
docker attach your_container_name

如启动刚才的myredis

D:>docker start myredis
myredis

D:>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
443ea1afa978        redis               "docker-entrypoint.s…"   2 hours ago         Up 5 seconds        0.0.0.0:6379->6379/tcp   myredis

OK 搞定

Docker是个非常棒的东东,解决了不同环境下大量的部署工作。同样方法非常方便的安装其他镜像,如debian、mysql等等。如想安装mysql,使用docker的search命令就能找到一堆。STARS越高使用的人越多,相对比较安全。

D:>docker search mysql
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                                                  MySQL is a widely used, open-source relation…   7119                [OK]
mariadb                                                MariaDB is a community-developed fork of MyS…   2284                [OK]
mysql/mysql-server                                     Optimized MySQL Server Docker images. Create…   521                                     [OK]
zabbix/zabbix-server-mysql                             Zabbix Server with MySQL database support       133                                     [OK]
hypriot/rpi-mysql                                      RPi-compatible Docker Image with Mysql          98

利用Docker搭建FRP内网穿透

去年的时候,我曾经写过一篇关于内网穿透的文章。

内网穿透(Frp)-拯救没有公网IP的你:https://post.smzdm.com/p/566063/

一年过去了,不断的有人咨询我关于使用的问题,而且我发现用这个的人也是越来越多,能问运营商要到公网IP的几率越来越小。我用的移动宽带,客服都直接回复,我们不提供公网IP。另外作者对frp也更新了很多,所以今天想再更新一下关于FRP,来张大妈骗点金币吧。

特别是在路由器、NAS没有公网IP是一件很不方便的事情,尤其是在国内的网络环境。为了解决这个问题,则需要内网穿透,而内网穿透的方法有很多种,例如使用花生壳、NGROK等,但是我感觉frp是相对更为稳定。

frp是什么

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。

说白了,就是利用一台有公网IP的机子,实现访问你家没有公网IP的设备。

在我使用过的穿透软件中,感觉frp在稳定性、功能和维护方面做得比较好,我也稳定使用了快2年了。

准备工具

从上面的内网穿透的原理可以看出,我么至少需要一台有公网IP的主机,目前来看VPS是最好的选择,以及一个域名。

关于VPS用法、域名购买以及有关工具在我过去的文章中已经详细的说明了。如果对VPS有不明白的地方可以看一下教程 由于我今天只想说说FRP,所以就不赘述了。

域名一定要做泛解析,有时容易忽视这里。不论是二级域名还是三级域名,都可以做泛解析。比如我f.anys.ga做域名泛解析,填入.f就可以吧.f.anys.ga进行解析。

未分类

FRP服务端搭建

利用docker

我选择了Docker方式,好处在于十分方便,容易部署,沙盒机制可以不破坏系统环境。最近docker用的多了感觉十分非常顺手,如果你不喜欢docker可以自行研究。

搭建服务端

我的OS是Ubuntu14.04 x64。首先安装Docker,这里不推荐apt-get 或者yum的形式安装,建议直接从官网下载docker。如果你不关心Docker是什么,那么你也不用深究,如果你有兴趣研究一下,可以自行google。

#安装Docker                                                                                                                                                                  
wget -qO- https://get.docker.com/ | sh

#在宿主机建立目录
mkdir /var/frp && mkdir /var/frp/conf &&cd /var/frp/conf

#获取服务器端配置文件
wget https://frp.anys.ga/frps.ini

未分类

#建立镜像
sudo docker run --name frps -d -v /var/frp/conf:/var/frp/conf -p 5000-5100:5000-5100 -p 7000:7000 -p 7500:7500 -p 7001:7001 -p 8089:80 -p 8443:443 ruiny/frps

未分类

这样服务器就搭建好了。按照以上配置完成的话,服务端口7000,状态查询(web)端口7500,http服务端口8089,https端口为8443,同时开放5000-5100端口用于其他TCP/UDP连接。

之所以用8089/8443端口是因为本机上的80/443端口用给Nginx了,如果你们确保端口没冲突的话可以用80/443端口。(有些强迫症患者只用80端口)

之后登陆你VPS地址IP地址:7500可以查询具体状态,用户名/密码为admin/Qwert123。

未分类

配置文档修改

好了,如果实在懒得动配置,上面的可以正常使用,但一般总要改一下密码什么的吧。我在制作镜像的时候,把配置文件放在了/var/frp/conf下,在上面过去服务器配置的时候,我直接用了作者的官方配置,很多配置是不合适的,如果需要更改:

nano /var/frp/conf/frps.ini

至少你应该修改以下几项内容:(ctrl+x保存,或者习惯用vi编辑器的)

#设置用户名和密码,注意是状态面板的用户名和密码。
dashboard_user = admin
dashboard_pwd = admin
#令牌,很重要,用于验证与客户端的通信。
token = 12345678
#自定义二级域名,如果设置了,之后在客户端的http、https类型的代理中可以不配置custom_domains,而是配置一个 subdomain 参数。可以不配置,默认没有配置。
subdomain_host = frps.com

我只开放了5000-5100用于TCP/UDP端口,如果需要更多端口请修改以下内容。但同时docker run中也要修改-p 5000-5100:5000-5100的端口范围。我测试,如果一次性开放端口过多,会导致docker卡死,所以不建议开太多哦。

# only allow frpc to bind ports you list, if you set nothing, there won't be any limit
allow_ports = 5000-5100

FRP客户端配置

不论是梅林、老毛子或者是群晖,在frp客户端中的设置都大同小异,但是我一般喜欢用配置文档的方式,简单说说配置文档。完整的客户端配置模板可以在查看

配置文档

配置文档分为两部分,第一部分是common开头的通用配置,第二部分就是每个穿透服务项目

未分类

下面将几个例子:

1.主路由web界面

[router]  #主路由web界面
type = http  #穿透类别为http
local_ip = 192.168.1.1  #内网地址
local_port = 80  #穿透服务内网端口
remote_port = 8089
custom_domains = router.f.anys.ga   #外网域名
use_encryption = true #开启加密
use_compression = true #开启压缩

在梅林的界面中对应内容如下:

未分类

2.GEN8中window的远程桌面

[Gen8-Winser]
type = tcp  #类别为tcp
local_ip = 192.168.1.5 内网Gen8的ip地址
local_port = 3389  #注意穿透端口是远程桌面的端口3389
remote_port = 5000 #外网端口随便填一个吧
use_encryption = true
use_compression = true

由于是tcp所以这里不需要外网域名了,这个就类似于端口转发。

未分类

3.DSM黑群晖

[dsm]
type = https #黑群晖DSM的web用https,所以类别是https
local_ip = 192.168.1.7 #黑群晖的地址
local_port = 5001 #群晖的https端口是5001
remote_port = 8443 #外网https端口对应是8443
custom_domains = dsm.f.anys.ga
use_encryption = true
use_compression = true

我黑群晖的内网地址是192.168.1.7,https端口是8443,对应访问域名就是dsm.f.anys.ga:8443。对于https的穿透,需要导入相应证书,否则不会有小绿锁哒~

未分类

群晖和梅林都有导入的地方,比如群晖在这里:

未分类

frp的作者还搞了一些高级用法,特殊情况可以尝试用一下:

4.转发 DNS 查询请求

可以通过frp转发自己的DSN请求,在客户端配置文件中设置。将DNS请求转发到google的8.8.8.8

[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000

5.stcp 类型的代理

stcp利用了一个sk验证,使得只有sk一直的两个客户端能够点对点互访,防止公网上的随意访问。

家里的路由器:

[secret_ssh]
type = stcp #类型是stcp
sk = router1 # 只有 sk 一致的用户才能访问到此服务
local_ip = 192.168.1.1
local_port = 22

另外一台PC:

[secret_ssh_visitor]
type = stcp
role = visitor # 访问者
server_name = secret_ssh # 对应穿透服务的名称与上面一直
sk = router1 # 只有 sk 一致的用户才能访问到此服务
bind_addr = 127.0.0.1 
bind_port = 8022 # 绑定本地的端口

在本地访问ssh,地址127.0.0.1,端口8022就会穿透到家里的路由器22端口。

未分类

测试

一个不知道什么时候就会消失的测试服务器,注意人多容易重名,不要当作正式用途。

Web地址:网址   admin/Qwert123
FRP服务地址:f.anys.ga:7000 
token:f.anys.ga 
TCP/UDP端口:8089,443, 5000-5100
三级域名 *.f.anys.ga

其它问题

1.修改frps.ini后需要重新启动容器 docker restart frps

2.服务器端只适用于64位的系统

3.0.17以后的版本和之前的不兼容,注意客户端和服务器版本一致

4.由于frp是封装在docker里面运行的,如果要讨论效率的话我不好说。

说真的FRP真的很好用,之前用Vultr做服务器的时候,带宽足够可以在线看家里NAS的视频,而且非常稳定,不论是客户端还是服务端都很稳,基本不用操心。

『高级篇』docker之微服务业务分析(九)

从本节开始微服务的开发,说到开发有几个问题需要解决,首先要知道我们需要开发什么?什么样的业务场景,分析业务场景,有几个微服务,每个微服务需要完成什么样的功能,微服务之间的关系,之间的依赖关系,他们之间是如何通迅的,这些都了解的之后,我们就可以进入开发阶段了。

业务场景

  • 用户可以注册和登录

现在的登录系统一般都是单点登录,支持跨域,在去使用其他系统的时候就不需要登录了,最好是不要使用session,最好是无状态的,避免使用session。

  • 登录用户可以对课程进行CURD操作

上边这个不是大而全的系统,只是微服务的功能,老铁咱们的目的很明确是搞微服务,不是学web开发的,我们通过上边的几个功能上从0开始了解微服务,一行不拉的完成开发微服务,让大家去开发有个真切的体会的。

基本的微服务的流程

  1. 用户访问api网关
  2. api网关访问2个用户的edgeservice(java) 和 课程的edgeservice(java)
  3. 这2个接口提供的http协议(rest)
  4. 用户的edgeservice 访问的用户服务
  5. 课程的edgeservice 访问的课程服务
  6. 用户服务对外接口是Thrift 跨语言的协议
  7. 课程服务对外接口使用Dubbo,只限java
  8. 用户服务(java) 后端有个数据库
  9. 课程服务(java) 后端也有一个数据库
  10. 信息服务(python)对外接口是Thrift (用户注册的时候,可能发送短信,或者邮件确认可能需要信息服务)
  11. redis 来进行用户的信息存储,提供给用户服务使用
  12. 课程的edgeservice 和 课程服务 通过 zookeeper 来完成服务的发现
  13. 用户查询课程 需要调用课程服务,这也就是微服务之间的调用

未分类

Docker 安装mediawiki

一、install and config

1.1 db

pre

#在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:
$docker run --restart=always
#如果已经启动了则可以使用如下命令:
$docker update --restart=always <CONTAINER ID>

mariadb

docker pull mariadb:latest
docker run -p 3307:3306 --restart 策略名称 -v 宿主机数据目录:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql密码 -d 镜像ID
docker run --name mymariadb  -p 3306:3306 --restart always -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=2240881 -d 54514d54a4a5
docker run --name mymariadb  -p 3307:3306 --restart always -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=2240881 -d  mariadb #同上

echo 'mymariadb  192.168.10.105' >>/etc/hosts
 mysql -uroot -p2240881 -h 192.168.10.105 -P3307  #连接 

mysql

docker pull mysql:5.7
#config and run 
docker run -p 3307:3306 --restart 策略名称 -v 宿主机数据目录:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mysql密码 -d 镜像ID
docker run --name mymariadb  -p 3306:3306 --restart always -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=2240881 -d 54514d54a4a5

通过Docker安装和使用MariaDB:https://mariadb.com/kb/en/library/installing-and-using-mariadb-via-docker/

Docker使用MariaDB:https://www.jianshu.com/p/32542630c2bd

1.2 wiki

docker run --name mymediawiki  -p 88:80  --link mymariadb:mysql -d  mediawiki #is good 
docker  cp LocalSettings.php  3c0002c21a6a:/var/www/html/LocalSettings.php
--net=host 

mediawiki   这个不会自启动 


docker run --name mymediawiki --link mymariadb:mysql -d   wikimedia/mediawiki  #起来 这个感觉不对 
#is old
docker pull mediawiki

#还是指定目录比较好  但是现在 官方的好像不支持 -v了 
docker run  --restart=always --name mediawiki -p 8080:80 -v  /data/mediawiki -d 8d721d068c81 #2018  但是没办法直接数据交互 下面的用了有问题呢
#mysql 填写 192.168.0.10:3307

docker run --name mediawiki -p 8080:80  -v /data/mediawiki:/var/www/html/ -d id
#docker run --name mediawiki -p 8080:80  -v /data/mediawiki:/var/www/html/ -d mediawiki
docker cp /data/LocalSettings.php  mediawiki:/var/www/html/LocalSettings.php
默认上传目录 /var/www/html/images/


#解说 
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest

#交互  
sudo docker exec -it facethink-mediawiki /bin/bash

#开机自启动
#在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:
$docker run --restart=always
#如果已经启动了则可以使用如下命令:
$docker update --restart=always <CONTAINER ID> #上次就是这样解决了重启后nginx问题

1.3 mysql

Docker mysql:https://wiki.linuxchina.net/index.php?title=Docker_mysql

1.4 nginx

#这个在内网其实可以不用呢
server {
    listen       80;
    server_name  wiki.linuxsa.org;

    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass   http://192.168.50.206:8080;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

docker  cp default.conf  nginx:/etc/nginx/conf.d/default.conf

Docker nginx:https://wiki.linuxchina.net/index.php?title=Docker_nginx

1.5 Memcached

Docker 安装 Memcached:https://wiki.linuxchina.net/index.php?title=Docker_%E5%AE%89%E8%A3%85_Memcached

二、see also

Docker for mediawiki:https://www.mediawiki.org/wiki/Docker

https://hub.docker.com/_/mediawiki/

使用 Docker 部署 MediaWiki:https://www.jianshu.com/p/a644988684d8

docker安装mediawiki教程:https://yq.aliyun.com/ziliao/65666

使用 Docker 部署 MediaWiki:https://cloud.tencent.com/developer/article/1193750

Docker 安装 Memcached:https://wiki.linuxchina.net/index.php?title=Docker_%E5%AE%89%E8%A3%85_Memcached

Docker 实践 3:fig 搭建 mediawiki:http://wiki.jikexueyuan.com/project/docker-practice/fig-creat-mediawiki.html

Docker Hello World容器运行报错的解决办法

费了好大力气从Docker官网下载了Docker Community Editor的安装镜像,Docker.dmg, 总共将近500MB,双击进行安装:

未分类

命令行里使用docker version查看版本:

未分类

然后使用命令行docker run hello-world,遇到错误信息:Error response from daemon: unauthorized: incorrect username or password:

未分类

解决方案

使用命令docker login首先进行登录:

未分类

然后hello world的Docker 容器就能正常工作了:

未分类

使用Docker安装phabricator的配置和使用方法

我这里使用的是ubuntu16.04的系统。

使用docker进行安装

我们使用https://hub.docker.com/r/redpointgames/phabricator/ 中提供的镜像。

在则这个镜像中已经为我们提供了多种插件,不过需要我们自己提供一个mysql数据库的地址。

所以我们可以先使用docker安装一个mysql数据库。可以参考:https://www.jb51.net/article/148880.htm

按照上面的教程,我们安装了mysql,账号为root,密码为123456

通过

docker inspect <container id> |grep IPAddress

我们可以知道mysql这个容器的ip地址。加入我们查到的这个容器的私有ip为172.17.0.2。

下面我们就可以来使用docker安装phabricator了。

docker pull redpointgames/phabricator    # 拉取最新版的phabricator

启动

docker run --name phabricator -p 443:443 -p 332:22 -p 8891:80 -v /root/phabricator/backup:/repos -e PHABRICATOR_HOST=xxxxxx:8891 -e MYSQL_HOST=172.17.0.2 -e MYSQL_USER=root -e MYSQL_PASS=123456 -e PHABRICATOR_REPOSITORY_PATH=/repos -e PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin -it redpointgames/phabricator /bin/bash /app/init.sh

其中xxxx为你服务器的外网ip,这个就可以通过http://xxxxx:8891来访问你服务器上docker部署的phabricator了。不过记得开启安全组。

安装完成后,我们就可以通过外网ip
加端口号8891来访问了。

未分类

这时我们添加的用户,会默认为系统的管理员,就可以登录到后台进行其他的设置了。但是先不要推出这个页面。因为要进行一些设置才行。

如果你第一次访问不是这个界面, 我们也可以在控制台通过命令 的方式添加用户.

进入容器
cd /srv/phabricator/phabricator
./bin/accountadmin

如果你的管理员用户退出来了,提示下面的信息了

This Phabricator install is not configured with any enabled authentication providers which can be used to log in. If you have accidentally locked yourself out by disabling all providers, you can use phabricator/bin/auth recover <username> to recover access to an administrative account.

你应该运行命令

进入容器
cd /srv/phabricator/phabricator
./bin/auth recover luanpeng(在网页中创建的管理员账号)

会提示通过一个网页进入。

Use this link to recover access to the "luanpeng" account from the web interface:
  http://xxxxxx:8891/login/once/recover/1/xxxxxxxxxx/
After logging in, you can use the "Auth" application to add or restore authentication providers and allow normal logins to succeed.

根据提示进行操作

在主页左侧栏选择Auth,进入下图

允许用户登录注册

到此为止,phabricator就安装完毕了

如果你不想使用docker安装,可以自己独立部署。不过步骤比较繁琐,所以建议还是通过docker部署。

使用安装脚本安装

创建安装脚本。打开网址将网页中的脚本内容复制到新建的sh文件中,https://secure.phabricator.com/source/phabricator/browse/master/scripts/install/install_ubuntu.sh

将网址中的脚本文件下载下来,或者直接在本地创建一个sh文件,将网页上的sh代码复制下来。形成本地的安装脚本install_ubuntu.sh

创建安装目录/home/luanpeng/work/phabricator

将安装脚本拷贝到安装目录,执行脚本

sh install_ubuntu.sh

执行脚安装本按照屏幕提示进行操作。脚本会自动帮你安装git, apache, mysql, php…等一系列工具。

注意:在安装mysql时,会有几次让你输入root密码的提示。这里推荐将密码设置为空,以方便后面的使用。

下载Phabricator以及其依赖包

$ cd somewhere/ # pick some install directory 切换到安装目录
somewhere/ $ git clone git://github.com/facebook/libphutil.git
somewhere/ $ git clone git://github.com/facebook/arcanist.git
somewhere/ $ git clone git://github.com/facebook/phabricator.git

WEB服务器:配置Apache

加入sverver name
(1)修改httpd.conf,这个文件在刚装完Apache时应该是空的。(2.4.x版本在/etc/apache2路径下创建httpd.conf文件即可)
加入如下内容: ServerName localhost
(2)保存退出。

验证Apache安装
(1)重启Apache服务
/etc/init.d/apache2 restart
(2)验证页面
打开浏览器,在地址栏中输入 localhost。看是否会出现“It works”的字样,如果出现代表Apache运行正常。否则,就需要去查看一下httpd.conf是否配置正确了。

更新Phabricator

由于Phabricator一直处于发展状态,所以你应该经常更新它。如何更新:

  • 停止webserver的运行
  • 运行git拉取libphutil/,arcanist/,phabricator
  • 运行phabricator/bin/storage upgrade
  • 重新启动webserver

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

Ubuntu Server下Docker实战 02: Docker进阶配置

在上一篇文章里《Ubuntu Server下Docker实战 01: 安装Docker,见 https://www.linuxidc.com/Linux/2018-10/154873.htm》,我们已经把docker安装起来了,并运行了一个hello-world

这一篇,我们继续讲进阶配置。

1. 配置docker在系统启动时候自动启动

sudo /lib/systemd/systemd-sysv-install enable docker
sudo systemctl enable docker
sudo systemctl restart docker.service

这样我们重启服务器后,docker服务也自动启动了

2. 转移docker数据文件路径

修改配置文件

vi /etc/default/docker

我们假设要把数据移动到 /data/docker下,那么在配置文件中添加如下内容,保存退出

OPTIONS=--graph="/data/docker" -H fd://

停止docker

service docker stop

确认不存在 /data/docker 目录

rm -rf /data/docker

转移文件,将docker数据从/var/lib/docker 移到 /data/docker,并创建连接

sudo mv /var/lib/docker /data/docker
sudo ln -s /data/docker /var/lib

启动docker

service docker start

3. 创建docker子网,docker默认使用 172.17.0.0/24 子网,但我们可能有自己的需要,那么可以通过下面方法创建子网

显示已有子网

docker network ls

创建一个172.18.0.0/24的子网

docker network create --subnet=172.18.0.0/24 dockernetwork

我们看下现在的子网列表

docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
b295fdf8279f        bridge              bridge              local
b338774b3d02        dockernetwork      bridge              local
88b7535d052a        host                host                local
79814a08c6d1        none                null                local

如何为双活Redis Enterprise搭建基于Docker的开发环境?

Redis Enterprise这种双活数据库是地域分布式应用程序的理想选择。其架构基于无冲突复制数据类型(CRDT)方面是突破性的学术研究。这种方法与其他双活数据库相比具有许多优点,包括如下:

  1. 为读写操作提供本地延迟

  2. 为简单和复杂的数据类型提供内置的冲突解决方案

  3. 跨区域故障切换

  4. 简化实施了诸多用例,比如积分榜、分布式缓存、共享会话和多用户计费等。

最近我们发布了一篇关于https://redislabs.com/docs/developing-apps-using-active-active-redis-enterprise/ 。为了模拟生产环境,开发人员或测试人员需要一种小型化的开发环境,很容易用Docker来搭建。

Redis Enterprise在Docker hub上以redislabs/redis的形式存在,我们已经在Redis Enterprise说明文档页面和docker hub本身上介绍了如何在Docker上搭建Redis Enterprise的详细逐步说明。

我们在本文中介绍创建基于Docker的Redis Enterprise集群的步骤,这一切通过命令行来完成。下面大体介绍了整个过程(更多详细信息如下):

  1. 安装数据库

    1)创建一个3个节点的Redis Enterprise集群,每个节点在单独的子网上

    2)创建基于CRDT的Redis Enterprise数据库

    3)连接到三个不同的实例

  2. 验证安装的环境

  3. 拆分网络

  4. 恢复连接

  5. 停止Redis Enterprise

在开始之前,确保你已有一个bash shell,并为docker进程分配了足够的内存。你可以进入到Docker -> Preferences -> Advanced来检查内存。

未分类

1. 安装数据库

下列脚本在3节点集群上创建基于CRDT的Redis Enterprise数据库。将其保存在文件中并为其命名,比如“create_3_node_cluster.sh”。然后将模式改成可执行(chmod + x create_3_node_cluster.sh),并运行脚本([path] /create_3_node_cluster.sh)。

#!/bin/bash  
# Delete the bridge networks if they already exist  
docker network rm network1 2>/dev/null  
docker network rm network2 2>/dev/null  
docker network rm network3 2>/dev/null  
# Create new bridge networks  
echo “Creating new subnets…”  
docker network create network1 –subnet=172.18.0.0/16 –gateway=172.18.0.1  
docker network create network2 –subnet=172.19.0.0/16 –gateway=172.19.0.1  
docker network create network3 –subnet=172.20.0.0/16 –gateway=172.20.0.1  
# Start 3 docker containers. Each container is a node in a separate network  
# These commands pull redislabs/redis from the docker hub. Because of the  
# port mapping rules, Redis Enterprise instances are available on ports  
# 12000, 12002, 12004  
echo “”  
echo “Starting Redis Enterprise as Docker containers…”  
docker run -d –cap-add sys_resource -h rp1 –name rp1 -p 8443:8443 -p 9443:9443 -p 12000:12000 –network=network1 –ip=172.18.0.2 redislabs/redis  
docker run -d –cap-add sys_resource -h rp2 –name rp2 -p 8445:8443 -p 9445:9443 -p 12002:12000 –network=network2 –ip=172.19.0.2 redislabs/redis  
docker run -d –cap-add sys_resource -h rp3 –name rp3 -p 8447:8443 -p 9447:9443 -p 12004:12000 –network=network3 –ip=172.20.0.2 redislabs/redis  
# Connect the networks  
docker network connect network2 rp1  
docker network connect network3 rp1  
docker network connect network1 rp2  
docker network connect network3 rp2  
docker network connect network1 rp3  
docker network connect network2 rp3  
# Sleep while the nodes start. Increase the sleep time if your nodes take  
# longer than 60 seconds to start  
echo “”  
echo “Waiting for the servers to start…”  
sleep 60  
# Create 3 Redis Enterprise clusters – one for each network. You can login to  
# a cluster as https://localhost:8443/ (or 8445, 8447). The user name is  
# [email protected], password is password. Change the user  
echo “”  
echo “Creating clusters”  
docker exec -it rp1 /opt/redislabs/bin/rladmin cluster create name cluster1.local username [email protected] password test  
docker exec -it rp2 /opt/redislabs/bin/rladmin cluster create name cluster2.local username [email protected] password test  
docker exec -it rp3 /opt/redislabs/bin/rladmin cluster create name cluster3.local username [email protected] password test  
# Create the CRDB  
echo “”  
echo “Creating a CRDB”  
docker exec -it rp1 /opt/redislabs/bin/crdb-cli crdb create –name mycrdb –memory-size 512mb –port 12000 –replication false –shards-count 1 –instance fqdn=cluster1.local,[email protected],password=test –instance fqdn=cluster2.local,[email protected],password=test –instance fqdn=cluster3.local,[email protected],password=test 

2. 验证安装的环境

在端口12000、12002和12004上运行redis-cli,验证你可以连接到所有三个Redis Enterprise端口。如果你将应用程序连接到Redis Enterprise,需要应用程序的三个实例连接到三个不同的端口。比如:

$ redis-cli -p 12000  
127.0.0.1:12000> incr counter  
(integer) 1  
127.0.0.1:12000> get counter  
“1” 

3. 拆分网络

拆分网络可帮助你在Redis Enterprise副本之间引入“网络分区”。你在设计应用程序时,必须设计成副本断开连接后可以顺畅运行。该脚本帮助你隔离三个副本。将该脚本保存在文件“split_networks.sh”中,并在运行之前更改模式,让它成为可执行(chmod +x split_networks.sh)。

#!/bin/bash  
docker network disconnect network2 rp1  
docker network disconnect network3 rp1  
docker network disconnect network1 rp2  
docker network disconnect network3 rp2  
docker network disconnect network1 rp3  
docker network disconnect network2 rp3 

4. 恢复连接

你运行脚本“split_netorks.sh”后,本地副本会停止与其他副本共享数据库更新。恢复连接将让它们能够交换所有更新,并获得同样的最终状态,这归功于Redis Enterprise提供了很强的最终一致性。下列脚本恢复副本之间的网络连接。将这保存在文件“restore_networks.sh”中,并更改模式让它成为可执行(chmod +x restore_networks.sh)。

#!/bin/bash  
docker network connect network2 rp1  
docker network connect network3 rp1  
docker network connect network1 rp2  
docker network connect network3 rp2  
docker network connect network1 rp3  
docker network connect network2 rp3 

5. 停止Redis Enterprise

完成开发和测试后,只要运行下列脚本,就可以终止Redis Enterprise的所有三个节点。将该文件保存在文件中,并将文件命名为“stop.sh”,更改模式,让它成为可执行(chmod +x stop.sh)。

#!/bin/bash  
docker stop rp1 rp2 rp3  
docker rm rp1 rp2 rp3  
docker network rm network1  
docker network rm network2  
docker network rm network3 

就是这样。完成了上述步骤后,现在你有了自己的基于Docker的Redis Enterprise双活数据库环境。若有任何问题,欢迎留言交流。