CHAPTER 11 数据库应用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

数据库应用


目前主流数据库包括关系型SQL和非关系型NoSQL两种。

  • 关系数据库是建立在关系模型基础上的数据库借助于集合代数等数学概念和方法来处理数据库中的数据支持复杂的事物处理和结构化查询。代表实现有MySQL、Oracle、PostgreSQL、MariaDB、SQLServer等。
  • 非关系数据库是新兴的数据库技术它放弃了传统关系型数据库的部分强一致性限制带来性能上的提升使其更适用于需要大规模并行处理的场景。非关系型数据库是关系型数据库的良好补充代表产品有MongoDB、Redis等。

本章选取了最具代表性的数据库如MySQL、Oracle、MongoDB、Redis、Cassandra等来讲解基于Docker创建相关镜像并进行应用的过程。

11.1 MySQL

MySQL是全球最流行的开源关系型数据库之一由于其具有高性能、成熟可靠、高适应性、易用性而得到广泛应用

11.1.1 使用官方镜像

用户可以使用官方镜像快速启动一个MySQL Server实例

[root@dbc-server-554 mysql]# docker run --name hi-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
...
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:latest
ff69f4ade1b7c69dbbffc73c02cc19cc85eb504428c6d9485406ea8e253eb365
[root@dbc-server-554 mysql]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                            NAMES
ff69f4ade1b7   mysql:latest             "docker-entrypoint.s…"   45 seconds ago   Up 38 seconds   3306/tcp, 33060/tcp                                                              hi-mysql

还可以使用--link标签将一个应用容器连接至MySQL容器

$ docker run --name some-app --link some-mysql:mysql -d application_that_uses_mysql

更多容器互联
MySQL服务的标准端口是3306用户可以通过CLI工具对配置进行修改

$ docker run it --link some_mysql:mysql --rm mysql sh -c 'exec mysql -h”$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' 

官方MySQL镜像还可以作为客户端连接非Docker或者远程的MySQL实例

$ docker run -it --rm mysql mysql -hsome.mysql.host -usome-mysql user -p
  1. 系统与日志访问用户可以使用docker exec指令调用内部系统中的bash shell 以访问容器内部系统
    $ docker exec -it some-mysql bash 
    
    MySQL Server日志可以使用dockerlogs指令查看
    $ docker logs some-mysql
    
  2. 使用自定义配置文件
    如果用户希望使用自定义MySQL配置则可以创建一个目录内置cnf配置文件然后将其挂载至容器的/etc/mysql/conf.d目录。比如自定义配置文件为/my/custom/config-file.cnf则可以使用以下指令
    $ docker run --name some-mysql -v /my/custom: /etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
    
    这时新的容器some-mysql启动后就会结合使用/etc/mysql/my.cnf/etc/mysql/conf.d/config-file.cnf两个配置文件
  3. 脱离cnf文件进行配置
    很多的配置选项可以通过标签flags传递至mysqld进程这样用户就可以脱离cnf配置文件对容器进行弹性的定制。比如用户需要改变默认编码方式将所有表格的编码方式修改为uft8mb4则可以使用如下指令
    $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql: tag - -character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    
    如果需要查看可用选项的完整列表可以执行如下指令
    $ docker run -it --rm mysql:tag --verbose --help
    
  4. 通过docker stack deploydocker-compose运行
    MySQL的示例stack.yml如下
    version: '3. l' 
    services: 
    	db: 
    		image: mysql 
    		restart: always 
    		environment:
    			MYSQLROOT_PASSWORD:example 
    	adminer: 
    		image: adminer 
    		restart: always 
    		ports: 
    			8080:8080 
    

11.1.2 相关资料

MySQL官网https://www.mysql.com/
MySQL官方镜像https://hub.docker.com/_/mysql/
MySQL官方镜像仓库https://github.com/docker-library/mysql/

11.2 Redis

Redis是一个开源BSD许可的基于内存的数据结构存储系统可以用作数据库、缓存和消息中间件。Redis使用ANSIC实现2013年起由Pivotal公司资助。Redis的全称意为REmote Dlctionary Server。

Redis支持多种类型的数据结构如string字符串、hash散列、list列表、set集合、sortedset 有序集合与范围查询、bitmaps、hyperloglogs和geospatial索引半径查询Redis同时支持replication、LUA脚本、LRU驱动事件、事务和不同级别的持久化支持等通过哨兵机制和集群机制提供高可用性。

11.2.1使用官方镜像

用户可以通过docker [container] run指令直接启动一个redis-container容器

[root@dbc-server-554 mysql]# docker run -d --name redis-container redis:latest
Unable to find image 'redis:latest' locally
...
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
c0c03fea1e6736a5094a0cc0267753868a875484200f56ca109459e4bfecf70d
[root@dbc-server-554 mysql]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS      NAMES
c0c03fea1e67   redis:latest   "docker-entrypoint.s…"   42 seconds ago   Up 40 seconds   6379/tcp   redis-container
[root@dbc-server-554 mysql]# docker exec -it c0c bash
root@c0c03fea1e67:/data# env
HOSTNAME=c0c03fea1e67
REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab
PWD=/data
HOME=/root
REDIS_VERSION=6.2.6
GOSU_VERSION=1.12
TERM=xterm
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

