前戏
大家可能都在服务器上搭建过mysql,或许遇到过不少的坑。但是使用docker部署mysql则很容易
mysql的镜像文档:https://hub.docker.com/_/mysql
docker部署mysql
拉取mysql 5.7的镜像
docker pull mysql:5.7
查看镜像
docker images
启动镜像
docker run --name zzmysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=zou123456 -d mysql:5.7
# 上面的没有挂载,也不是最新的mysql,最新的django已经不支持5.7了,所以这里使用最新的mysql,挂载到本地的 /var/lib/mysql目录下 docker run -d --name mydb -v mysql:/var/lib/mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=zou123456 mysql
说明:
- --name 后面是指定的容器名
- -p 代表端口映射,格式为 宿主机映射端口:容器运行端口
- -e 代表添加环境变量
- MYSQL_ROOT_PASSWORD是root用户的登陆密码
- mysql:5.7 是下载的镜像+版本(若不指定版本,该命令会重新下载mysql最新的镜像)
- -d 后台启动
外网访问的是3307端口
进入容器内部
# 最简单的进入方式 docker exec -it <contrainerId> /bin/bash # 这种方式下,数据库才可输入和展示中文数据 docker exec -it <contrainerId> env LANG=C.UTF-8 /bin/bash
我们这里使用简单的进入方式
docker exec -it zzmysql /bin/bash
执行建库建表插入数据
-- 建库 create database `db_student`; SET character_set_client = utf8; use db_student; -- 建表 drop table if exists `user`; CREATE TABLE user ( id tinyint(5) zerofill auto_increment not null comment '学生学号', name varchar(20) default null comment '学生姓名', age tinyint default null comment '学生年龄', class varchar(20) default null comment '学生班级', sex char(5) not null comment '学生性别', unique key (id) )engine=innodb charset=utf8; -- 插入数据 insert into user values('1','小明','15','初三','男'); insert into user values('2','小红','13','初二','女');
查询下user表里的数据
可以看出我们查询出来的数据name,classs,sex没有显示,这是因为这个镜像是外国人写得,所以对中文默认不支持
解决不显示中文的问题
这里解决方法有两种,第一种是在进入容器的时候设置环境变量,使用中文就可以了,命令如下,上面也说过
docker exec -it zzmysql env LANG=C.UTF-8 /bin/bash
env LANG=C.UTF-8 设置语言为utf-8
第二种使用dockerfile,在初始化的时候就设置好
创建一个init.sql文件,内容如下(和上面的一样)
创建dockerfile,内容如下
FROM mysql:5.7 WORKDIR /docker-entrypoint-initdb.d ENV LANG=C.UTF-8 ADD init.sql .
注意:dockerfile和init.sql在同一目录
ADD既可以复制也可以执行init.sql文件,copy只复制
构建docker镜像
docker build -t mysql:zou .
启动容器进入容器内部
docker run --name zzmysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=zou123456 -d mysql:zou
连接数据库,查看数据是否显示