Docker是近几年非常流行的技术。作为软件开发人员,应该及时接触并掌握。刚入职的公司刚好需要用到Docker作为开发环境,所以不得不学习Docker的使用方法。写下今天搭建PHP开发环境的过程,也是记录一下。我正在为Mac使用DockerDesktop。Docker安装需要拉取镜像,使用原镜像拉取会很慢。不过我们可以使用国内的镜像资源,而且大部分都是免费的。我用的是阿里云的镜像加速链接,速度很快。我们可以在阿里云上免费获取,然后配置使用。阿里云Docker加速器,没有阿里云账号也可以注册一个。查看Docker是否正常运行docker-vinstallMysqlpullimage#拉取最新版本的Mysqldockerpullmysql#拉取指定版本的Mysql(5.7)dockerpullmysql:5.7runMysql#运行最新版本的Mysqldockerrun--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=12345678-dmysql#运行指定版本dockerrun--namemysql_57-p3306:3306-eMYSQL_ROOT_PASSWORD=12345678-dmysql:5.7参数:run:新建容器--name:容器名称-p:端口映射(local_port:container_port)-e:传入环境变量-d:后台运行进入容器dockerexec-itmysqlbash-i表示让我们对容器进行操作-t表示为终端指定一个新容器/etc/mysql:Mysql容器中的配置文件目录,该目录包含my.cnf配置和一个conf.d文件夹,my.cnf文件包含一些基本配置。自定义配置应该写在conf.d文件夹下的配置文件中,从而覆盖默认的my.cnf。/var/lib/mysql:Mysql在镜像中的持久化数据存放目录。MySQL是一个有状态的应用程序。如果是容器化的,需要把它的状态提取到宿主机上,把它的配置文件、日志文件、持久化数据挂载到宿主机上。在PC上创建一个目录,用于存放Mysql的数据、配置和日志,使数据存储在宿主机上。我们删除容器后重新安装,就可以直接使用,不会造成数据丢失。mkdir-pdocker/mysql&&cddocker/mysqlmkdirdatalogconf删除我们之前创建的Mysql容器dockerstopmysql&&dockerrmmysql在conf目录下新建my.cnf文件作为Mysql配置文件vimmy.cnf[mysqld]datadir=/var/lib/mysql#(默认不是中文时区,用的时候被骗了)default-time_zone='+8:00'log-error=/var/log/mysql/error.log并重新创建Mysql容器,并将创建的目录挂载到容器中对应的目录下。dockerrun--namemysql--restart=always(Docker重启时容器也会启动)--privileged=true(Docker在Easy中给root用户授予真正的root权限,否则会提示log目录权限不足)-p3306:3306-vdocker/mysql/conf:/etc/mysql/conf.d(将配置目录挂载到容器中的配置目录)-vdocker/mysql/data:/var/lib/mysql(mount数据存储目录mount到容器中的出站存储目录)-v/docker/mysql/log:/var/log/mysql(将log目录挂载到容器中的log目录)-eMYSQL_ROOT_PASSWORD=12345678-dmysql-vcontainer内部路径挂载到容器内部的主机路径,配置可以使用数据库管理工具连接Mysql$dockerexec-itmysqlbash$mysql-uroot-p$mysql->ALTERuser'root'@'%'使用mysql_native_passwordBY'12345678'进行识别;$mysql->FLUSHPRIVILEGES;您现在可以使用数据库管理工具进行连接。安装Nginx拉取镜像dockerpullnginx创建并启动容器dockerrun--namenginx-p80:80-dnginx然后访问localhost可以看到Nginx默认的欢迎页面创建一个目录存放Nginx配置和日志mkdir-pdocker/nginx&&cddocker/nginxmkdirconflog从容器中复制配置文件到宿主机,并将配置文件映射到容器中对应目录dockercpnginx:/etc/nginx/conf.d/default.confdocker/nginx/conf/default.conf重新创建dockerstopnginx&&dockerrmnginxdockerrun--namenginx-p80:80-vdocker/nginx/conf:/etc/nginx/conf.d-vdocker/www:/usr/share/nginx/html-vdocker/nginx/log:/var/log/nginx-dnginxinstallPHPpullPHP镜像dockerpullphp:fpm创建容器dockerrun--namephp-fpm-p9000:9000-dphp:fpm创建存放php配置文件和日志的目录mkdir-pdocker/php&&cddocker/phpmkdirconflog从容器复制配置文件dockercpphp-fpm:/usr/local/etc/php-fpm.d/www.confdocker/php/conf/www.confdockercpphp-fpm:/usr/local/etc/php/php.ini-productiondocker/php/conf/php.ini重启容器dockerrun--namephp-fpm--链接mysql:mysql-v~/docker/www:/var/www/html-vdocker/php/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf-vdocker/php/conf/php.ini:/usr/local/etc/php/php.ini-dphp:fpm–link:可以用来链接两个容器,使源容器和接收容器可以相互通信。连接PHP和Mysql容器后,当PHP脚本连接数据库时,host值为'mysql'Nginx容器支持PHP-FPM容器修改Nginx配置文件default.confserver{listen80;服务器名称本地主机;根/usr/share/nginx/html;字符集utf-8;access_log/var/log/nginx/access.logmain;错误日志/var/log/nginx/error.log;location/{indexindex.htmlindex.htmindex.php;try_files$uri$uri//index.php?$query_string;}#error_page404/404.html;#将服务器错误页面重定向到静态页面/50x.html#error_page500502503504/50x.html;location=/50x.html{根html;}location~.php${fastcgi_indexindex.php;#php-fpm容器名称:端口号fastcgi_passphp-fpm:9000;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;包括fastcgi_params;}location~/.ht{全部拒绝;}}重新创建Nginx容器docker停止nginx&&dockerrmnginxdockerrun--namenginx-p80:80--linkphp-fpm-vdocker/nginx/conf:/etc/nginx/conf.d-vdocker/www:/usr/share/nginx/html-vdocker/nginx/log:/var/log/nginx-dnginxOK!在docker/www下创建index.phpphpinfo();打开localhost可以看到phpinfo()函数的输出信息安装php扩展docker-php-ext-installmysqli如果提示peclinstallredis&&docker-php-ext-installredisinstallgdextensionapt-getupdateapt-getinstalllibpng-devlibjpeg-devlibfreetype6-devdocker-php-ext-installgd扩展安装完成后,无需修改配置文件,重启PHP容器即可。容器启动顺序:mysql>php>nginx
