当前位置:   article > 正文

Docker-compose详解和LNMP搭建实战_麒麟系统中如何用docker-compose.yml文件来配置lamp环境,其中包含mysql和ph

麒麟系统中如何用docker-compose.yml文件来配置lamp环境,其中包含mysql和php两个

目录

一、Docker-compose简介

1.前言

2.概述

二、Docker-compose安装

三、YAML文件格式及编写注意事项

1.简介

2.使用方法

四、Docker Compose 常用命令

五、Docker Compose 配置常用字段

六、Docker-compose搭建LNMP实战


一、Docker-compose简介

1.前言

        我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,如Docker 官方产品Docker Compose。

        Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project,即项目),例如一个Web服务容器再加上后端的数据库服务容器等。

2.概述

        Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

        Docker-Compose将所管理的容器分为三层,分别是工程(project)服务(service) 以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务 发现及负载均衡,比如Consul。

project:代表多个service组成的项目,默认是用工作目录的名称作为project的工程名称。
service:一个 service 可以包含一个或多个容器,在里面可以定义网络模式端口镜像数据卷等参数。
container:可以直接由一个已存在的镜像运行实现,也可以通过dockerfile构建镜像实现。

        Docker-Compose的工程配置文件默认为docker-compose. yml,可通过环境变量COMPOSE_FILE 或 -f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

        使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

        Compose允许用户通过一个单独的docker-compose. yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目 (project) 。

        Docker-Compose项目由Python编写,调用Docker服 务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

二、Docker-compose安装

注意:Docker Compose是 Docker 的独立产品,因此需要安装 Docker 之后再单独安装Docker Compose。

安装源获取

  1. #获取在线源
  2. curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
  3. #安装,给予执行权限
  4. chmod +x /usr/local/bin/docker-compose
  5. #查看版本
  6. docker-compose --version

安装包下载

  1. #下载好安装包,直接上传到系统,给执行权限,放在指定目录
  2. chmod +x docker-compose
  3. mv docker-compose /usr/local/bin/

三、YAML文件格式及编写注意事项

1.简介

        YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 json 数据描述语言,语法比 json 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [ ] 括起来, hash用花括号 { } 括起来。

使用 YAML 时需要注意下面事项

  • 大小写敏感;
  • 通过缩进表示层级关系,不支持制表符 tab 键缩进,只能使用空格缩进
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格;
  • 用 # 号注释;
  • 符号字符后缩进1个空格,如冒号":" 、逗号 "," 、横杠"-";
  • 如果包含特殊字符用单引号' '引起来,会作为普通字符串处理;双引号" "引用起来,特殊字符作为本身想表示的意思。

2.使用方法

(1)数据结构

animals: pets        #对象映射: 键值对的字典

(2)序列数组

pets:         #对象映射: 

  - cat                       - 序列值

  - dog

  - pig

pets: ["cat", "dog", "pig"]        #另一种表达格式

示例

#序列的映射,是指针对一个对象,序列中的值都属于该对象,如蔬菜包含包菜、胡萝卜、土豆等。

vegetables:         

  - potato

  - carrot

  - cabbage

#映射的映射,是指针对一个对象有多个子对象,分别有他们的值,如系统状态包含cpu、内存、网络、磁盘等。

vmstat: 

  cpu: 2

  memory: 4G

  disk: 100G

  network: 

    ipv4: 192.168.1.1 

    netmask: 255.255.255.0

    gateway: 192.168.1.254

    dns: 8.8.8.8

都是通过左对齐的层级关系来表示的

(3)布尔值

debug: true        #真true,假false,不能用引号引用

debug: false

(4)文本块

value: |       # | 代表保留输出文本的换行和回车符,不加的话即使文本换行也会在同一行显示

  hello         #这种情况就是输出 hello   ,不加 | 就是 helloworld!

  world!                                       world!

| - #不保留文本块末尾的换行                | + #会保留文本块末尾的换行

