• Docker Compose编排工具部署lnmp实践及理论(详细)


    一、理论概述

    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文件中指定好的。

    二、使用docker compose 部署lnmp

    • 部署社区版docker
    [root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
    #安装依赖
    
    [root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
    #下载docker的repo
    
    [root@localhost ~]# yum -y install docker-ce
    
    [root@localhost ~]# mkdir /etc/docker
    [root@localhost ~]# vim /etc/docker/daemon.json
    
    {
            "registry-mirrors":["https://*******.mirror.aliyuncs.com"]
    }
    #阿里云镜像加速
    

    地址需要个人前往阿里云获得,参考这篇文档

    • 安装compose工具
    [root@localhost ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    [root@localhost ~]# chmod +x /usr/local/bin/docker-compose 
    
    
    [root@localhost ~]# mkdir compose_lnmp
    [root@localhost ~]# cd compose_lnmp/
    
    
    • 编写compose文件和dockerfile格式严谨
    [root@localhost 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
    
    
    [root@localhost 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: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@localhost compose_lnmp]# cat nginx/Dockerfile 
    FROM centos:7
    #如果有该docker镜像则基于该镜像进行构建,没有则自行从镜像仓库pull
    MAINTAINER joinbestbest
    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配置文件,直接复制到容器内使用
    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.111.3:9000;
                #ip修改为宿主机的,端口是php程序映射到宿主机的端口
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
            }
        }
    }
    
    daemon off;
    
    
    [root@localhost compose_lnmp]# vim nginx/run.sh 
    #在dockerfile中指定运行的脚本传送到容器中
    #!/bin/bash
    
    /usr/local/nginx/sbin/nginx
    
    • mysql配置文件
      mysql操作比较少,基本都是在compose制定好的,所以比较简便
    [root@localhost 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@localhost 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@localhost compose_lnmp]# cat wwwroot/index.html 
    www.join.com
    
    [root@localhost compose_lnmp]# cat wwwroot/index.php 
    <?php
    phpinfo();
    ?>
    
    

    三、测试

    • 部署WordPress
    直接将相应的代码文件放到宿主机的wwwroot目录下即可,因为这里已经做好了映射
    
    [root@localhost compose_lnmp]# tar xf wordpress-5.0.2-zh_CN.tar.gz 
    
    [root@localhost compose_lnmp]# mv wordpress wwwroot/
    

    然后在测试浏览器上访问192.168.111.3/wordpress进行操作

    四、总结

    1. 以前学的docker知识印象都模糊了
    2. dockercompose工具生产环境大都不会采用
    3. 不管如何,docker的基础知识一定要积极跟上
    4. dockercompose的弊端以及和其他工具的区别随后会发布到博客
    5. 将docker的基础理论整理发布到博客
  • 相关阅读:
    python 自动化之路 day 10 协程、异步IO、队列、缓存
    MySQ binlog三种模式
    文件存储之-内存文件系统tmpfs
    Linux 系统结构详解
    服务端高性能数据库优化演变细节案例
    滴滴研发笔记题,亮灯问题
    linux screen 命令详解
    Linux之在CentOS上一次艰难的木马查杀过程
    python 自动化之路 day 09 进程、线程、协程篇
    redis
  • 原文地址:https://www.cnblogs.com/jojoword/p/11075056.html
Copyright © 2020-2023  润新知