博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker安装mysql数据库映射_一步一步学会如何在Docker中安装MySQL数据库并配置可远程访问和连接...
阅读量:5869 次
发布时间:2019-06-19

本文共 6540 字,大约阅读时间需要 21 分钟。

前言

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

使用docker,你可以轻松地启动基于镜像的不同软件版本的容器。

你也可以在一台主机中创建诸多不同的容器,这些容器彼此独立,互不影响。

并且,每个docker镜像都是版本可控的。

这篇文章,我将为大家分享如何在docker中一步一步安装MySQL数据库,并且配置远程可访问。

第一步、拉取MySQL镜像

MySQL的镜像有很多,本文使用的是mysql/mysql-server镜像,拉取mysql/mysql/mysql-server镜像,命令如下:

docker pull mysql/mysql-server:latest

日志如下:

ubuntu@VM-0-9-ubuntu:~$ docker pull mysql/mysql-server:latest

latest: Pulling from mysql/mysql-server

a316717fc6ee: Pull complete

11af9372e1ad: Pull complete

3edd2f9154a6: Pull complete

f71a5f0dcc26: Pull complete

Digest: sha256:2a55d7081363a869ea9ea2513bb31439bae59981530b9d1890b3771a6cebefe9

Status: Downloaded newer image for mysql/mysql-server:latest

docker.io/mysql/mysql-server:latest

查看docker中所有镜像

docker images

日志如下:

ubuntu@VM-0-9-ubuntu:~$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

mysql/mysql-server latest b172b40598f0 3 weeks ago 350MB

hello-world latest fce289e99eb9 10 months ago 1.84kB

第二步、在docker容器中启动MySQL实体

现在,我们可以使用docker run命令启动一个mysql-server实例:

docker run --name=mysql1 -d mysql/mysql-server注: 其中的mysql1表示为当前的mysql-server实例指定一个自定义的容器名称,这个参数是可选的,如果不指定此参数,则会生成一个随机的容器名称。-d参数表示在后台运行当前的docker run命令,如需打印mysql1运行的日志,可以使用如下命令:

docker logs mysql1

一旦初始化完成,命令会自动为root用户生成一个随机密码并打印在日志中。

以上运行的docker runMySQL实例只能用于本地连接,如果你的MySQL实例需要允许远程访问和连接,则要为MySQL实例指定端口并设置环境变量MYSQL_ROOT_HOST以允许来自其他主机的连接,docker run命令如下:

docker stop mysql1 && docker rm mysql1 #先停止并删除mysql1服务

docker run --name=mysql1 -e MYSQL_ROOT_HOST=% -e -p 3306:3306 -d mysql/mysql-server如果要指定密码,请添加参数-e MYSQL_ROOT_PASSWORD=123456,如:

docker run --name=mysql1 -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql/mysql-server

日志如下:

ubuntu@VM-0-9-ubuntu:~$ sudo docker run —name=mysql1 -e MYSQL_ROOT_HOST=% -p 3306:3306 -d mysql/mysql-server

a76e9b8eef6c39ff5087d31cd46223cf720af64bbe15a85cc3404881c1ac0a37

再运行

docker logs mysql1

日志如下:

ubuntu@VM-0-9-ubuntu:~$ docker logs mysql1

[Entrypoint] MySQL Docker Image 8.0.18-1.1.13

[Entrypoint] No password option specified for new database.

[Entrypoint] A random onetime password will be generated.

[Entrypoint] Initializing database

2019-11-05T02:35:48.785221Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.18) initializing of server in progress as process 20

2019-11-05T02:35:51.984685Z 5 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the —initialize-insecure option.

[Entrypoint] Database initialized

2019-11-05T02:35:55.513277Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 67

2019-11-05T02:35:56.251721Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

2019-11-05T02:35:56.274981Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: ‘8.0.18’ socket: ‘/var/lib/mysql/mysql.sock’ port: 0 MySQL Community Server - GPL.

2019-11-05T02:35:56.344027Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: ‘/var/run/mysqld/mysqlx.sock’

Warning: Unable to load ‘/usr/share/zoneinfo/iso3166.tab’ as time zone. Skipping it.

Warning: Unable to load ‘/usr/share/zoneinfo/leapseconds’ as time zone. Skipping it.

Warning: Unable to load ‘/usr/share/zoneinfo/tzdata.zi’ as time zone. Skipping it.

