初识 docker 搭建自己的开发环境

换了一台设备,程序猿嘛第一件事肯定是先把开发环境搭建起来,以前为了方便都是搞的集成环境,这次准备下载集成环境的时候,突然想起 docker 这个东西,在下虽然了解一些概念性的东西但一直为曾实践。人嘛,没有梦想和咸鱼有什么分别。接下来就给大家分享我这两天倒腾的结果

还不了解 docker 的朋友可以看看软一峰老师的讲述: http://www.ruanyifeng.com/blog/2018/02/doc...

为了方便控制我采用的是编写配置文件 docker-compose.yml 的方式

语法我参考的是这里:https://www.jianshu.com/p/2217cfed29d7

我的目标是 mac + php + nginx + mysql,安装 docker 我就省略了,阮老师文章里面有通道。以下是我的 yml 文件配置

version: "3"
services:
  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - $PWD/project:/usr/share/nginx/html
      - $PWD/config/nginx:/etc/nginx
  php:
    image: php:7.2-fpm
    ports:
      - "9000:9000" 
    volumes:
      - $PWD/project:/var/www/html
  mysql:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=demo
      - MYSQL_USER=demo
      - MYSQL_PASSWORD=demo
    ports:
      - "3306:3306"

ps: [@Summer](https://learnku.com/users/1) 这个 yml 代码排版,搞得我强迫症发作

在 yml 文件所在目录运行命令 docker-compose up 加载配置,运行成功便会创建三个正在运行的容器,可以使用 docker container ls 查看详细信息,使用 docker container exec -it containerID /bin/bash 可以进入某个容器执行 shell 命令。
我这个配置估计是极简了,我认为也是最核心的配置。说说我的理解,首先通过 image 获取镜像,通过 ports 建立宿主机和容器的端口映射,通过 volumes 挂载宿主机 目录/文件 到服务容器指定位置(我觉得一般就是工作目录和配置文件)。不出意外现在访问 http://127.0.0.1:8080 你就能看到 nginx 欢迎界面。

前面都是小case,接下来我说几个我抓狂的地方(由于 nginx 配置得少,我后面说的要是过于简单,请大家见谅,我不是故意拉低社区知识质量,毕竟我一直都在学习如何把一个网站搞好),配置 nginx 我最终修改的是配置文件 /etc/nginx/conf.d/default.conf 开始我一直在 /etc/nginx/nginx.conf 来来回回,找了一堆列子都未果,还浪费了大把时间,反正最后找到 default.conf 修改几点如下

一、

location / {
    root   /usr/share/nginx/html;
    # 这里添加了index.php
    index  index.html index.htm index.php;
}

二、

location ~ \.php$ {
   # 这里修改为 php  读取文件目录
   root           /var/www/html;
   # 这里修改为 php 服务名称(和 yml 配置保持一直)和对应的端口
   # 千万不要使用容器 ip,因为重起容器之后 ip 地址会被重新分配
   fastcgi_pass   php:9000;
   fastcgi_index  index.php;
   # 这里的默认值我注释了起来,因为很痛啊
   # 到这里我页面一直是 File not found
   # 搜索引擎是个好东西,后面找到配置替换,终于输出 Hello world
   # fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

再说说 php,官网的镜像扩展很少,所以 mysql 扩展还得自己装,我装的是 PDO
我这里用的是一种比较直接了当的方式(也是淘了很久啊), 进入容器找到 /usr/local/bin 目录,运行 docker-php-ext-install pdo_mysql 完事。
前面说了容器 IP 地址每次重启会变,所以连接 mysql 的时候 host 请替换为服务名称,像这样,注意 host 参数。

$dns = "mysql:dbname=demo;host=mysql;charset=utf8";
$pdo = new PDO($dns, 'demo', 'demo');

安装扩展的其他方式可以参考这里:http://www.ruanyifeng.com/blog/2018/02/doc...

mysql 这里主要注意 environment(环境变量)

  • MYSQL_ROOT_PASSWORD 是强制性的提供的,作为最高操作权限的密码。
  • MYSQL_DATABASE 做为镜像启动时创建的数据库的名称
  • MYSQL_USER 用户
  • MYSQL_PASSWORD 密码

更多环境变量参考:https://hub.docker.com/_/mysql/
ps:别说 English 看不懂,谷歌翻译看个大概应该也懂吧

差不多就这样了,如果可以集齐龙珠,我想再聪明点,所以有任何写的不到位的地方还望各位指正,在下一向 吃一堑,长一智。

本作品采用《CC 协议》,转载必须注明作者和本文链接
你迷茫的原因大多数是因为,想得多,做得少
本帖由系统于 6年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 14

通过挂载的方式去修改nginx的配置文件,第一次启动容器的时候是不会生效的吧。

6年前 评论
DianWang

laradock轻松解决一切

6年前 评论
free-andy

@LiuKaHo 我是启动容器,然后把配置文件 copy 下来修改的,还有什么骚操作吗?

6年前 评论

@free-andy 我是创建镜像时把文件ADD进去,但这样的缺点就是,每次你修改配置文件都需要重新build镜像。

6年前 评论
free-andy

@yansongda 谢谢分享

6年前 评论
free-andy

@DianWang laradock 修改配置 .env 之后除了重建容器还有没有其他生效方式啊,我重启也没用

6年前 评论
DianWang

@free-andy laradock.io上面文档很清楚啊,修改配置之后必须要build才生效的,另外它会直接加载已存在的镜像,不会再重新下载的。如果env不生效,可以尝试直接修改每个模块下的dockfile啊

6年前 评论

这个网站蛮方便的 可以自己搭配:https://phpdocker.io/generator

6年前 评论
free-andy

@小方 好厉害的样子

6年前 评论

https://github.com/ScoLib/dnmp
这是我今天捣鼓一天,弄错来的,参考了不少 laradock 的yaml

6年前 评论

在选择 php image 的时候,是选择 php 还是 php-fpm???

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!