Running ceph in docker containers

由于毕设在研究docker容器中运行的ceph,现记录下我的运行过程。

环境说明

运行环境是centOS 7上安装的Docker version1.10.2。共计有三个主机,每个主机上配置两个硬盘,其中一个硬盘用于装系统,另一个硬盘作为OSD对象存储。由于MON所用计算资源和存储资源都很少所以直接在主机上运行。这样就共计三个MON和三个OSD。

操作之前务必关闭所有主机防火墙,血的教训!!!

修改主机名

我的三个主机IP分别是192.168.3.65,192.168.3.66,192.168.3.67。将对应的主机名改为ceph1, ceph2, ceph3.

1
vim /etc/hostname

改变容器和主机映射的目录标签

1
2
chcon -Rt svirt_sandbox_file_t /etc/ceph
chcon -Rt svirt_sandbox_file_t /var/lib/ceph

上述过程需要设置SELinux是enable的,且三个主机都需要上述步骤。

运行MON

先在ceph1上运行MON

1
docker run -d --net=host -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -e MON_IP=192.168.3.65 -e CEPH_PUBLIC_NETWORK=192.168.3.0/24 ceph/daemon mon

需要说明CEPH_PUBLIC_NETWORK是你的网卡CIDR值。一般CIDR=IP & mask。
这时候会出现下图的效果:
logo

接着在ceph2和ceph3上运行MON,需要将ceph1上的/etc/ceph和/var/lib/ceph目录下的东西都转移到ceph2和ceph3相应的目录中。

然后在ceph2运行:

1
docker run -d --net=host -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -e MON_IP=192.168.3.66 -e CEPH_PUBLIC_NETWORK=192.168.3.0/24 ceph/daemon mon

在ceph3中运行

1
docker run -d --net=host -v /etc/ceph:/etc/ceph -v /var/lib/ceph/:/var/lib/ceph/ -e MON_IP=192.168.3.67 -e CEPH_PUBLIC_NETWORK=192.168.3.0/24 ceph/daemon mon

这时候会看见三个MON都启动了:
logo`

运行OSD

使用mkfs将新添加的硬盘格式化制作ext4或者btrfs文件系统

1
mkfs -t ext4 /dev/sdb

挂载OSD

1
docker run -d --net=host -v /etc/ceph:/etc/ceph -v /var/lib/ceph:/var/lib/ceph -v /dev:/dev --privileged=true -e OSD_FORCE_ZAP=1 -e OSD_DEVICE=/dev/sdb ceph/daemon osd_ceph_disk

这时就发现OSD进入了集群
同理在ceph2和ceph3中类似操作。

这样我们就完成了在容器中运行ceph,另外我们也可以利用Dockerfile自己构建相关的镜像;ceph/demo镜像提供单机版的容器化的ceph,其中包含一个MON和一个OSD,可以用来学习ceph集群的操作;
运行命令如下:

1
docker run -d --net=host -e MON_IP=192.168.3.66 -e CEPH_NETWORK=192.168.3.0/24 ceph/demo

1
docker exec -t -i ContainID /bin/bash

参考

Demo:running Ceph in Docker containers
在Docker里运行Ceph集群