一、docker
1、安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
实际就是执行以下几步:
sh -c 'yum install -y -q yum-utils'
sh -c 'yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
sh -c 'yum makecache'
sh -c 'yum install -y -q docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-ce-rootless-extras docker-buildx-plugin'
2、启动:systemctl start docker
教程参考:https://www.runoob.com/docker/centos-docker-install.html
3、【注】若出现"Peer’s Certificate has expired"问题
删除/etc/yum.repos.d/docker-ce.repo镜像仓库文件
rm /etc/yum.repos.d/docker-ce.repo
同步时钟信息
yum install ntp -y
ntpdate ntp.aliyun.com
二、安装MySQL
1、拉取镜像
docker pull mysql
2、创建以及运行mysql容器
docker run -p 3307:3306 --name mysql -v /data/docker/mysql/conf:/etc/mysql/conf.d -v /data/docker/mysql/data:/var/lib/mysql -v /data/docker/mysql/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 -d mysql
备注:
-p: 设置主机与容器的端口映射【主机端口:容器端口】,一般一样即可,如【-p 3306:3306】
–name:指定容器别名【–name 容器名称】
-v:指定主机挂载容器目录【主机目录:容器目录】
-d:指后台运行
最后一个是容器的镜像,最新本可以不指定版本【容器[:版本号]】
挂载容器目录说明
1、/etc/mysql/conf.d 该目录下可以设置mysql的启动配置(xxx,cnf),如关闭ssl【tls-version=invalid】
2、/var/lib/mysql 该目录下保存是数据库文件
3、/var/lib/mysql-files 作用不清楚,如果不映射挂载,会出现【Error on realpath() on ‘/var/lib/mysql-files’ (Error 2 - No such file or directory)】错误
3、进入mysql容器
a、登录mysql
进入容器以及登录mysql
docker exec -it mysql bash
mysql -uroot -p123456
或者直接登录mysql
docker exec -it mysql mysql -uroot -p123456
b、修改支持远程
mysql>use mysql
mysql> select user, plugin, host from user;
+------------------+-----------------------+-----------+
| user | plugin | host |
+------------------+-----------------------+-----------+
| root | mysql_native_password | % |
| mysql.infoschema | caching_sha2_password | localhost |
| mysql.session | caching_sha2_password | localhost |
| mysql.sys | caching_sha2_password | localhost |
| root | caching_sha2_password | localhost |
+------------------+-----------------------+-----------+
5 rows in set (0.00 sec)
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
问题见问题1~4
4、脚本创建多个不同端口mysql容器
# run_mutil_mysql_docker.sh
# 创建多个mysql容器
#!/bin/bash
function show_log () {
local curTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "$curTime ---- $1";
}
function run_list () {
local name port dir;
for cf in `cat mysqlNameList.txt`
do
name=`echo $cf | awk -F"[ ,|]" '{print $1}'`;
port=`echo $cf | awk -F"[ ,|]" '{print $2}'`;
dir="/data/docker/mysql/$name";
if [ ! -e "$dir/conf" ]; then
mkdir -p "$dir/conf"
fi
cp /data/docker/mysql/conf/mysql.cnf "$dir/conf"
if [ ! -e "$dir/data" ]; then
mkdir -p "$dir/data"
fi
if [ ! -e "$dir/mysql-files" ]; then
mkdir -p "$dir/mysql-files"
fi
show_log $dir;
docker run -p $port:3306 --name $name -v "$dir/conf":/etc/mysql/conf.d -v "$dir/data":/var/lib/mysql -v "$dir/mysql-files":/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=123456 -d mysql
done
}
function op_list () {
local name;
for cf in `cat mysqlNameList.txt`
do
name=`echo $cf | awk -F"[ ,|]" '{print $1}'`;
show_log "$1 $name"
docker $1 $name
done
}
for arg in $*
do
if [[ $arg = 'run' ]]; then
run_list;
elif [[ $arg = 'start' ]]; then
op_list "start";
elif [[ $arg = 'stop' ]]; then
op_list "stop";
elif [[ $arg = 'restart' ]]; then
op_list "restart";
elif [[ $arg = 'rm' ]]; then
op_list "rm";
else
show_log "Unsupport!";
fi
done
mysqlNameList.txt(不要出现空格,否则for遍历时会以空格来分离数据)
mysql2,3308
mysql3,3309
mysql4|3310
mysql1|3307
/data/docker/mysql/conf/mysql.cnf
[mysqld]
# 【ERROR 2026 (HY000): SSL connection error: unknown error number】
tls-version=invalid
# default_authentication_plugin=mysql_native_password
authentication_policy=mysql_native_password
[root@localhost ~]# chmod 777 run_mutil_mysql_docker.sh
[root@localhost ~]# ./run_mutil_mysql_docker.sh run
备注:
多个指令顺序一起使用:./run_mutil_mysql_docker.sh stop rm run
三、端口转发
目的:其他机器通过宿主机访问到虚拟机
说明:其他机器和宿主机是局域网,即网段(如192.168.0.105和192.168.0.189)一样;宿主机和虚拟机是网络适配器是NAT模式(两者网段不一样,如192.168.0.189和192.168.157.129)。
1、打开VMware虚拟网络编辑器
2、端口转发设置
备注说明:
a、主机端口:指的是宿主机的端口,需要确保该端口已经开放出去。否则其他机器依旧无法访问
b、虚拟机IP地址、端口:指的是VMware中的虚拟机系统(如centos7)的IP地址、端口
3、关系
机器【192.168.0.105】访问宿主机【192.168.0.189】的虚拟机【192.168.157.129】中的mysql容器【3306】
mysql -uroot -p123456 -h192.168.0.189 -P3307
其他机器(192.168.0.105)–访问–》宿主机IP和端口(192.168.0.189:3307)–转发–》虚拟机IP和端口(192.168.157.129:3307)–映射–》容器端口(192.168.157.129:3306)
四、笔记
查询容器镜像:docker search 容器
拉取镜像:docker pull 容器[:版本]
查看已拉取镜像:docker images
查看容器信息:docker inspect 容器名称
查看容器启动日志: docker logs -f --details -t 启动的容器ID;docker logs 容器名称
查看已运行容器的Pid:docker inspect --format “{{.State.Pid}}” 容器ID
容器配置位置:/var/lib/docker/containers/容器ID/hostconfig.json
说明:每个容器的该配置文件,存储的就是创建容器时填写参数以及相关配置信息,适合修改已创建容器的信息。如映射端口(修改前一定要先关闭docker,否则修改还是会被覆盖,修改后再启动docker)
备注:hostconfig.json修改的是映射关系,config.v2.json才是容器的启动配置、如MySQL端口3326是在config.v2.json,hostconfig.json是对config.v2.json的映射
关闭/开启/重启容器:docker stop/start/restart 容器名称
移除容器:docker rm 容器名称
进入后台运行的容器: docker exec -it 启动的容器名称 bash
防火墙:
批量添加开放端口:firewall-cmd --zone=public --add-port=3306-3330/tcp --permanent
更新防火墙:firewall-cmd --reload
查看开放端口(规则):firewall-cmd --zone=public --list-ports
查询:firewall-cmd --zone=public --query-port=3308/tcp
删除:firewall-cmd --zone=public --remove-port=3308/tcp --permanent
五、问题:
1、如果创建MySQL(8.x)容器时,指定映射目录,导致MySQL登录失败【ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES)】
解决方式:在MySQL启动自定义配置文件(/etc/mysql/conf.d/xxx.cnf)指定跳过密码登录(在文件中的[mysqld]下添加skip-grant-tables),登录MySQL后修改登录密码。
参考:https://blog.csdn.net/Ayue1220/article/details/120350809
2、自定义MySQL配置(/etc/mysql/conf.d/xxx.cnf)时,无法启动容器,错误【Different lower_case_table_names settings for server (‘1’) and data dictionary (‘0’).】
解决方式:是在配置文件中添加【lower_case_table_names=2】
3、修改密码【alter user ‘root’@‘%’ identified by ‘123456’】出现问题
a、出现ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
解决:刷新权限【flush privileges】
b、出现ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@‘%’
解决:查看用户的host【select user,host from user】,如果root的host是localhost,则修改其host【update user set host=‘%’ where user=‘root’】并刷新权限【flush privileges】,最后再执行密码更新和权限刷新。
查看密码加密方式【select user,plugin from user】,默认是caching_sha2_password,如果需要更改加密方式【ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘123456’】
4、设置MySQL可被远程连接
a、授权【GRANT ALL PRIVILEGES ON . TO ‘root’@‘%’】并刷新权限
b、更改密码加密方式【ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘123456’】,即修改密码时添加【WITH mysql_native_password】,就能将加密方式改为mysql_native_password
5、远程连接是出现【ERROR 2013 (HY000): Lost connection to MySQL server at ‘reading initial communication packet’, system error: 0】
解决:在MySQL自定义配置文件(/etc/mysql/conf.d/xxx.cnf)的[mysqld]下添加skip-name-resolve
参考:https://blog.csdn.net/jallin2001/article/details/6776943
6、远程连接出现【ERROR 2026 (HY000): SSL connection error: unknown error number】
解决:在配置文件的[mysqld]下添加skip-ssl(丢弃)或tls-version=invalid(建议使用)
7、出现【ERROR 2003 (HY000): Can’t connect to MySQL server on ‘192.168.0.189’ (10060)】无法连接
a、可能是宿主机防火墙问题,端口未开放。解决:添加指定端口到防火墙或者关闭防火墙(注意:包含虚拟机、宿主机的端口,刚开始关注点在虚拟机,没有关注宿主机的端口开放,导致其他机器一直无法连接)
b、连接地址无法连通。虚拟机的地址需要通过VMware设置转发,由宿主机地址作为转接,从而其他机器连接到虚拟机
(VMware设置 》虚拟网络编辑器 》选中“VMnet8” 》点击“NAT设置” 》端口转发下进行添加。设置宿主机端口【其他机器连接时使用】、虚拟机ip和端口【使用的是映射端口,如创建容器时使用 “-p 3307:3306”,此时端口应为3307】)