创建镜像

拉取官方镜像(我们这里选择8.0,如果不写后面的版本号则会自动拉取最新版)

1
2
docker pull mysql:8.0   # 拉取 mysql 8.0
docker pull mysql # 拉取最新版mysql镜像

查看所有镜像

1
docker images

创建容器

1
docker run -d -p 33060:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
  • -–name:容器名,此处命名为mysql8.0
  • –privileged:root权限
  • -e:配置信息,此处配置mysql的root用户的登陆密码
  • -p:端口映射,此处将宿主机3306端口映射到容器的33060端口
  • -d:后台运行容器,保证在退出终端后容器继续运行

创建固定ip容器

1
2
3
4
# 命令创建一个自定义网络
docker network create --subnet=172.18.0.0/16 mynetwork
# 并在创建容器时将其分配给容器一个固定ip
docker run -d -p 33060:3306 --name mysql8.0 -e MYSQL_ROOT_PASSWORD=123456 --net mynetwork --ip 172.18.0.10 mysql:8.0

创建目录映射

为了数据安全和可操作性,可以把mysql的配置文件和数据映射到宿主机上。

1
2
3
4
5
6
docker run -d -p 3306:3306 --name mysql --privileged=true \
-v /usr/local/docker/mysql/conf:/etc/mysql/conf.d \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
  • -v:主机和容器的目录映射关系,”:”前为主机目录,之后为容器目录
  • –privileged:只有这个值等于true的时候才能挂在映射关系。可以理解为mysql的root权限

连接mysql

进入docker本地连接mysql客户端

1
2
$ docker exec -it mysql8.0 bash
$ mysql -uroot -p123456

远程连接

使用远程连接软件时要注意一个问题,我们在创建容器的时候如果将容器的3306端口映射到主机的33060端口,那么就应该应该访问:

1
2
3
4
host: 127.0.0.1
port: 33060
user: root
password: 123456

常见问题

如果你的容器运行正常,但是无法访问到MySQL,一般有以下几个可能的原因:

防火墙阻拦

1
2
3
4
5
6
# 开放端口:
$ systemctl status firewalld
$ firewall-cmd --zone=public --add-port=3306/tcp -permanent
$ firewall-cmd --reload
# 关闭防火墙:
$ sudo systemctl stop firewalld

设置远程访问账号

1
2
3
$ sudo docker exec -it mysql bash
$ mysql -uroot -p123456
mysql> grant all privileges on *.* to root@'%' identified by "password";

mysql使用mysql数据库中的user表来管理权限,修改user表就可以修改权限(只有root账号可以修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29


mysql> use mysql;
Database changed

mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host | user | password |
+--------------+------+-------------------------------------------+
| localhost | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
2 rows in set (0.00 sec)

mysql> grant all privileges on *.* to root@'%' identified by "password";
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> select host,user,password from user;
+--------------+------+-------------------------------------------+
| host | user | password |
+--------------+------+-------------------------------------------+
| localhost | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| 192.168.1.1 | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
| % | root | *A731AEBFB621E354CD41BAF207D884A609E81F5E |
+--------------+------+-------------------------------------------+
3 rows in set (0.00 sec)