文章目录
Ubuntu16安装Docker
Ubuntu自带的软件源列表更新很慢,所以我们切换成阿里提供的软件源列表。
# 备份自带的软件源列表
cp /etc/apt/sources.list /etc/apt/sources.list.back
# 删除自带的软件源列表文件
rm -rf /etc/apt/sources.list
# 新建软件源列表文件
vim /etc/apt/sources.list
# 将下面阿里提供的软件源列表内容复制到sources.list文件中
# deb cdrom:[Ubuntu 16.04 LTS _Xenial Xerus_ - Release amd64 (20160420.1)]/ xenial main restricted
deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
deb http://archive.canonical.com/ubuntu xenial partner
deb-src http://archive.canonical.com/ubuntu xenial partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
下面正式安装Docker。
首先更新软件列表:apt-get update
安装Docker:apt-get install docker.io -y
查看Docker版本:docker version
如下图表示没有启动Docker服务。
启动Docker服务:service docker start
如下图表示Docker服务已启动。
查看容器状态:service docker status
Docker常用命令
查看正在运行的容器
# 查看正在运行的容器
docker ps
# 查看所有的容器,包括已经停止的。
docker ps -a
查看所有镜像
docker images
拉取镜像
docker pull <镜像名:tag>
# 例如以下代码
docker pull mysql
停止、启动、杀死指定容器
docker start <容器名 or ID>
docker stop <容器名 or ID>
docker kill <容器名 or ID>
删除容器
docker rm -f <容器名 or ID>
# 删除所有容器
docker rm -f $(docker ps -a -q)
查看容器日志
docker logs -f <容器名 or ID>
进入容器
docker exec -it <容器名 or ID> bash
Docker搭建Mysql5.7服务
docker部署mysql并修改配置: https://blog.csdn.net/Madness_stone/article/details/124513179
拉取官方镜像
[mysqld]
lower_case_table_names=1
default-time-zone = Asia/Shanghai
docker cp /home/mysql.conf.d/mysqld.cnf mysql3381:/etc/mysql/mysql.conf.d/mysqld.cnf
# 拉取 mysql 5.7
docker pull mysql:5.7
# 拉取最新版mysql镜像
docker pull mysql
创建一个Mysql容器
sudo docker run -p 3380:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
或者
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
- -v:挂载文件,启动的时候把容器中的文件映射到虚拟机文件当中
- –name:容器名,此处命名为mysql
- -e:配置信息,此处配置mysql的root用户的登陆密码
- -p:端口映射,(3380)冒号前面是主机端口,(3306)冒号后面容器内部端口
- -d:源镜像名,此处为 mysql:5.7
进入到容器:docker exec -it mysql3380 bash
进入Mysql客户端: mysql -h127.0.0.1 -uroot -p123456 -P3306
注意:在容器中进入Mysql客户端用的是容器内部端口,主机是127.0.0.1;如果外部连接Mysql客户端,需要使用创建容器时指定主机端口的端口号,主机名是主机的IP地址。
Docker搭建Mysql8.0.20服务
# 拉取镜像
docker pull mysql:8.0.20
# 创建挂载使用到的目录
mkdir -vp /home/docker/mysql3380
cd /home/docker/mysql3380
mkdir data logs conf
# 创建mysql容器
docker run -d -p 3380:3306 --name mysql3380 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.20
# 拷贝mysql的配置文件和数据
# 复制配置文件
docker cp mysql3380:/etc/mysql /home/docker/mysql3380/conf
# 复制data文件
docker cp mysql3380:/var/lib/mysql /home/docker/mysql3380/data
# 停止并删除容器
docker stop mysql3380
docker rm -f mysql3380
# 重新创建容器(指定数据卷)
docker run -d -p 3380:3306 \
--name mysql3380 \
--privileged=true \
--restart=unless-stopped \
-v /home/docker/mysql3380/conf/mysql/conf.d:/etc/mysql/conf.d \
-v /home/docker/mysql3380/logs:/var/log/mysql \
-v /home/docker/mysql3380/data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.20
# 不允许远程连接解决方法
docker exec -it mysql /bin/bash
mysql -u root -p
use mysql
# 更新root - localhost 为 root - %
update user set host = '%' where user = 'root' and host='localhost';
# 设置允许远程用户访问
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;# 刷新权限
#更新用户加密方式,mysql8默认的加密方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
Docker搭建Mysql主从复制
上面我们已经创建了一个Mysql服务,这里作为主从中的master服务。
创建Mysql的slave服务
下面用同样的方式创建一个Mysql的slave服务。
# 注意修改主机端口号和容器名
sudo docker run -p 3381:3306 --name mysql3381 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
配置主从之前我们需要知道服务器的IP地址。
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql3380
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql3381
Master 服务器地址是 172.17.0.4
,Slave 服务器地址是 172.17.0.5
,MySQL 的端口号都为 3306。
配置master服务器
进入到 Master 服务器:docker exec -it mysql3380 bash
进入Mysql客户端: mysql -h127.0.0.1 -uroot -p123456 -P3306
修改配置文件: /etc/mysql/my.cnf
[mysqld]
## 设置server_id,一般设置为IP,同一局域网内注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=edu-mysql-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
一般docker容器中没有vi或者其它相应的文本编辑器,如果只是为了修改这个配置文件就安装一个vi,太麻烦了,下面是另一种方案。
通过docker cp把这个文件拷贝出来: docker cp mysql3380:/etc/mysql/my.cnf /home/
再拷贝回去:docker cp /home/my.cnf mysql3380:/etc/mysql/
在容器中重启Mysql服务: service mysql restart
这个命令会使得容器停止,重新启动容器就可以了。
创建数据同步用户:
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
配置slave服务器
进入到 Master 服务器:docker exec -it mysql3381 bash
进入Mysql客户端: mysql -h127.0.0.1 -uroot -p123456 -P3306
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=edu-mysql-slave1-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
配置完成后重启mysql,和配置 Master 一样,会使容器停止,需要启动容器。
完成Master和Slave链接
在 Master 进入 MySQL, 然后执行命令: show master status;
记录下 File 和 Position 字段的值,后面会用到。
然后到 Slave 中进入 mysql,执行命令:
change master to master_host='172.17.0.4',
master_user='slave',
master_password='123456',
master_port=3306,
master_log_file='edu-mysql-bin.000001',
master_log_pos=2395,
master_connect_retry=30;
- master_host: Master 的IP地址
- master_user: 在 Master 中授权的用于数据同步的用户
- master_password: 同步数据的用户的密码
- master_port: Master 的数据库的端口号
- master_log_file: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
- master_log_pos: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
- master_connect_retry: 当重新建立主从连接时,如果连接失败,重试的时间间隔,单位是秒,默认是60秒。
执行以下命令,开始开启主从同步: start slave;
在 Slave 的 MySQL 终端执行查看主从同步状态: show slave status \G;
SlaveIORunning 和 SlaveSQLRunning 是No,表明 Slave 还没有开始复制过程。相反 SlaveIORunning 和 SlaveSQLRunning 是Yes表明已经开始工作了,因为我已经运行过了,所以我的显示的都是 Yes。