注:自从开始使用docker,部署方面的事情就简单多了。使用docker构建的数据库容器不用直接安装,开启后就可以使用,也比以前方便很多。下面将一些要点记录下来。

下面的例子使用以下环境:

- 系统(即host):CentOS Linux release 7.4.1708

- docker:Docker version 17.12.0-ce, build c97c6d6

- 数据库:MariaDB 5.5

启动数据库


MariaDB是MySQL的一个分支,使用起来基本上没有什么差别。在docker hub中有该数据库的官方镜像,使用下面的简单命令就可以开启一个数据库容器,开启后可以利用IP+端口号的方式访问该数据库。

1 [belter@localhost ~]$ docker run -d -p 3301:3306 -v ~/mdbdata/mdb55:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mdb55 mariadb:5.5
2 c7f2cd8ed93de8ab8ab58171c375e83fb2659c2a1cdab2ec79c264cb78b1e131
3 [belter@localhost ~]$ docker ps
4 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5 c7f2cd8ed93d mariadb:5.5 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3301->3306/tcp mdb55
  • 使用第1行的命令,就可以开启一个数据库容器,主要参数:

-d: 表示detach,后台运行并打印container ID;

-p: 端口,3301:3306表示将容器中的3306端口公开给host的3301端口;

-v: 表示volume,用来设置数据文件存放的位置,~/mdbdata/mdb55:/var/lib/mysql表示将host中当前用户home目录下的文件夹"mdbdata/mdb55"挂载于容器中的/var/lib/mysql目录,这样即使容器被删除,数据文件还是可以保留;

-e: 表示environment,用来设置用户及密码等环境变量,MYSQL_ROOT_PASSWORD=admin表示将root的密码设置为admin(只在第一次登陆数据库时使用);

--name: 表示容器的名称,例如现在这个数据库容器的名称为mdb55

命令的最后是镜像的名称,mariadb:5.5表示MariaDB-5.5

  • 第2行是返回的容器编号
  • 第3行的命令用来查看当前运行的容器列表,第4-5行可以看到刚刚启动的数据库容器的基本信息

此外可以使用下面的命令查看全部容器的状态(包括已经停止运行的容器),以及删除容器

1 [belter@localhost ~]$ docker ps -a  # 查看所有的容器
2 [belter@localhost ~]$ docker rm 92a1bcd89578  # 删除ID为92a1bcd89578的容器

Mariadb在docker hub中的官方网站,以及build镜像mariadb:5.5的Dockerfile文件

下面测试一下刚启动的数据库容器的连接:

 1 [belter@localhost ~]$ mysql -u root -padmin -h 127.0.0.1 -P3301
 2 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 3 Your MariaDB connection id is 3
 4 Server version: 5.5.60-MariaDB-1~trusty mariadb.org binary distribution
 5
 6 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
 7
 8 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 9
10 MariaDB [(none)]> 

现在已经可以正常连接该数据库了(由于这里使用了host中的mysql命令,因此需要先安装mysql才能使用)。

  • 注意-padmin和-P3301之间没有空格,一个表示user的密码,另一个表示连接的端口号;
  • -h: 表示需要连接的数据库的IP地址,这里连接的是本地IP+3301端口,host中的3301端口是访问数据库容器中3306端口的入口;

上面使用host中的mysql来连接容器中的数据库,需要先在本地安装mysql(或MariaDB)。此外也可以直接进入容器内部连接该数据库:

 1 [belter@localhost ~]$ docker exec -it c7f2cd8ed93d /bin/bash
 2 root@c7f2cd8ed93d:/# mysql -u root -padmin -h 127.0.0.1 -P3306
 3 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 4 Your MariaDB connection id is 4
 5 Server version: 5.5.60-MariaDB-1~trusty mariadb.org binary distribution
 6
 7 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 8
 9 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
10
11 MariaDB [(none)]> 
  • 使用第1行命令,进入刚才启动的数据库容器(ID为c7f2cd8ed93d)的bash;
  • 进入容器后,使用第2行命令连接容器内部的数据库,此时使用的端口号是3306.

注:退出数据库和容器都可以使用"exit;"

为了测试修改密码以及数据文件的重用,在数据库中做了以下修改:修改root的密码,创建一个新的数据库"test"并在该数据库中创建一个表"table1"

 1 # 修改root的密码为admin1,并更新权限列表
 2 SET PASSWORD FOR 'root'@'%' = PASSWORD('admin1');
 3 FLUSH PRIVILEGES;
 4
 5 # 创建数据库test,并在该数据库中创建表table1
 6 CREATE DATABASE test;
 7 CREATE TABLE table1(
 8  col1 VARCHAR(50),
 9  col2 VARCHAR(50)
10 );
11
12 # 在表table1中插入两行记录
13 INSERT INTO table1(col1, col2) VALUES(1, 'Belter'), (2, 'Merry Christmas');

数据文件可以直接复制到另一个文件夹来备份(所有者修改为ods:ssh_keys,与原数据文件相同)

使用docker-compose配置数据库


利用上面的方法可以快速开启一个数据库容器,连接后就可以使用。但是配置的参数都写在命令行中不利于后面的维护。此时可以使用docker-compose来保存配置文件:

对于数据库来说,主要需要以下几方面的配置:用户及密码,数据文件存放的位置,端口,字符集。

下面是我的配置文件:

 1 version: '2.2'
 2
 3 services:
 4   db:
 5     image: mariadb:5.5
 6     restart: always
 7     environment:
 8       - MYSQL_HOST=localhost
 9       - MYSQL_PORT=3306 # port in container
10       - MYSQL_ROOT_HOST=%
11       - MYSQL_DATABASE=test
12       - MYSQL_USER=belter
13       - TZ=Asia/Shanghai
14     volumes:
15       - ~/mdbdata/mdb55:/var/lib/mysql
16     ports:
17       - 3303:3306
18     command:
19       - --character-set-server=utf8mb4
20       - --collation-server=utf8mb4_unicode_ci
21       - --skip-character-set-client-handshake

更多关于docker-compose.yml文件的介绍,可参考我的上一篇博客:使用docker搭建数据分析环境

  • environment是对容器内部来说的,第10行设置为"%"表示允许使用root远程连接数据库,第11行指定了MYSQL_USER直接访问的数据库,MYSQL_USER需要手动添加;
  • 修改完root密码后,就不需要在environment中指定MYSQL_ROOT_PASSWORD这一参数了,该参数相当于指定了数据库初始化时的root密码;
  • 第19-21行,配置了数据库的字符集,更多可参考link1link2
  • host的端口换成3303

停止之前运行的容器,并使用docker-compose启动上面配置好的容器:

 1 [belter@localhost mariadb]$ docker stop c7f2cd8ed93d
 2 c7f2cd8ed93d
 3 [belter@localhost mariadb]$ docker-compose up -d
 4 Creating network "mariadb_default" with the default driver
 5 Creating mariadb_db_1 ... done
 6 [belter@localhost mariadb]$ docker-compose logs
 7 Attaching to mariadb_db_1
 8 db_1  | 181225 18:04:11 [Note] mysqld (mysqld 5.5.60-MariaDB-1~trusty) starting as process 1 ...
 9 db_1  | 181225 18:04:11 InnoDB: The InnoDB memory heap is disabled