value: > hello        #将 > 后的字符串和之后的字符串用空格分开,即 hello world!

world!

(5)打锚点和引用

type: &a string        #&是打锚点,后面跟的是锚点名称,&a 代表的就是 string

type: *a                   #*a 代表引用锚点,此处输出结果就是 type: string

types:                      #此处就是输出 types: 

  - int                                                   - int

  - *a                                                   - string 

  - double                                            - double

(6)组合yaml文件

pets:       

  - cat                      

  - dog

  - pig

---        #可以将多个yml文件写入一个yml文件中,使用 --- 作为分隔符

vegetables:         

  - potato

  - carrot

  - cabbage

四、Docker Compose 常用命令

命令描述
docker-composebuild重新构建服务
ps列出容器
up创建和启动容器
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示容器进程
logs查看容器输出
down删除容器、网络、数据卷和镜像
stop/start/restart停止/启动/重启服务
-f,--file使用特定的 compose 模板文件,默认为 docker-compose.yml
-p,--project-name指定项目名称,默认使用目录名称
-d在后台运行

五、Docker Compose 配置常用字段

字段含义
build使用Dockerfile构建镜像。指定Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile构建镜像上下文路径(指定Dockerfile文件)
context可以是dockerfile 的路径,或者是指向git 仓库的url地址
image指定镜像。
command执行命令,覆盖容器启动后默认执行的命令(类似于 docker run)
container_name指定容器名称,由于容器名称是唯一的, 如果指定自定义名称,则无法scale指定容器数量(同一个镜像指定多个容器数量)
deploy指定部署和运行服务相关的配置,只能在Swarm模式使用
environment添加环境变量
networks加入网络,引用顶级networks下条目
networks_mode设置容器的网络模式,如 host,bridge
ports暴露容器端口,与-p相同,但端口不能小于60
volumes挂载一个宿主机目录或命令卷到容器中,命令卷要在顶级volumes定义卷名称
volumes_from从另一个服务或容器挂载卷,可选参数:ro 和:rw。仅版本'2' 支持
hostname容器主机名
sysctls在容器内设置内核参数
links连接到另外一个容器,- 服务名称[:服务别名] (类似于容器互联)
privileged

用来给予容器root权限,注意是不安全的,只有两个值:true或false

restart        

设置重启策略,never,always, no-failure, unless-stopped

        never——默认策略,在容器退出时不重启容器

        on-failure——在容器非正常退出时(退出状态非0),才会重启容器

        on-failure:3——在容器非正常退出时重启容器,最多重启3次

        always——在容器退出时总是重启容器

        unless-stopped——在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

depends_on

此标签用于解决容器的依赖、启动先后问题

六、Docker-compose搭建LNMP实战

整体文件结构

1.准备依赖文件,配置nginx

  1. #创建nginx工作目录,上传nginx-1.12.0的软件包
  2. mkdir /opt/compose_lnmp/nginx/
  3. [root@localhost1 ~]#ls /opt/compose_lnmp/nginx/
  4. Dockerfile nginx-1.12.0.tar.gz nginx.conf
  5. #编写nginx的Dockerfile
  6. vim Dockerfile
  7. FROM centos:7
  8. MAINTAINER this is nginx image <chips>
  9. RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make && useradd -M -s /sbin/nologin nginx
  10. ADD nginx-1.12.0.tar.gz /usr/local/src/
  11. WORKDIR /usr/local/src/nginx-1.12.0
  12. RUN ./configure \
  13. --prefix=/usr/local/nginx \
  14. --user=nginx \
  15. --group=nginx \
  16. --with-http_stub_status_module && make -j2 && make install
  17. ENV PATH /usr/local/nginx/sbin:$PATH
  18. ADD nginx.conf /usr/local/nginx/conf/
  19. RUN chmod 777 -R /usr/local/nginx/html/
  20. EXPOSE 80
  21. EXPOSE 443
  22. ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
  23. #修改nginx配置文件(只做了基础配置,后续可以修改)
  24. #修改45行,添加php项
  25. location / {
  26. root html;
  27. index index.html index.php;
  28. }
  29. #66~71行取消注释,修改
  30. location ~ \.php$ {
  31. 66 root html;
  32. 67 fastcgi_pass 172.18.0.30:9000;
  33. 68 fastcgi_index index.php;
  34. 69 fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_sc ript_name;
  35. 70 include fastcgi_params;
  36. 71 }

