OceanBase 运维平台(OCP)使用基础:Docker技术
https://oceanbase.alipay.com/download/resource
)。其中主要包含OceanBase软件包和OCP相关软件包。OCP是OceanBase的自动化运维平台,通过OCP可以自动化部署OceanBase集群,但是OCP架构比OceanBase复杂一些,包含多个组件:OCP应用程序、OBProxy进程、元数据库(一个独立的OceanBase集群)。自然OCP这个元数据库OB集群是不能靠OCP来自动化部署,所以OCP的部署主要使用了Docker容器技术。2.Docker 命令
https://yeasy.gitbooks.io/docker_practice/content/introduction/
。2.1 安装
/var/lib/docker
。OCP部署脚本安装使用的目录是/docker,后面用到的镜像文件都会放在这个目录。如果根分区(/
)不够大,就需要提前准备好独立的文件系统/docker
. 2.1.1 创建/docker
目录(可选)
OCP的安装文档里在初始化分区时指定了/docker
文件系统的大小,会自动创建一个。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 49G 22G 26G 46% /
/dev/mapper/ob_vg-docker_home 492G 73M 467G 1% /docker
2.1.2 安装docker
软件
通常安装docker软件方法如下:
## 添加公网docker的yum源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
## 查看所有仓库中所有docker版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce # 这里安装的可能是最新稳定版
## 或者安装特定版本
$ sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce
## 启动并加入开机启动
$ sudo systemctl start docker
$ sudo systemctl enable docker
## 验证docker安装成功
$ docker version
在OCP安装步骤里,已经提供了docker
运行文件的副本,采取的是直接复制文件的方式,然后启动Docker服务。
[root@xxx /root/oceanbase_trial/clonescripts]
#./clone.sh -i
##unzip : tar xvpf /usr/local/clonescripts/db_ob_v1/docker/docker-18.03.0-ce.tgz
docker/
docker/docker-proxy
docker/docker-containerd
docker/dockerd
docker/docker-runc
docker/docker-containerd-shim
docker/docker
docker/docker-init
docker/docker-containerd-ctr
##binary : docker copy to /usr/bin/
/bin/docker
##systemd service: docker.service
##docker.service: create docker systemd file
<......>
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
[root@xxx /root/oceanbase_trial]
#ip addr show docker0
7: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 52:**:**:**:df:8a brd ff:ff:ff:ff:ff:ff
inet 172.*.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
[root@xxx /root/oceanbase_trial]
#brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.000000000000 no
2.2 镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
2.2.1 获取镜像文件
镜像文件通常保存在特定的仓库里。可以直接登录仓库下载或者在linux终端里用docker save
命令获取。
# docker save acs-reg.alipay.com/antman2/obproxy:OBP156_20191227_1714 | gzip > obproxy156.tar.gz
上面是举例。私有Docker Registry
的仓库的文件在外部通常是无法获取的。OCP的镜像文件目前应该没有放到公网Docker Registry
仓库里。目前只能从OceanBase官网(https://oceanbase.alipay.com/download/resource
)获取。
2.2.2 加载镜像文件
首先要在目标机器上加载镜像文件,然后根据镜像文件启动容器。镜像和容器的关系就是类和实例的关系。
[root@xxx /root/oceanbase_trial]
#docker load < observer1478.tar.gz
<......>
Loaded image: reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113
2.2.3 查看镜像文件
[root@xxx /root/oceanbase_trial]
#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
reg.docker.alibaba-inc.com/antman/ob-docker OB1478_20200102_2113 5351e5990e0f 2 weeks ago 780MB
上面信息包含镜像的仓库路径、标签(TAG
)和镜像ID(IMAGE_ID
)。这三个信息在后面自动化安装加载镜像和启动容器时会用到。
2.2.4 删除镜像文件
删除镜像文件之前确保使用该镜像文件的容器已经被删除。然后查询镜像ID。
# docker images
# docker rmi 5351e5990e0f
批量删除镜像文件
# docker rmi $(docker images -q)
2.3 容器
镜像和容器的关系就是类和实例的关系。
2.3.1 启动容器
启动docker
容器时需要指定镜像文件的仓库和标签、网络模式,以及可能传递相关参数和目录映射。下面是OB的docker
容器启动参数
docker run -d -it --name META_OB_ZONE_1 --net=host -e OBCLUSTER_NAME=obcluster -e DEV_NAME=bond0 -e ROOTSERVICE_LIST="11.166.87.5:2882:2881" -e DATAFILE_DISK_PERCENTAGE=90 -e CLUSTER_ID=100000 -e ZONE_NAME=META_OB_ZONE_1 -e METADB_HOST=xxx.xxx.xxx.xxx -e METADB_PORT=3306 -e METADB_USER=root@ocp_meta#obcluster -e METADB_PASS=meta1234 -e METADB_DB=ocp -e METADB_ENV=private -e OPTSTR="cpu_count=18,memory_limit=106G" --cpu-period 100000 --cpu-quota 1800000 --cpuset-cpus 0-17 --memory 106G -v /home/admin/oceanbase:/home/admin/oceanbase -v /data/log1:/data/log1 -v /data/1:/data/1 --restart on-failure:5 reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113
-d
:后台运行,日志不输出到终端,查看后台运行日志用docker logs 容器名
。-t
:启动时分配一个伪终端(pseudo-tty
)并绑定到容器的标准输入上。-i
:让容器的标准输入保持打开。--name
:为容器指定一个名称。-e
:设置环境变量。同--env
。--cpu-period
:限制CPU CFS(完全公平调度程序)周期。--cpu-quota
:限制CPU CFS(完全公平的调度程序)上限。--cpu-cpus
:允许执行的cpu (0-3,0,1)。--memory
:设定内存限额,同-m
。-v
:绑定安装卷。--restart
:配置容器的重启策略,当容器退出时重新启动(默认为“no”)。
使用OCP自动安装脚本时会自动创建OB docker
容器,不需要记录这么多参数。如果后期要调整已有容器的启动参数、映射目录等,可以停掉容器,修改启动参数文件,然后手动启动;或者在线修改容器某些参数。
启动一个已停止的容器不需要指定这么多参数
# docker start META_OB_ZONE_1
批量启动所有停止的容器(前提是确认容器状态都是停止的)
# docker ps -a
# docker start $(docker ps -aq)
2.3.2 停止容器
## 根据容器名称停容器
# docker stop META_OB_ZONE_1
## 根据容器ID停容器
# docker stop a5d70bf582ed
# docker stop $(docker ps -q)
2.3.3 查看容器
查看运行中的容器用docker ps
。
[root@xxx /root/oceanbase_trial]
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5d70bf582ed reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113 "/usr/bin/supervisor…" 9 minutes ago Up 9 minutes META_OB_ZONE_1
查看包含停止的容器用docker ps -a
。
[root@xxx /root/oceanbase_trial]
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cebc67bb114a reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113 "/usr/bin/supervisor…" 5 minutes ago Up 5 minutes META_OB_ZONE_1
[root@xxx /root/oceanbase_trial]
#docker stop cebc67bb114a
cebc67bb114a
[root@xxx /root/oceanbase_trial]
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@xxx /root/oceanbase_trial]
#docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cebc67bb114a reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113 "/usr/bin/supervisor…" 5 minutes ago Exited (137) 9 seconds ago META_OB_ZONE_1
[root@xxx /root/oceanbase_trial]
#docker start META_OB_ZONE_1
META_OB_ZONE_1
[root@xxx /root/oceanbase_trial]
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cebc67bb114a reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113 "/usr/bin/supervisor…" 5 minutes ago Up 2 seconds META_OB_ZONE_1
2.3.4 重启容器
如果怀疑OCP容器有性能问题,或者其他未知的问题而又不知道如何处理时,重启一下容器是一个办法。即使是OB容器,反复重启也不会丢失数据。
# docker restart META_OB_ZONE_1
批量重启所有容器
# docker restart $(docker ps -q)
2.3.5 查看容器运行日志
如果容器启动后不正常,可以查看容器运行日志。
#docker logs META_OB_ZONE_1
对于容器内部一些自动化脚本的日志在容器运行日志里通常看不到,还需要进入容器查看。
2.3.6 进入容器
[root@xxx /root/oceanbase_trial]
#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cebc67bb114a reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113 "/usr/bin/supervisor…" 12 minutes ago Up 6 minutes META_OB_ZONE_1
[root@xxx /root/oceanbase_trial]
#docker exec -it META_OB_ZONE_1 bash
[root@xxx admin]#
[root@xxx admin]# ls
logs ob_admin.log obztools_agent oceanbase
[root@xxx admin]# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 492G 868M 466G 1% /
tmpfs 64M 0 64M 0% /dev
tmpfs 63G 0 63G 0% /sys/fs/cgroup
/dev/mapper/ob_vg-ob_log 1007G 206M 956G 1% /data/log1
/dev/mapper/ob_vg-ob_data 3.3T 2.8T 348G 90% /data/1
/dev/mapper/ob_vg-docker_home 492G 868M 466G 1% /etc/hosts
shm 64M 0 64M 0% /dev/shm
/dev/sda5 387G 30G 338G 9% /home/admin/oceanbase
tmpfs 63G 0 63G 0% /proc/scsi
tmpfs 63G 0 63G 0% /sys/firmware
[root@xxx admin]# pwd
/home/admin
[root@xxx admin]# ps -auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1085 0.0 0.0 13428 2044 pts/1 Ss 17:16 0:00 bash
root 1187 0.0 0.0 53312 1828 pts/1 R+ 17:19 0:00 \_ ps -auxf
root 1 0.0 0.0 117304 14996 pts/0 Ss+ 17:10 0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
root 15 0.0 0.0 24272 1608 pts/0 S 17:10 0:00 /usr/sbin/crond -n
root 17 0.0 0.0 13292 1656 pts/0 S 17:10 0:00 /bin/bash /root/start_ob.sh
root 1166 0.0 0.0 5940 356 pts/0 S 17:18 0:00 \_ sleep 60
admin 55 131 3.6 16605172 4005196 ? Ssl 17:10 11:46 /home/admin/oceanbase/bin/observer
root 249 0.0 0.0 199996 2368 pts/0 Sl 17:10 0:00 /usr/sbin/rsyslogd -c5 -f /etc/rsyslog.conf -N debug -n
在容器里如果查看文件内容的时候,可能会碰到窗口很小,导致操作非常不方便。有一个临时技巧就是把自己的终端窗口(xshell
或securecrt
)改变一下大小,利用终端窗口的resize
事件可以改变容器内部的窗口大小。至今我也不知道为什么会这样。如果有哪位朋友知道原因和解决办法,欢迎留言告知,不胜感激!
2.3.7 删除容器
删除容器之前先得停掉容器。
# docker stop META_OB_ZONE_1
# docker rm META_OB_ZONE_1
批量删除所有停止的容器
# docker ps -aq
# docker rm $(docker ps -aq)
2.3.8 复制文件
有时候需要把容器里的文件复制到宿主机上,或者从宿主机复制文件到容器里,可以用docker cp
命令
[root@xxx /root]
# docker cp test.sh cebc67bb114a:/home/admin/
[root@xxx /root]
# docker exec -it cebc67bb114a bash
[root@xxx admin]# ls -lrth test.sh
-rw-r--r-- 1 root root 0 Jan 19 09:46 test.sh
反之也可以复制出来
[root@xxx /root]
#rm test.sh
rm: remove regular empty file ‘test.sh’? y
[root@xxx /root]
#docker cp cebc67bb114a:/home/admin/test.sh .
[root@xxx /root]
#ls -lrth test.sh
-rw-r--r-- 1 root root 0 Jan 19 09:46 test.sh
2.4 获取容器/镜像元数据
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
reg.docker.alibaba-inc.com/antman/ob-docker OB1478_20200102_2113 5351e5990e0f 2 weeks ago 780MB
# docker inspect 5351e5990e0f
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cebc67bb114a reg.docker.alibaba-inc.com/antman/ob-docker:OB1478_20200102_2113 "/usr/bin/supervisor…" 17 hours ago Up 17 hours META_OB_ZONE_1
# docker inspect cebc67bb114a
推荐阅读
Docker —— 从入门到实践( https://yeasy.gitbooks.io/docker_practice/content/introduction/
)OceanBase 2.x体验:手动搭建OceanBase集群 OceanBase一体机和云栖大会OB体验介绍