注:自从开始使用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. python 对象存储///对象序列化

    如果你有写数据来之不易,并且希望每次都可以方便的读取,那么存储为一个对象是一个很不错的解决方法 方法一. import pickle #首先要导入包 dics={'a':4,'b':5,'c':6}# ...

  2. Python知识回顾 —— 面向对象

    博客转载自 http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/linhaifeng/articles/62040 ...

  3. Python hasattr,getattr,setattr,delattr

    #!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # 反 ...

  4. java日志的相关配置文件知识

    w2bc.com/article/261758”“”“

  5. gradle上传本地文件到远程maven库(nexus服务器)

    自定义aar-upload.gradle文件 artifacts { archives file('./build/outputs/aar/Lib_ads-baidu-debug.aar') } up ...

  6. Radar Installation POJ - 1328(贪心)

    Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. ...

  7. Ajax技术使用(一)

    Ajax技术使用 目录 AJAX介绍 XMLHttpRequest 请求和响应 onreadystatechange 事件 AJAX介绍 什么是 AJAX AJAX = 异步 JavaScript 和 ...

  8. 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(en ...

  9. Alpha(5/10)

    鐵鍋燉腯鱻 项目:小鱼记账 团队成员 项目燃尽图 冲刺情况描述 站立式会议照片 各成员情况 团队成员 学号 姓名 git地址 博客地址 031602240 许郁杨 (组长) https://githu ...

  10. 2018.12.1 Test

    目录 2018.12.1 Test A 串string(思路) B 变量variable(最小割ISAP) C 取石子stone(思路 博弈) 考试代码 B C 2018.12.1 Test 题目为2 ...