目录结构:

- docker-compose.yml
 - nginx
 	* conf
 		+ nginx.conf
 		+ conf.d
 			+ default.conf
 	* log
 	* Dockerfile
 	* run.sh
 - php
 	* conf
 		+ php-fpm.conf
 		+ php-fpm.d
 			+ www.conf
 			+ zz-docker.conf
 	* Dockerfile
 	* run.sh
 - mysql
	* conf
 		+ my.cnf
 	* Dockerfile
 	* run.sh

docker-compose文件配置

version: '2' #这个序号必须与docker-comose版本号相同,例如1.24,则version:2
services: 
    nginx: 
        #restart: always # nginx意外退出时自动重启
        # image: nginx:alpine #进入这个容器的命令不是/bin/bash,而是/bin/sh
        build: # 要么用官方的镜像image,要么用自己编排的镜像build
            context: ./nginx
            dockerfile: Dockerfile
        container_name: my_nginx
        networks: # 网桥,跨主机容器之间通信(官方推荐使用networks,link依赖方式后期可能会被删除)
            - lnmp
        #depends_on: #解决容器依赖的先后问题,等下面容器开启后再开启(link)
        #    - php72
        #    - mysql
        #links: #单主机容器连接
        #    - php72
        #    - mysql
        ports: # 主机端口:容器端口
            - "94:80"
        volumes: #主机:容器  将主机文件夹挂载到容器内部,使容器内部能够访问
            - ./www/:/www/:rw
            - ./nginx/conf/conf.d/:/etc/nginx/conf.d/:rw #容器内的配置文件可能可不相同,请按位置填写
            - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro # docker不能挂载空文件,可先拷贝进主机文件夹,下面有方法去拷贝
            - ./nginx/log/:/var/log/nginx/:rw
    php72: 
        #restart: always
        # image: php:7.2-fpm
        build: 
            context: ./php
            dockerfile: Dockerfile
        container_name: my_php72
        networks: 
            - lnmp
        ports: 
            - "95:9000"
        volumes: 
            - ./www/:/www/:rw
            - ./php/conf/php.ini:/usr/local/etc/php/php.ini:ro
            - ./php/conf/php-fpm.d/:/usr/local/etc/php-fpm.d/:rw
            - ./php/conf/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
            - ./php/log/:/var/log/php/:rw
    mysql: 
        #restart: always
        image: mysql:5.6 
        container_name: my_mysql
        networks: 
            - lnmp
        ports: 
            - "96:3306"
        volumes: 
            - ./mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf:ro # 复制的一定要是文件,别是软链接,仔细核对
            - ./mysql/log/:/var/log/mysql/:rw
            - ./mysql/data/:/var/lib/mysql/:rw
        privileged: true # 使用该参数,container内的root拥有真正的root权限。
        environment: 
            MYSQL_ROOT_PASSWORD: "123456"
networks: 
    lnmp:







# 1 docker-compose up -d --force-recreate  强制重新构建容器

# 2 docker 查看日志代码:
    #docker logs 对应的docker容器别名或者id

# 3 第一次使用up,之后使用start,如果再次使用up将会重新创建容器,一些对容器的修改将会丢失

# 4 docker不能挂载文件,文件不能为空文件,可先手动开启容器,从容器中中拷贝进主机文件夹
    # 手动开启容器如下
    # 例nginx : docker run -d -p 94:94 -v /www:/www/ --name my_nginx nginx:alpine
    # 例mysql : docker run -it -d --name my_mysql -p 96:96 --env MYSQL_ROOT_PASSWORD='123456' mysql:latest
    # 拷贝代码如步骤:5

# 5容器主机互相拷贝命令 :容器必须开启状态
    # 将主机./RS-MapReduce目录拷贝到容器30026605dcfe的/home/cloudera目录下。
    #docker cp RS-MapReduce 30026605dcfe:/home/cloudera

    #将容器30026605dcfe的/home/cloudera/RS-MapReduce目录拷贝到主机的/tmp目录中。
    # docker cp  30026605dcfe:/home/cloudera/RS-MapReduce /tmp/

# 6 mysql启动立刻退出问题 总结:
    # 1虚拟内存 
        # 查询服务器 free
        # 发现swap 虚拟内存都是0
        # 应该是swap 未启用
        # 启用swap:
        # dd if=/dev/zero of=/swapfile bs=1M count=1024
        # mkswap /swapfile
        # swapon /swapfile
        # 再次 free
        # 发现swap 已经有数值 已启用
    # 2 日志报:docker mysql Operation CREATE USER failed for 'root'@'%'
        #1、拉取mysql5.6镜像
        #    $docker pull mysql:5.6
        #2、创建一个网桥(有的话就不必)
        #    $docker network create -d bridge blog_network
        #3、运行mysql 容器
        #    $docker container run -it --detach --name my_mysql  --network blog_network -p 96:96 --env MYSQL_RANDOM_ROOT_PASSWORD=yes mysql:5.6
        #4、查看root密码
        #    $docker container logs my_mysql| grep 'GENERATED ROOT PASSWORD: ' | awk -F': ' '{print $2}'
        #    会返回一串字符串,这个就是我们的root用户的实际密码:使用这个密码登录后再修改root用户密码即可。
        #4、进入容器
        #    $docker exec -it mysql bash
        #5、进入mysql
        #    $mysql -u root -p
        #    使用上面的密码,进入mysql之后就是修改密码了。
        #6、修改密码
        #    mysql>update mysql.user set authentication_string=password('newpassword') where user='root' ;
        #    mysql>flush privileges;
        #    mysql>exit


