docker -v
查看是否已经安装了docker,如下面提示版本信息则是安装了。
➜ ~ docker -v
Docker version 20.10.16, build aa7e414```
查询docker hub 上是否有mysql镜像,
如下 ofiicial 为ok的为官方发布的,一般我们选择就是官方提供的。
docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, [OK]
使用docker pull mysql 拉去mysql 这里的mysql为上面search 出来的name字段;
➜ ~ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
bd2ec1b01835: Downloading [=========> ] 7.979MB/43.63MB
ec2e560d878c: Download complete
e8397fbbbc3b: Download complete
eff4258297ab: Download complete
137be606bff3: Download complete
0ef6a538fcba: Download complete
a5431fa8c17d: Downloading [========> ] 10.14MB/57.7MB
23af94ba6338: Download complete
87a8250fff28: Downloading [=====> ] 6.919MB/63.78MB
6b7e1aea563b: Waiting
等待⌛️安装完成✅后,docker images -a 查看本地镜像
➜ ~ docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest bdfb0ec4d54a 4 weeks ago 599MB
docker run -it mysql /bin/bash
( 参数 -i -t 等价于 -it 表示insert , 进入 ; /bin/bash 表示 shell 脚本交互界面 )
➜ ~ docker run -it mysql /bin/bash
bash-4.4# ls
bin dev etc lib media opt root sbin sys usr
boot docker-entrypoint-initdb.d home lib64 mnt proc run srv tmp var
基于上一步后,查看mysql 的版本
bash-4.4# mysql -V
mysql Ver 8.1.0 for Linux on aarch64 (MySQL Community Server - GPL)
退出当前窗口,docker 容器也同时推出,docker ps 查看后没有记录
bash-4.4# exit
exit
启动mysql 后一直运行:
docker run -p 3306:3306 --name JY_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
像上述的命令运行的mysql,如果只是平时玩玩是没问题。因为没有做到备份数据记录,如果某个(100+150)运行 docker rm -f mysql
后,你的mysql数据也被删除了。
这里就要说说 docker Volume 卷
Docker 卷(Volume)是用于持久化存储数据的一种机制,可以将宿主机上的文件系统目录或者其他容器挂载到容器中,以方便地对数据进行管理和共享。
下面是 Docker 卷的一些特点和使用方法:
数据持久化:容器运行时的数据保存在卷中,即使容器停止或删除,数据仍然存在。
数据共享:多个容器可以挂载同一个卷,实现数据共享。
管理文件系统:Docker 卷可以为容器指定一个特定的文件系统,从而使容器和宿主机之间的文件系统隔离。
备份和恢复:通过卷,可以将容器的数据备份到宿主机,方便容器的数据管理和恢复。
使用 Docker 卷的步骤如下:
创建卷:可以使用 docker volume create 命令创建卷,也可以在容器启动时自动创建。
挂载到容器:使用 -v 或 --mount 参数将卷挂载到容器中,可以指定挂载点和读写权限等参数。
访问数据:在容器中使用挂载点访问卷中的数据。
例如,下面的命令将创建一个名为 myvolume 的卷,并将其挂载到名为 mycontainer 的容器的 /data 目录中:
docker volume create myvolume
docker run -v myvolume:/data --name mycontainer myimage
这样,在容器中访问 /data 目录时,就可以访问到卷中的数据了。(也就是数据共享的味道了)如果需要备份或恢复数据,可以使用 docker cp 命令将容器中的数据备份到宿主机上,或者将宿主机上的数据恢复到容器中
。
看了上述的基本认识,我们回到关于 250 删了我们的mysql的数据备份问题。我们照着上面画葫芦,加上 -v 以及备份的路径,
➜ ~ docker run -p 3306:3306 --name mysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql
这里我提前安装了 docker desktop 工具,下面就是带了 -v 也就是有卷和没卷的创建的mysql,明显带 -v 的数据大小大了很多。也可以使用 docker inspect my_container
查看;
然后我们 docker ps 查看,exec 进入操作一下
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0fbfa37c3274 mysql "docker-entrypoint.s…" 42 minutes ago Up 42 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
docker exec -it 0fbfa37c3274 /bin/bash
我们进入mysql后台 ,然后就是创建表,插入数据,这些操作就和在mysql操作一样
bash-4.4# mysql -u root -p
Enter password:
mysql> create DATABASE TESTDB;
mysql> CREATE TABLE IF NOT EXISTS `test_tbl`(
`testdb_id` INT UNSIGNED AUTO_INCREMENT,
`testdb_title` VARCHAR(100) NOT NULL,
`testdb_author` VARCHAR(40) NOT NULL,
`testdb_date` DATE,
PRIMARY KEY ( `testdb_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> use TESTDB;
Database changed
mysql> INSERT INTO test_tbl
-> (testdb_title, testdb_author, testdb_date)
-> VALUES
-> ("learn docker use mysql", "chayedan", NOW());
mysql> SHOW DATABASES;
mysql> SHOW DATABASES LIKE '%DB';
上面依次是创建数据库 TESTDB,创建表 test_tbl,插入数据,显示数据库;
在docker环境中设置MySQL主从复制,需要以下步骤:
docker network create mysql-replication
docker run -d --name mysql-master \
--network mysql-replication \
-e MYSQL_ROOT_PASSWORD=master-pass \
-e MYSQL_REPLICATION_USER=repl \
-e MYSQL_REPLICATION_PASSWORD=repl-pass \
mysql:latest \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-do-db=testdb \
--binlog-ignore-db=mysql \
--gtid-mode=ON \
--enforce-gtid-consistency=ON \
--log-slave-updates=ON \
--auto-increment-offset=1 \
--auto-increment-increment=2
docker run -d --name mysql-slave \
--network mysql-replication \
-e MYSQL_ROOT_PASSWORD=slave-pass \
-e MYSQL_REPLICATION_USER=repl \
-e MYSQL_REPLICATION_PASSWORD=repl-pass \
mysql:latest \
--server-id=2 \
--log-bin=mysql-bin \
--binlog-do-db=testdb \
--binlog-ignore-db=mysql \
--gtid-mode=ON \
--enforce-gtid-consistency=ON \
--relay-log=mysql-relay-bin \
--log-slave-updates=ON \
--read-only=ON \
--auto-increment-offset=2 \
--auto-increment-increment=2 \
--master-info-repository=TABLE \
--relay-log-info-repository=TABLE \
--replicate-do-db=testdb
在主服务器上创建一个用户和密码,用于从服务器连接到主服务器。在主服务器上执行以下命令:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl-pass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
然后,在从服务器上执行以下命令:
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='repl-pass',
MASTER_AUTO_POSITION=1;
START SLAVE;
在主服务器上创建一个测试数据库和表:
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL
);
INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
然后,在从服务器上查询该表:
USE testdb;
SELECT * FROM users;
如果返回结果与主服务器上的结果一致,则说明主从同步已经成功。
我们一开始介绍了如何在docker上安装与启动mysql,以及进入mysql的后台创建数据库与表等;接着我们过了一遍如何基于docker操作mysql 主从库复制。