docker构建nginx+php+redis环境

Dockerfile相关文件

  • redis -Dockerfile
FROM alpine:3.11
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers \
&& rm -rf /var/cache/apk/*
COPY ./redis-5.0.7.tar.gz redis-5.0.7.tar.gz
#通过选择更小的镜像,删除不必要文件清理不必要的安装缓存,从而瘦身镜像
#创建相关目录能够看到日志信息跟数据跟配置文件 sh
RUN mkdir -p /usr/src/redis \
&& mkdir -p /redis/data \
&& mkdir -p /redis/conf \
&& mkdir -p /redis/log \
&& mkdir -p /var/log/redis \
&& tar -zxvf redis-5.0.7.tar.gz -C /usr/src/redis \
&& rm -rf redis-5.0.7.tar.gz \
&& cd /usr/src/redis/redis-5.0.7 && make \
&& cd /usr/src/redis/redis-5.0.7 && make install;
EXPOSE 6379
#CMD ["redis-server","/redis/conf/redis.conf"]
#ENTRYPOINT ["redis-server", "/usr/src/redis/redis-5.0.7/redis.conf"]
  • nginx-Dockerfile
FROM centos:centos7
RUN groupadd -r nginx && useradd -r -g nginx nginx
#添加centos源(先下载wget)
COPY ./epel-7.repo /etc/yum.repos.d/epel.repo
RUN mkdir /data \
&& mkdir /conf \
&& yum update -y \
&& yum clean all \
&& yum makecache \
&& yum -y install gcc gcc-c++ autoconf automake make zlib zlib-devel net-tools openssl* pcre* wget \
&& yum clean all && rm -rf /var/cache/yum/*
#声明匿名卷
VOLUME /data
COPY ./nginx-1.14.1.tar.gz /data/nginx-1.14.1.tar.gz
RUN cd /data \
&& tar -zxvf nginx-1.14.1.tar.gz \
&& cd nginx-1.14.1 \
&& ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
&& make && make install && rm -rf /data/nginx-1.14.1.tar.gz && rm -rf /data/nginx-1.14. \
&& ln -s /usr/local/nginx/sbin/* /usr/local/sbin
COPY ./conf/nginx.conf /conf
#进入容器时默认打开的目录
WORKDIR /conf
#声明端口
EXPOSE 80
#容器启动的时候执行,在docker run过程当中是会被其他指令替代
#CMD ["/usr/local/nginx/sbin/nginx","-c","/conf/nginx.conf","-g","daemon off;"]
#执行一条指
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-c","/conf/nginx.conf","-g","daemon off;"]
  • php-Dockerfile
FROM php:7.3-fpm-alpine
#Version
ENV PHPREDIS_VERSION 4.0.0
#Libs
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add \
curl \
vim \
wget \
git \
openssl-dev\
zip \
unzip \
g++ make autoconf
#docker方式安装PDO extension # 安装扩展
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install pcntl \
&& docker-php-ext-install sysvmsg
#Redis extension
RUN wget http://pecl.php.net/get/redis-${
     PHPREDIS_VERSION}.tgz -O /tmp/redis.tar.tgz \
&& pecl install /tmp/redis.tar.tgz \
&& rm -rf /tmp/redis.tar.tgz \
&& docker-php-ext-enable redis
#修改php.ini的文件 extension=redis.so
EXPOSE 9000
#设置工作目录
WORKDIR /www
  • 然后构建镜像
docker build -t php7 .
docker build -t nginx .
docker build -t redis5 .
  • 再构建容器
    容器名称镜像名称共享目录端口
nginx1.4 nginx /www/wwwroot/project/00-1/lrnp/nginx/conf:/conf 81:80
php7 php7 /www/wwwroot/project/00-1/lrnp/www:/www 9001:9000
redis5 redis5 /www/wwwroot/project/00-1/lrnp/redis:/redis 6379:6379

注意:需要注意配置nginx的配置和redis配置

docker run -itd -p 81:80 -v /www/wwwroot/project/00-1/lrnp/nginx/conf:/conf --name nginx1.4 nginx
docker run -itd -p 9001:9000 -v /www/wwwroot/project/00-1/lrnp/www:/www --name php7 php7
docker run -itd -p 6379:6379 -v /www/wwwroot/project/00-1/lrnp/redis:/redis --name redis5 redis5
  • -v:这个参数的作用就是让容器与宿主机的目录同步
    格式:-v 宿主机目录地址:容器目录地址
  • -p:这个是让容器和宿主机绑定在一起
    格式:-p 宿主机端口:容器端口 注意一定要执行 docker top检测是否运行相应进程
[root@localhost lrnp]# docker top php7
UID PID PPID C STIME TTY TIME CMD
root 34583 34566 0 04:44 ? 00:00:00 php-fpm: master process (/usr/local/etc/phpfpm.
conf)
82 34628 34583 0 04:44 ? 00:00:00 php-fpm: pool www
82 34629 34583 0 04:44 ? 00:00:00 php-fpm: pool www
[root@localhost lrnp]# docker top redis5
UID PID PPID C STIME TTY TIME CMD
root 34674 34657 0 04:44 ? 00:00:00 redis-server *:6379
[root@localhost lrnp]# docker top nginx1.4
UID PID PPID C STIME TTY TIME CMD
root 34495 34478 0 04:44 ? 00:00:00 nginx: master process
/usr/local/nginx/sbin/nginx -c /conf/nginx.conf -g daemon off;
root 34528 34495 0 04:44 ? 00:00:00 nginx: worker process
[root@localhost lrnp]#

为什么访问不成功

  1. 可能三个容器都没有启动成功
  2. 容器中的程序没有启动成功
  3. 目录地址不对
  4. 端口的配置开放问题
  5. 防火墙问题
  6. 网络配置
    目前的情况是根据宿主机ip以及暴露的port进行lnrp环境间的通信;
[root@localhost lrnp]# docker network create --subnet=172.100.100.0/24 lrnp
857964f4f251f04a755a6da1e82160038fab024b042c2d40f606d58541abf06b
[root@localhost lrnp]# docker network ls
NETWORK ID NAME DRIVER SCOPE
7ce602860620 bridge bridge local
7891e699e1a9 host host local
857964f4f251 lrnp bridge local
3fb7b0de9e8a none null local
477c3f040371 redis_network bridge local
  • 配置事项 容器名称镜像名称共享目录端口ip nginx1.4 nginx /…/lrnp/nginx/conf:/conf 81:80 172.100.100.10 php7 php7 /…/lrnp/www:/www 9001:9000
    172.100.100.20 redis5 redis5 /…/lrnp/redis:/redis 6379:6379 172.100.100.30
  • 先删除所有容器 docker stop $(docker ps -a -q) | xargs docker rm
  • 重新构建容器 注意:需要注意配置nginx的配置和redis配置 目前采用的是ip和port的方式连接了 docker run -itd --network=lrnp --ip=172.100.100.10 -p 81:80 -v /www/wwwroot/project/00-1/lrnp/nginx/conf:/conf --name nginx1.4 nginx
    docker run -itd --network=lrnp --ip=172.100.100.20 -p 9001:9000 -v
    /www/wwwroot/project/00-1/lrnp/www:/www --name php7 php7 docker run
    -itd --network=lrnp --ip=172.100.100.30 -p 6379:6379 -v /www/wwwroot/project/00-1/lrnp/redis:/redis --name redis5 redis5

你可能感兴趣的:(Docker,docker)