web项目中经常会使用到mysql数据库,mongodb数据库,redis数据库,三种数据库的配置相当麻烦,但是使用docker会让配置变得非常简单。
搭建mysql数据库命令非常简单
docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=asd123 -v /data/mysql1:/var/lib/mysql -d -p 3307:3306 mysql
命令解释:
--name 给容器命名
-e MYSQL_ROOT_PASSWORD=asd123 初始化mysql容器root账号密码为asd123
-v /data/mysql1:/var/lib/mysql 挂载数据卷到本地/data/mysql1,通过本地/data/mysql1访问容器内文件
-d 守护进程
-p 向外映射端口,让外网通过3307端口访问mysql服务
这样就搭建起了一个可供外部访问的mysql数据库,数据库的root账号密码是asd123
使用 docker ps 查看数据库状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a43bb6658a28 mysql:latest "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp mysql1
这个mysql容器也可以当做客户端,访问其他容器的mysql服务,我们再开启一个mysql数据库,并连接到刚才建好的数据库上
docker run --name mysql2 --link mysql1 -e MYSQL_ROOT_PASSWORD=asd123 -v /data/mysql2:/var/lib/mysql-d -p 3308:3306 mysql
使用mysql2容器去访问mysql1容器,
docker exec -it mysql2 mysql -u root -h mysql1 -P 3306 -pasd123
然后就进入mysql1的数据库里了,如果有其他机器,可以用其他机器的mysql客户端访问3307或3308这两个刚开放的端口
mysql -u root -h IP -P 3307 -p
这里的IP是指刚刚mysql服务器的IP
原来,MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_sha2_password),对此,我们将mysql用户使用的 登录密码加密规则 还原成 mysql_native_password,即可登陆成功。
具体操作:
首先使用 MySql 数据库自带的命令行客户端工具登录数据库
use mysql
从数据库的user表中查询 mysql 用户原来使用的身份验证插件
select user,host,plugin,authentication_string from user;
将用户root使用的身份验证插件 替换为之前版本使用的 mysql_native_password ,修改成功后再次使用客户端工具,如无其它意外 , 应该是可以正常连接登录了。
alter user ‘root’@’%’ identified with mysql_native_password by ‘asd123’;
运行mongo容器
docker run --name mongo2 -p 27019:27017 -v /data/mongo2/db:/data/db -d mongo --auth
运行docker ps 可以看到容器已经运行并监听了 27019 端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56036a23aa23 mongo "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 0.0.0.0:27019->27017/tcp mongo2
现在需要给容器设置一个密码,执行
docker exec -it mongo2 mongo admin
进入容器后创建root账号
> db.createUser({user:'shilin',pwd:'asd123',roles:[{role:'root',db:'admin'}]})
Successfully added user: {
"user" : "shilin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
这样就可以使用搭建好的mongo容器了
运行redis容器
docker run --name redis1 -d -p 6380:6379 -v /data/redisdb:/data redis
运行docker ps 可以看到容器已经运行并监听了 6380端口
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9fc955fcb43 redis "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:6380->6379/tcp redis
然后就是设置redis密码,可以通过设置临时密码或设置配置文件的方式设置密码
临时方式在容器 stop 后就失效了,不推荐使用
首先进入redis客户端 docker exec -it redis1 redis-cli,然后执行
127.0.0.1:6379> config set requirepass asd123
OK
127.0.0.1:6379> SET lin aaa
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth asd123
OK
127.0.0.1:6379> SET lin aaa
OK
但是 容器停止后就失效了。执行 docker restart redis1 来重启redis数据库
lin@iZ2zefq26zde3vcgsd3gzrZ:/data/mysql1$ docker exec -it redis1 redis-cli
127.0.0.1:6379> get lin
"aaa"
127.0.0.1:6379> SET lin bbb
OK
看到已经不需要密码了
第二种方案是使用本地的redis.conf 来启动服务,通过数据转将redis.conf 挂载到容器里,然后使用redis-server redis.conf 命令启动容器,这个方法以后再说.