0
点赞
收藏
分享

微信扫一扫

docker-compose 启动mysql或多个项目实例


问题背景

研究某技术问题,结果需要使用docker部署一个msyql。
并且:

  1. mysql 正常启动,这不用多说
  2. mysql启动后带一些初始化sql脚本,即数据库启动后就已经有了某些数据
  3. mysql启动后就可以被远程访问
  4. 为提升B格,使用docker-compose方式启动,而不是docker。

但如果把容器都放在一个network下的话,也不是很需要mysql的远程访问了,而且更安全。

记录一下系统环境:

docker-compose 启动mysql或多个项目实例_docker-compose

具体操作

1.先创建对应的路径及文件准备

如下图:

docker-compose 启动mysql或多个项目实例_docker mysql_02

其中 ​​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​​ 文件所在的目录,执行启动。

docker-compose 启动mysql或多个项目实例_docker启动多个_03


得到启动画面如图(此图不必细看):

docker-compose 启动mysql或多个项目实例_docker_04

3. 可以看到启动了的两个mysql实例

docker-compose 启动mysql或多个项目实例_docker_05


然后可以查看他们的IP

​docker inspectr mysql-57-2​

docker-compose 启动mysql或多个项目实例_docker 多实例_06


另一个的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上,如能成功,则显然可以证明是相通的。

  1. docker exec -it mysql-57 /bin/bash
  2. mysql -h 172.23.0.3 -u root -p
  3. mysql -h 172.23.0.2 -u root -p
    经试验,都能连接成功。
  4. docker-compose 启动mysql或多个项目实例_docker mysql_07

4.2 客户端连接

直接上图

docker-compose 启动mysql或多个项目实例_docker 多实例_08

docker-compose 启动mysql或多个项目实例_docker-compose_09


docker-compose 启动mysql或多个项目实例_docker启动多个_10


显然,数据并不相通,就是相当于局域网内分别启动了两个不相干的mysql实例。

但由于在同一局域网内,两个mysql的服务器可以互相访问到对方,并且可以连接到对方的数据库中去。

后续

那么,这么干的意义在哪里?

可以使用docker-compose创建一系列的容器(比如一个nacos配置中心,使用mysql数据库,还有项目等一套内容,集群等),一起启动。
由于docker-compose.yml文件可以写很多内容,用起来要比一个一个使用docker run命令好好多了。
可以”一键启动“一个”无穷大的世界“。


举报

相关推荐

0 条评论