### 搭建单个容器命令示范:$PWD 宿主机当前目录
### docker run -itd --name my_mysql2 --network docker_app_lnmp -p 97:3306 -v "$PWD"/mysql2/conf/:/etc/mysql/ -v "$PWD"/mysql2/log/:/var/log/mysql/ -v "$PWD"/mysql2/var/:/var/lib/mysql/ --env MYSQL_ROOT_PASSWORD='123456' mysql:5.6


## 运行docker容器时报standard_init_linux.go:195: exec user process caused "no such file or directory" 的解决方法
## 这是由于windows 和linux dos字符与unix字符的问题

## 安装dos2unix
## yum install dos2unix

## 将相关文件转换一下字符,删除上次已构建的镜像,重新docker up:
##dos2unix Dockerfile
##dos2unix run-lamp.sh

构建php新镜像dockerfile

## 指定镜像
FROM  php:7.2-fpm

## 维护者信息
## 指定镜像
FROM  php:7.2-fpm

## 维护者信息
## 运行用户,默认root
# ENV RUN_USER php 
## 设置组
# ENV RUN_GROUP php
## 数据文件夹
# ENV DATA_DIR /data
## 日志文件夹
# ENV LOG_DIR /log

## 设置时区
ENV TZ=Asia/Shanghai
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

## 可以先进入容器查看php已经有了哪些扩展: php -m ,例如下
## Core,ctype,curl,date,dom,fileinfo,filter,ftp,hash,iconv,json,
## libxml,mbstring,mysqlnd,openssl,pcre,PDO,pdo_sqlite,Phar,posix,
## readline,Reflection,session,SimpleXML,sodium,SPL,sqlite3,standard,
## tokenizer,xml,xmlreader,xmlwriter,zlib

RUN apt-get update

## docker 官方扩展
RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm

# bz2
RUN apt-get install -y --no-install-recommends \
libbz2-dev \
&& docker-php-ext-install -j$(nproc) bz2

# gd
RUN apt-get install -y --no-install-recommends \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd

# intl
# RUN apt-get install -y --no-install-recommends \
# libicu-dev \
# && docker-php-ext-install -j$(nproc) intl

# mcrypt
# RUN apt-get install -y --no-install-recommends \
# libmcrypt-dev \
# && pecl install mcrypt-1.0.1 && docker-php-ext-enable mcrypt

# igbinary
RUN pecl install igbinary && docker-php-ext-enable igbinary

# xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug

# gmp
# RUN apt-get install -y --no-install-recommends libgmp-dev \
# && docker-php-ext-install -j$(nproc) gmp

# soap wddx xmlrpc tidy xsl
# RUN apt-get install -y --no-install-recommends \
# libxml2-dev \
# libtidy-dev \
# libxslt1-dev \
# && docker-php-ext-install -j$(nproc) soap wddx xmlrpc tidy xsl

# pgsql pdo_pgsql 
# RUN apt-get install -y --no-install-recommends \
# libpq-dev \
# && docker-php-ext-install -j$(nproc) pgsql pdo_pgsql

# zip
# RUN apt-get install -y --no-install-recommends \
# libzip-dev \
# && docker-php-ext-install -j$(nproc) zip

# memcached 
RUN apt-get install -y --no-install-recommends \
libmemcached-dev \
zlib1g-dev \
&& pecl install memcached && docker-php-ext-enable memcached

# redis
RUN pecl install redis && docker-php-ext-enable redis

# opcache
RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

## 清除临时扩展文件
RUN apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* \
&& docker-php-source delete

## cmd 用于执行容器启动后的命令,只能出现一次,所以用脚本
# RUN chmod 775 /run.sh
# CMD ["/run.sh"]

EXPOSE 9000

CMD ["php-fpm", "-F"]

nginx 构建新镜像

## 指定镜像
FROM  nginx:alpine

## 维护者信息
## 运行用户,默认root
# ENV RUN_USER nginx 
## 设置组
# ENV RUN_GROUP nginx
## 数据文件夹
# ENV DATA_DIR /data
##日志文件夹
# ENV LOG_DIR /log

## 设置时区
ENV TZ=Asia/Shanghai
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

## 设置一个默认端口
EXPOSE 80

## 创建一些需要的目录
# RUN mkdir /www -p

## 进入目录中,相当于cd
WORKDIR /root/nginx

## 添加当前目录的一些东西复制到进入镜像
ADD conf/nginx.conf /etc/nginx/nginx.conf
ADD conf/conf.d/default.conf /etc/nginx/conf.d/default.conf
ADD run.sh /run.sh

## 设置权限
# RUN chown nginx.nginx -R /www
RUN chmod 775 /run.sh

## cmd 用于执行容器启动后的命令,只能出现一次,所以用脚本
# CMD ["/run.sh"]

CMD ["nginx", "-g", "daemon off;"]

docker-compose 一主二从三哨兵模式: