作者 adminz 发布于 2019-02-22 修改于

php开发环境安装配置:win10+docker+Laradock(下篇)

接上篇:http://z.uxpi.net/node/306

六、Docker 容器的基本操作

1、如下图,在 windows shell 中使用 docker-composer up -d nginx mysql 命令,可以启动容器,并会启动相关联的容器。启动之后一个基本的 LNMP 环境就构建完成了。

Thumbnail

使用 docker-compose ps 可以查看所有容器,如上图,可以看到,beanstalkd 和 redis 在 state 状态是 Exit ,也就是没有启动。所以,想使用哪个服务就启动哪个容器。最后的 Ports 端口号是 宿主机的端口映射到容器的端口,比如,浏览器访问 http://127.0.0.1 ,宿主机( Win10 ) 的80端口就会映射到 nginx 容器的 80 端口,这样就由 nginx 提供服务了。

2、进入相应的容器就相当于进入了 Linux 系统环境,比如进入 Workspace 容器就可以执行( Artisan, Composer, PHPUnit, Gulp, ... )等命令,进入 mysql 容器,可以登录 mysql 命令行。

Thumbnail

 如上图,进入 nginx 容器 bash 后,就可以运行 Linux 命令了,运行 nginx -V 查看版本,可以看到版本号及编译参数,比如,已经启用了 ssl 、gzip、 http_v2 等功能模块。最后用 exit 退出 Linux bash 环境。

docker-compose exec workspace bash // 进入workspace 容器bash

docker-compose exec mysql bash // 进入 mysql 容器 bash

docker-compose exec nginx bash  // 进入 nginx 容器 bash

###显示结果###
bash-4.4#

Windows PowerShell 用户执行以下命令以进入任何正在运行的容器:

# docker exec -it {workspace-container-id} bash

每一个容器就相当于类似于沙箱一样的互相隔离的一个 Linux 系统,比如 nginx 容器就是一个 Linux + nginx 系统,而 mysql 容器是另一个 Linux + mysql 系统,两个容器之间是隔离的,不会互相影响,每个容器都有一个 Docker 统一分配的局域网 IP 地址。进入容器之后 bash ,可以运行基本的 Linux 命令,比如查看容器的ip地址:

# cat /etc/hosts

3、为了区别 Windows PowerShell 和 容器 base 环境,可以约定:如果命令行前是  > 符号,就表示要在 Windows PowerShell 中运行;如果命令行前是  # 符号,就表示在 Linux base 环境中运行。

4、如果在安装时没有修改 .env 文件,按默认没有安装 Xdebug ,要重新配置启用 Xdebug 的话,可以按前面  五、安装 Laradock 中的第3条方法修改 .env 文件,修改完成后,运行命令 > docker-compose build workspace php-fpm 重新构建容器,所需时间和第一次安装时一样。

5、一般在修改 nginx 配置后,需要重启 Docker 的 Nginx:

> docker-compose up -d nginx

###显示结果###
laradock_docker-in-docker_1 is up-to-date
Recreating laradock_workspace_1 ... done
Recreating laradock_php-fpm_1   ... done
Recreating laradock_nginx_1     ... done

6、进入 workspace 容器 base ,使用国内的 composer 镜像,详见:https://pkg.phpcomposer.com/

docker-compose exec workspace bash 
composer config -g repo.packagist composer https://packagist.phpcomposer.com

七、mysql8.0 无法连接问题

1、使用docker-compose up命令运行phpMyAdmin容器

# use with mysql
docker-compose up -d mysql phpmyadmin

2、打开浏览器并通过端口8080访问本地主机:http://localhost:8080 ,服务器:mysql, 用户名:root,密码:root 登录

3、如果宿主机安装了 Navicat 之类的数据库管理软件,主机地址使用 127.0.0.1 ,就可以连接 mysql 数制库。

4、但是在 mysql8.0 时,这些数据库管理软件还不支持,可能会报错:

mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password]
mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client

这是因为 mysql 8.0 将密码验证方式由以前的 mysql_native_password 改为了 caching_sha2_password 。可以进入 mysql 容器 bash,登录 mysql ,将验证方式修改成原来的。

#在
docker-compose exec mysql bash

mysql -uroot -p
mysql> grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;
mysql> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

现在就可以用 root  登录了。为了使新建用户的验证方式默认为 mysql_native_password ,可以修改 my.cnf 文件,在 [mysqld] 部分中添加:

default_authentication_plugin = mysql_native_password

5、laradock 默认装的是 mysql 最新版本(mysql8),也可以更换成低版本的 mysql 。

# 修改 .env 文件
MYSQL_VERSION=5.7 # 默认为 latest

#停止mysql容器
docker-compose stop mysql

# 删除旧数据库数据
rm -rf ~/.laradock/data/mysql

# 重新构建新 mysql
docker-compose build mysql

 # 重新创建容器
docker-compose up -d nginx mysql

# 查看现有 mysql 版本
docker inspect laradock_mysql_1

6、在 php 程序中连接数据库时,如果 DB_HOST 为 127.0.0.1 或 localhost,则会报错:SQLSTATE[HY000] [2002] Connection refused ,SQLSTATE[HY000] [2002] No such file or directory,那时因为 php 容器里是没有 mysql 的,需要用 mysql 容器的 IP。

