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

nginx如果本地没有,则会先从远程仓库中拉取,将本地的conf配置文件拷贝到容器,在容器中创建目录并且授权,这个不是必须的,因为我本地的conf文件里配置的日志文件和错误文件是在这个目录,所有本地也要先有这个目录,如果容器起不来,要在docker-compose.yml文件内加上配置tty: true才行

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.conftouch 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
  tty: true
  volumes_from:
   - php
  volumes:
   - /var/nginx:/var/nginx
  links:
   - php
  ports:
   - "80:80"

使用docker-compose up -ddocker-compose down便可以搭建和销毁环境,其中nginx的配置文件在配置连接php时使用php容器ip或者fastcgi_pass php:9000;,php代码连接mysql数据库时使用mysql容器ip或者别名mysql,即links对应的别名。

雪花飘
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2

兄弟文章内容在仔细排版一下效果会更好,现在看上去还是比较累眼睛的

5年前 评论

@Handle 内容是从其它平台写后复制过来的,可能有些地方不支持所以排版有点乱了,谢谢支持,下次努力做好!

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!