dockerfile + docker-compose 部署nginx+php+mysql+redis

  第一次听说docker可以一条指令部署一整套的运行环境的时候,心里是很好奇的,平时虽然用phpstudy或者lnmp也没多大的麻烦,但是开发中由于工作环境差异性,有时候在本地开发环境测试没问题的代码,到线上就莫名其妙的不行了。抱着好奇的心里决定一窥究竟。

  跟学习一门新语言一样。先看一下什么是docker,工作原理是什么,运行要求等,开始整活,先搞个nginx,简单,几分钟ok。接下来就是nginx+php,花了点时间,每个docker容器,或者说是应用服务,都是一个独立的沙箱,通过特定的端口号互相作用,比如nginx的fastcgi_pass可以配置为127.0.0.1:9000(9000是php容器的端口号)来访问php-fpm。

  docker-compose:一键执行搭建服务,非常方便,通过创建专有网络将一个个的nginx、php、mysql等等等都系统的管理起来,使用之前要准备好image字段所指明的镜像。

配合dockerfile:php、redis需要用到,例如php需要安装vim、(crul、mysqli等)扩展,需要先使用dockerfile来构建自定义预设镜像。上下文:实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。


认知准备

1、运行:docker-compose up 或者docker-compose up -d,添加-d是后台运行不占用shell窗口,调试建议直接docker-compose up 能看到更多的错误信息。

2、docker-compose stop、docker-compose restart

3、mysql的配置文件my.cnf位于etc/mysql/my.cnf,值得注意的是mysql容器在没有启动时my.cnf是不存在的,所以在yml文件配置映射将会得到一个my.cnf的文件夹。volumes映射的时候应该 : - "`你的本地文件夹`:/etc/mysql"

4、端口的映射,对应所有容器来说只有一个端口有用,一般80:80类似这样就可以了,不建议搞特殊以免造成代码上不必要的麻烦。

5、对yml的修改,比如修改端口映射、文件夹映射,需要删掉容器重新执行docker-compose up,因为路径-容器上下文没有发生变更配置是不会刷新的


