centos
环境下,先确认是否安装docker
,如未安装,使用yum install docker
或者yum -y install docker-io
进行安装
一、安装PHP
查看镜像
docker images
在镜像列表里可以确认 镜像名 和 版本,如果需要
查看container
docker ps
可以用来查看当前已经运行的docker
容器
查找
docker search php
下载
docker pull php:7.2-fpm
*
注意:不要直接docker pull php
,官方php
镜像里没有安装fpm
相关
运行PHP镜像
docker run --restart=always -p 9000:9000 --name php -v /data/www:/www -idt php:7.2-fpm
注解:
run --restart=always
: 保证docker
重启的时候container
会跟随自动运行-p 9000:9000
:宿主端口9000
映射容器端口9000
--name php
: 容器命名php
-v /data/www:/www
: 目录映射,宿主目录/data/www
映射到容器目录/www
-i
: 以交互模式运行容器,通常与-t
同时使用-t
: 为容器重新分配一个伪输入终端,通常与-i
同时使用;-d
: 后台运行容器,并返回容器ID;
进入PHP容器
docker exec -it php /bin/bash
容器内查看PHP信息
php --ini
得到类似如下信息:
Configuration File (php.ini) Path: /usr/local/etc/php Loaded Configuration File: /usr/local/etc/php/php.ini Scan for additional .ini files in: /usr/local/etc/php/conf.d Additional .ini files parsed: /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
这样就能看到关键文件php.ini
的位置
也可以直接使用:
php -i|grep php.ini
得到类似如下信息:
Configuration File (php.ini) Path => /usr/local/etc/php Loaded Configuration File => /usr/local/etc/php/php.ini
常规配置文件结构如下:
/usr/local/etc |-- log | `-- php-fpm | `-- xdebug.log|-- pear.conf |-- php| |-- conf.d| | |-- docker-php-ext-gd.ini | | |-- docker-php-ext-mysqli.ini| | |-- docker-php-ext-opcache.ini | | |-- docker-php-ext-pdo_mysql.ini| | |-- docker-php-ext-redis.ini | | |-- docker-php-ext-sodium.ini| | |-- docker-php-ext-xdebug.ini | | |-- docker-php-ext-yaf.ini| | `-- docker-php-ext-zip.ini | `-- php.ini|-- php-fpm.conf |-- php-fpm.conf.default`-- php-fpm.d |-- docker.conf |-- www.conf |-- www.conf.default `-- zz-docker.conf
二、安装MYSQL
查找
docker search mysql
下载
docker pull mysql
*
注意:
这里直接获取的
mysql:latest
可能会遇到问题:Navicat 连接 mysql 8.0 提示:Client does not support authentication protocol requested by server
运行MYSQL镜像
docker run --restart=always --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
注解:
-e MYSQL_ROOT_PASSWORD
: 配置信息,此处配置mysql
的root用户
的登陆密码
三、安装NGNIX
查找
docker search ngnix
下载
docker pull ngnix
运行NGNIX镜像并Link
docker run --restart=always --name lnmp -p 8080:80 \ --link mysql:mysql --link php:php \ -v /www:/www -v /etc/nginx:/etc/nginx:ro \ --volumes-from php \ -idt nginx
注解:
--link mysql:mysql
:--link <name or id>:alias
,原容器名
或者ID
映射到自定义别名
-v /www:/www
: 将宿主的/www
目录映射到容器的www
目录
注意:php
的文件目录和nginx
必须保持一致,避免一些意外情况-v /etc/nginx:/etc/nginx:ro
: 将宿主的/etc/nginx
配置文件目录映射到容器的/etc/nginx
配置文件目录,且ro : 只读
--volumes-from php
: 将php容器
挂载的卷也挂载到了nginx
容器上
Docker提供了多个容器直接访问的方法,最简单的方式是直接使用端口映射-p参数指定映射的端口或者-P映射所有端口,多个容器直接通过网络端口进行访问。
但网络端口映射方式并不是Docker中连接多个容器的唯一方式,还可以使用Docker的连接系统(--link)连接多个容器,当容器连接到一起时,接受者容器就可以看到源容器的信息。
default.conf
配置信息:
server { listen 80; server_name localhost #域名或者IP; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /www #容器文件目录; index index.html index.htm index.php; } #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; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { fastcgi_pass php:9000; #因为用了link,所以直接用link后的容器别名 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name; # 容器文件目录 include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #}}
到这里,就基本配置完成了。
四、其它
环境变量
docker
在连接容器的时候,会根据--link
提供的参数自动的在接收者容器中创建一些环境变量,包括源容器的Dockerfile
中使用ENV
命令设置的环境变量和源容器启动时(docker run
),使用-e
或者--env
,--env-file
参数指定的环境变量。
我们使用以下方式:
docker exec lnmp env
得到类似如下信息:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=313b081ac042 MYSQL_PORT=tcp://172.17.0.4:3306MYSQL_PORT_3306_TCP=tcp://172.17.0.4:3306MYSQL_PORT_3306_TCP_ADDR=172.17.0.4MYSQL_PORT_3306_TCP_PORT=3306MYSQL_PORT_3306_TCP_PROTO=tcp MYSQL_NAME=/lnmp/mysql MYSQL_ENV_MYSQL_ROOT_PASSWORD=123456MYSQL_ENV_GOSU_VERSION=1.7MYSQL_ENV_MYSQL_MAJOR=8.0MYSQL_ENV_MYSQL_VERSION=8.0.11-1debian9 PHP_PORT=tcp://172.17.0.3:9000PHP_PORT_9000_TCP=tcp://172.17.0.3:9000PHP_PORT_9000_TCP_ADDR=172.17.0.3PHP_PORT_9000_TCP_PORT=9000PHP_PORT_9000_TCP_PROTO=tcp PHP_NAME=/lnmp/php PHP_ENV_PHPIZE_DEPS=autoconf dpkg-dev file g++ gcc libc-dev make pkg-config re2c PHP_ENV_PHP_INI_DIR=/usr/local/etc/php PHP_ENV_PHP_EXTRA_CONFIGURE_ARGS=--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --disable-cgi PHP_ENV_PHP_CFLAGS=-fstack-protector-strong -fpic -fpie -O2 PHP_ENV_PHP_CPPFLAGS=-fstack-protector-strong -fpic -fpie -O2 PHP_ENV_PHP_LDFLAGS=-Wl,-O1 -Wl,--hash-style=both -pie PHP_ENV_GPG_KEYS=1729F83938DA44E27BA0F4D3DBDB397470D12172 B1B44D8F021E4E2D6021E995DC9FF8D3EE5AF27F PHP_ENV_PHP_VERSION=7.2.11PHP_ENV_PHP_URL=https://secure.php.net/get/php-7.2.11.tar.xz/from/this/mirrorPHP_ENV_PHP_ASC_URL=https://secure.php.net/get/php-7.2.11.tar.xz.asc/from/this/mirrorPHP_ENV_PHP_SHA256=da1a705c0bc46410e330fc6baa967666c8cd2985378fb9707c01a8e33b01d985 PHP_ENV_PHP_MD5= NGINX_VERSION=1.13.12-1~stretch NJS_VERSION=1.13.12.0.2.0-1~stretch HOME=/root
上述例子中,指定了容器的别名
,因此所有环境变量都是以别名
开头。
注意的是,如果源容器重启,接收容器中的环境变量信息并不会自动更新,因此,如果要使用源容器的IP地址,请使用/etc/hosts中配置的主机信息。
/etc/hosts文件
除了环境变量之外,docker
也在接收容器的/etc/hosts
文件中更新了hosts信息。
docker exec -it lnmp cat /etc/hosts
可以看到类似如下信息:
127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopbackfe00::0 ip6-localnetff00::0 ip6-mcastprefixff02::1 ip6-allnodesff02::2 ip6-allrouters172.17.0.4 mysql da857bbf0bc2172.17.0.3 php f56712241b85172.17.0.5 313b081ac042
从上可以看出,在接收容器的hosts文件中增加了额外的信息,本机IP和别名以及源容器的IP和别名。
与环境变量不同的是,如果源容器重启了,接收容器中
/etc/hosts
中的信息会自动更新。
作者:kx叔
链接:https://www.jianshu.com/p/842843fd51d4