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

思考:在不同的物理机上,实现主从配置,只需要解决网络连同就可以了。