2.准备依赖文件,配置mysql

  1. #创建mysql工作目录,上传mysql-boost-5.7.20的软件包
  2. mkdir /opt/compose_lnmp/mysql/
  3. [root@localhost1 mysql]#ls
  4. Dockerfile my.cnf mysql-boost-5.7.20.tar.gz
  5. #编写Dockerfile
  6. vim Dockerfile
  7. FROM centos:7
  8. MAINTAINER this is mysql image <chips>
  9. RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
  10. ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
  11. WORKDIR /usr/local/src/mysql-5.7.20/
  12. RUN cmake \
  13. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
  14. -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
  15. -DSYSCONFDIR=/etc \
  16. -DSYSTEMD_PID_DIR=/usr/local/mysql \
  17. -DDEFAULT_CHARSET=utf8 \
  18. -DDEFAULT_COLLATION=utf8_general_ci \
  19. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  20. -DMYSQL_DATADIR=/usr/local/mysql/data \
  21. -DWITH_BOOST=boost \
  22. -DWITH_SYSTEMD=1 && make -j2 && make install
  23. ADD my.cnf /etc/
  24. ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
  25. RUN useradd -M -s /sbin/nologin mysql && chown mysql:mysql /etc/my.cnf && chown -R mysql:mysql /usr/local/mysql/ && /usr/local/mysql/bin/mysqld \
  26. --initialize-insecure \
  27. --user=mysql \
  28. --basedir=/usr/local/mysql \
  29. --datadir=/usr/local/mysql/data && cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
  30. EXPOSE 3306
  31. CMD ["/usr/local/mysql/bin/mysqld"]
  32. #修改my.cnf
  33. [client]
  34. port = 3306
  35. socket=/usr/local/mysql/mysql.sock
  36. [mysql]
  37. port = 3306
  38. socket = /usr/local/mysql/mysql.sock
  39. auto-rehash
  40. [mysqld]
  41. user = mysql
  42. basedir=/usr/local/mysql
  43. datadir=/usr/local/mysql/data
  44. port = 3306
  45. character-set-server=utf8
  46. pid-file = /usr/local/mysql/mysqld.pid
  47. socket=/usr/local/mysql/mysql.sock
  48. bind-address = 0.0.0.0
  49. skip-name-resolve
  50. max_connections=2048
  51. default-storage-engine=INNODB
  52. max_allowed_packet=16M
  53. server-id = 1
  54. sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES

