目录结构:
- 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 一主二从三哨兵模式: