docker 容器搭建 lnmp 环境小记
1.阿里云容器地址
https://cr.console.aliyun.com
2.创建镜像仓库
3.虚拟机修改docker源
修改文件:/etc/docker/daemon.json
内容:
{ "registry-mirrors": ["https://78zjyej0.mirror.aliyuncs.com"] }
4.虚拟机登录仓库账号
docker login --username= registry.cn-shenzhen.aliyuncs.com
输入账号密码,账号为阿里云账号,密码是在仓库那里另外设置的密码
有时login会出现这个问题: x509: certificate has expired or is not yet valid
这个问题是由于虚机的系统时间没有校正导致的,使用date命令查看时间是否为本地时间 ,使用命令 ntpdate cn.pool.ntp.org
校正时间,如果提示命令不存在,使用命令安装 yum instal ntp
,再使用 date
命令进行查看,确保时间为本地时间,最后重新使用 docker login
命令,输入密码即可。
5.拉取php镜像
docker pull php:7.2-fpm
尝试过很多php镜像,发现还是这个好用一点,配置文件分割清析在 /usr/local/etc
下面,php相关命令较全,在 /usr/local/bin
下可以看到很多命令,包括 phpize php-config
等等,而且改配置立即生效。
6.xdebug扩展
使用镜像开启一个容器 docker run -itd --name php php:7.2-fpm
,进入容器 docker exec -it php bash
,
使用 php -m
命令可看相关模块,笔者自己安装了 xdebug
扩展,使用命令 php -i > phpinfo.txt
获取到环境信息,复制文件里的内容到这个网址获取对应版本的 xdebug
https://xdebug.org/wizard.php
,文件是下载到宿主机的,要拷贝文件到docker容器中, docker cp filename containerid:target_file_path
,到容器中解压文件并进入目录
/usr/local/bin/phpize ./configure --with-php-config=/usr/local/bin/php-config make && make install
安装完成,添加配置,在目录 /usr/local/etc/php/conf.d
下添加xdebug.ini文件,内容为
;zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so ;xdebug.remote_enable=1 ;xdebug.idekey="PHPSTORM" ;xdebug.remote_connect_back=1 ;xdebug.remote_port=9900 ;xdebug.remote_log="/tmp/xdebug_log/"
使用的时间把”;”删除,使用xdebug生效, php -m
查看安装模块是否有xdebug。如果要安装其他模块,安装命令和配置添加类似,可以下载相应的php安装源码cp到虚拟机安装所需的扩展。(笔者曾经试过自己安装在一个centos容器中安装php环境,跑到最后达到了1.5G,最重要的是fileinfo这个扩展安装不了,提示内存不足,在网上找了很多方法都不行,最后放弃了,直接找现成的php容器)
7.提交镜像
回到宿主机,为保留刚才做的修改,所以重新创建一个镜像 git commit -m 'update php image' songzw/php-fpm:v1
,此时使用 git images
可以看到多了一个 songzw/php-fpm:v2
镜像
8.提交镜像到阿里仓库
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/songzw/php:[镜像版本号]
把仓库修改到阿里, docker push registry.cn-shenzhen.aliyuncs.com/songzw/php:[镜像版本号]
完成推送。
9.在php容器中需要安装composer才能安装扩展包,使用composer命令时要用到git,zip,unzip命令,所以要先 apt-get update
, apt-get install git zip upzip
,重新构建镜像。
10.docker-compose构建nginx
./nginx/Dockerfile
from nginx COPY ./*.conf /etc/nginx/conf.d/ run mkdir -p /var/nginx/logs/access /var/nginx/logs/error && chmod -R 777 /var/nginx CMD nginx
nginx如果本地没有,则会先从远程仓库中拉取,将本地的conf配置文件拷贝到容器,在容器中创建目录并且授权,这个不是必须的,因为我本地的conf文件里配置的日志文件和错误文件是在这个目录,所有本地也要先有这个目录,如果容器起不来,使用docker logs containerid来查看日志,有可能是这个目录问题导致的,最后以nginx进程来运行容器,这个放到docker-compose里面没有生效,导致容器起不来。
11.docker-compose构建mysql
./mysql/Dockerfile
from mysql:5.6 COPY ./*.cnf /etc/mysql/mysql.conf.d/
需要在mysql目录下 touch my.cnf
,里面内容为自定义配置,可以为空,mysql:5.6镜像如果本地不存在也是从远程拉取。
12.docker-compose构建php
from songzw/php-fpm:v5 COPY *.conf /usr/local/etc/php-fpm.d/ COPY *.ini /usr/local/etc/php/conf.d/ run chown -R www-data.www-data /var/www
其中songzw/php-fpm:v5是笔者从php:7.2-fpm拉取下来进行重新构建的镜像,要创建文件 touch my.conf
和 touch my.ini
,这样可以添加自定义配置,/var/www修改属主是因为会出现缓存文件的写权限问题
13.docker-compose.yml
最后呈现docker-compose.yml文件内容
mysql: build: ./mysql/ volumes: - /var/mysql/data:/var/lib/mysql - /var/mysql/logs:/var/log/mysql expose: - "3306" ports: - 3306:3306 env_file: - ./env php: build: ./php/ volumes: - /var/www/html:/var/www/html expose: - "9000" links: - mysql command: php-fpm nginx: build: ./nginx volumes_from: - php volumes: - /var/nginx:/var/nginx links: - php ports: - "80:80"
使用 docker-compose up -d
和 docker-compose down
便可以搭建和销毁环境,其中nginx的配置文件在配置连接php时使用php容器ip或者 fastcgi_pass php:9000
;,php代码连接mysql数据库时使用mysql容器ip或者别名mysql,即links对应的别名。
原文出处:laravel-china -> https://laravel-china.org/topics/13497/docker-container-set-up-lnmp-environment?order_by=created_at&