11.2.2 连接Redis容器

用户可以使用--link参数连接创建的redis-container容器

[root@dbc-server-554 mysql]# docker run -it --link redis-container:db alpine sh
/ # ping db
PING db (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.225 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.141 ms

还可以使用nc指令即NetCat检测Redis服务的可用性

/ # nc db 6379 
PING 
+PONG 

官方镜像内也自带了Redis客户端可以使用以下指令直接使用

[root@dbc-server-554 mysql]# docker run -it --rm --link redis-container:db --entrypoint redis-cli redis -h db
db:6379> ping
PONG
db:6379> set 1 2
OK
db:6379> get 1
"2"

11.2.3 使用自定义配置

如果需要使用自定义的Redis配置有以下两种操作

  • 通过Dockerfile构建自定义镜像
  • 使用数据卷

下面首先介绍第一种方式。首先新建项目目录井新建Dockerfile文件

[root@dbc-server-554 mysql]# cat dockerfile
FROM redis:latest
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server",”/usr/local/etc/redis/redis.conf"]
[root@dbc-server-554 mysql]# docker build -t myredis .
Sending build context to Docker daemon  245.2kB
Step 1/3 : FROM redis:latest
 ---> 7614ae9453d1
Step 2/3 : COPY redis.conf /usr/local/etc/redis/redis.conf
 ---> 9e7b87692c5b
Step 3/3 : CMD ["redis-server",”/usr/local/etc/redis/redis.conf"]
 ---> Running in fa5e83b79cd0
Removing intermediate container fa5e83b79cd0
 ---> 2fac9d49264a
Successfully built 2fac9d49264a
Successfully tagged myredis:latest

如果使用第二种方式即通过数据卷实现自定义Redis配置可以通过以下指令完成

[root@dbc-server-554 mysql]# docker run -d -v redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf
d9f745f218cf63709daf8967e89e0fb97a64576b131faa0a383234b4ceac02d0
[root@dbc-server-554 mysql]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS      NAMES
d9f745f218cf   redis          "docker-entrypoint.s…"   3 seconds ago    Up 2 seconds    6379/tcp   myredis

11.2.4 相关资料

Redis官方网站http://redis.io/
Redis官方镜像https://hub.docker.com/_/redis/
Redis官方镜像仓库https://github. com/docker-library/redis

11.3 MongoDB

MongoDB是一款可扩展、高性能的开源文档数据库Document-Oriented是当今最流行的NoSQL数据库之一。它采用C++开发支持复杂的数据类型和强大的查询语言提供了关系数据库的绝大部分功能。由于其高性能、易部署、易使用等特点MongoDB已经在很多领域都得到了广泛的应用。

MongoDB 源自“humogous”是一个面向文档的跨平台数据库避开了传统关系型数据库结构转而使用动态类似于JSON的BSON格式使其能轻松地将多个数据写在同一类型中。MongoDB以AGPL和ApacheLicense联合协议发布。

11.3.1 使用官方镜

像用户可以使用docker [container] run指令直接运行官方mongoDB镜像

[root@dbc-server-554 mysql]# docker run -d --name mongo-container mongo
Unable to find image 'mongo:latest' locally
latest: Pulling from library/mongo
...
Status: Downloaded newer image for mongo:latest
cbc043e49f3a008e9a4984ec42695eec2bad3fc0dc03ed169f1e0bd09c0b6a38
[root@dbc-server-554 mysql]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS       NAMES
cbc043e49f3a   mongo          "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   27017/tcp   mongo-container

在此mango-contariner启动一个bash进程并通过mango指令启动mongodbDB交互命令行再通过db.stats()指令查看数据库状态

[root@dbc-server-554 mysql]# docker exec -it cbc bash
root@cbc043e49f3a:/# mongo
MongoDB shell version v5.0.5
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("93525c8d-c019-4a91-b79e-8f25ab404d5e") }
MongoDB server version: 5.0.5
================
Warning: the "mongo" shell has been superseded by "mongosh",
...
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db.stats()
{
        "db" : "test",
        "collections" : 0,
        "views" : 0,
        "objects" : 0,
...
        "fsTotalSize" : 0,
        "ok" : 1
}
> exit
bye
root@cbc043e49f3a:/# env
HOSTNAME=cbc043e49f3a
PWD=/
HOME=/root
MONGO_PACKAGE=mongodb-org
...
MONGO_REPO=repo.mongodb.org
MONGO_VERSION=5.0.5
TERM=xterm
MONGO_MAJOR=5.0
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

镜像默认暴露了mongoDB的服务端口27017可以通过该端口访问服务。
连接mongoDB容器使用--link参数连接新建的mango-container容器

