使用多个容器搭建php环境(容器之间网络通信)

11 篇文章 0 订阅

一、创建网络

命令:docker network create my_net

 

docker network说明

-d bridge #用于管理网络的驱动程序 -

-subnet #CIDR格子的子网,代表网段, docker network create --driver=bridge --subnet=192.168.0.0/16 br0 

具体查看:https://docs.docker.com/engine/reference/commandline/network_create/

二、安装nginx

1、远程拉取nginx镜像

 

              docker pull nginx

2、运行nginx容器

  • 前提
先进入nginx容器查看需要挂在的文件在哪里 docker run -itd docker.io/nginx:latest /bin/bash 然后docker exec -it 容器id /bin/bash 进入 然后需要把nginx.conf和default.conf拷贝出来

注意:此镜像可能是Ubuntu的,而且是简易的,很多命令不能使用。可能只能用cat查看文件内容,下面我会附一个ubuntu的基本几个操作命令 

可以查看一下系统

 

 

 

在宿主机上建几个文件

/usr/local/nginx/conf/nginx.conf nginx的配置文件,内容是容器中拷贝出来的nginx.conf内容 

/usr/local/nginx/logs 需要挂在的日志文件 

/usr/local/nginx/conf.d 项目的配置文件 

/usr/local/nginx/conf.d/default.conf 项目配置文件,内容由容器中拷贝的default.conf 

/www/test1 项目代码文件
  • 开始创建容器

 

docker run --name=nginx -itd -p 80:80 --network=my_net --network-alias=nginx -v /www/test1:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/logs:/var/log/nginx docker.io/nginx:latest /bin/bash

 

  • 进入容器并启动nginx

 

docker exec -it cfd44052045c /bin/bash 

容器中开启nginx:service nginx start
-p 80: 80 是为了让容器的80端口暴露出来,这样容器才能被外部访问 

--network=my_net --network-alias=nginx 其中--network=my_net 是指容器使用my_net的网络,--network-alias=nginx 指给容器网络起一个别名

-v /www/test1:/usr/share/nginx/html 把nginx 放代码的/usr/share/nginx/html路径挂在到宿主机上的 /www/test1 

-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 把nginx的配置文件挂在到宿主机 /usr/local/nginx/conf/nginx.conf上 

-v /usr/local/nginx/conf.d:/etc/nginx/conf.d 把项目的conf配置文件也同步到宿主机上

-v /usr/local/nginx/logs:/var/log/nginx 把日志也挂在到宿主机上

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


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;

    include /etc/nginx/conf.d/*.conf;
}

default.conf:

server {
    listen       80;
    server_name  localhost;
    root  /usr/share/nginx/html;
    #charset koi8-r;
    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;

    index index.html index.htm index.php;
    location / {
         try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;

   # error_log  /usr/local/nginx/logs/nginx/devadmin.xiuxiutool.meitu.com-error.log error;


    #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;
#    }

    sendfile off;
    client_max_body_size 100m;
    client_body_buffer_size 100m;
    proxy_read_timeout 300;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php:9000; #php-fpm的网络
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors off;
        #fastcgi_buffer_size 16k;
        fastcgi_buffer_size 1024k;
        #fastcgi_buffers 4 16k;
        fastcgi_buffers 64 1024k;
        fastcgi_param MY_ENV dev;
    }

    location ~ /\.ht {
        deny all;
    }
}

三、安装php

 

1、拉取远程php镜像

 

docker pull docker.io/bitnami/php-fpm #注意要拉取php-fpm 如果拉php则可能拉的镜像是不包含fpm,得自己安装

 

2、运行php容器

  • 前提
先进入php容器查看需要挂在的www.conf文件在哪里

docker run -itd docker.io/bitnami/php-fpm:v1 /bin/bash 

docker exec -it 0aeac71168c70335e773303400169719b4a238b540de4b08016034cd6cfa300b /bin/bash 

find / -name www.conf

注意:此镜像可能是Ubuntu的,而且是简易的,很多命令不能使用。可能只能用cat查看文件内容,下面我会附一个ubuntu的基本几个操作命令

先进入php容器查看需要挂在的www.conf文件在哪里

docker run -itd docker.io/bitnami/php-fpm:v1 /bin/bash 

docker exec -it 0aeac71168c70335e773303400169719b4a238b540de4b08016034cd6cfa300b /bin/bash 

find / -name www.conf
docker run -itd -p 9000:9000 --name=php --network=my_net --network-alias=php -v /www/test1:/usr/share/nginx/html -v /usr/local/php/php-fpm.d/www.conf:/opt/bitnami/php/etc/php-fpm.d/www.conf docker.io/bitnami/php-fpm:latest /bin/bash

 

  • 说明
-p 9000:9000 是为了让容器的9000端口暴露出来,这样容器才能被外部访问

--network=my_net --network-alias=php 其中--network=my_net 是指容器使用my_net的网络,--network-alias=php 指给容器网络起一个别名

-v /www/test1:/usr/share/nginx/html 把php 放代码的/usr/share/nginx/html路径挂在到宿主机上的 /www/test1,/usr/share/nginx/html这个是由nginx决定的

-v /usr/local/php/php-fpm.d/www.conf:/opt/bitnami/php/etc/php-fpm.d/www.conf 是为了把www.conf挂载到宿主机上

 

  • 配置
vi /usr/local/nginx/conf.d/default.conf 

fastcgi_pass php:9000; 
  • 进入容器
docker exec -it d72abe7274be /bin/bash 

/opt/bitnami/php/sbin/php-fpm -c /opt/bitnami/php/etc/php.ini #在容器中启动php-fpm 

telnet 172.18.0.3 9000 #看是否可以访问9000端口,如果可以的话,那就ok了
  • 进入nginx容器,重启nginx: service nginx start

 

  • 宿主机容器的一些操作

 

#显示某个容器ip

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

#显示所有容器IP地址:

docker inspect --format='{{.Name}} - {{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

 

  • Ubuntu一些操作命令
apt-get update #更新源。

apt-get install telnet #安装telnet命令,用telnet 127.0.0.1 9000 可以看端口是否启动

apt-get install lsof #安装lsof lsof -i:9000可以查看9000端口是否启动

apt-get install vim #安装vim编辑

netstat -ap | grep 9000

四、安装mysql

1、拉取远程mysql镜像

docker pull mysql:5.6

2、建立需要挂在目录

cd /usr/local/

mkdir mysql

cd mysql

mkdir conf

mkdir data

mkdir logs

3、运行mysql容器

docker run -p 3306:3306 --name=mysql --network=my_net --network-alias=mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/logs:/logs -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d 95e0fc47b096

 

4、说明

-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。

-v  /usr/local/mysql/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。

-v /usr/local/mysql/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。

-v /usr/local/mysql/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。

-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

# 最后行数的日志

journalctl -n

docker rm -f $(docker ps -aq) #删除所有容器

注意:

 

nginx 和php都要把文件目录挂载在同一个地方(-v /www/test1:/usr/share/nginx/html)的原因:

我们知道,Nginx配置都有这样一项:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

其中,$document_root就是server块下root所指的路径:

server {

#...     root /usr/share/nginx/html;

#...

}

这里$document_root就是/usr/share/nginx/html。

如果Nginx和PHP-FPM在同一主机,Nginx会通过9000端口把这个目录值和脚本URI传给PHP-FPM。

PHP-FPM再通过9000端口接收Nginx发过来的目录值和脚本URI,发给PHP解析。

PHP收到后,就到指定的目录下查找PHP文件并解析,完成后再通过9000端口返回给Nginx。

如果Nginx和PHP-FPM在同一个主机里面,PHP就总能找到Nginx指定的目录。

但是,如果他们在不同的容器呢?

未做任何处理的情况,Nginx容器中的站点根目录,PHP-FPM容器肯定不存在。

所以,这里需要保证Nginx和PHP-FPM都挂载了宿主机的/www/test1,并且都挂载在容器的:/usr/share/nginx/html

可以看:

https://www.awaimai.com/2120.html

执行顺序:

参考:

https://blog.csdn.net/qq_26614295/article/details/80505246

https://www.cnblogs.com/jsonhc/p/7823286.html

https://www.runoob.com/docker/docker-install-mysql.html

 

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值