创建应用
$ oc new-app \
-e MYSQL_USER=data \
-e MYSQL_PASSWORD=data \
-e MYSQL_DATABASE=data \
-e MYSQL_ROOT_PASSWORD=root centos/mysql-57-centos7
注意: 如果要在CentOS下使用最新的MySQL 5.7版本, 容器镜像的名称为centos/mysql-57-centos7
. 官方文档使用的是openshift/mysql-55-centos
, 具体参考: 初始化数据库
在容器中运行MySQL命令
列出运行中的PODS:
oc get pods
登录远程SHELL:
oc rsh ${pod-name}
输入mysql命令进入MySQL交互式SHELL
bash-4.2$ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -h $HOSTNAME $MYSQL_DATABASE
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.37 MySQL Community Server (GPL)
...
mysql>
环境变量
You must either specify the following environment variables:
MYSQL_USER (regex: '^[a-zA-Z0-9_]+$')
MYSQL_PASSWORD (regex: '^[a-zA-Z0-9_~!@#$%^&*()-=<>,.?;:|]+$')
MYSQL_DATABASE (regex: '^[a-zA-Z0-9_]+$')
Or the following environment variable:
MYSQL_ROOT_PASSWORD (regex: '^[a-zA-Z0-9_~!@#$%^&*()-=<>,.?;:|]+$')
Or both.
Optional Settings:
MYSQL_LOWER_CASE_TABLE_NAMES (default: 0)
MYSQL_LOG_QUERIES_ENABLED (default: 0)
MYSQL_MAX_CONNECTIONS (default: 151)
MYSQL_FT_MIN_WORD_LEN (default: 4)
MYSQL_FT_MAX_WORD_LEN (default: 20)
MYSQL_AIO (default: 1)
MYSQL_KEY_BUFFER_SIZE (default: 32M or 10% of available memory)
MYSQL_MAX_ALLOWED_PACKET (default: 200M)
MYSQL_TABLE_OPEN_CACHE (default: 400)
MYSQL_SORT_BUFFER_SIZE (default: 256K)
MYSQL_READ_BUFFER_SIZE (default: 8M or 5% of available memory)
MYSQL_INNODB_BUFFER_POOL_SIZE (default: 32M or 50% of available memory)
MYSQL_INNODB_LOG_FILE_SIZE (default: 8M or 15% of available memory)
MYSQL_INNODB_LOG_BUFFER_SIZE (default: 8M or 15% of available memory)
注意: 某些环境变量有两种默认值, 当容器没有设置内存限制时, 使用固定值, 否则是用容器限制的百分比.
修改数据库密码
在容器环境中唯一修复MYSQL_USER和root密码的方式是通过MYSQL_PASSWORD, MYSQL_ROOT_PASSWORD环境变量, 因为, MYSQL的配置已经被固化到了部署配置(DC: Deployment Config)当中, 通过命令行获取POD或DC的环境变量列表:
➜ .minishift oc set env pod mysql-57-centos7-1-qplng --list
# pods mysql-57-centos7-1-qplng, container mysql-57-centos7
MYSQL_DATABASE=data
MYSQL_PASSWORD=data
MYSQL_ROOT_PASSWORD=root
MYSQL_USER=data
➜ .minishift oc set env dc mysql-57-centos7 --list
# deploymentconfigs mysql-57-centos7, container mysql-57-centos7
MYSQL_DATABASE=data
MYSQL_PASSWORD=data
MYSQL_ROOT_PASSWORD=data
MYSQL_USER=data
注意:
1. 如果环没有设置境变量MYSQL_ROOT_PASSWORD
, root 用户是不能远程登录的, 容器内本地环境仍然可以无密码登录, 在产品环境下建议不要设置MYSQL_ROOT_PASSWORD
. 这不影响正常的MYSQL_USER
用户.
2. 建议不要用其他非环境变量的方式修改密码, 因为容器在启动的时候回通过环境变量充值MySQL用户密码.
修改部署配置(DC: Deployment Config)的环境变量
$ oc set env dc [ ...] \
MYSQL_PASSWORD= \
MYSQL_ROOT_PASSWORD=
容器是通过DC进行实例化的, 如果要对每一个DC下的实例都有效, 需要修改DC的环境变量, 首先获取当前项目(名称空间)下的DC列表:
➜ .minishift oc get dc
NAME REVISION DESIRED CURRENT TRIGGERED BY
hello-microservice 1 1 1 config,image(hello-microservice:latest)
mysql-57-centos7 1 1 1 config,image(mysql-57-centos7:latest)
nodejs-ex 1 1 1 config,image(nodejs-ex:latest)
然后执行:
➜ .minishift oc set env dc mysql-57-centos7 MYSQL_PASSWORD=changed MYSQL_ROOT_PASSWORD=changed
deploymentconfig "mysql-57-centos7" updated
注意: 更新环境变量会触发一次重新部署.
数据持久化
容器如果没有使用外部的持久化卷, 那么当容器重新启动后, 之前更新的数据将会全部丢失, 因此, 像MySQL这类需要持久化数据存储支持的应用, 如果丢失数据, 是要命的事情!
创建持久化卷
MySQL 容器镜像可以挂载卷, 以持久化数据库存储:
/var/lib/mysql/data
- 该目录是MySQL存储数据库文件的目录
挂载卷之前, 我们先创建持久化卷(PV), 如下:
定义名称为 db.mysql.data
, 卷的访问模式为单用户非共享卷, 也就是同时只能有一个容器能够挂载这个卷. 测试目的, 卷的大小设置为较小的值128MiB
.
注意:
MiB
(BINARY UNITS, 二进制单位
)的进制是1024
,MB
(DECIMAL UNITS 十进制单位
)的进制是1000
, 下面是创建卷的描述文件:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: '2017-10-22T13:04:04Z'
name: db.mysql.data
namespace: reactive-microservices
resourceVersion: '7789'
selfLink: >-
/api/v1/namespaces/reactive-microservices/persistentvolumeclaims/db.mysql.data
uid: 7adb87cd-b729-11e7-8e63-665a136940b1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 128Mi
status:
phase: Pending
通过 oc get 命令查看持久卷被绑定到哪里了
➜ .minishift oc get persistentvolume |grep mysql
pv0020 100Gi RWO,ROX,RWX Recycle Bound reactive-microservices/db.mysql.data 1d
➜ .minishift oc get persistentvolumeclaim
NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE
db.mysql.data Bound pv0020 100Gi RWO,ROX,RWX 1m
我们看到我们的持久化卷请求(PVC: Persistent Volume Claim), 被绑定到了容量为100Gi的设备pv0020上了.
挂载
进入DC(上图 Applications > Deployments), 选中 mysql-57-centos7 这个DC. 删除已经挂载的容器内部卷. 并点击Add Storage
添加签名创建的卷.
注意: 因为默认
mysql-57-centos7
部署配置的数据目录默认挂载位置是/var/lib/mysql/data
, 因此为了避免路径冲突, 需要删除内置的卷. 因为修改了配置, Openshift 会自动重新触发一次mysql-57-centos7
的部署.
现在可以登录容器创建一些测试数据了
sh-4.2$ oc rsh mysql-57-centos7-10-sffhd
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.16 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| data |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use data;
Database changed
mysql> show tables;
+----------------+
| Tables_in_data |
+----------------+
| users |
+----------------+
1 row in set (0.00 sec)
mysql> select * from users;
+----+--------------+
| id | username |
+----+--------------+
| 1 | admin |
| 2 | system:admin |
| 3 | developer |
+----+--------------+
3 rows in set (0.00 sec)
mysql>
注意: 你现在可以重新部署一次这个DC来看看新实例化的容器MySQL的数据有没有丢失, 如下: