• Docker-compose详解和LNMP搭建实战


    目录

    一、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
    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
    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
    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/

  • 相关阅读:
    手把手教会:XML建模
    SqlServer 列转行,用逗号,分割
    C++ —— IO流
    GPU释放显存
    利用Spring Boot实现MQTT在物联网中的应用
    SpringBoot使用AOP记录接口操作日志
    支持流畅运行win10的最低配置是什么
    Mac版Jmeter安装与使用&模拟分布式环境
    EIP-3664合约研究笔记05--扩展属性分析
    Docker consul的容器服务更新与发现
  • 原文地址:https://blog.csdn.net/weixin_58544496/article/details/128037254