在Win10系统中,基于 Docker 构建 PHP 开发环境:Win10+Docker+Larad

接上篇:

https://mp.weixin.qq.com/s/MvIl0uJR21JUZ3WbmIngdQ

六、Docker 容器的基本操作
1、如下图,在 windows shell 中使用 docker-composer up -d nginx mysql 命令,可以启动容器,并会启动相关联的容器。启动之后一个基本的 LNMP 环境就构建完成了。
在Win10系统中,基于 Docker 构建 PHP 开发环境:Win10+Docker+Larad

使用 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 命令行。
在Win10系统中,基于 Docker 构建 PHP 开发环境:Win10+Docker+Larad

如上图,进入 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-c
```ontainer-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 将密码验证方式由以前的 mysqlnativepassword 改为了 cachingsha2password 。可以进入 mysql 容器 bash,登录 mysql ,将验证方式修改成原来的。

#在

docker

compose
exec
mysql bash

mysql

uroot

p

mysql

grant all PRIVILEGES on
.
to root@
‘%‘
WITH GRANT OPTION
;

mysql

ALTER user br/>‘root‘
@
‘%‘
IDENTIFIED WITH mysql_native_password BY
‘root‘
;

mysql

ALTER user br/>‘root‘
@
‘localhost‘
IDENTIFIED WITH mysql_native_password BY
‘root‘
;

mysql

FLUSH PRIVILEGES
;

mysql

exit
;


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

defaultauthenticationplugin = mysqlnativepassword

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 laradockmysql


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 mysql

docker

compose up

d nginx

###输出内容###

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会使用 bridge 网络模式为每一个启动的容器动态分配一个IP,以172.17.0.1为网关,172.17.0.2,172.17.0.3 依次类推作为容器的 ip,但是如果下次启动时容器启动顺序有变化,可能分配的 IP 地址也会变化,并且有些容器之间互相有依赖,所以最好按顺序依次启动,不要包含在一条 docker-compose up 命令中,这样当下次启动多个容器的时候 IP 还是会分配和上次相同的 IP。

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 laravel.test

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

8、使用 Navicat ,或 phpMyAdmin ,新建数据库 testlaravel ,字符及排序规则选:utf8mb4unicode_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
:
// laravel.test

...

DB_CONNECTION
=
mysql

DB_HOST
=
172.19
.
0.2

DB_PORT
=
3306

DB_DATABASE
=
test_laravel

DB_USERNAME
=
root

DB_PASSWORD
=
root

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


一、安装 cmder
1、win10 中将 cmder 放在C:\Program files\ 目录下时有权限问题。2、360杀毒会误杀,要将 cmder/vendor/init.bat 到360杀毒的 设置->文件白名单 中,在弹出拦截窗口时点击加入白名单无效,要手动加入。

二、Docker 常用命令
切换到 laradock 目录执行:

进入容器:docker-compose exec{容器名}bash 默认是使用 root 用户进入,议不要采用root进入,因为composer不推荐

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

退出命令是 : exit。

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

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

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

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

关闭所有容器:docker-compose stop

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

删除所有容器:docker-compose down

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

重启 nginx 容器: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 rm CONTAINER ID或者NAMES

查看openssl版本号:openssl version

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

三、win10 中 docker 运行程序加载速度慢的问题
docker 在win10挂载目录 IO 速度慢,导致 laravel 程序加载速度慢,说明及解决方法见以下两个链接:

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

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

相关内容

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

---END---

在Win10系统中,基于 Docker 构建 PHP 开发环境:Win10+Docker+Larad

上一篇:[Win32 API] FindFirstFile()和FindNextFile()


下一篇:Photoshop入门教程 美女照片变线稿