```

version: "2"

networks:#docker内核子局域网络注册

  docker_composer_npmr_net:

services:

  nginx:  #服务名称,docker内核的互相识别

     image: nginx:1.19.3 #镜像名:标签

     restart: always

     container_name: nginx  #容器名称,docker ps -a显示的名称

     volumes: #路径映射,物理地址:容器地址

      - "/home/www/wwwroot/web:/www/home"

      - "/home/www/docker-compose.d/nginx/nginx.conf:/etc/nginx/nginx.conf"

      - "/home/www/docker-compose.d/nginx/conf.d:/etc/nginx/conf.d"

      - "/home/www/docker-compose.d/nginx/logs:/var/log/nginx"

     ports: #物理端口:容器端口

      - "80:80"

     depends_on: #依赖顺序性启动

      - php

      - mysql

      - redis

     networks:#绑定隶属子局域网

      docker_composer_npmr_net:

       aliases:#子局域网内别名,可有多个

         - nginx1

         - nginx2

  php:

    image: php:7.4.11-fpm

    restart: always

    ports:

      - "9000:9000"

    container_name: php

    volumes:

      - "/home/www/wwwroot/web:/www/home"

      - "/home/www/docker-compose.d/php/php-fpm.d/www.conf:/opt/bitnami/php/etc/php-fpm.d/www.conf"

    networks:

      docker_composer_npmr_net:

        aliases:

          - php

  mysql:

    image: mysql:8.0.22

    restart: always

    container_name: mysql

    volumes:

      - "/home/www/docker-compose.d/mysql/conf:/etc/mysql/conf.d"

      - "/home/www/docker-compose.d/mysql/logs:/logs"

      - "/home/www/docker-compose.d/mysql/data:/var/lib/mysql"

    ports:

      - "3306:3306" #最好改成其他端口,避免黑客入侵

    #command:  -e MYSQL_ROOT_PASSWORD=123456

    command: [

      '--default-authentication-plugin=mysql_native_password',

      '--character-set-server=utf8mb4', #设置数据库表的数据集

      '--collation-server=utf8mb4_unicode_ci', #设置数据库表的数据集

    ]

    environment:

      MYSQL_ROOT_PASSWORD: "123456"

      #MYSQL_USER: 'ylc' 

      #MYSQL_PASS: 'ylc123'

      MYSQL_DATABASE: "wowonew"

    networks:

      docker_composer_npmr_net:

        aliases:

          - mysql

  redis:

    image: redis:6.0.8

    restart: always

    container_name: redis

    volumes:

      - "/home/www/docker-compose.d/redis/redis.conf:/etc/redis/redis.conf:rw"

      - "/home/www/docker-compose.d/redis/data:/data:rw"

      - "/home/www/docker-compose.d/redis/redis.log:/dev/null"

    ports:

      - "6379:6379" #最好改成其他端口,避免黑客入侵

    command: redis-server /etc/redis/redis.conf --appendonly yes #数据持久化,启动的时候指定redis.conf。这边的redis.conf要是容器的地址

    networks:

      docker_composer_npmr_net:

        aliases:

          - resis


  dockerfile:刚开始的时候有时候,测试要看一看容器里面的东西,发现直接执行vim .....,提示我“-bash:vim command not found”,想想也是,人家都把镜像往最小的做,怎么可能每个镜像都有一套linux的一套软件。于是就在容器里安装vim,但是每次重新生成容器后都要重新安装vim一次,实在是烦,其实主要的配置文件只需要通过映射目录volumes字段挂在出来就可以了,只是这引出了我的一些思考。

  于是我发现了dockerfile,用户来在容器生成的时候执行相关的指令,我就想要把安装vim的shell指令写进去让执行而已,然后发现docker-compose.yml文件里有个build的字段用来指定dockerfile的。我就想每次只需要一条up就能安装各种各样的扩展,就很方便,可是光是在容器里安装一个vim都要花费五六分钟,每个容器安装一次半个钟都算少了。先实践一下,进入到安装了vim的容器确实是能使用vi了。但是也发现create完容器之后,仓库多了个$rootDir_$containerName命名的镜像,例如web_nginx($rootDir是我执行docker-compose up -d的目录,也就是根目录,$containerName是我的容器名称)。由此知道,docker-compose up -d的执行如果是指定了build:属性的时候会伴随一个自定义的镜像(根据dockerfile)生成。

  然后当再次执行up的时候,重点来了,docker内核会根据镜像的上下文目录,一般是dockerfile所在的目录,来查看是否存在之前在该目录创建过的镜像,有则直接使用,无则创建(因为容器的上下文已经绑定在docker内核)。一般有两个方法创建镜像,1、docker build -t nginx:v3。2、在docker-compose.yml的build字段指定dockerfile的路径和context字段指定上下文路径,从而生成$rootDir_$containerName格式命名的镜像。也就是我用的方法。建议使用第一种,对强迫症来说可以舒服的控制一下镜像的命名。其实这么做对理解docker是很有意义的,直接拿别人的docker-compose来用,不如自己一个个推敲。还有一点,就是当存在以某个目录为上下文目录生成的镜像时,修改原有的dockerfile再执行up是不会生成新的镜像和容器的,up命令不负责镜像的更新。废话:好比dockerfile生成的镜像就是手动挡,上坡就降档高速就升档,完全使用compose.yml来代替dockerfile就是自动挡,加减档场景早已预设。

  简而言之,较为合理的使用docker-compose搭建lnmpr有两个步骤,1、准备镜像,包括五花八门的自己定制的dockerfile生成的镜像。2、编写docker-compose.yml文件,并将各个挂载的目录、配置文件准备好。最后up。

  文字多一点,可能无法准确表达遇到问题的解决方法,参考一下让大伙少走弯路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270