docker 使用mysql数据库,采用外部数据卷方式 在主机备份数据库

本文详述了如何利用Docker数据卷进行MySQL数据库备份,包括创建数据卷、配置my.cnf、启动容器及数据库初始化等关键步骤,确保数据持久化及容器重启后的数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章主要介绍 如何使用数据卷,备份docker容器数据库的数据。默认宿主设备已安装好docker.

一、准备阶段

在宿主设备上创建目录,一个配置文件my.cnf。  目录将作为容器内数据库实际数据和日志数据的数据卷。

创建完成后,如下所示

[root@yj138 mysqlbak]# ls -a
.  ..  data  my.cnf
[root@yj138 mysqlbak]# 

修改配置文件内容  my.cnf, 这个文件起始也不需要改变,如果构建镜像时,已经修改,且反之在 /etc/my.cnf下。其实,在安装过程中,该文件默认在 安装路下, 只要mysqld 配置了basedir参数,可不用将该文件拷贝到/etc/目录下。 

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
 basedir =/usr/local/mysql
 datadir =/usr/local/mysql/data
 port =3306
 server_id =/usr/local/mysql/data/mysql.pid
 socket =/usr/local/mysql/data/mysql.sock

[mysql]
default-character-set=utf8
socket = /usr/local/mysql/data/mysql.sock
#socket = /tmp/mysql.sock

[client]
default-character-set=utf8
socket = /usr/local/mysql/data/mysql.sock

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M 

#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

二、启动容器

docker run -tdi -v /mysqlbak/data:/use/local/mysql/data -v /mysqlbak/my.cnf:/etc/my.cnf  --name mysql IMAGEID

启动容器后,进入容器内部

docker exec -ti mysql /bin/bash

三、数据库初始化

该步骤字需要初始化一次(如果挂载的数据库备份目录不变),如果每次启动挂载不同的目录,则启动容器后,需要初始化,不然会爆出如下错误。同时需要注意 myql的数据目录的权限应该是 mysql:mysql(这是自己创建的,也可是其他用户,但注意在数据库初始化是需要指定该用户名)

root@6aae6b71082e:/usr/local/mysql# service mysqld start
Starting MySQL
. * The server quit without updating PID file (/usr/local/mysql/data/6aae6b71082e.pid).
root@6aae6b71082e:/usr/local/mysql# 
 ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --pid-file=/usr/local/mysql/data/mysql.pid

数据库初始化,需要进入到目录 script , 然后执行上述指令。

执行完成后,发现 data 目录下新建了内容,同时在宿主设备对应的目下,也发现相同内容

root@6aae6b71082e:/usr/local/mysql/scripts# cd ..
root@6aae6b71082e:/usr/local/mysql# cd data && ls -a
.  ..  6aae6b71082e.err  auto.cnf  ib_logfile0  ib_logfile1  ibdata1  mysql  performance_schema  test
root@6aae6b71082e:/usr/local/mysql/data# exit
[root@yj138 mysqlbak]# cd data && ls -a
.  ..  6aae6b71082e.err  auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test
[root@yj138 data]# 

三、启动容器内的数据库

完成上述后,可启动容器内数据库

root@6aae6b71082e:/usr/local/mysql/data# service mysqld start
Starting MySQL
. * 
root@6aae6b71082e:/usr/local/mysql/data# 

查看下启动状态

root@6aae6b71082e:/usr/local/mysql/data# service mysqld status
 * MySQL running (452)
root@6aae6b71082e:/usr/local/mysql/data# 

尝试添加数据库,添加数据,看外部是否有备份


mysql> create database test1;
Query OK, 1 row affected (0.00 sec)

mysql> use test1;

mysql> CREATE TABLE userInfo( userId int not null, usename varchar(50), userage int, primary key(userId));                                                          Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO userInfo VALUES(1,'test', 20);
Query OK, 1 row affected (0.00 sec)



mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test1              |
+--------------------+
5 rows in set (0.00 sec)

mysql> use test1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables
    -> ;
+-----------------+
| Tables_in_test1 |
+-----------------+
| userInfo        |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from userInfo;
+--------+---------+---------+
| userId | usename | userage |
+--------+---------+---------+
|      1 | test    |      20 |
+--------+---------+---------+
1 row in set (0.00 sec)

mysql> 

查看下外部数据

[root@yj138 data]# ls -a
.  ..  6aae6b71082e.err  6aae6b71082e.pid  auto.cnf  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test  test1
[root@yj138 data]# cd test1 && ls -a
.  ..  db.opt  userInfo.frm  userInfo.ibd
[root@yj138 test1]# 

