目前用到docker的命令:
docker ps //查询所有正在运行的容器
docker ps -a //查询所有创建的容器
dockere stop [容器id/容器名] //停止运行容器
docker rm [容器id/容器名] //删除容器
docker images //查询所有拉取的镜像
docker rmi [REPOSITORY] //删除镜像
docker restart [容器id/容器名] //重启容器
docker inspect --format '{{ .NetworkSettings.IPAddress }}' c9996261e1c5 //查询容器ip地址
一、安装docker客户端。
https://get.daocloud.io/
二、添加加速器地址。
由于在拉取镜像的时候仓并不在国内,所以需要添加阿里云加速器。
也可以直接进入阿里云的加速器界面下,找到相应的系统下载docker客户端。
安装后Perferences ---> Daemon ---> 添加镜像加速器地址 --> Apply&Restart
三、拉取镜像。
打开终端,拉取nginx、mysql:5.7、php:7.0-fpm的镜像。
拉取镜像 nginx
docker pull nginx
拉取镜像 mysql
docker pull mysql:5.7
拉取镜像 php
docker pull php:7.0-fpm
四、创建容器并做link操作
参数说明:
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-e 设置环境变量,必须设置root的用户名的初始密码
-v 添加目录的映射,就是在本机的/~/~/~/文件夹和容器中的/var/www/html目录同步。
-link 与另一个容器建立关系,以便于在当前的容器可以使用另外一个容器的服务。
//创建mysql容器
docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:5.7
//创建php-fpm容器
在创建之前,由于我们需要将php的 php.ini以及www.conf配置文件跟拷贝出来方便直接与容器相对应的文件做挂载
//我们先运行
$ docker run --name php1 -d php:7.0-fpm
//创建一个临时的php容器,通过使用docker cp 将www.conf和php.ini 复制到/s9docker/php-fpm下
在复制php.ini前记得进入到php容器中的/usr/local/etc/php/ 将php.ini-development复制完后改名为php.ini
$ docker cp php1:/usr/local/etc/php/php.ini /Users/nekumatar/s9docker/php-fpm/
$ docker cp php1:/usr/local/etc/php-fpm.d/www.conf /Users/nekumatar/s9docker/php-fpm/
复制完后就可以在自己挂载的路径看到两个文件了,这个时候就值需要把运行的容器停了,然后再删除,然后创建我们所需要的php容器。
docker run --name php70 -p 9000:9000 --link mysql57:mysql \
-v /Users/nekumatar/s9docker/app:/var/www/html \
-v /Users/nekumatar/s9docker/php-fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf \
-v /Users/nekumatar/s9docker/php-fpm/php.ini:/usr/local/etc/php/php.ini -d php:7.0-fpm
PS:可以先简单的创建容器后将配置文件拷贝到本地的目录下最后再两个文件的挂载-v /本地位置:/容器里的位置
//创建nginx容器
这里需要将日志跟nginx的配置文件挂载出来。
docker run --name s9nginx -d -p 80:80 \
-v /Users/nekumatar/s9docker/app:/var/www/html:ro \
-v /Users/nekumatar/s9docker/logs/nginx:/var/log/nginx \
-v /Users/nekumatar/s9docker/nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx
五、配置nginx容器
容器创建过后需要修改nginx配置
1、进路容器:docker exec -it s9nginx bash
2、先更新软件源:apt update
3、安装vim:apt-get install vim
完成后才可以使用vi命令进行改写。
4、在容器中对nginx的配置文件进行修改:vi etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
root /var/www/html;
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
#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
#172.17.0.3:9000;
location ~ \.php {
fastcgi_pass 172.17.0.4:9000;
fastcgi_index index.php;
include fastcgi_params;
#下面两句是给fastcgi权限,可以支持 ?s=/module/controller/action的url访问模式
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#下面两句才能真正支持 index.php/index/index/index的pathinfo模式
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param REMOTE_ADDR "192.168.1.4";
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
root为nginx容器里的服务器路径,mall是我的项目。这样输入url的时候直接写localhost即可访问项目
location / { // …..省略部分代码
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
上面的代码为隐藏tp5的入口文件index.php的方法。
如果root为/var/www/html的话,mall就为二级目录,则改为:
location /mall/ {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^/mall/(.*)$ /mall/index.php?s=/$1 last;
break;
}
由于有挂载到本地的文件,可以直接在/Users/nekumatar/s9docker/nginx/default.conf修改,改完后并重启容器。
fastcgi_pass 需要填入调用php服务的容器ip,如需要查询容器地址ip可以使用:docker inspect --format '{{ .NetworkSettings.IPAddress }}' c9996261e1c5
c9996261e1c5是容器的ip, 可以通过 docker ps -a 查询所有的容器信息。
最后在挂载的本地文件夹(/Users/nekumatar/s9docker/app)位置上创个phpinfo进行查看。
六、配置php容器的扩展
镜像自带了php源码包,位置为容器的 /usr/src/php.tar.xz
可以通过docker-php-ext-install [扩展名]
例如:docker-php-ext-install mysqli
坑:有一点要注意,有些扩展需要依赖库,我自己在安装的gd时候就报错了。这是依赖库的原因,在php70的容器里运行:
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng-dev 安装这些依赖库。
最后根据 docker-php-ext-install 命令就可以直接本地编译安装扩展了。
现在我在本地的php-fpm文件夹通过touch Dockerfile来创建新的镜像,Dockerfile内容如下:
FROM php:7.0-fpm
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
&& docker-php-ext-install -j$(nproc) iconv mcrypt \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd \
# no dependency extension
&& docker-php-ext-install gettext mysqli opcache pdo_mysql sockets
然后在创建Dockerfile的文件夹创建有安装扩展的镜像,命令:
docker build -t php70:v1 .
创建完后就可以把这个镜像上传到aliyun下次就不用再安装扩展了,算是基于官方镜像搭建了自己的需要的镜像
七、安装Xdebug
首先将打印出来的phpinfo复制后粘贴到https://xdebug.org/wizard.php查询自己php相对应的Xdebug版本。
下载下来后并对其进行安装,用例:docker cp /opt/test/file.txt mycontainer:/opt/testnew/
复制xdebug进容器后:
先将/usr/src/里的php.tar.xz解压出来,之后再去解压xdebug的文件复制到/usr/src/php(看你解压出来的是什么名字)/ext
//现将文件解压
tar -xf /home/xdebug-2.6.0.tgz
//删除掉压缩包
rm -rf /home/xdebug-2.6.0.tgz
mkdir -p /usr/src/php/ext
mv xdebug-2.6.0 /usr/src/php/ext/xdebug
//在安装之前,要将你解压出来的/usr/src/php中的php压缩回原来的php.tar.xz
tar -Jcvf php.tar.xz php-7.0.32/
//将xdebug扩展安装
docker-php-ext-install xdebug
最后在info.php查询到xdebug安装就表示成功了。
docker下PHOPSTORM与Xdebug配置可以参考:
https://laravel-china.org/articles/14834/configuration-of-php-storm-xdebug-in-docker-based-development-environment