Google、docker.io、amazon先后在国内被墙,使得docker swarm集群搭建按常规操作步骤已经不能正常安装成功。后来我发现“时速云”的镜像广场有许多可以直接使用的镜像,完全可以替代docker.io的镜像进行安装,实在是太好了。
集群规划
k8s_mater:192.168.192.132
k8s_slaver1:192.168.192.141
k8s_slaver2:192.168.192.142
VMware workstation11.1.1,三台centos 7.2.1511(core),
Docker版本:1.9.1(开始前预先在3台虚拟机上安装好) 用户:root(如果是非root 用户,后面所有docker命令前要加sudo)。
时速云swarm镜像: https://hub.tenxcloud.com/repo ... swarm
安装步骤
一、 docker daemon准备
对于docker 1.9.1编码docker配置文件,先把准备加入集群的所有的节点的docker deamon的监听端口修改为0.0.0.0:2375,如下:
# vim /etc/sysconfig/docker
OPTIONS='-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'
编辑完成,保存退出,重启docker 引擎:
#systemctl restart docker.service
#systemctl enable docker.service
#reboot
二、确保docker daemon处于运行状态
检查docker daemon是否运行,以及2375端口是否正常,如下:
# ps -ef|grep docker
#telnet 0.0.0.0 2375
三、创建swarm镜像
#docker pull index.tenxcloud.com/docker_library/swarm
四、时速云的其他重要镜像
创建mongodb镜像:
#docker pull index.tenxcloud.com/tenxcloud/mongodb
创建redis镜像:
#docker pull index.tenxcloud.com/docker_library/redis
创建mysql镜像:
#docker pull index.tenxcloud.com/tenxcloud/mysql
创建tomcat镜像:
#docker pull index.tenxcloud.com/tenxcloud/tomcat
创建nginx镜像:
#docker pull index.tenxcloud.com/tutum/nginx
启动一个redis容器:
#docker run -d -P -m 1g index.tenxcloud.com/docker_library/redis
#docker ps|grep redis
启动一个mysql容器:
#docker run –name mysql -d=false -P index.tenxcloud.com/tenxcloud/mysql
启动一个mongodb容器并进行shell:
#docker run -i -t --entrypoint /bin/bash index.tenxcloud.com/tenxcloud/mongodb
启动mongodb 服务:
#/usr/bin/mongod --dbpath /data/db --port 27017 --logpath /data/db/log --logappend &
使用console登录mongodb命令行:
/usr/bin/mongo db
五、创建swarm集群ID
在任何一个节点上面执行swarm create命令来创建一个集群标志。这条命令执行完毕之后,swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识swarm管理的Docker集群。
#docker run index.tenxcloud.com/docker_library/swarm create
正常会显示一个UUID的token,要记录下来,后面要用到。
六、在每个cluster成员机器上运行以下命令,每个docker daemon加入集群:
# docker run -d index.tenxcloud.com/docker_library/swarm join --addr=[custer member ID]:2375 token://[cluster Token ID]
如下所示:
#docker run -d index.tenxcloud.com/docker_library/swarm join --addr=192.168.192.132:2375 token://348358591f2ab8b5ab8d79e0daca4f09
#docker run -d index.tenxcloud.com/docker_library/swarm join --addr=192.168.192.141:2375 token://348358591f2ab8b5ab8d79e0daca4f09
#docker run -d index.tenxcloud.com/docker_library/swarm join --addr=192.168.192.142:2375 token://348358591f2ab8b5ab8d79e0daca4f09
七、在所有3个集群成员上,启动swarm集群管理:
#docker run -d -p 2376:2375 index.tenxcloud.com/docker_library/swarm manage token://348358591f2ab8b5ab8d79e0daca4f09
需要注意的是:在这条命令中,第一:要以daemon的形式运行swarm;第二:端口映射:2376可以更换成任何一个本机没有占用的端口,一定不能是2375,否则就会出问题。
这样在任何一台机器上,可以使用swarm list命令来查询集群状态。
至此,swarm集群已经安装完成,每次开机时,要执行以上swarm manage命令来启动集群。
八、在任何一台机器上,即可列出集群中的节点:
#docker run --rm index.tenxcloud.com/docker_library/swarm list token://1b108ababc6b4c0fa73b6ecf1d52d9a4
以下命令可以显示出所有集群节点的状态:
#docker -H 0.0.0.0:2376 info
还可以用以下命令
#docker -H tcp:// 0.0.0.0:2376 run
#docker -H tcp:// 0.0.0.0:2376 ps
#docker -H tcp:// 0.0.0.0:2376 logs
九、通过配置文件文件启动集群(所有节点)
在所有节点上执行以下命令编辑集群配置文件:
#echo 192.168.192.132:2375 >> cluster
#echo 192.168.192.141:2375 >> cluster
#echo 192.168.192.142:2375 >> cluster
在所有节点上想要执行swarm manage的节点上执行以下命令swarm manage命令完成启动:
#docker run -d -p 2376:2375 -v $(pwd)/cluster:/root/cluster index.tenxcloud.com/docker_library/swarm manage file:///root/cluster
任一节点上执行以下命令列出所有节点:
#docker run --rm -v $(pwd)/cluster:/root/cluster index.tenxcloud.com/docker_library/swarm list file:///root/cluster
#docker -H 0.0.0.0:2376 info(只能在启动了swarm manage的节点上执行)
十、docker集群操作
先在一台机器上启动一个容器
#docker -H tcp://192.168.192.132:2376 run --name mongo_001 -d -e constraint:label==001 index.tenxcloud.com/tenxcloud/mongodb
#docker -H tcp://0.0.0.0:2376 run index.tenxcloud.com/tenxcloud/mongodb
#docker -H tcp://0.0.0.0:2376 pull index.tenxcloud.com/tutum/nginx
#docker -H tcp://0.0.0.0:2376 run -d -p 8888:80 --shm-size 100 -i -t --entrypoint /bin/bash index.tenxcloud.com/tutum/nginx
#docker -H tcp://0.0.0.0:2376 stop ab17a72eb40
#docker -H 0.0.0.0:2376 images
#docker -H 0.0.0.0:2376 ps
在host本地运行Nginx:
docker run --name nginx -p 80:80 -ti --entrypoint /bin/bash index.tenxcloud.com/tutum/nginx
docker run -d -p 80:80 index.tenxcloud.com/tutum/nginx (一旦run成功,就会创建一个新的容器)
curl http://localhost/
docker stop nginx
docker ps -a|more
docker start focused_morse
docker attach --sig-proxy=false nginx8(docker ps中查询到的NAMES)
1.在集群上运行nginx
创建并运行一个nginx容器,并打个终端连接上去:
docker -H 0.0.0.0:2376 run --name nginx -p 80:80 --shm-size 100 -ti --entrypoint /bin/bash index.tenxcloud.com/tutum/nginx (会导致nginx不能自动启动)
以daemon方式运行一个nginx容器,先运行shell
docker -H 0.0.0.0:2376 run --name nginx -d -p 80:80 --shm-size 100 index.tenxcloud.com/tutum/nginx
运行起来后,可以根据容器名称“nginx“ attch上去。
删除集群上停止的容器:docker -H 0.0.0.0:2376 rm $(docker -H 0.0.0.0:2376 ps -a -q)
绑定到一个ngix的shell:docker -H 0.0.0.0:2376 attach nginx
查到容器的IP、gateway:docker -H 0.0.0.0:2376 inspect nginx
通过容器的gateway:curl http://192.168.81.3:80/
docker -H tcp://0.0.0.0:2376 stop nginx_lin
docker -H tcp://0.0.0.0:2376 start nginx_lin
2.在集群上运行mongo db
首先创建mongodb并进入console方式
#docker -H 0.0.0.0:2376 run --name mongodb -p 27017:27017 -p 28017:28017 --shm-size 100 -i --entrypoint /bin/bash index.tenxcloud.com/tenxcloud/mongodb
启动mongodb:
# /usr/bin/mongod --dbpath /data/db --port 27017 –port 28017 --logpath /data/db/log --logappend &
#/usr/bin/mongo db
#exit
或以后台方式启动:
#docker -H 0.0.0.0:2376 run --name mongodb -d -p 27017:27017 -p 28017:28017 --shm-size 100 -e MONGODB_PASS="123456"
http://192.168.192.141:28017/
index.tenxcloud.com/tenxcloud/mongodb 27017是服务口,28017是管理口 mongo admin -u admin -p 123456
#docker -H 0.0.0.0:2376 attach mongo_001
3.在集群启动一个redis容器
创建并进入console模式(不会自动启动):
docker -H 0.0.0.0:2376 run --name redis --shm-size 100 -ti --entrypoint /bin/bash index.tenxcloud.com/docker_library/redis
创建并直接以后台模式启动redis容器:
docker -H 0.0.0.0:2376 run --name redis -d --shm-size 100 index.tenxcloud.com/docker_library/redis
docker -H 0.0.0.0:2376 logs redis
docker -H 0.0.0.0:2376 attach redis
docker -H 0.0.0.0:2376 inspect redis
telnet 192.168.192.132 6379 登录上去可使用命令行直接操作redis
quit 退出redis命令行
4.在集群启动一个mysql容器
首先以创建并进入console模式:
docker -H 0.0.0.0:2376 run --name mysql -p 3306:3306 --shm-size 100 -ti --entrypoint /bin/bash index.tenxcloud.com/tutum/mysql
设置MYMYSQL为开机启动:
方法一:在/etc/rc.d/rc.local文件末尾添加如下一行
/usr/sbin/mysql start
方法二:在mysql5目录下找到support-files目录将其中的mysql.server复制修改为/etc/init.d/mysqld
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start
chkconfig --level 35 mysqld on
登录(无密码):
mysql -u root -p
创建新用户:
CREATE USER 'admin' IDENTIFIED BY '123456';
给用户授权:
GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
修改root默认密码:
mysqladmin password 123456
然后再次启动容器时,会自动启动mysql。
以下是创建以后台方式启动的mysql容器:
docker -H 0.0.0.0:2376 run --name mysql -d -p 3306:3306 --shm-size 100 index.tenxcloud.com/tutum/mysql
docker -H 0.0.0.0:2376 attach mysql
docker -H 0.0.0.0:2376 inspect mysql|more
mysql -uadmin –p123456 -h
-P
5.在集群启动一个tomcat容器
docker -H 0.0.0.0:2376 run --name tomcat -d -p 8080:8080 --shm-size 100 index.tenxcloud.com/tenxcloud/tomcat
docker -H 0.0.0.0:2376 logs tomcat
docker -H 0.0.0.0:2376 attach tomcat
docker -H 0.0.0.0:2376 inspect tomcat
curl http://192.168.46.4:8080/
curl http://192.168.46.4:8080/
http://192.168.192.132:8081/
You can now login to you admin console to configure your tomcat server:
http://127.0.0.1:8080/manager/html http://127.0.0.1:8080/host-manager/html Setting a specific password for the admin account
If you want to use a preset password instead of a random generated one, you can set the environment variable TOMCAT_PASS to your specific password when running the container:
6.在集群启动一个zookeeper容器
docker -H 192.168.192.132:2376 pull index.tenxcloud.com/sdvdxl/zookeeper
docker -H 192.168.192.132:2376 tag index.tenxcloud.com/sdvdxl/zookeeper zookeeper
docker -H 192.168.192.132:2376 run --name=zookeeper -d -e MYID=1 -e SERVERS=k8s_master,k8s_slave1,k8s_slave2 --net=host --restart=always --shm-size 100 zookeeper
docker -H 192.168.192.132:2376 run --name=zookeeper -d -p 2181:2181 -e MYID=1 --net=host --restart=always --shm-size 100 zookeeper
docker -H 0.0.0.0:2376 logs zookeeper
docker -H 0.0.0.0:2376 inspect zookeeper
十一、关闭所有成员的防火墙
#iptables –F
十二、再次启动集群
注意:docker run运行成功后,就会永久创建一个容器实例,包括swarm manage容器。再次启动时,不能再用docker run,否则会产生过多的容器。
swarm manage容器可以只有一个,只要在集群任何一个节点访问swarm manage容器所在节点的IP就可以,如下:
#docker –H 192.168.192.132 info
只需按以下方式:
#docker ps –a 列出已经创建的容器及状态
#docker start [swarm manage容器名称] :启动swarm manage容器
#docker -H 0.0.0.0:2376 ps –a 列出集群范围所有的容器
#docker –H 192.168.192.132 ps –a 列出某个节点上的所有容器
#docker -H 0.0.0.0:2376 start [容器名称] :启动集群上的某个容器
#docker -H 0.0.0.0:2376 stop [容器名称] :停止集群上的某个容器
# docker -H 0.0.0.0:2376 stop $(docker ps -a -q) :停止集群范围所有容器
# docker -H 0.0.0.0:2376 rm $(docker ps -a -q) :删除集群范围所有已经停止的容器
FAQ
Cannot connect to the Docker daemon. Is 'docker -d' running on this host?
#rm /etc/docker/key.json
#rm /var/run/docker.pid
还有一种原因可能引起,同时配置了/etc/default/docker,/etc/sysconfig/docker
OPTIONS='-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'
Docker1.9.1一定要使用/etc/sysconfig/docker,删除/etc/default/docker
明明集群中是有3个节点的,但是info命令只显示了2个节点。为什么会出现这个情况呢?
检查可能其中有一台机器没有设置上面的docker daemon监听0.0.0.0:2375这个端口,所以Swarm没办法把这个节点加入集群中来。