用 Docker 运行数据库

MySQL

MySQL 是最流行的开源关系型数据库。

下载

下载最常用的 5.7 版本:

root@server4 ~]$ docker search --filter=is-official=true mysql
NAME         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql        MySQL is a widely used, open-source relation…   11582     [OK]  
[root@server4 ~]$ docker pull mysql:5.7.28

MySQL 服务中主要使用的目录如下:

路径 说明
/etc/mysql/conf.d/ MySQL 配置文件目录。
/var/lib/mysql/ MySQL 数据文件目录。
/var/log/mysql/ MySQL 日志文件目录。

MySQL 服务使用的端口如下:

端口 说明
3306 服务端口

配置

启动一个随机的 MySQL 容器,将配置目录复制出来:

[root@server4 ~]$ docker run --name tempm -d -e MYSQL_ALLOW_EMPTY_PASSWORD=1 mysql:5.7.28
bcf418aec03085c97aeb4336b6cecbb4157dfcaa2f9affbc1a4b64f47a93ca12
[root@server4 ~]$ mkdir -p mysql
[root@server4 ~]$ docker cp -a tempm:/etc/mysql/conf.d mysql/conf.d
[root@server4 ~]$ docker rm -f tempm

配置文件 mysql.cnf 内容参考如下:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error      = /var/log/mysql/error.log

sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

symbolic-links=0
lower_case_table_names=1
max_allowed_packet = 32M
interactive_timeout = 120
wait_timeout = 120
innodb_flush_log_at_trx_commit = 0
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
server-id=100
log-bin=/var/log/mysql/mysql-bin 
skip_ssl
# disable_ssl

expire_logs_days = 4
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow_query.log
long_query_time = 5
query_cache_limit = 10M
query_cache_min_res_unit = 4096
query_cache_size = 1G
query_cache_type = 1
query_cache_wlock_invalidate = 0
log_bin_trust_function_creators = 1

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

启动

修改好配置文件后,挂载目录和映射端口启动:

[root@server4 ~]$ docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=mysqlpass -p 3306:3306 -v mysql/conf.d:/etc/mysql/conf.d:ro -v mysql/data:/var/lib/mysql mysql:5.7.28
903380791a9ce92461c76fe794b51296312cd685d2cf761bd85fe07d0d86bb2d
[root@server4 ~]$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
903380791a9c   mysql          "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   mysql

使用 Docker-Compose 启动的配置文件参考如下:

version: '3.9'

services:
  mysql:
    image: mysql:5.7.28
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=QeqAr:%R+s5:pYnr
    volumes:
      - ./config/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - ./data:/var/lib/mysql
      - ./log:/var/log/mysql

注意,日志目录 log 要手动配置属主和数组,否则会启动报错:

root@k8s-204:~/mysql$ chown lxd:docker log

使用

可以使用 MySQL 镜像作为客户端连接:

[root@server1 ~]$ docker run -it --rm mysql mysql -h192.168.2.241 -uroot -p
Enter password: 

修改 MySQL 的 root 用户密码:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysqlpass';
Query OK, 0 rows affected (0.01 sec)

或者用 set 命令。修改完毕用 FLUSH PRIVILEGES 来生效:

mysql> set password for 'root'@'%' = password('密码');
FLUSH PRIVILEGES;

MongoDB

MongoDB 是一款开源文档数据库(Document-Oriented),是当前最流行的 NoSQL 数据库。

下载

MongoDB 5 以上版本,要求 CPU 必须支持 AVX 指令集,否则启动会失败。为了适用性这里使用 4.4.9 版本:

[root@server4 ~]$ docker search --filter=is-official=true mongo
NAME            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mongo           MongoDB document databases provide high avai…   8243      [OK]       
mongo-express   Web-based MongoDB admin interface, written w…   1071      [OK]  
[root@server4 ~]$ docker pull mongo:4.4.9

MongoDB 服务中主要使用的目录如下:

路径 说明
/data/db/ MongDB 数据库存放目录

MongoDB 服务使用的端口如下:

端口 说明
27017 服务端口
28017 HTTP 访问端口

启动

可以不修改配置文件,挂载目录和映射端口启动,并设置 root 账号密码为 root:

[root@server4 ~]$ docker run -d -p 27017:27017 -p 28017:28017 --name mongo -v /docker/mongodb/db:/data/db -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=root mongo:4.4.9
14d297ff4282ea50bbcb0383ebb51e0fc6da0685dd83cfa9775892803da1b7a5
[root@server4 ~]$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                                                                          NAMES
14d297ff4282   mongo          "docker-entrypoint.s…"   7 seconds ago   Up 5 seconds   0.0.0.0:27017->27017/tcp, :::27017->27017/tcp, 0.0.0.0:28017->28017/tcp, :::28017->28017/tcp   mongo

使用 Docker-Compose 启动的配置文件参考如下:

version: '3.9'

services:
  mongo:
    image: mongo:4.4.9
    container_name: mongo
    restart: always
    ports:
      - "27017:27017"
    volumes:
      - ./data:/data/db