3.准备依赖文件,配置php

  1. #创建php工作目录,上传php-7.1.10的软件包
  2. mkdir /opt/compose_lnmp/php/
  3. [root@localhost1 php]#ls
  4. Dockerfile php-7.1.10.tar.bz2 php-fpm.conf php.ini www.conf
  5. #编写Dockerfile
  6. FROM centos:7
  7. MAINTAINER this is php image <chips>
  8. RUN yum -y install gd \
  9. libjpeg libjpeg-devel \
  10. libpng libpng-devel \
  11. freetype freetype-devel \
  12. libxml2 libxml2-devel \
  13. zlib zlib-devel \
  14. curl curl-devel \
  15. openssl openssl-devel \
  16. gcc gcc-c++ make pcre-devel && useradd -M -s /sbin/nologin nginx
  17. ADD php-7.1.10.tar.bz2 /usr/local/src/
  18. WORKDIR /usr/local/src/php-7.1.10
  19. RUN ./configure \
  20. --prefix=/usr/local/php \
  21. --with-mysql-sock=/usr/local/mysql/mysql.sock \
  22. --with-mysqli \
  23. --with-zlib \
  24. --with-curl \
  25. --with-gd \
  26. --with-jpeg-dir \
  27. --with-png-dir \
  28. --with-freetype-dir \
  29. --with-openssl \
  30. --enable-fpm \
  31. --enable-mbstring \
  32. --enable-xml \
  33. --enable-session \
  34. --enable-ftp \
  35. --enable-pdo \
  36. --enable-tokenizer \
  37. --enable-zip && make -j2 && make install
  38. ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATH
  39. ADD php.ini /usr/local/php/lib/
  40. ADD php-fpm.conf /usr/local/php/etc/
  41. ADD www.conf /usr/local/php/etc/php-fpm.d/
  42. EXPOSE 9000
  43. ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]
  44. #修改php.ini文件
  45. #1170行
  46. mysqli.default_socket = /usr/local/mysql/mysql.sock
  47. #939行
  48. date.timezone = Asia/Shanghai
  49. #修改php-fpm.conf文件
  50. #19行取消注释
  51. pid = run/php-fpm.pid
  52. #修改www.conf文件
  53. #23,24行修改
  54. user = nginx
  55. group = nginx
  56. #36行修改为监听php地址的9000端口
  57. listen = 172.18.0.30:9000
  58. #62行允许的客户端,添加监听地址为nginx的地址
  59. listen.allowed_clients = 127.0.0.1,172.18.0.10

4.编写docker-compose.yml文件

  1. #docker-compose.yml放在服务同级目录
  2. [root@localhost1 compose_lnmp]#ls
  3. docker-compose.yml mysql nginx php wwwroot
  4. #编写
  5. vim docker-compose.yml
  6. #定义docker-compose版本,可以是2 或 3
  7. version: '3'
  8. #使用services定义服务
  9. services:
  10. #第一个service
  11. nginx:
  12. #设置容器名
  13. container_name: nginx
  14. #使用dockerfile来构建镜像
  15. build:
  16. #指定Dockerfile文件所在位置
  17. context: ./nginx
  18. #指定文件名
  19. dockerfile: Dockerfile
  20. #映射端口
  21. ports:
  22. - 80:80
  23. - 443:443
  24. #设置数据卷挂载
  25. volumes:
  26. - ./wwwroot:/usr/local/nginx/html
  27. #加入网络
  28. networks:
  29. lnmp:
  30. ipv4_address: 172.18.0.10
  31. mysql:
  32. container_name: mysql
  33. build:
  34. context: ./mysql
  35. dockerfile: Dockerfile
  36. ports:
  37. - 3306:3306
  38. networks:
  39. lnmp:
  40. ipv4_address: 172.18.0.20
  41. volumes:
  42. - db-data:/usr/local/mysql
  43. privileged: true
  44. php:
  45. container_name: php
  46. build:
  47. context: ./php
  48. dockerfile: Dockerfile
  49. ports:
  50. - 9000:9000
  51. networks:
  52. lnmp:
  53. ipv4_address: 172.18.0.30
  54. volumes:
  55. - db-data:/usr/local/mysql
  56. - ./wwwroot:/usr/local/nginx/html
  57. #指定依赖,php需要最后启动
  58. depends_on:
  59. - nginx
  60. - mysql
  61. #设置网络为自定义网络
  62. networks:
  63. lnmp:
  64. driver: bridge
  65. ipam:
  66. config:
  67. - subnet: 172.18.0.0/16
  68. volumes:
  69. db-data:

5.准备测试项目WordPress

6.docker-compose构建项目(等待约30min)

查看状态(全up则成功)

7.授权数据库,访问192.168.116.10/wordpress/index.php/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/330951
推荐阅读
相关标签
  

闽ICP备14008679号