参考文档:https://hub.docker.com/_/mysql/
一、Docker获取MySql镜像
下载镜像
$ sudo docker pull mysql:5.7 # 拉取 mysql 5.7
$ sudo docker pull mysql # 拉取最新版mysql镜像
访问官网太慢报错
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
配置 Docker 镜像站
`该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
$ curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
重启docker
$ sudo systemctl restart docker
查看是否安装成功
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 d5cea958d330 35 hours ago 440MB
二、配置
将全部的配置文件和关联的文件夹统一放到/opt/docker-mysql
中
$ sudo mkdir -p /opt/docker-mysql/conf.d
转到刚创建的目录
$ cd /opt/docker-mysql/conf.d
创建配置文件config-file.cnf
$ sudo vi config-file.cnf
Linux下默认是区分的,设置表名不区分大小写。内容如下:
[mysqld]
# 表名不区分大小写
lower_case_table_names=1
#server-id=1
datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysqlx.sock
#symbolic-links=0
# sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
三、启动
增加数据库文件夹
$ sudo mkdir -p /opt/docker-mysql/var/lib/mysql
建立目录树启动 -v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
$ sudo docker run --name mysql \
--restart=always \
-p 3306:3306 \
-v /opt/docker-mysql/conf.d:/etc/mysql/conf.d \
-v /opt/docker-mysql/logs:/var/log/mysql \
-v /opt/docker-mysql/var/lib/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
如果不需要建立目录树,命令如下:
$ sudo docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
–name:容器名,此处命名为mysql
-e:配置信息,此处配置mysql的root用户的登陆密码
-p:端口映射,此处映射 主机3306端口 到 容器的3306端口
-
-d:源镜像名,此处为 mysql:5.7
检查容器是否允许正确
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
393a726634e1 mysql:5.7 "docker-entrypoint.s…" 39 seconds ago Up 36 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
四、远程连接
使用sudo docker exec -it mysql bash
进入容器
$ sudo docker exec -it mysql bash #进入容器
$ mysql -u root -p #进入MySql
修改root访问权限为任意访问
grant all privileges on *.* to 'root'@'%' ;
刷新权限
flush privileges;
查看权限
use mysql;
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
得到结果如下:
+------------------------------------+
| query |
+------------------------------------+
| User: 'root'@'%'; |
| User: 'mysql.session'@'localhost'; |
| User: 'mysql.sys'@'localhost'; |
| User: 'root'@'localhost'; |
+------------------------------------+
4 rows in set (0.00 sec)
现在可以通过IP远程访问了,如果仍然无法访问查看一下安全策略和防火墙。
五、常用命令
使用sudo docker exec -it mysql bash
进入容器
$ sudo docker exec -it mysql bash #进入容器
$ mysql -u root -p #进入MySql
查看日志
$ sudo docker logs -f mysql
备份数据
$ sudo docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"123456"' > /some/path/on/your/host/all-databases.sql
恢复数据
$ sudo docker exec -i mysql sh -c 'exec mysql -uroot -p"123456-abc"' < /some/path/on/your/host/all-databases.sql
使用docker ps -a
查看容器的运行或终止状态
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
393a726634e1 mysql:5.7 "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
使用docker stop $CONTAINER_ID
来终止一个运行中的容器
$ sudo docker stop 393a726634e1 #
393a726634e1
是刚才查询的MySql编号
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
393a726634e1 mysql:5.7 "docker-entrypoint.s…" 15 minutes ago Exited (0) 6 seconds ago mysql
终止状态的容器,可以使用docker start $CONTAINER_ID
来重新启动
$ sudo docker start 393a726634e1 #393a726634e1是刚才查询的MySql编号
$ sudo docker restart 393a726634e1 #使用docker restart命令来重启一个容器。
容器终止后,在需要的时候可以重新启动,确定不需要了,可以进行删除操作。
docker rm [NAME]/[CONTAINER ID]
:不能够删除一个正在运行的容器,会报错。需要先停止容器。
$ sudo docker rm 393a726634e1
全部删除:docker本身没有提删除所有的操作,但是可以使用如下命令实现:
docker rm 'docker ps -a -q'
:
- -a 标志列出所有容器
- -q 标志只列出容器的ID 然后传递给rm命令,依次删除容器。