开始从基础学起
K8S的结构复杂度并不复杂,但是命令很繁杂。

一些工作及日常随笔
开始从基础学起
K8S的结构复杂度并不复杂,但是命令很繁杂。
阿里云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
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容器,将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集成,点击与jira集成。
填入jira的访问地址,呼应开头的深坑:使用http://jira:8080,即可访问,切记不要通过nginx代理的域名+端口访问。
填入jira的超级管理员用户名/密码
切记:勾选confluence超级用户组和普通用户组权限
踩完坑,强烈建议nginx,jira,confluence使用三个不同的docker-compose.yml,在宿主机建立一个bridge网络,联通三个容器即可。
破解完后,所有容器采用restart命令启动,切记不可使用docker-compose restart。
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”;
}
}
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
项目管理中:时间,成本,质量只可能同时达成两项
架构设计中:数据一致性,系统可用性,系统容错性,只可能同时满足两项
建立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
配置块如下
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;
}
}
LINUX下的gitlab服务器
LINUX下的测试服务器
实现功能:当新的代码被推送至项目git库的指定分支中,测试服务器上的代码,同步更新。
使用gitlab的hooks功能,采用post-receive脚本实现。当新代码被推送时,触发post-receive脚本,登陆到测试服务器,pull新的代码,然后composer升级相关php插件。
进入测试服务器root用户(或者指定用户)的.ssh目录,将id_rsa.pub中的内容,复制到gitlab服务器的git用户的authorized_keys中。注意在此文件中,一个用户的key为单独的一行。
使用gitlab服务器的git用户手动完成一次ssh登陆到测试服务器的操作,将服务器秘钥保存至gitlab服务器本地。
在已经克隆完成的项目目录中,编辑./config文件,在尾部加入
[credential]
helper = store
然后进行一次git pull操作,让登陆凭证自动保存。
在本项目中,在/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
在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中。
# sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log
# cat /opt/shell/pulldev.log
# 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
当开发人员向gitlab服务器的dev分支推送新代码后,执行5.2的第二步,观察代码是否更新,如果同步更新,则自动部署完毕。而在这时,开发人员的git客户端也会有相关提示。
腾讯云CENTOS7.4镜像
mysql:5.7
nginx:latest
php:7.2-fpm
phpmyadmin/phpmyadmin:latest
# 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
# 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
# cd /var/www/html && vi phpinfo.php
内容:
<?php
phpinfo();
?>
# docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest
# cd /var/www/html
# composer create-project laravel:laravel 项目名
选用mysql5.7镜像
docker pull mysql:5.7
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
确认配置文件位置,确定本地文件位置,将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启动失败
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状态,表示运行正常
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[]
docker pull phpmyadmin:phpmyadmin
docker run --name phpmyadmin -p 10080:80 -e PMA_ARBITRARY=1 -d phpmyadmin/phpmyadmin:latest
访问http://服务器ip:10080,测试phpmyadmin是否正常
也可使用其他mysql管理端
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
登入phpmyadmin
http://主机:10080/
添加账户:
例如添加’slave’账户,赋权’REPLICATION SLAVE’,访问地址%,密码设定’123456’。
查看服务器状态,记录下:
File,Position两个数值
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
登入从数据库的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,进行查看,定位错误。
在容器中添加一个网络,下例,添加一个名为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
阿里云Ubuntu18.04
tomcat使用docker部署
apache使用docker部署
nginx使用docker部署
php使用docker部署
Mysql部署在本地
应用程序部署在本地
web根路径:/var/www/html/
nginx配置文件路径:/etc/nginx/;/usr/lib/nginx/modules/
nginx log路径:/var/log/nginx/
apache配置文件路径:/etc/apache/
apache log路径:/var/log/apache/
tomcat的配置文件路径:/usr/local/tomcat/
tomcat log路径:/var/log/tomcat/
phpmyadmin绝对路径:/usr/share/phpmyadmin/
# 安装mysql
$ sudo apt-get install mysql-server mysql-client
# 安装phpmyadmin,两种方式
$ git clone https://github.com/phpmyadmin/phpmyadmin.git /usr/share/phpmyadmin # 需要php7.1以上版本
$ wget -c https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip # 适用php5.6~7.2版本
# 解压
$ unzip phpMyAdmin-4.8.4-all-languages.zip
$ sudo mv phpMyAdmin-4.8.4-all-languages /var/www/html/phpMyAdmin
# 删除可能存在的docker程序
$ sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新源
$ sudo apt-get update
# 安装必要程序,使得apt可以支持https
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# 添加docker官方的 GPG key:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 检查apt-key是否正确
$ sudo apt-key fingerprint 0EBFCD88
# 输出:
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22
# 添加docker的stable库到源中
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 升级源索引
$ sudo apt-get update
# 安装docker
$ sudo apt-get install docker-ce
# 配置加速器
$ vi /etc/docker/daemon.json
# 添加官方镜像
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
# 重启docker引擎,测试
$ sudo docker container run hello-world
docker部署完毕
搜索镜像/下载镜像
# NGINX
$ sudo docker search nginx
$ sudo docker pull nginx
# APACHE
$ sudo docker search httpd
$ sudo docker pull httpd
# TOMCAT
$ sudo docker search tomcat
$ sudo docker pull tomcat
# PHP
$ sudo docker search php
$ sudo docker pull php:7.0-fpm
# 如需别的版本,可以把7.0-fpm修改为5.6-fpm或者7.2-fpm
# 运行一个容器,名字叫testweb,使用nginx:latest镜像
$ sudo docker run --name testweb -d nginx:latest
# 查看
$ sudo docker ps -a
2e62644b6ef1 nginx:latest "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 80/tcp testweb
# 其中:2e62644...为镜像的hash序号
# 进入运行的容器内部(退出命令为ctrl+p+q)
$ sudo docker exec -it 2e62644 /bin/bash
# 查看nginx配置文件所在目录
# ls -al /etc/nginx/
# 重新开启一个服务器tty,对照刚才查看的容器内nginx配置文件,把他们拷贝到宿主机,目录在文章头部已经约定
$ sudo docker cp 2e6:/etc/nginx /etc/
$ sudo docker cp 2e6:/usr/lib/nginx/modules /usr/lib/nginx/
# 停止刚才临时启动的testweb容器,并删除他
$ sudo docker container stop testweb
$ sudo docker container rm testweb
# 还可以
$ sudo docker system prune
# 注意:此命令会删除所有不在运行状态的容器,慎用,尽量使用删除指定容器的命令
# 编辑nginx在宿主机的配置文件,修改需要的配置参数,例如处理器数量等
$ sudo vi /etc/nginx/nginx.conf
# 按照需要配置,server_name修改为域名
$ sudo vi /etc/nginx/conf.d/default.conf
# 启动容器,测试配置文件是否正常,使用-v参数,将宿主机目录挂载进容器,这样做的目的是可以方便的修改各种配置文件,而不用登陆容器
-v/-p 的使用方法 宿主机:容器
$ sudo docker run -d --name web -p 10080:80 -v /etc/nginx:/etc/nginx -v /var/lib/nginx/modules:/var/lib/nginx/modules -v /var/www/html:/usr/share/nginx/html -v /var/log/nginx:/var/log/nginx nginx:latest
# 访问http://主机:10080,出现nginx欢迎页面
# 停止并删除该容器
$ sudo docker container stop web&& sudo docker container rm web
# 运行一个容器,名字叫做testphp,使用phpdockerio/php7-fpm:latest镜像
$ sudo docker run -d --name testphp phpdockerio/php7-fpm:latest
# 进入容器
$ sudo docker exec -it testphp /bin/bash
# 安装php扩展,在容器内
$ sudo docker-php-source extract
$ sudo docker-php-ext-install 扩展名
# 例如
$ sudo docekr-php-ext-install mysqli
# 如需安装必须的依赖包,则
$ sudo apt-get update
$ sudo apt-get install -y 依赖包名
# 例如:安装mcrypt和gd要安装如下依赖
$sudo apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev
# 最后,删除开始解压的source
$ sudo docker-php-source delete
# 其他扩展安装方式以后补充
# 另开一个终端
$ sudo mkdir /etc/php
$ sudo docker cp ae23f3:/usr/local/etc /etc/php/7.0
$ sudo cp /etc/php/7.0/php/php.ini-production php.ini
# 生成一个新的镜像
$ sudo docker commit ae23f3 php7.0-fpm-ext:1.0
# 修改nginx配置文件
$ sudo vi /etc/nginx/conf.d/default.conf
# 修改如下部分(尤其注意两个/var/www/html,和php:9000)
location ~ \.php$ {
root /var/www/html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
# 使用新镜像运行一个php容器
$ sudo docker run -d --name php -v /etc/php/7.0:/usr/local/etc -v /var/www/html:/var/www/html -p 9000:9000 php7.0-fpm-ext:1.0
# 关于映射端口的思考,如果在同一台宿主机上运行单个php容器,则无需映射端口,tomcat也是同理,原则就是:按需映射端口,尽可能不要让端口暴露在公网。
$sudo docker run -d --name nginx -p 10080:80 -v /etc/nginx:/etc/nginx -v /var/log/nginx:/var/log/nginx -v /var/www/html:/usr/share/nginx/html --link php:php nginx:latest
# 测试
# 在宿主机/var/www/html/下建立phpinfo.php,内容如下
<?php
phpinfo();
?>
# 访问http://服务器地址:10080/phpinfo.php
1.设置mysql
$ sudo vi /etc/mysql/mysql.conf.d/mysql.cnf
# 修改如下内容
bind-address = 172.17.0.1 #该ip地址是docker宿主机的默认ip
# 增加如下内容
query_cache_type = 1
$ mysql -uroot
mysql> use mysql;
# 修改连接密码,此处只适用于mysql5.7及以下版本
mysql> set password for root@localhost = password('123456');
# 设置外部网络访问权限
mysql> update user set host='%' where user = 'root';
# 注意:生产环境配置完后,只开放指定数据库用户的远程访问,将root设定为只能从localhost访问
2.设置phpmyadmin
$ cd /var/www/html/phpMyAdmin
$ sudo mkdir tmp && sudo chown www-data.www-data -R ./tmp
$ sudo cp config.sample.inc.php config.inc.php
$ sudo vi config.inc.php
# 修改17行
$cfg['blowfish_secret'] = 'ff18d1baa624d81dfb28757fa80ad5dad50f87c693db8a1c6e84e1e118f919d9'
# 修改31行
$cfg['Servers'][$i]['host'] = '172.17.0.1';
3.测试
访问http://主机:10080/phpMyAdmin
# 启动一个tomcat容器
$ sudo docker run -d --name testjava -p 8080:8080 tomcat:latest
进入testjava容器
$ sudo docker exec -it testjava /bin/bash
# 将相关目录复制到宿主机
# 开启另一个终端
$ sudo docker cp testjava:/usr/local/tomcat/conf /usr/local/tomcat/
$ sudo docker cp testjava:/usr/local/tomcat/temp /usr/local/tomcat/ #tomcat运行的临时文件
$ sudo docker cp testjava:/usr/local/tomcat/work /usr/local/tomcat/ #tomcat运行的临时文件
$ sudo docker cp testjava:/usr/local/tomcat/logs /var/log/tomcat
$ sudo docker cp testjava:/usr/local/tomcat/webapps /var/www/html/
# 修改配置文件
$ sudo vi /usr/lcoal/tomcat/server.xml
找到如下行,增加address一句,此处按需修改,在同一宿主机上配置时,可以不做# 修改
<Connector port="8080" address="容器ip" protocol="HTTP/1.1"
# 停止并删除此容器
$ sudo docker container stop testjava && sudo docker container rm testjava
# 重新启动一个tomcat容器
$ sudo docker run -d --name tomcat -v /usr/local/tomcat/conf:/usr/local/tomcat/conf -v /var/log/tomcat:/usr/local/tomcat/logs -v /usr/local/tomcat/work:/usr/local/tomcat/work -v /usr/local/tomcat/temp:/usr/local/tomcat/temp -v /var/www/html/webapps:/usr/local/tomcat/webapps tomcat:latest
# 查看已经运行的tomcat容器ip地址:
$ sudo docker inspect tomcat| grep IPAddress
编辑nginx配置文件
$ sudo vi /etc/nginx/conf.d/defautl.conf
# 最基本的配置就是把所有的请求都转发给tomcat
在12行左右,第一个location /{}中,增加如下内容:
index index.jsp index.php index.html index.htm;
proxy_pass http://172.17.0.4:8080; # 172.17.0.4就是tomcat容器的ip
# 因为我们的nginx对外的端口是10080,所以,还需要增加如下
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http://$host http://$host:$server_port;
# 如需实现jsp|jsps|do文件交给tomcat,其他文件交给nginx,还需要定义location进行配置
# 将静态文件指定在特定location即可
# 重启tomcat容器,重启nginx容器
$ sudo docker container restart tomcat && sudo docker container restart nginx
# 测试
http://主机地址:10080/index.jsp
# 还有就是只把java请求转发给tomcat,增加如下location,不再使用全局的proxy_pass
location ~ \.(jsp|jspx|do)?$ {
proxy_pass http://172.17.0.4:8080;
}
建议使用本地mysql,参照上文安装并配置好mysql
建立wordpress用户/密码,并生成wordpress数据库
$ sudo docker pull wordpress
$ sudo docker run -d --name wordpress -p 10080:80 -e WORDPRESS_DB_HOST=172.17.0.1:3306 -e WORDPRESS_DB_USER=用户名 -e WORDPRESS_DB_PASSWORD=密码 -e WORDPRESS_DB_NAME=数据库名称 wordpress:latest
访问http://主机:10080,完成wordpress的安装,简单的一批啊。。。