[root@dbc-server-554 mysql]# docker run -it --link mongo-container:db alpine sh
/ # ls
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var
/ # ping db
PING db (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.193 ms
64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.046 ms
^C
--- db ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.046/0.119/0.193 ms

直接使用mangocli指令
如果用户想直接在宿主机器上使用mongoDB可以在docker [container] run指令后面加入entrypoint指令这样就可以非常方便地直接进入mango cli了

[root@dbc-server-554 mysql]# docker run -it --link mongo-container:db --entrypoint mongo mongo --host db
MongoDB shell version v5.0.5
connecting to: mongodb://db:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("5a0ff69e-4a2a-48e3-b176-09f197b52198") }
MongoDB server version: 5.0.5
================
Warning: the "mongo" shell has been superseded by "mongosh",
...
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> db.version()
5.0.5
>

最后用户还可以使用--storageEngine参数来设置储存引擎

$ docker run --name mongo-container -d mongo --storageEngine wiredTiger 

11.3.2 使用自定义Dockerfile

第一步准备工作。新建项目目录并在根目录新建Dockerfile内容如下

[root@dbc-server-554 mongo]# cat dockerfile
#设置从用户之前创建的sshd镜像继承
FROM sshd:dockerfile

MAINTAINER docker user (user@docker com)
RUN apt-get update && \
        apt-get install -y mongodb pwgen &&\
        apt-get clean
#       rm -rf /var/lib/apt/lists/ *

#创建mongoDB存放数据文件的文件夹
RUN mkdir -p /data/db

VOLUME /data/db

ENV AUTH yes

#添加脚本
ADD run.sh /run.sh
ADD set_mongodb_password.sh /set_mongodb_password.sh

RUN chmod 755 ./*.sh

EXPOSE 27017
EXPOSE 28017

CMD ["/run.sh" ]

运行脚本run.sh

[root@dbc-server-554 mongo]# cat run.sh
#!/bin/bash
if [ ! -f /.mongodb_password_set ]; then
        /set_mongodb_password.sh
fi

if [ "$AUTH" == "yes" ]; then
        export mongodb='/usr/bin/mongod --nojournal --auth --httpinterface --rest'
else
        export mongodb='/usr/bin/mongod --nojournal --httpinterface --rest'
fi

if [ ! -f /data/db/mongod.lock ]; then
        eval $mongodb
else
        export mongodb=$mongodb' --dbpath /data/db'
        rm /data/db/mongod.lock
        mongod --dbpath /data/db --repair && eval $mongodb
fi

新建set_mongodb_password.sh脚本此脚本主要负责配置数据库的用户名和密码

[root@dbc-server-554 mongo]# cat set_mongodb_password.sh
#!/bin/bash

#这个脚本主要是用来设置数据库的用户名和密码

#判断是否已经设置过密码
if [ -f /.mongodb_password_set ]; then
        echo "MongoDB password already set!"
        exit 0
fi

/usr/bin/mongod --smallfiles --nojournal &
PASS=${MONGODB_PASS:-$(pwgen -s 12 1)}
_word=$([${MONGODBPASS} ] && echo "preset"||echo "random")
RET=l
while [[ RET -ne 0   ]];do
        echo "=> Waiting for confirmation of MongoDB service startup"
        sleep 5
        mongo admin --eval "help" >/dev/null 2>&1
        RET=$?
done
echo "=> Creating an admin user with a ${_word} password in MongoDB"
mongo admin --eval "db.addUser({user :'admin', pwd:'$PASS' ,roles: [ 'userAdminAnyDatabaset'dbAdminAnyDatabase']});"
mongo admin --eval "db.shutdownServer ();"
echo "=> Done!" touch /.mongodb_password_set
echo "========================================================================"
echo "You can now connect to this MongoDB server using"
echo ""
echo "mongo admin -u admin - p $PASS -host <host> port <port>"
echo ""
echo "Please remember to change the above password as soon as possible!"
echo "========================================================================"

构建镜像

[root@dbc-server-554 mongo]# docker build -t mongodb-image .
Sending build context to Docker daemon   5.12kB
Step 1/12 : FROM sshd:dockerfile
...
Successfully built 9eb151795466
Successfully tagged mongodb-image:latest

运行容器

[root@dbc-server-554 mongo]# docker run -d -p 27017:27017 -p 28017:28017 mongodb-image

也可以利用环境变量在容器启动时指定密码

$ docker run -d - p 27017:27017 -p 28017:28017 -e MONGODB_PASS="mypass" mongodb 

甚至设定不需要密码即可访问

$ docker run - d -p 27017:27017 -p 28017:28017 - e AUTH=no mongodb 

同样读者也可以使用-v参数来映射本地目录到容器。

上述参数也可以直接在mongod.conf配置文件中配置例如

dbpath = /data/mongodb 
logpath = /data/mongodb/mongodb.log
logappend = true 
port = 27017 
fork = true 
auth = true

11.3.3 相关资料

MongoDB官网https://www.mongodb.org
MongoDB官方镜像https://hub.docker.com/_/mongo/
MongoDB官方镜像实现https://github.com/docker-library/mongo

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 数据库

“CHAPTER 11 数据库应用” 的相关文章