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 logs containerid来查看日志,有可能是这个目录问题导致的,在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.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
tty: true
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对应的别名。