八、项目配置

1、以安装和配置一个 Laravel 项目为例,在 PowerShell 中首先进入 Laradock 目录,启动容器:

docker-compose up -d nginx mysql

###输出内容###
laradock_mysql_1 is up-to-date
laradock_docker-in-docker_1 is up-to-date
laradock_workspace_1 is up-to-date
laradock_php-fpm_1 is up-to-date
laradock_nginx_1 is up-to-date
docker-compose up -d redis beanstalkd phpmyadmin
docker-compose up -d phpmyadmin

容器之间有依赖的,最好依次启动,不要包含在一条 docker-compose up 命令中。

2、进入 workspace 容器

docker-compose exec workspace bash

###输出内容###
root@5f056ea61aed:/var/www#

输出内容可以看到容器中默认目录是 /var/www 目录,这个目录默认是和 win10 中 Laradock 同级目录建立的软链接。

ps:如果要修改这个默认的软链接目录,可以先在 laradock 父级目录下创建一个与 laradock 同级的 wwwroot 目录,然后编辑 laradock 目录下 .env 文件中的 APPLICATION 配置项:

APPLICATION=../wwwroot/

再重新载入容器,这样就相当于为 win10 中的 wwwroot 目录与 Docker 的 /var/www 目录建立了软链接

4、在 workspace 容器的 bash 中,首先要确定是否已启用用 composer 国内镜像,参见上述 六.6 ,然后运行 composer 命令创建一个 Laravel 项目:

composer create-project laravel/laravel larabbs --prefer-dist

在 win10 中的目录结构如下:

+laradock
+laravel

在 win10 中的 laravel 目录,就相当于 workspace 中的 /var/www  目录。

5、在win10中打开 laradock/nginx/sites 目录,复制一份 laravel.conf.example ,重命名为 larabbs.conf 并编辑此文件:

server_name larabbs.test;
root /var/www/laravel/public;
index index.php index.html index.htm;

重新启动 laradock_nginx 容器,也就是重启 nginx 服务器

docker restart laradock_nginx_1

6、打开 C:\Windows\System32\drivers\etc 目录,编辑 hosts 文件,添加:127.0.0.1  larabbs.test

7、打开浏览器,访问 http://larabbs.test ,即可看到 laravel 框架默认首页。

8、使用 Navicat ,或 phpmyadmin ,新建数据库 test_larabbs ,字符及排序规则选:utf8mb4_unicode_ci

9、进入 mysql 容器,查询容器的 ip 地址,如本例:172.19.0.2 即为php项目连接数据库的地址。

> docker-compose exec mysql bash

# cat /etc/hosts

***显示结果***
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.19.0.2      973c5c774036

退出容器 bash

# exit

***显示结果***
exit
PS C:\WWW\laradock>

10、用 phpstrom 或别的编辑器,打开 Laravel 项目,编辑 .env 配置文件,DB_HOST 为上一步查询到的 IP 地址:

APP_URL=http://larabbs.test
...
DB_CONNECTION=mysql
DB_HOST=172.19.0.2
DB_PORT=3306
DB_DATABASE=test_larabbs
DB_USERNAME=root
DB_PASSWORD=root

11、至此,项目配置完成!

 

安装 cmder

1、放在C:\Program files\ 目录下时有权限问题,2、360杀毒会误杀,要退出360

 

附:Docker 常用命令

切换到 laradock 目录执行:docker-compose exec{容器名}bash ,例如:

进入 nginx 容器: docker-compose exec mysql bash

进入 workspace 容器:docker-compose exec workspace bash ,这是 laradock 的 docker 的工作空间

在 mysql 容器 bash 中,进入mysql 命令行: mysql -uroot -proot

退出 : exit

查看容器启动状态:docker-compose ps

关闭所有容器:docker-compose stop

关闭指定容器:docker-compose stop ID

删除所有容器:docker-compose down

重启:docker-compose restart nginx

杀死所有正在运行的容器:docker kill $(docker ps -a -q)

删除所有已经停止的容器:docker rm $(docker ps -a -q)

查看本地镜像:docker images

查看本地容器:docker ps

创建镜像:docker build -t name:tag Dockerfile路径

进入容器:docker exec-it IMAGE ID或者NAMES /bin/bash

关闭容器:docker stop CONTAINER ID或者NAMES

重新启动关闭的容器:docker start CONTAINER ID或者NAMES

移除本地容器:docker rm CONTAINER ID或者NAMES

进入容器:docker-compose exec —user=laradock workspace bash

建议不要采用root进入,因为composer不推荐

查看openssl版本号:openssl version

查看 nginx 的版本及编译参数: nginx -V

 

 

 

默认情况下,docker会使用
bridge网络模式为每一个启动的容器动态分配一个IP,以172.17.0.1为网关,172.17.0.2,172.17.0.3依次类推作为容器的ip,这样也算是
每个容器有了ip,当下次启动多个容器的时候IP还是会按照这种方式分配,表面上还是一个固定IP的方式,但是这种方式对容器启动顺序
有严格的要求。

 

docker在win10挂载目录IO速度慢,导致 laravel 程序加载速度慢

https://github.com/docker/for-win/issues/188

https://www.jianshu.com/p/db1c826ea98c