本文详细讲解了docker容器搭建lnmp负载均衡的例子
1.安装mysql
[root@mysql ~]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.22-el7-x86_64.tar.gz
[root@mysql ~]# tar -xf mysql-5.7.22-el7-x86_64.tar.gz
[root@mysql ~]# mv mysql-5.7.22-el7-x86_64 /usr/local/
[root@mysql ~]# cd /usr/local/
[root@mysql local]# ln -s mysql-5.7.22-el7-x86_64/ mysql
[root@mysql local]#
[root@mysql local]# cp mysql/support-files/mysql.server /etc/init.d/mysqld
[root@mysql local]# ll /etc/init.d/mysqld
-rwxr-xr-x 1 root root 10576 Jul 29 04:45 /etc/init.d/mysqld
[root@mysql local]#
[root@mysql local]# useradd mysql
[root@mysql local]# mkdir -p /var/lib/mysql
[root@mysql local]# chown -R mysql.mysql /var/lib/mysql
[root@mysql local]# mkdir -p /var/log/mariadb/
[root@mysql local]# chown -R mysql.mysql /var/log/mariadb/
[root@mysql local]# touch /var/log/mariadb/mariadb.log
[root@mysql local]# chown -R mysql.mysql /var/log/mariadb/
[root@mysql local]# /etc/init.d/mysqld start
[root@mysql local]# mkdir -p /var/run/mariadb/
[root@mysql local]# chown -R mysql.mysql /var/run/mariadb/
结尾添加下面的环境变量
[root@mysql local]# vim /etc/profile
export MYSQL=/usr/local/mysql/bin/
export PATH="${MYSQL}:${PATH}"
使环境变量生效
[root@mysql local]# source /etc/profile
安装依赖
[root@mysql local]# yum -y install libaio
初始化数据,黄色部分是密码
[root@mysql local]# mysqld --initialize
2018-07-29T09:12:33.373161Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-07-29T09:12:33.951747Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-07-29T09:12:34.060407Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-07-29T09:12:34.120200Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 8775432e-930f-11e8-b03c-000c2939e151.
2018-07-29T09:12:34.121440Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-07-29T09:12:34.122642Z 1 [Note] A temporary password is generated for root@localhost: k/lhzl)&z5qK
[root@mysql local]# chown -R mysql.mysql /var/lib/mysql
[root@mysql local]# /etc/init.d/mysqld start
[root@mysql local]# mysqladmin -uroot -p"k/lhzl)&z5qK" password xiaohuang -S /var/lib/mysql/mysql.sock
授权
mysql> grant all on *.* to root@'%' identified by 'xiaohuang';
Query OK, 0 rows affected, 1 warning (0.00 sec)
2安装docker
[root@php ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@php ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@php ~]# yum -y install docker-ce
[root@php ~]# systemctl start docker
[root@php ~]# systemctl enable docker
3.安装docker-compose
[root@php /]# yum -y install epel-release
[root@php /]# yum -y install python-pip
[root@php /]# pip install docker-compose
[root@php /]# docker-compose version
4.创建镜像
4.1准备环境
[root@php ~]# mkdir -p /docker/{system,scripts,tmp,runtime,app,code}
[root@php ~]# mkdir -p /docker/system/centos-base/conf/
[root@php ~]# mkdir -p /docker/app-environment/nginx_php/{nginx,php,conf}
[root@php ~]# mkdir -p /docker/app/xiaohuang/{code,conf}
4.2 centos-base的Dockerfile
[root@php ~]# cat /docker/system/centos-base/Dockerfile
#Docker for CentOS
#base imamge
FROM centos:7
#who
MAINTAINER JY.H
#init base
#RUN yum -y install wget
#RUN yum -y install ntpdate
RUN rm -f /etc/localtime
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#RUN ntpdate cn.pool.ntp.org
#RUN hwclock -w
ADD ./conf/limits.conf /etc/
RUN echo "ulimit -n 65535" >> /etc/profile
RUN echo "ulimit -u 65535" >> /etc/profile
RUN echo "ulimit -d unlimited" >> /etc/profile
RUN echo "ulimit -m unlimited" >> /etc/profile
RUN echo "ulimit -s unlimited" >> /etc/profile
RUN echo "ulimit -t unlimited" >> /etc/profile
RUN echo "ulimit -v unlimited" >> /etc/profile
RUN source /etc/profile
4.2.1 配置最大打开文件数
[root@php ~]# cat /docker/system/centos-base/conf/limits.conf
* soft noproc 65535
* hard noproc 65535
* soft nofile 10240
* hard nofile 10240
4.3.1配置php-nginx的基础镜像Dockerfile
[root@php ~]# vim /docker/app-environment/nginx_php/Dockerfile
#Base image
FROM xiaohuang/centos7:base
#Maintainer
MAINTAINER JY.H
#add user www
RUN useradd -s /sbin/nologin -M www
RUN yum -y install epel-release
RUN yum -y install supervisor
RUN yum -y install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel openssl-devel
RUN yum -y install freetype-devel libpng-devel libcurl-devel libxslt-devel gd-devel
RUN yum -y install mhash mcrypt libmcrypt-devel
ADD ./nginx/nginx-1.12.2 /usr/local/nginx
ADD ./php/php-5.6.9 /usr/local/php-5.6.9
RUN ln -s /usr/local/php-5.6.9 /usr/local/php
ADD ./conf/supervisord.conf /etc/supervisord.conf
ADD ./conf/app-supervisor.ini /etc/supervisord.d/
4.3.2配置app-supervisor.ini多进程管理的文件
[root@php ~]# vim /docker/app-environment/nginx_php/conf/app-supervisor.ini
[program:php]
command=/usr/local/php/sbin/php-fpm
process_name=%(program_name)s
autostart=true
[program:nginx]
command=/usr/local/nginx/sbin/nginx
process_name=%(program_name)s
autostart=true
stdout_logfile=/tmp/app.log
stderr_logfile=/tmp/app.err
4.3.3配置supervisord.conf
root@php ~]# vim /docker/app-environment/nginx_php/conf/supervisord.conf
[unix_http_server]
file=/var/run/supervisor/supervisor.sock ; (the path to the socket file)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor/supervisor.sock ; use a unix:// URL for a unix socket
[include]
files = supervisord.d/*.ini
4.4.1配置php-nginx的镜像Dockerfile
[root@php xiaohuang]# vim /docker/app/xiaohuang/Dockerfile
#Base image
FROM xiaohuang/php-nginx:version-0.0.0
#Maintainer
MAINTAINER bonzi.Hu
ADD ./code/xiaohuang /usr/local/nginx/html/xiaohuang
ADD ./conf/nf/www.xiaohuang.com.conf /us /usr/local/nginx/conf.d/.d/www.xiaohuang.com.conf
CMD
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
4.4.2配置容器里的nginx配置文件www.xiaohuang.com.conf
[root@php xiaohuang]# vim /docker/app/xiaohuang/conf/www.xiaohuang.com.conf
server {
listen 80;
server_name www.xiaohuang.com;
root html/xiaohuang;
location / {
index index.php index.html index.htm;
}
location ~ .*\.(php|php5)?$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 3650d;
}
location ~ .*\.(js|css)?$ {
expires 365d;
}
location ~ ^/images/.*\.(php|php5|sh|pl|py)$ {
deny all;
}
location ~ ^/static/.*\.(php|php5|sh|pl|py)$ {
deny all;
}
location ~ ^/data/.*\.(php|php5|sh|pl|py)$ {
deny all;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4.5配置docker-compose的启动文件
[root@php scripts]# vim docker-compose.yml
version: '2'
services:
xiaohuang-v1:
image: xiaohuang/php-nginx:version-1.1.1
restart: always
container_name: xiaohuang-v1
ports:
- “2000:80”
xiaohuang-v2:
image: xiaohuang/php-nginx:version-1.1.1
restart: always
container_name: xiaohuang-v2
ports:
- "2001:80"
4.6 创建镜像
[root@php /]# docker pull centos:7
[root@php /]# docker build -t xiaohuang/centos7:base /usr/my/docker/system/centos-base/
[root@php /]# docker build -t xiaohuang/php-nginx:version-0.0.0 /usr/my/docker/app-environment/nginx_php/
[root@php /]# docker build -t xiaohuang/php-nginx:version-1.1.1 /usr/my/docker/app/xiaohuang/
5.启动docker-compose
cd /usr/my/docker/scripts/
/usr/bin/docker-compose up -d