10 db_1  | 181225 18:04:11 InnoDB: Mutexes and rw_locks use GCC atomic builtins
11 db_1  | 181225 18:04:11 InnoDB: Compressed tables use zlib 1.2.8
12 db_1  | 181225 18:04:11 InnoDB: Using Linux native AIO
13 db_1  | 181225 18:04:11 InnoDB: Initializing buffer pool, size = 256.0M
14 db_1  | 181225 18:04:11 InnoDB: Completed initialization of buffer pool
15 db_1  | 181225 18:04:11 InnoDB: highest supported file format is Barracuda.
16 db_1  | 181225 18:04:11  InnoDB: Waiting for the background threads to start
17 db_1  | 181225 18:04:12 Percona XtraDB (http://www.percona.com) 5.5.59-MariaDB-38.11 started; log sequence number 1601918
18 db_1  | 181225 18:04:12 [Note] Plugin 'FEEDBACK' is disabled.
19 db_1  | 181225 18:04:12 [Note] Server socket created on IP: '0.0.0.0'.
20 db_1  | 181225 18:04:12 [Warning] 'proxies_priv' entry '@ root@c7f2cd8ed93d' ignored in --skip-name-resolve mode.
21 db_1  | 181225 18:04:12 [Note] Event Scheduler: Loaded 0 events
22 db_1  | 181225 18:04:12 [Note] mysqld: ready for connections.
23 db_1  | Version: '5.5.60-MariaDB-1~trusty'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution
  • 第1行停止了之前的容器(停止后3301端口就无法访问了);
  • 第3行从docker-compose启动了新的数据库容器;
  • 第6行查看容器开启之后的日志,第22行显示数据库已经可以正常连接.

使用上面的方法,连接host的3303端口:

 1 [xiongxin@localhost mariadb]$ mysql -u root -padmin1 -h 127.0.0.1 -P3303
 2 Welcome to the MariaDB monitor.  Commands end with ; or \g.
 3 Your MariaDB connection id is 2
 4 Server version: 5.5.60-MariaDB-1~trusty mariadb.org binary distribution
 5
 6 Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
 7
 8 Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 9
10 MariaDB [(none)]> show databases;
11 +--------------------+
12 | Database           |
13 +--------------------+
14 | information_schema |
15 | mysql              |
16 | performance_schema |
17 | test               |
18 +--------------------+
19 4 rows in set (0.00 sec)
20
21 MariaDB [(none)]> select * from test.table1;
22 +------+-----------------+
23 | col1 | col2            |
24 +------+-----------------+
25 | 1    | Belter          |
26 | 2    | Merry Christmas |
27 +------+-----------------+
28 2 rows in set (0.00 sec)
29
30 MariaDB [(none)]> 

可以正常连接,且之前的数据还可以查询到。

在另一个容器中连接数据库


创建另一个文件夹"query-db",从另外一个镜像上开启一个新的容器,如果这个容器需要连接上面的数据库容器该怎么办呢?

下面使用的镜像可以在我的docker hub中下载到:django_py35_new,更多关于这个问题的讨论可以参考Stack OverFlow

直接使用host的IP(127.0.0.1)和本地的端口(3303)无法连接。这时候需要使用docker内部自己建立的网络将这两个容器连接起来。

在该文件夹下创建如下docker-compose.yml文件:

 1 version: '2.2'
 2
 3 services:
 4   djangoApp:
 5     image: onlybelter/django_py35_new
 6     # restart: on-failure
 7     command: python3 query_db.py
 8     working_dir: /code
 9     volumes:
10       - ./code:/code
11       - /etc/localtime:/etc/localtime:ro
12     environment:
13       - PYTHONUNBUFFERED=1
14
15 networks:
16   default:
17     external:
18       name: mariadb_default

并且在该文件夹下创建新的文件夹"code",并将名为query_db.py的文件放到code文件夹,该文件内的代码如下:

import MySQLdb
import time

def q_db():
    db = MySQLdb.connect(host='db', port=3306, user='root',
                         passwd='admin1', db='test')
    try:
        q_queue = """SELECT a.col2 FROM table1 AS a;"""
        with db.cursor() as cursor:
            cursor.execute(query=q_queue)
            one_queue = cursor.fetchall()
            print(one_queue[0], one_queue[1], '\n')
    except Exception as e:
        print(e)
    finally:
        db.close()

while 1:
    q_db()
    time.sleep(5)
  • 在上面的docker配置文件中的第7行,会执行code文件夹中名为"query_db.py"的Python脚本,即上面所示的Python代码;
  • 配置文件的第15-18行,添加了数据库容器中默认网络的名称"mariadb_default"作为自己的一个扩展网络(一般由文件夹的名称+"_default");

整体的目录结构如下:

mariadb  # 数据库容器所在的文件夹
  docker-compose.yml
query-db  # 查询数据库的另一个容器所在的文件夹
  docker-compose.yml
  code  # code文件夹
    query_db.py

可以使用下面的命令来查看当前正在运行的容器所属的网络(通常名称为外部的文件夹名称加一个"_default"后缀):

1 [belter@localhost query-db]$ docker network ls
2 NETWORK ID          NAME                   DRIVER              SCOPE
3 1d35e7fb797c        bridge                 bridge              local
4 8a2336ca7bcc        djangopy35_default     bridge              local
5 8d044b04d49f        mariadb_default        bridge              local

由于扩展网络的连接,上面的Python代码会查询之前建立的数据库容器(名称为db,配置文件中service的名称)的3306端口(docker的内网),然后输出数据库中的内容:

1 [belter@localhost query-db]$ docker-compose up
2 Starting querydb_djangoApp_1 ... done
3 Attaching to querydb_djangoApp_1
4 djangoApp_1  | ('Belter',) ('Merry Christmas',)
5 djangoApp_1  |
6 djangoApp_1  | ('Belter',) ('Merry Christmas',)
7 djangoApp_1  |
8 djangoApp_1  | ('Belter',) ('Merry Christmas',)
9 djangoApp_1  | 

Reference


https://mariadb.com/resources/blog/mariadb-and-docker-use-cases-part-1/

https://stackoverflow.com/a/47980388/2803344

docker中的数据库的更多相关文章

  1. 在Docker中体验数据库之MySql

    在上一篇在Docker中体验数据库之Mongodb之后,这次记录一下在docker中安装mysql.过程要比Mongodb麻烦一点…… 参考网址: https://dev.mysql.com/doc/ ...

  2. 在Docker中体验数据库之Microsoft SQL Server

    前面记录了一下在docker中体验mongodb和mysql.今天记录一下mssql……其实早就体验了,就是没有记录,前几天看了一下2019的一些新闻,很喜欢Polybase这个特性,想体验一把,可惜 ...

  3. 【web开发】docker中的数据库

    注:自从开始使用docker,部署方面的事情就简单多了.使用docker构建的数据库容器不用直接安装,开启后就可以使用,也比以前方便很多.下面将一些要点记录下来. 下面的例子使用以下环境: - 系统( ...

  4. docker中mysql数据库

    在docker中安装mysql数据库,直接上代码,pull 并run 补充20190809=============== 如果要挂载数据库实现数据持久化到本地的时候,会出现权限问题,这个原因是: 在执 ...

  5. 在Docker中体验数据库之Mongodb

    本文记录一下,在docker中安装Mongodb的过程. 环境:物理机 ubuntu18.04 因为环境变了,我在一台物理机上直接安装了ubuntu(非虚拟机和双系统),制作U盘镜像.安装参考:htt ...

  6. docker中mysql数据库的数据导入和导出

    导出数据 查看下 mysql 运行名称 docker ps 结果:  执行导出(备份)数据库命令: 由第一步的结果可知,我们的 mysql 运行在一个叫 mysql_server 的 docker ...

  7. 在Docker中使用Microsoft SQL Server数据库

    下图中对SQL Server容器创建及数据库创建等操作进行了记录,方便自己日后查看.(文中的 * 仅表示隐藏自己的个人信息,手动马赛克,哈哈-) Docker下载可看上一篇博文mac系统,docker ...

  8. linux小白成长之路8————访问Docker中的mysql

    [内容指引] 本篇实战演示如何操作Docker中的mysql数据库,包含以下五个知识点: 登录容器: 登录mysql: 运行SQL指令创建数据库: 退出mysql: 退出容器: 1.登录容器 我们在上 ...

  9. C#.Net Core 操作Docker中的redis数据库

    做软件开发的人,会在本机安装很多开发时要用到的软件,比如数据库,有MS SQL Server,MySQL,等,如果每种数据库都按照在本机确实有点乱,这个时候我们就想用虚拟机来隔离,这样就不会扰乱本机一 ...

随机推荐

  1. WPF: Hide grid row

    http://stackoverflow.com/questions/2502178/wpf-hide-grid-row Setting all the Items in the Row to Vis ...

  2. aop日志记录

    1.自定义 package cc.mrbird.common.annotation; import java.lang.annotation.ElementType; import java.lang ...

  3. 51Nod1336 RMQ逆问题 其他

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1336.html 题目传送门 - 51Nod1336 题意 题解 我们将输入的一个区间的答案称为 V ...

  4. 51Nod1253 Kundu and Tree 容斥原理

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1253.html 题目传送门 - 51Nod1253 题意 树包含 N 个点和 N-1 条边.树的边有 ...

  5. ConcurrentModificationException(并发修改异常)的分析

    1)介绍 并发修改ConcurrentModificationException错误是开发中一个常见错误,多发生在对一个Collection边遍历边做影响size变化的操作中,下面以ArrayList ...

  6. springmvc+ajax——第二讲(页面缓存)

    springmvc+ajax+页面缓存(参考:https://www.cnblogs.com/liuling/archive/2013/07/25/2013-7-25-01.html) 必须设置响应头 ...

  7. 03. Pandas 2| 时间序列

    1.时间模块:datetime datetime模块,主要掌握:datetime.date(), datetime.datetime(), datetime.timedelta() 日期解析方法:pa ...

  8. Trident继承kafka

    1.Kafka涉及的类 上一个类是不透明事务 后一个是完全事务 2.启动服务 3..驱动类 重要的地方是修改了两个部分: 1.数据的来源是kafka 2.第二个是字段的Fields是str packa ...

  9. PAT (Basic Level) Practise - 写出这个数

    题目链接:https://www.patest.cn/contests/pat-b-practise/1002 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试 ...

  10. Aladdin and the Flying Carpet(唯一分解定理)

    题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况: 题目分析:根据唯一分解定理,先将a唯一分解,则a的所有正约数的个 ...