前言
本文记录docker和docker-compose两种方式安装使用mysql。从简单快速使用入手,再根据实际场景不断完善更符合开发/生产环境的配置实践。
- 环境准备
- 操作系统:centos7.4 (下载:https://renwole.com/archives/1526)
- docker版本:20.10.11
一. docker安装mysql_5.7
1. 快速启动版
1.1 拉取镜像
docker pull mysql:5.7
1.2 安装
docker run -itd --name mysql_01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
- -i: 交互式操作。
- -t: 终端。
- -d: 在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
- –name: 容器名称(非必需)
- -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
- e MYSQL_ROOT_PASSWORD=123456:指定环境变量,这里设置 MySQL 服务 root 用户的密码。
1.3 查看进程
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5fa2b58a0e8 mysql:5.7 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql_01
1.4 查看日志
[root@docker ~]# docker logs mysql_01
2. 使用mysql
2.1 连接msql
- 进入mysql_01容器
[root@localhost ~]# docker exec -it mysql_01 bash
- 连接数据库
mysql -u root -p
mysql -u root -p
root@d357051fa903:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.37 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2.2 创建数据库
CREATE DATABASE `demo_01` default CHARACTER set utf8 COLLATE utf8_general_ci;
- CREATE DATABASE
demo_01
— 代表的是创建数据库 demo_01。 - DEFAULT CHARACTER SET utf8 — 代表的是将该库的默认编码格式设置为utf8格式。
- COLLATE utf8_general_ci — 代表的是数据库校对规则,utf8_bin将字符串中的每一个字符用二进制数据存储,区分大小写。utf8_genera_ci不区分大小写,ci为case insensitive的缩写,即大小写不敏感。utf8_general_cs区分大小写,cs为case sensitive的缩写,即大小写敏感
utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果
utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容
查看数据库创建信息
show crate database demo_01;
2.3 删除数据库
drop database demo_01;
二. docker-compose安装mysql_5.7
1.安装docker-compose
2.快速启动版
2.1 定义mysql_simple.yaml
version: "2"
services:
mysql:
container_name: mysql_simple
image: mysql:5.7
#env_file:
#- ../env/mysql.env
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_USER: 'test'
MYSQL_PASS: 'test'
volumes:
- ./mysql:/var/lib/mysql
ports:
- "3306:3306"
- image:为你拉取镜像的地址和版本,当然也可以换成自己的镜像仓库,这里使用官方的。
- volumes:里面的参数为映射本地和docker容器里面的文件夹和目录。
- ports:为映射端口。
- MYSQL_ROOT_PASSWORD:为数据库的密码,也就是root用户的密。
- MYSQL_USER和MYSQL_PASS:代表用户名和密码。
2.2 启动mysql_simple.yaml 服务
docker-compose -f mysql_simple.yaml up
2.3 关闭mysql_simple.yaml 服务
docker-compose -f mysql_simple.yaml down
3.快速启动版–指定初始化数据库
一个应用服务一般连接, docker的mysql容器对应的业务数据库, 并且使用专用账号密码。如果mysql容器创建时候,同时完成数据库初始化和账号创建。这样在一个新环境,快速部署一套服务时候,可以进一般减少手动操作的环节。
3.1 定义mysql_init_db.yaml
vi mysql_init_db.yaml
version: "2"
services:
mysql:
container_name: mysql_init_db
image: mysql:5.7
#env_file:
#- ../env/mysql.env
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_USER: 'test'
MYSQL_PASS: 'test'
volumes:
- ./mysql:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d/ # sql初始化目录
ports:
- "3306:3306"
3.2 创建初始化脚本
- 创建初始化脚本目录
mkdir -p init
- 创建初始化脚本
vi /init/db_demo_01.sql
- 脚本内容
create database db_demo_01 default charset 'utf8';
use db_demo_01;
create table user
(
id int auto_increment primary key,
username varchar(64) unique not null,
email varchar(120) unique not null
);
insert into user values(1, "zhangsan","test12345@qq.com");
insert into user values(2, "lisi","12345test@qq.com");
3.3 启动mysql_init_db.yaml 服务
docker-compose -f mysql_init_db.yaml up
3.4 授权创建的账号
- 进入容器
docker exec -it mysql_init_db bash
- 使用root账号授权
mysql -u root -p
> grant all on db_demo_01.* to 'test'@'%' identified by 'test';
> flush privileges;
> quit
注意./init中sql脚本只会首次运行创建./mysql,执行一次。
4.快速启动版–指定初始化数据库及账号授权
通过上面的快速启动版, 已经实现了创建容器自带业务库和账号信息,但是授权操作还是过于麻烦,账号授权其实可以和创建数据库同时进行。
vi /init/db_demo_01.sql
优化创建脚本补充授权信息
create database db_demo_01 default charset 'utf8';
grant all on db_demo_01.* to 'test'@'%' identified by 'test';
flush privileges;
use db_demo_01;
create table user
(
id int auto_increment primary key,
username varchar(64) unique not null,
email varchar(120) unique not null
);
insert into user values(1, "zhangsan","test12345@qq.com");
insert into user values(2, "lisi","12345test@qq.com");
这样可以为不同的微服务,初始化不同数据库环境。
- init/
- db_service_01.sql 独立账号/密码
- db_servcie_02.sql 独立账号/密码
上面场景更多适合快速创建成熟的产品的数据环境或者是演示库,如果在开发阶段,数据库设计经常需要变动, 推荐使用liquibase通过版本化来管理数据库脚本。SpringBoot_liquibase使用