Warning: Unable to load ‘/usr/share/zoneinfo/zone.tab’ as time zone. Skipping it.

Warning: Unable to load ‘/usr/share/zoneinfo/zone1970.tab’ as time zone. Skipping it.

[Entrypoint] GENERATED ROOT PASSWORD: oDulSiv@cIz]3t=0N[Oded@bBoz

[Entrypoint] ignoring /docker-entrypoint-initdb.d/*

2019-11-05T02:35:58.099733Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.18).

2019-11-05T02:35:59.590395Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.18) MySQL Community Server - GPL.

[Entrypoint] Server shut down

[Entrypoint] Setting root user as expired. Password will need to be changed before database can be used.

[Entrypoint] MySQL init process done. Ready for start up.

[Entrypoint] Starting MySQL 8.0.18-1.1.13

2019-11-05T02:36:00.418693Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 1

2019-11-05T02:36:00.927563Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.

2019-11-05T02:36:00.963953Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: ‘8.0.18’ socket: ‘/var/lib/mysql/mysql.sock’ port: 3306 MySQL Community Server - GPL.

2019-11-05T02:36:01.106180Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: ‘/var/run/mysqld/mysqlx.sock’ bind-address: ‘::’ port: 33060

运行如下命令查看自动生成的root用户的密码:

docker logs mysql1 2>&1 | grep GENERATED

日志如下:

ubuntu@VM-0-9-ubuntu:~$ docker logs mysql1 2>&1 | grep GENERATED

[Entrypoint] GENERATED ROOT PASSWORD: oDulSiv@cIz]3t=0N[Oded@bBoz

其中的oDulSiv@cIz]3t=0N[Oded@bBoz即为随机生成的密码,请记录下来,后面登录MySQL的root用户会用到。

将MySQL的数据持久化到主机物理硬盘

默认情况下,docker容器中的MySQL实例的数据是存储在docker虚拟空间中的。所以,如果容器不存在了(被删除),那么该MySQL实例的所有数据也就会丢失。

所以,生产环境中我们非常有必要将docker容器中的MySQL实例的数据持久化在主机物理硬盘中,这样可避免在容器实例被删除的情况下数据同时丢失的风险。

具体操作是指定docker容器中MySQL实例的虚拟存储目录与物理主机存储目录的映射,如下:

docker run --name=mysql1 -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql/mysql-server其中的参数-v /my/own/datadir:/var/lib/mysql即为存储目录的映射关系,/my/own/datadir指物理主机真实的目录,所以请确保该目录真实存在,/var/lib/mysql是docker容器中MySQL实例的默认数据存储路径。

第三步、连接到MySQL实例

接下来,我们使用docker exec运行MySQL的命令行以连接到刚才创建的MySQL实例,如下:

docker exec -it mysql1 mysql -u root -p

输入上面创建的随机密码。

日志如下:

ubuntu@VM-0-9-ubuntu:~$ docker exec -it mysql1 mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 367

Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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>

到此,我们成功连接上docker窗口中本地的MySQL实例了。

由于root用户的密码是随机创建的,所以运行如下MySQL语句以修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY '';其中的修改成你的密码

到这里,在docker容器中安装MySQL数据库的基本操作就完成了。你可以通过3306端口远程访问此MySQL实例(如果是阿里云或者腾讯云上安装的,请将3306端口添加到允许的安全组中)。

可能的问题

在远程连接时,你可能遇到如下的问题:

mysql plugin caching_sha2_password could not be loaded

可以运行如下的命令来修改root用户的加密规则:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '';

转载地址:http://wytnx.baihongyu.com/

你可能感兴趣的文章
微软整合实验(七):布署Exchange2010 Mailbox高可用(DAG)
查看>>
spring定时器----JobDetailBean
查看>>
我的友情链接
查看>>
XP下如何删除附件中的游戏组件
查看>>
我的友情链接
查看>>
emma的几个不足之处
查看>>
Java工具类——UUIDUtils
查看>>
使用Node搭建reactSSR服务端渲染架构
查看>>
文件缓存
查看>>
转 博弈类题目小结(hdu,poj,zoj)
查看>>
Java NIO学习笔记八 Pipe
查看>>
远程协助
查看>>
Scrum实施日记 - 一切从零开始
查看>>
关于存储过程实例
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
AIX 7.1 install python
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
福利丨所有AI安全的讲座里,这可能是最实用的一场
查看>>