1.前言

OceanBase官网近期放出了OceanBase 2.2版本安装相关文件(https://oceanbase.alipay.com/download/resource)。其中主要包含OceanBase软件包和OCP相关软件包。OCP是OceanBase的自动化运维平台,通过OCP可以自动化部署OceanBase集群,但是OCP架构比OceanBase复杂一些,包含多个组件:OCP应用程序、OBProxy进程、元数据库(一个独立的OceanBase集群)。自然OCP这个元数据库OB集群是不能靠OCP来自动化部署,所以OCP的部署主要使用了Docker容器技术。本文主要分享一些Docker技术基础命令,以方便大家理解OCP的安装过程并能自行更换相关组件版本和诊断OCP使用问题。

2.Docker 命令

有关Docker的介绍,网上文章很多,也可以参考https://yeasy.gitbooks.io/docker_practice/content/introduction/

2.1 安装

Docker安装有多种方式。如果机器可以连公网,可以通过yum源安装。默认软件安装后会创建目录/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

OceanBase 运维平台(OCP)使用基础:Docker技术_3g


对于容器内部一些自动化脚本的日志在容器运行日志里通常看不到,还需要进入容器查看。

2.3.6 进入容器

[root@xxx /root/oceanbase_trial]
#docker psCONTAINER 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 -hFilesystem 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 -auxfUSER 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
bashroot 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

在容器里如果查看文件内容的时候,可能会碰到窗口很小,导致操作非常不方便。有一个临时技巧就是把自己的终端窗口(xshellsecurecrt)改变一下大小,利用终端窗口的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


​​