bingo 。 如果需要确保容器断开就重启, 在docker run  启动容器时,添加参数 --restart=always

下次重点,研究如何将数据和日志分开存储。

<think>好的,我现在需要帮助用户了解如何通过WindTerm连接到虚拟机并在其中使用Docker安装MySQL数据库。首先,我需要理清整个流程,确保步骤正确且符合用户的需求。 用户提到了WindTerm,这是一个SSH客户端工具,所以第一步应该是配置WindTerm来连接到虚拟机。我需要确认用户是否已经拥有虚拟机的IP地址、SSH端口、用户名和密码。这些信息是建立连接的基础。如果用户不清楚如何获取虚拟机的IP,可能需要指导他们使用像`ifconfig`或`ip addr`这样的命令来查看。 接下来,安装Docker。根据不同的Linux发行版,安装步骤可能有所不同。例如,Ubuntu和CentOS的安装命令不同,我需要判断用户可能使用的系统。考虑到大多数用户可能使用Ubuntu,所以先提供Ubuntu的安装步骤,但也要提到其他系统可能需要不同的命令。同时,要确保用户启动Docker服务,并加入用户组以避免每次使用sudo。 然后是Docker安装MySQL的步骤。这里需要用户拉取MySQL镜像,并运行容器。需要注意数据持久化的问题,所以要用`-v`参数挂载数据卷。此外,设置root密码和映射端口到宿主机的步骤也很重要,确保用户能够从外部访问MySQL服务。 最后,验证安装是否成功,包括检查容器状态和通过MySQL客户端连接。这里需要提醒用户如果遇到连接问题,可能需要检查防火墙设置或安全组规则。 在参考用户提供的引用内容时,要注意正确引用相关的命令,比如创建数据库的命令来自引用[1],启动Docker的信息来自引用[2],Dockerfile和数据卷的信息来自引用[3]。需要确保这些引用自然地融入到步骤说明中,避免突兀。 用户可能的问题还包括如何配置远程访问MySQL,如何备份数据,以及如何处理常见的连接错误。这些可以作为相关问题列出,帮助用户进一步探索。 整个过程中需要注意使用中文,正确应用LaTeX格式,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能数学公式较少,不过如果有涉及版本号或其他需要强调的地方,可能需要使用。同时,代码块要用正确的语法高亮,比如shell和python,但用户的问题主要涉及shell命令,所以确保代码块标记正确。 最后,检查步骤是否清晰,逻辑是否连贯,确保用户能够一步步跟随操作,不会遗漏关键步骤,比如Docker的权限设置或MySQL的安全配置。如果有需要,可以加入注意事项,提醒用户注意密码安全或数据备份的重要性。</think>### 通过WindTerm连接虚拟机并安装MySQL数据库教程 #### 1. **连接虚拟机** - **步骤1**:打开WindTerm,选择「会话」→「新建会话」,协议选择`SSH`,填写虚拟机IP地址、SSH端口(默认22)、用户名(如`root`)和密码[^2]。 - **步骤2**:点击连接,输入密码后即可进入虚拟机终端。 #### 2. **安装Docker** - **步骤1**:更新软件包列表: ```shell sudo apt update ``` - **步骤2**:安装Docker(适用于Ubuntu/Debian): ```shell sudo apt install docker.io ``` - **步骤3**:启动Docker服务并设置开机自启: ```shell sudo systemctl start docker sudo systemctl enable docker ``` - **步骤4**:验证安装: ```shell docker run hello-world # 显示成功信息即安装完成[^2] ``` #### 3. **通过Docker安装MySQL** - **步骤1**:拉取MySQL镜像(以MySQL 8.0为例): ```shell docker pull mysql:8.0 ``` - **步骤2**:创建并运行MySQL容器: ```shell docker run -d \ --name mysql-server \ -v /my/custom:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123 \ -p 3306:3306 \ mysql:8.0 ``` - `-v`:挂载数据卷,确保数据持久化[^3] - `-e MYSQL_ROOT_PASSWORD`:设置root用户密码(此处为`123`) - `-p 3306:3306`:将容器端口映射到宿主机端口[^1] #### 4. **验证MySQL服务** - **步骤1**:查看容器状态: ```shell docker ps # 显示运行中的容器 ``` - **步骤2**:进入容器并连接MySQL: ```shell docker exec -it mysql-server mysql -uroot -p123 ``` 输入密码后即可执行SQL命令(如创建数据库)。 #### 5. **从外部访问MySQL** - 使用MySQL客户端工具(如Navicat或命令行),通过`宿主机IP:3306`连接,用户名`root`,密码`123`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值