问题背景
研究某技术问题,结果需要使用docker部署一个msyql。
并且:
- mysql 正常启动,这不用多说
- mysql启动后带一些初始化sql脚本,即数据库启动后就已经有了某些数据
- mysql启动后就可以被远程访问
- 为提升B格,使用docker-compose方式启动,而不是docker。
但如果把容器都放在一个network下的话,也不是很需要mysql的远程访问了,而且更安全。
记录一下系统环境:
具体操作
1.先创建对应的路径及文件准备
如下图:
其中 conf
、db
、init
分别是配置文件、数据存储目录 和 初始化脚本目录。
显然,如果想用docker-compose一次启动多个mysql实例,则不同的示例只用db目录不同就行了。
其他的配置可能的话可以复用。
compose.yml 文件内容如下
:
其中有些内容我也没有很明白怎么用,但目前这个文件是可以成功的。
# mysql
version: "3"
services:
mysql1:
image: mysql:5.7.37
restart: always
command: --default-authentication-plugin=mysql_native_password #这行代码解决无法访问的问题
# 这个可以决定启动的容器的name
container_name: mysql-57
ports:
- 3306:3306
environment:
- "MYSQL_ROOT_PASSWORD=123456"
- "MYSQL_DATABASE=mydb"
- "TZ=Asia/Shanghai"
volumes:
- "/opt/soft/mysql/db:/var/lib/mysql"
- "/opt/soft/mysql/conf/my.cnf:/etc/my.cnf"
- "/opt/soft/mysql/init:/docker-entrypoint-initdb.d/"
networks:
- mysqln
mysql2:
image: mysql:5.7.37
restart: always
command: --default-authentication-plugin=mysql_native_password #这行代码解决无法访问的问题
# 这个可以决定启动的容器的name
container_name: mysql-57-2
ports:
- 3307:3306
environment:
- "MYSQL_ROOT_PASSWORD=123456"
- "MYSQL_DATABASE=mydb"
- "TZ=Asia/Shanghai"
volumes:
- "/opt/soft/mysql/db2:/var/lib/mysql"
- "/opt/soft/mysql/conf/my.cnf:/etc/my.cnf"
- "/opt/soft/mysql/init:/docker-entrypoint-initdb.d/"
networks:
- mysqln
#网络设置,配置和使用成功
networks:
mysqln:
driver: bridge
enable_ipv6: false
# ipam:
# driver: default
# config:
# - subnet: 172.20.0.0/16
# # gateway: 172.20.0.1
备份一下
其中,db、conf、init等这几个文件的内容参考了这篇文章:
https://www.jianshu.com/p/ab3367b2e6b4
备份一下防原文消失:
conf 目录里面是 my.cnf 文件。内容:
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
init 目录里是 init.sql 文件,内容:
create database test;
use test;
create table user
(
id int auto_increment primary key,
username varchar(64) unique not null,
email varchar(120) unique not null,
password_hash varchar(128) not null,
avatar varchar(128) not null
);
insert into user values(1, "zhangsan","test12345@qq.com","passwd","avaterpath");
insert into user values(2, "lisi","12345test@qq.com","passwd","avaterpath");
db 是空目录,用于存储文件。
2. 启动
进入compose.yml
文件所在的目录,执行启动。
得到启动画面如图(此图不必细看):
3. 可以看到启动了的两个mysql实例
然后可以查看他们的IP
docker inspectr mysql-57-2
另一个的IP是172.23.0.2
,不上图了。
证明两个mysql示例确实通过docker启动成功了。
4. 证明从其中某个容器,可以连接到另一个容器
4.1 容器内命令行互相连接
容器名 | IP地址 |
---|---|
mysql-57 | 172.21.0.2 |
mysql-57-2 | 172.21.0.3 |
思路:先exec ,连接到其中一个容器上,然后在容器中 mysql -h x.x.x.x. -u root -p 连接到另一个容器的mysql上,如能成功,则显然可以证明是相通的。
- docker exec -it mysql-57 /bin/bash
- mysql -h 172.23.0.3 -u root -p
- mysql -h 172.23.0.2 -u root -p
经试验,都能连接成功。
4.2 客户端连接
直接上图
显然,数据并不相通,就是相当于局域网内分别启动了两个不相干的mysql实例。
但由于在同一局域网内,两个mysql的服务器可以互相访问到对方,并且可以连接到对方的数据库中去。
后续
那么,这么干的意义在哪里?
可以使用docker-compose创建一系列的容器(比如一个nacos配置中心,使用mysql数据库,还有项目等一套内容,集群等),一起启动。
由于docker-compose.yml文件可以写很多内容,用起来要比一个一个使用docker run命令好好多了。
可以”一键启动“一个”无穷大的世界“。