静下来休息几天,让压力不要那么大
学习K8S
开始从基础学起
K8S的结构复杂度并不复杂,但是命令很繁杂。
docker下jira+confluence安装集成
环境准备
阿里云ECS主机
阿里云RDS mariadb10.3
此处的深坑:jira无法连接阿里云的polardb,应该是mysql连接器的事情,但是没有找到合适的连接器,暂时放弃掉。
安装完成docker及docker-compose,下载镜像
cptactionhank/atlassian-jira-software:8.1.0
cptactionhank/atlassian-confluence:latest
phpmyadmin/phpmyadmin:latest,用于管理MYSQL数据库
nginx:latest,用nginx做反向代理(此处有隐患,后面描述,在二次安装的时候,抛开了nginx)
数据库先建库
注意字符集,jira的字符集为:utf8mb4,confluence的字符集为:utf8-bin
jira和confluence安装在同一宿主机,以换取集成的方便性。
各种破解所需工具和文件
jira破解包:atlassian-extras-3.2.jar
confluence破解程序:confluence_keygen.jar
这次安装,建立三个docker-compose.yml,把三个容器分别拉起,这个时候需要先建立一个network,使用bridge模式
安装过程
docker network create -d bridge jira-wiki
安装jira
mkdir /opt/jiar_confluence
vi docker-compose.yml
内容如下
version: '2'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
links:
- jira:jira
- confluence:confluence
ports:
- 8080:8080
- 8090:8090
- 8091:8091
- 8088:80
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /opt/jira_confluence/nginx-etc:/etc/nginx
- /var/tmp/nginx:/var/log/nginx
networks:
default:
external:
name: jira-wiki
version: '2'
services:
jira:
image: cptactionhank/atlassian-jira-software:8.1.0
container_name: jira
user: root:root
mem_limit: 20480m
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/tmp/jira:/var/atlassian/jira/log
- /var/tmp/jira-tomcat:/opt/atlassian/jira/logs
- /opt/jira_confluence/jira/setenv.sh:/opt/atlassian/jira/bin/setenv.sh
networks:
default:
external:
name: jira-wiki
注意:version一定要用2,可以在容器使用mem_limit限定内存使用量,对于JAVA应用来说,这是保证宿主机不宕机的基本保护。
随便拉起一个jira容器
mkdir /opt/jira_confluence/jira
cd /opt/jira_confluence/jira
docker cp base-jira/opt/atlassian/jira/bin/setenv.sh ./
编辑setenv.sh,JVM虚拟机内存使用,时区
JVM_MINIMUM_MEMORY="8192m"
JVM_MAXIMUM_MEMORY="16384m"
JVM_REQUIRED_ARGS='-Djava.awt.headless=true -Datlassian.standalone=JIRA -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dmail.mime.decodeparameters=true -Dorg.dom4j.factory=com.atlassian.core.xml.InterningDocumentFactory -Duser.timezone=Asia/Shanghai'
将nginx的代理设定好,在nginx.conf内设定upstream段,在./conf.d/default.conf设定proxy_pass段
示例如下:
upstream jira {
server jira:8080; # 此处的jira,就是docker-compose中的对应services名称
}
server {
listen 8080;
server_name 域名;
#charset koi8-r;
access_log /var/log/nginx/jira.access.log main;
location / {
proxy_pass http://jira; # 此处的jira,就是upstream处定义的名称
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 64M; # 如果有大文件上载,此处需要修订
client_body_buffer_size 512K;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
启动jira安装程序
docker-compose up -d
访问:域名:8080,进入jira安装页面
页面右上角选择语言为中文,选择我将设置他自己
下一步设置数据库连接,测试通过后,点击下一步
把serverID保存
点击生成jira使用许可证
选择jira software (server)
写入serverID
点击生成授权码
点击yes
回到安装页面,点击下一步
创建admin账户,邮件部分选择以后再说。
将破解文件拷贝到容器内
docker cp atlassian-extras-3.2.jar jira:/opt/atlassian/jira/atlassian-jira/WEB-INF/lib
重启容器
docker restart jira
登陆jira>>右上角设置按钮>>应用程序,查看许可证信息。
安装confluence
随便拉起一个confluence容器,将setenv.sh拷贝出来
mkdir /opt/jira_confluence/confluence
cd /opt/jira_confluence/confluence
docker cp base-jira/opt/atlassian/jira/bin/setenv.sh ./
vi setenv.sh
修改
CATALINA_OPTS="-Xms8192m -Xmx16384m -XX:+UseG1GC ${CATALINA_OPTS}"
CATALINA_OPTS="-Duser.timezone=GMT+08"
CATALINA_OPTS="-Dconfluence.document.conversion.fontpath=/usr/share/fonts/msttcore/ ${CATALINA_OPTS}"
准备windows字体
将C:\windows\fonts* 上传至服务器windowsfonts目录
如同上面的nginx反向代理配置,修改nginx配置文件。
新建一个docker-compose.yml
补充如下内容:
version: '2'
services:
confluence:
image: cptactionhank/atlassian-confluence:latest
container_name: confluence
user: root:root
mem_limit: 20480m
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /opt/jira_confluence/confluence/setenv.sh:/opt/atlassian/confluence/bin/setenv.sh
- /opt/jira_confluence/windowsfonts:/usr/share/fonts/msttcore
networks:
default:
external:
name: jira-wiki
启动容器
docker-compose.yml
检查confluence容器内,有没有/use/share/fonts/msttcore目录,目录内有没有字体内容,如果没有,则进入confluence容器,建立/usr/share/fonts/msttcore目录,然后stop容器,再start容器,不要使用restart。
开始安装confluence
访问域名:8090
语言选择中文
选择产品安装,点击下一步
页面上连个选择框都勾选,点击下一步
停留在该页面,将serverID记录下来
在服务器上,将需要破解的文件拷贝出来
docker cp confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.4.1.jar ./atlassian-extras-2.4.jar
在一台安装了java的windows主机上,把atlassina-extras-2.4.jar从服务器拷贝下来,执行java -jar confluence_keygen.jar,在窗口内输入serverID,点选.patch,选择刚才的jar文件,会生成破解文件,点选生成.gen,会生成KEY
将破解后的jar文件,上传至服务器,并拷贝进入容器
docker cp ./atlassian-extras-2.4.jar confluence:/opt/atlassian/confluence/confluence/WEB-INF/lib/atlassian-extras-decoder-v2-3.4.1.jar
然后重新启动容器:docker restart confluence
访问域名:8090,将刚才生成的KEY填入,点击下一步
然后选择数据库相关信息,就可以了。
注意:数据库需要设置隔离级别:transaction-isolation=READ-COMMITTED
confluence集成jira
confluence安装时,会有选择自建账号还是与jira集成,点击与jira集成。
填入jira的访问地址,呼应开头的深坑:使用http://jira:8080,即可访问,切记不要通过nginx代理的域名+端口访问。
填入jira的超级管理员用户名/密码
切记:勾选confluence超级用户组和普通用户组权限
教训
踩完坑,强烈建议nginx,jira,confluence使用三个不同的docker-compose.yml,在宿主机建立一个bridge网络,联通三个容器即可。
破解完后,所有容器采用restart命令启动,切记不可使用docker-compose restart。
nginx配置https反向代理jira和confulunce的补充。(排除所有坑)
nginx.conf内容
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 65535;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
## added by zhaosanbao
proxy_connect_timeout 300; #单位秒
proxy_send_timeout 300; #单位秒
proxy_read_timeout 300; #单位秒
upstream wiki {
server 172.31.0.100:8090;
}
upstream wikisyn {
server 172.31.0.100:8091;
## 此处特别重要。
}
upstream jira {
server 172.31.0.200:8080;
}
conf.d下的配置
jira.conf内容:
server {
listen 80;
listen [::]:80;
server_name jira的域名;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
return 301 https://$host$request_uri;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 443 ssl http2;
server_name jira的域名;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://jira/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_connect_timeout 150;
proxy_pass_request_headers on;
proxy_send_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 64M;
client_body_buffer_size 256K;
}
}
wiki.conf的内容:
server {
listen 80;
listen [::]:80;
server_name wiki的域名;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
return 301 https://$host$request_uri;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 443 ssl http2;
server_name wiki的域名;
ssl_certificate cert/xxxxxx.pem;
ssl_certificate_key cert/xxxxxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #使用此加密套件。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; #使用该协议进行配置。
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://wiki/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass_request_headers on;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 64M;
client_body_buffer_size 256K;
}
location /synchrony {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://wikisyn/synchrony;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “Upgrade”;
}
}
docker容器时区修改
1.在docker-compose.yml里面增加:
volumes:
– /etc/localtime:/etc/localtime:ro
2.编写Dockerfile的时候加入:
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo ‘Asia/Shanghai’ >/etc/timezone
三角关系
项目管理中:时间,成本,质量只可能同时达成两项
架构设计中:数据一致性,系统可用性,系统容错性,只可能同时满足两项
使用aliyun安装docker和docker-compose
建立install-docker.sh,内容如下:
#!/bin/bash
apt-get update
apt-get upgrade -y
apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io -y
建立install-docker-compose.sh,内容如下:
#!/bnin/bash
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
使用NGINX做负载均衡
配置块如下
server {
listen 80 reuseport;
server_name xxx;
location / {
return 301 https://$host$request_uri;
}
# rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl http2 reuseport;
ssl_certificate cert/xxx.pem;
ssl_certificate_key cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
server_name xxx;
#charset koi8-r;
access_log /var/log/nginx/xxx.access.log main;
location / {
proxy_pass http://xxx;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 8m;
client_body_buffer_size 128;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
使用git的hooks完成php项目的跨服务器自动发布
环境
LINUX下的gitlab服务器
LINUX下的测试服务器
目的
实现功能:当新的代码被推送至项目git库的指定分支中,测试服务器上的代码,同步更新。
思路
使用gitlab的hooks功能,采用post-receive脚本实现。当新代码被推送时,触发post-receive脚本,登陆到测试服务器,pull新的代码,然后composer升级相关php插件。
步骤
1.完成测试服务器的免密登陆
进入测试服务器root用户(或者指定用户)的.ssh目录,将id_rsa.pub中的内容,复制到gitlab服务器的git用户的authorized_keys中。注意在此文件中,一个用户的key为单独的一行。
使用gitlab服务器的git用户手动完成一次ssh登陆到测试服务器的操作,将服务器秘钥保存至gitlab服务器本地。
2.完成git操作时的免密登陆
在已经克隆完成的项目目录中,编辑./config文件,在尾部加入
[credential]
helper = store
然后进行一次git pull操作,让登陆凭证自动保存。
3.在测试服务器编写执行脚本
在本项目中,在/opt/shell下建立一个pulldev.sh,加入以下内容,并赋予执行权限
#!/bin/bash
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "${time}" # 以上两行输出执行脚本时的时间
cd /var/www/html/ # 进入项目目录
git pull # 以上两行执行代码的同步
docker exec -it laravel-php /bin/bash -c "cd /var/www/html/ && composer install" # 本行是在php容器内执行“composer install”命令
exit 0 # 退出
# chmod +x pulldev.sh
4.在gitlab服务器编写post-receive脚本
在gitlab服务器中,进入/var/opt/gitlab/git-data/repositories中,找到项目的库目录,如xxx.git。将原有的hooks目录移动走,mv hooks bak_hooks。然后新建hooks目录,并编辑post-receive脚本,键入如下内容:
#!/bin/sh
NowPath=`pwd`
unset GIT_DIR # 非常关键,释放该变量在上次执行后的值
ssh 测试服务器用户名@测试服务器地址 "sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log;exit"
unset Git_DIR
cd $NowPath
exit 0
# chmod +x post-receive
# chown git.git -R /var/opt/gitlab/git-data/repositories/xxx.git/hooks ##非常关键,因为gitlab服务器对库的操作,都是用系统内的git用户来完成的。这也就是步骤1中为什么将id_rsa.pub添加到git用户的authorized_keys中。
5.测试
5.1在测试服务器,测试脚本:
# sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log
# cat /opt/shell/pulldev.log
5.2在gitlab服务器,验证post-receive脚本
# su git
$ sh /var/opt/gitlab/git-data/repositories/xxx.git/hooks/post-receive
登陆测试服务器:
# cat /opt/shell/pulldev.log
# cd /var/www/html/
# git log
5.3推送新代码测试
当开发人员向gitlab服务器的dev分支推送新代码后,执行5.2的第二步,观察代码是否更新,如果同步更新,则自动部署完毕。而在这时,开发人员的git客户端也会有相关提示。
使用docker完成laravel(LNMP)运行环境搭建
基础环境
腾讯云CENTOS7.4镜像
准备docker镜像
mysql:5.7
nginx:latest
php:7.2-fpm
phpmyadmin/phpmyadmin:latest
mysql,nginx,php配置文件
# docker run --name base_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
# docker run --name base_php -d php:7.2-fpm
# docker run --name base_nginx -d nginx:latest
# mkdir /etc/laravel.docker.d
# mkdir /etc/laravel.docker.d/mysql && mkdir /etc/laravel.docker.d/php && mkdir /etc/laravel.docker.d/nginx
# mkdir /var/www/html
将配置文件分别拷贝到对应目录中,注意:php:7.2-fpm的配置文件在容器的/usr/local/etc下,nginx:latest的root路径是/usr/share/nginx/www
生成PHP扩展镜像
# vi Dockerfile
内容:
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev && docker-php-source extract && docker-php-source delete && docker-php-ext-config gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-gd && docker-php-ext-install gd && docker-php-ext-install zip && docker-php-ext-install mysqli && docker-php-ext-install pdo_mysql && docker-php-ext-install opcache && cd ~ && php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" && chmod +x composer-setup.php && php composer-setup.php && mv composer.phar /usr/local/bin/composer && chmod +x /usr/local/bin/composer && composer config -g repo.packagist composer https://packagist.phpcomposer.com && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/*
# docker build -t php-ext:0.1 .
注意:经过试验,用composer容器运行composer会提示很多扩展包不存在的错误,因为不熟悉php镜像的结构和php配置文件,不知道怎么修改,因此将composer直接装入php扩展镜像。
报错的Dockerfile
FROM php:7.2-fpm
RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev && docker-php-source extract && docker-php-source delete && docker-php-ext-install gd && docker-php-ext-install zip && docker-php-ext-install mysqli && docker-php-ext-install pdo_mysql && docker-php-ext-install opcache && curl 'http://pecl.php.net/get/mcrypt-1.0.2.tgz' && pecl install mcrypt-1.0.2.tgz && curl 'http://pecl.php.net/get/memcached-3.1.3.tgz' && pecl install memcached-3.1.3.tgz && curl 'http://pecl.php.net/get/redis-4.2.0.tgz' && pecl install redis-4.2.0.tgz && cd ~ && php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" && chmod +x composer-setup.php && php composer-setup.php && mv composer.phar /usr/local/bin/composer && chmod +x /usr/local/bin/composer && composer config -g repo.packagist composer https://packagist.phpcomposer.com && composer selfupdate && apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/*
运行并连接容器
# docker run --name laravel-mysql -e MYSQL_ROOT_PASSWORD=123456 -v /etc/laravel.docker.d/mysql/etc/mysql:/etc/mysql -v/etc/laravel.docker.d/mysql/var/lib/mysql:/var/lib/mysql -d mysql:5.7
# docker run --name laravel-php -v /var/www/html:/var/www/html -v /etc/laravel.docker.d/php/etc:/usr/local/etc --link laravel-mysql:mysql -d php-ext:0.1
# docker run --name laravel-nginx -v /var/www/html:/usr/share/nginx/html -v /etc/laravel.docker.d/nginx/etc/nginx:/etc/nginx -v /var/log/nginx:/var/log/nginx -p 80:80 --link laravel-php:php -d nginx:latest
建立phpinfo.php并测试
# cd /var/www/html && vi phpinfo.php
内容:
<?php
phpinfo();
?>
启动phpmyadmin镜像
# docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest
生成laravel项目
# cd /var/www/html
# composer create-project laravel:laravel 项目名
基于DOCKER的MYSQL主从分离学习
1.MYSQL配置环境准备
1.1 启动基础镜像
选用mysql5.7镜像
docker pull mysql:5.7
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
1.2 复制配置文件及数据库
确认配置文件位置,确定本地文件位置,将master和slave的配置文件及数据库放置在不同路径下
登录容器,确认相关文件位置
docker exec -it mysql /bin/bash
ps:退出容器的命令:ctrl+p+q
在宿主机上,拷贝对应文件
sudo docker cp mysql:/etc/mysql /etc/mysql/master/mysql5.7
sudo docker cp mysql:/etc/mysql /etc/mysql/slave/mysql5.7
sudo docker cp mysql:/var/lib/mysql /var/lib/mysql/master/mysql5.7
sudo docker cp mysql:/var/lib/mysql /var/lib/mysql/slave/mysql5.7
重点:删除slave的数据文件中的auto.conf,否则,两个服务器的uuid会相同,造成后面start slave启动失败
1.3 测试
docker run --name mysql_master -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/master/mysql5.7:/etc/mysql -v /var/lib/mysql/master/mysql5.7:/var/lib/mysql -d mysql:5.7
docker run --name mysql_slave -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/slave/mysql5.7:/etc/mysql -v /var/lib/mysql/slave/mysql5.7:/var/lib/mysql -d mysql:5.7
docker ps -a
都是up状态,表示运行正常
2.配置mysql主从
2.1确定各个容器的ip地址
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
还可以分别连接到各个容器,查看/etc/hosts文件
本例中
/mysql_slave 172.17.0.4 map[]
/mysql_master 172.17.0.3 map[]
/mysql 172.17.0.2 map[]
2.2 配置主从
2.2.1 下载并启动一个phpmyadmin镜像
docker pull phpmyadmin:phpmyadmin
docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest
访问http://服务器ip:10080,测试phpmyadmin是否正常
也可使用其他mysql管理端
2.2.2 配置主服务器
2.2.2.1修改配置文件
sudo vi /etc/mysql/master/mysql5.7/mysql.conf.d/mysqld.conf
添加如下内容:
## 让数据库开放监听
bind-address = 0.0.0.0
## master mysql-server
log-bin = mysql-bin
server-id = 1
## 忽略库(此处根据需要填写)
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = preformance_schema
## 制定复制的库,修改下面一行的内容
replicate-do-db
2.2.2.2 在主数据库服务器添加slave账户,
登入phpmyadmin
http://主机:10080/
添加账户:
例如添加’slave’账户,赋权’REPLICATION SLAVE’,访问地址%,密码设定’123456’。
2.2.2.3 记录关键数据
查看服务器状态,记录下:
File,Position两个数值
2.2.3 配置从服务器
2.2.3.1 修改配置文件
sudo vi /etc/mysql/master/mysql5.7/mysql.conf.d/mysqld.conf
添加如下内容:
## 让数据库开放监听
bind-address = 0.0.0.0
## slave mysql-server
log-bin = mysql-bin
server-id = 2 ## 此处切记不要和主服务器重复
## 忽略库(此处根据需要填写)
replicate-ignore-db = mysql
replicate-ignore-db = sys
replicate-ignore-db = information_schema
replicate-ignore-db = preformance_schema
2.2.3.2 在从数据库设置master
登入从数据库的phpmyadmin
执行:
change master to master_host='172.17.0.3',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3306;
其中:
master_host就是主服务器的docker ip地址
master_log_file就是在master服务器查询到的日志名
master_log_pos就是在master服务器查询到的position值
执行:
start slave;
查看服务器状态:
show slave status;
Slave_IO_Running Yes
Slave_SQL_Running Yes
以上两项均为’yes’,则slave正常启动
有错误时,需开启slave服务器的mysqld.conf中的error.log,进行查看,定位错误。
以上为在单一宿主机,使用docker完成主从配置的过程。
遗留问题,当没有指定服务器IP时,重启容器,容器的IP会变化,导致主从不可用
解决方案,固化容器IP地址
固化方法
在容器中添加一个网络,下例,添加一个名为mysql的网络,网段是172.18.0.0/16
docker network create --subnet=172.18.0.0/16 mysql
启动容器时,指定IP即可
docker run --name mysql_slave --net mysql --ip 172.18.0.3 -e MYSQL_ROOT_PASSWORD=123456 -v /etc/mysql/slave/mysql5.7:/etc/mysql -v /var/lib/mysql/slave/mysql5.7:/var/lib/mysql -d mysql:5.7
