• 基于 Docker Compose 部署 LNMP+WordPress 测试环境


    Docker Compose是一个定义及运行多个Docker容器的工具,它自身我们可以简单的理解为就是一个二进制文件(命令),是我们可以更方便易于管理的构建基于docker的复杂应用

    • 使用Compose的过程:三步
    1. 使用Dock而file定义单个应用程序的环境,以便在任何地方进行复制。
    2. 在docker-compose.yml中定义组成该应用程序的服务,将单个应用程序组成一个整体,它们各自处在相对隔离的环境中,却可以通过端口映射来进行协同工作。
    3. 运行docker-compose开始撰写后并运行整个应用程序

    编排

    指挥的角色地位,根据被部署的对象之间的耦合关系,以及被部署对象的环境依赖,制定部署流程中各个动作的执行顺序和获取防止;这些信息都会在编排工具中以指定的格式在配置文件中定义,保证这个流程可以随时在全新环境可靠有序重现

    部署

    具体实施的角色地位,按照编排指定的内容和流程,在目标容器执行,一切都是按照编排中制定好的来进行具体实施。

    Compose原理

    简单概述下:如用户执行docker-compose up指令表示运行在docker-compose.yml中定义好的各项任务,进行构建镜像或者运行容器,等一些列操作。 那么如果在当前宿主机中已经存在了与该应用对应的容器(即重复了),docker-compose会进行逻辑判断,如果用户指定了可以重新启动已有服务,其就会执行service模块的容器重启方法 否则将直接启动已有的容器。两者区别在于前者是重启,会创建新容器,就容器会移除掉。 该过程中创建容器的各项定义参数都是compose指令和.yml文件中指定好的。

    YAML简介

         YAML 是一种标记语言,可读性很强。类似于 XML 数据描述语言,语法比 XML 简单的多。YAML 数据结构通过缩进来表示,连续的目录通过减号来表示,键值对用冒号分割,数组用括号括起来,hash 用花括号括起来。

    YAML 文件格式注意事项:

    在缩进中空白字符的数目并不是非常重要,只要相同阶层的元素左对齐就可以了(不过不能使用TAB字符);

    通常开头缩进2个空格;

    字符的后面缩进1个空格,比如冒号、逗号、横杆;

    支持#注释;

    允许在文件中加入选择性的空行,以增加可读性

    字段 描述

    build

    dockerfile

    context

    指定 dockerfile 文件名

    构建镜像上下文路径  

    image 指定镜像
    command 执行命令,覆盖默认命令
    container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
    deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
    environment 添加环境变量
    metworks 加入网络,引入顶级networks下条目
    ports 暴露端口,与-p相同,但端口不低于60
    volumes 挂载宿主机路径或命名卷。如果是命名卷在顶级volumes定义卷名称
    restart 重启策略,默认no,always|on-failure|unless-stopeed
    hostname 容器主机名

    二、使用docker compose 部署lnmp

    安装 docker-ce 

    yum -y install yum-utils device-mapper-persistent-data lvm2

    curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo

    yum -y install docker-ce

    systemctl start docker

    systemctl enable docker

    阿里云镜像加速器

    https://cr.console.aliyun.com/

    [root@gitlab ~]# cat << END > /etc/docker/daemon.json
    {
             "registry-mirrors":["https://xc1orh81.mirror.aliyuncs.com"]
    }
    END
    [root@gitlab ~]# systemctl daemon-reload
    [root@gitlab ~]# systemctl restart docker

    安装compose工具

    curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

    chmod +x /usr/local/bin/docker-compose

    mkdir compose_lnmp

    cd compose_lnmp/

    编写compose文件和dockerfile文件

    [root@tomcat compose_lnmp]# tree
    .
    ├── docker-compose.yml
    ├── mysql
    │   ├── conf
    │   │   └── my.cnf
    │   └── data
    ├── nginx
    │   ├── Dockerfile
    │   ├── nginx-1.12.1.tar.gz
    │   ├── nginx.conf
    │   └── run.sh
    ├── php
    │   ├── Dockerfile
    │   ├── php-5.6.39.tar.gz
    │   └── php.ini
    └── wwwroot
    ├── index.html
    └── index.php

    6 directories, 11 files

    [root@tomcat compose_lnmp]# cat docker-compose.yml
    version: '3'
    services:
        nginx:

    #在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
            hostname: nginx

    #相当于提前预定义容器的主机名,会写入到容器的/etc/hostname中
            build:

    #该标签标示基于dockerfile来构建一个镜像
                context: ./nginx

    #指定构建镜像所需的dockerfile目录,我这里指定的是相对目录,该文件(docker-compose.yml)所处位置,也可以绝对目录,
                dockerfile: Dockerfile
            ports:
                - 80:80

    #和宿主机映射的端口
            networks:
                - lnmp

    #指定的网络环境????
            volumes:
                - ./wwwroot:/usr/local/nginx/html

    #将宿主机目录挂载到该容器当中

              (  - ./wwwroot:/usr/local/nginx/html:ro

    #将宿主机目录挂载到该容器当中(只读))

        php:
            hostname: php
            build:
                context: ./php
                dockerfile: Dockerfile
        ports:
            - 9000:9000
        networks:
            - lnmp
        volumes:
            - ./wwwroot:/usr/local/nginx/html

        mysql:
            hostname: mysql
            image: mysql:5.6

    #image标签表示是基于mysql:5.6镜像构建一个新的
        ports:
            - 3306:3306
        networks:
            - lnmp
        volumes:
            - ./mysql/conf:/etc/mysql/conf.d
            - ./mysql/data:/var/lib/mysql
        command: --character-set-server=utf8
        environment:
            MYSQL_ROOT_PASSWORD: 123456

    #???mysql中root用户密码
            MYSQL_DATABASE: wordpress

    #新建一个数据库名为WordPress
            MYSQL_USER: user

    #新建一个用户名为user
            MYSQL_PASSWORD: user123

    #新建user用户密码为user123

        networks:
            lnmp:

    #创建一个网络,lnmp为该网络的别名

    Nginx的dockerfile编写

    [root@tomcat compose_lnmp]# cat nginx/Dockerfile
    FROM centos:7

    #如果有该docker镜像则基于该镜像进行构建,没有则自行从镜像仓库pull
    MAINTAINER crushlinux
    ENV TIME_ZOME Asia/Shanghai

    RUN useradd -s /sbin/nologin -M nginx && yum -y install gcc gcc-c++ make openssl-devel pcre-devel 

    #运行的命令,安装依赖
    ADD nginx-1.12.1.tar.gz /tmp

    #将宿主机源码包传送到容器内tmp目录

    RUN cd /tmp/nginx-1.12.1 &&
             ./configure --prefix=/usr/local/nginx &&
             make -j 2 &&
             make install

    #编译;make -j 2使用两个进程来make,加速

    RUN rm -rf /tmp/nginx* && yum clean all &&
                   echo "${TIME_ZOME}" > /etc/timezone &&
                   ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime

    EXPOSE 80
    COPY nginx.conf /usr/local/nginx/conf/
    WORKDIR /root/nginx
    ADD run.sh /run.sh
    RUN chmod 775 /run.sh
    CMD ["/run.sh"]

    #一系列命令操作

    Nginx配置文件,直接复制到容器内使用

    [root@tomcat compose_lnmp]# cat nginx/nginx.conf
    user nginx nginx;
    worker_processes 1;
    worker_rlimit_nofile 102400;
    error_log logs/error.log;
    pid logs/nginx.pid;

    events {
        use epoll;
        worker_connections 4096;
    }

    http {
        include mime.types;
        default_type application/octet-stream;

        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                                   '$status $body_bytes_sent "$http_referer" '
                                   '"$http_user_agent" "$http_x_forwarded_for"';

        access_log logs/access.log main;
        sendfile on;
        keepalive_timeout 65;

        server {
            listen 80;
            server_name localhost;
        charset utf-8;

            location / {
                root html;
                index index.php index.html index.htm;
            }
            location ~ .php$ {
                root html;
                fastcgi_index index.php;
                fastcgi_pass 192.168.200.113:9000;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
            }
        }
    }

    daemon off;

    [root@tomcat compose_lnmp]# cat nginx/run.sh
    #!/bin/bash

    /usr/local/nginx/sbin/nginx

    MySQL配置文件

    [root@tomcat compose_lnmp]# cat mysql/conf/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/tmp/mysql.sock
    symbolic-links=0

    [mysqld_safe]
    log-error=/var/log/mysql/mysql.log
    pid-file=/tmp/mysql.pid

    PHP配置文件

    [root@tomcat compose_lnmp]# cat php/Dockerfile
    FROM centos:7
    MAINTAINER crushlinux
    ENV TIME_ZOME Asia/Shanghai
    RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
    ADD php-5.6.39.tar.gz /tmp/

    RUN cd /tmp/php-5.6.39 &&
                 ./configure --prefix=/usr/local/php
                 --with-config-file-path=/usr/local/php/etc
                 --with-mysql --with-mysqli
                 --with-openssl --with-zlib --with-curl --with-gd
                 --with-jpeg-dir --with-png-dir --with-iconv
                 --enable-fpm --enable-zip --enable-mbstring &&
                 make -j 4 &&
                 make install

    RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf &&
                  sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf &&
                  sed -i "21a daemonize=no" /usr/local/php/etc/php-fpm.conf &&
                  echo "${TIME_ZOME}" > /etc/timezone &&
                  ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime

    COPY php.ini /usr/local/php/etc/
    RUN rm -rf /tmp/php* && yum clean all
    WORKDIR /usr/local/php/
    EXPOSE 9000

    #将容器内该端口进行映射
    CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]

    wwwroot目录为网页测试文件

    [root@tomcat compose_lnmp]# cat wwwroot/index.html
    www.crushlinux.com
    [root@tomcat compose_lnmp]# cat wwwroot/index.php
    <?php
    phpinfo();
    ?>

    问题:

    gpg 验证错误

    然而突然出现一个docker安装的gpg 验证错误: 

    warning: /var/cache/yum/x86_64/7/dockerrepo/packages/docker-engine-selinux-1.10.3-1.el7.centos.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 2c52609d: NOKEY
    Retrieving key from https://yum.dockerproject.org/gpg
     

    GPG key retrieval failed: [Errno 12] Timeout on https://yum.dockerproject.org/gpg: (28, 'Resolving timed out after 3512 milliseconds')

    解决办法是:

     rpm -import http://yum.dockerproject.org/gpg

    导入gpg文件,ok,非常简单, 搞定

    Gpgkey
    开启gpgcheck后,通过gpgkey来指定,相应的gpg文件
    如果不指定gpgkey文件,那么就必须手动的导入相应的gpg文件,
    Rpm --import http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
    必须手动的敲入这条命令。


    RHEL发行版安装好后会将相应的gpgkey放在/etc/pki/rpm-gpg目录下面。
    Yum仓库中每一行参数都已经介绍完毕了

    创建容器的时候报错WARNING: IPv4 forwarding is disabled. Networking will not work.

    # docker run -it -p 30001:22 --name=centos-ssh  centos /bin/bashWARNING: IPv4 forwarding is disabled. Networking will not work.  123
     

    解决办法:

    # vim  /usr/lib/sysctl.d/00-system.conf
     

    添加如下代码:

    net.ipv4.ip_forward=1
     

    重启network服务

    # systemctl restart network
     

    完成以后,删除错误的容器,再次创建新容器,就不再报错了

  • 相关阅读:
    HTML有2种路径的写法:绝对路径和相对路径
    ZB本地设置
    java main函数
    java static 关键字
    03013_动态页面技术-JSP
    Oracle数据库的文件以及Oracle体系架构
    记录一次mybatis缓存和事务传播行为导致ut挂的排查过程
    rtmp规范1.0全面指南
    程序员小哥教你秋招拿大厂offer
    ubuntu配置samba解决linux的svn使用舒适问题
  • 原文地址:https://www.cnblogs.com/2567xl/p/11926444.html
Copyright © 2020-2023  润新知