docker容器化~1.mysql容器部署


前言

​ MySQL是最受欢迎的关系型数据库,是开发人员选择最为广泛的数据存储数据库。以下将介绍Docker安装MySQL的方式。

​ Docker安装MySQL需要涉及的内容:

  • Docker –network模式。要了解Docker容器网络,先了解Docker的网络模型CNM(Container Network Model)
  • Docker -v 共享目录

1. Docker NetWork

​ Docker默认会提供三个网络:host,bridge,none。网络隔离是基于Linux内核的Namespace技术实现资源隔离的。可参考 Docker底层网络隔离

  • None网络:不会为容器分配单独的网络环境/资源,容器之间无法通信。
  • Bridge网络:默认的网络类型,当启动容器的时候,会默认创建一个网络名为docker0的网络,并分配IP地址。可通过该IP地址访问容器。
  • Host网络:当使用host网络时,容器启动后并不会分配虚拟的docker0,而是直接使用宿主机的网络,即 容器与宿主机的网络没有隔离。

注意:通过docker run创建容器时,该容器会默认分配bridge网络。

2. mysql容器

​ 创建容器的方法其实很简单,但是基本都是创建一个单独网络环境的mysql容器,并通过端口映射来访问数据库。下面将创建基于bridge网络的mysql容器 以及 基于host网络的mysql容器。

2.1 基于bridge网络的mysql容器

创建bridge网络的容器命令如下:

1
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

注意:

  • 由于默认创建的容器使用的是bridge网络,因此想通过外网访问数据库,则需要将宿主机的3306端口与容器的3306端口做映射。(宿主机并不一定开通3306,其他端口也可以)。
  • 如果其他处于bridge网络下的容器,也需要访问mysql容器。解决办法有两个:
    • 通过 宿主机外网IP:3306 来访问
    • 启动不同容器时,将他们的网络设置为同一个bridge网络,然后通过 网络别名:3306 来访问

2.2 基于host网络的mysql容器

创建host网络的容器命令如下:

1
docker run --restart=always --network host -d --name mysql -v /var/lib/mysql-files:/var/lib/mysql-files -v /etc/mysql:/etc/mysql -v /var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD='password' mysql --default-authentication-plugin=mysql_native_password

注意:

  • 启动命令直接指定—network参数为host
  • 本地创建 /var/lib/mysql-files 和 /var/lib/mysql空目录,用于存储数据库的数据
  • 共享/etc/mysql目录,主要配置数据库相关参数

设定以上参数的目的:

  • 通过以上命令创建成功后,可直接通过宿主机127.0.0.1:3306即可访问mysql容器提供的数据库服务,因为mysql容器和宿主机处于一个网络

  • mysql容器保存的数据存储在宿主机,以免容器挂掉,数据丢失

3 /etc/mysql数据库配置

基于2.2中的容器启动方式,路径/etc/mysql下的文件如下所示:

|— mysql

​ |— config

​ |— docker.cnf

​ |— mysql.cnf

​ my.cnf

3.1 my.cnf配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/lib/mysql/mysql.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
symbolic-links=0

default-time_zone = '+8:00'

character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake
max_connections=1024

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_BACKSLASH_ESCAPES,NO_AUTO_VALUE_ON_ZERO
!includedir /etc/mysql/conf.d/

[client]
socket = /var/lib/mysql/mysql.sock

/etc/mysql/my.cnf为启动mysql的时候会被主动加载的文件。理解了my.cnf中的众多配置,才可以对数据库进行性能优化。以下对my.cnf参数做简单的解释:

客户端参数解释:

1
2
3
4
[client]                          #客户端设置,即客户端默认的连接参数
port = 3306                  #默认连接端口
socket = /var/lib/mysql/mysql.sock    #用于本地连接的socket套接字
default-character-set = utf8mb4        #编码

服务端参数解释

1
2
3
4
5
6
7
[mysqld]                       #服务端基本设置
port = 3306 MySQL监听端口
socket = /var/lib/mysql/mysql.sock   #为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
pid-file = /var/run/mysqld/mysqld.pid   #pid文件所在目录
datadir = /var/lib/mysql      #数据文件存放的目录
character_set_server = utf8mb4        #服务端默认编码(数据库级别)
collation_server = utf8mb4_bin        #服务端默认的比对规则,排序规则

更多参数可参考: 参数解释地址

3.2 docker.cnf配置

1
2
3
[mysqld]
skip-host-cache
skip-name-resolve

3.3 mysql.cnf配置

1
[mysql]

文章作者: 王海飞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 王海飞 !
  目录