一、理论概述

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
  1. [root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
  2. #安装依赖
  3. [root@localhost ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
  4. #下载docker的repo
  5. [root@localhost ~]# yum -y install docker-ce
  6. [root@localhost ~]# mkdir /etc/docker
  7. [root@localhost ~]# vim /etc/docker/daemon.json
  8. {
  9. "registry-mirrors":["https://*******.mirror.aliyuncs.com"]
  10. }
  11. #阿里云镜像加速

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

  • 安装compose工具
  1. [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
  2. [root@localhost ~]# chmod +x /usr/local/bin/docker-compose
  3. [root@localhost ~]# mkdir compose_lnmp
  4. [root@localhost ~]# cd compose_lnmp/
  • 编写compose文件和dockerfile格式严谨
  1. [root@localhost compose_lnmp]# tree
  2. .
  3. ├── docker-compose.yml
  4. ├── mysql
  5.    ├── conf
  6.       └── my.cnf
  7.    └── data
  8. ├── nginx
  9.    ├── Dockerfile
  10.    ├── nginx-1.12.1.tar.gz
  11.    ├── nginx.conf
  12.    └── run.sh
  13. ├── php
  14.    ├── Dockerfile
  15.    ├── php-5.6.39.tar.gz
  16.    └── php.ini
  17. └── wwwroot
  18. ├── index.html
  19. └── index.php
  20. [root@localhost compose_lnmp]# cat docker-compose.yml
  21. version: 3
  22. services:
  23. nginx:
  24. #在 services 标签下的第二级标签是 web,这个名字是用户自己自定义,它就是服务名称。
  25. hostname: nginx
  26. #相当于提前预定义容器的主机名,会写入到容器的/etc/hostname中
  27. build:
  28. #该标签标示基于dockerfile来构建一个镜像
  29. context: ./nginx
  30. #指定构建镜像所需的dockerfile目录,我这里指定的是相对目录,该文件(docker-compose.yml)所处位置,也可以绝对目录,
  31. dockerfile: Dockerfile
  32. ports:
  33. - 80:80
  34. #和宿主机映射的端口
  35. networks:
  36. - lnmp
  37. #指定的网络环境????
  38. volumes:
  39. - ./wwwroot:/usr/local/nginx/html:ro
  40. #将宿主机目录挂载到该容器当中(只读)
  41. php:
  42. hostname: php
  43. build:
  44. context: ./php
  45. dockerfile: Dockerfile
  46. ports:
  47. - 9000:9000
  48. networks:
  49. - lnmp
  50. volumes:
  51. - ./wwwroot:/usr/local/nginx/html
  52. mysql:
  53. hostname: mysql
  54. image: mysql:5.6
  55. #image标签表示是基于mysql:5.6镜像构建一个新的
  56. ports:
  57. - 3306:3306
  58. networks:
  59. - lnmp
  60. volumes:
  61. - ./mysql/conf:/etc/mysql/conf.d
  62. - ./mysql/data:/var/lib/mysql
  63. command: --character-set-server=utf8
  64. environment:
  65. MYSQL_ROOT_PASSWORD: 123456
  66. #???mysql中root用户密码
  67. MYSQL_DATABASE: wordpress
  68. #新建一个数据库名为WordPress
  69. MYSQL_USER: user
  70. #新建一个用户名为user
  71. MYSQL_PASSWORD: user123
  72. #新建user用户密码为user123
  73. networks:
  74. lnmp:
  75. #创建一个网络,lnmp为该网络的别名
  • Nginx的dockerfile编写
  1. [root@localhost compose_lnmp]# cat nginx/Dockerfile
  2. FROM centos:7
  3. #如果有该docker镜像则基于该镜像进行构建,没有则自行从镜像仓库pull
  4. MAINTAINER joinbestbest
  5. ENV TIME_ZOME Asia/Shanghai
  6. RUN useradd -s /sbin/nologin -M nginx && yum -y install gcc gcc-c++ make openssl-devel pcre-devel
  7. #运行的命令,安装依赖
  8. ADD nginx-1.12.1.tar.gz /tmp
  9. #将宿主机源码包传送到容器内tmp目录
  10. RUN cd /tmp/nginx-1.12.1 && \
  11. ./configure --prefix=/usr/local/nginx && \
  12. make -j 2 && \
  13. make install
  14. #编译;make -j 2使用两个进程来make,加速
  15. RUN rm -rf /tmp/nginx* && yum clean all && \
  16. echo "${TIME_ZOME}" > /etc/timezone && \
  17. ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime
  18. EXPOSE 80
  19. COPY nginx.conf /usr/local/nginx/conf/
  20. WORKDIR /root/nginx
  21. ADD run.sh /run.sh
  22. RUN chmod 775 /run.sh
  23. CMD ["/run.sh"]
  24. #一系列命令操作
  • Nginx配置文件,直接复制到容器内使用
  1. user nginx nginx;
  2. worker_processes 1;
  3. worker_rlimit_nofile 102400;
  4. error_log logs/error.log;
  5. pid logs/nginx.pid;
  6. events {
  7. use epoll;
  8. worker_connections 4096;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. '$status $body_bytes_sent "$http_referer" '
  15. '"$http_user_agent" "$http_x_forwarded_for"';
  16. access_log logs/access.log main;
  17. sendfile on;
  18. keepalive_timeout 65;
  19. server {
  20. listen 80;
  21. server_name localhost;
  22. charset utf-8;
  23. location / {
  24. root html;
  25. index index.php index.html index.htm;
  26. }
  27. location ~ \.php$ {
  28. root html;
  29. fastcgi_index index.php;
  30. fastcgi_pass 192.168.111.3:9000;
  31. #ip修改为宿主机的,端口是php程序映射到宿主机的端口
  32. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  33. include fastcgi_params;
  34. }
  35. }
  36. }
  37. daemon off;
  38. [root@localhost compose_lnmp]# vim nginx/run.sh
  39. #在dockerfile中指定运行的脚本传送到容器中
  40. #!/bin/bash
  41. /usr/local/nginx/sbin/nginx
  • mysql配置文件

    mysql操作比较少,基本都是在compose制定好的,所以比较简便
  1. [root@localhost compose_lnmp]# cat mysql/conf/my.cnf
  2. [mysqld]
  3. datadir=/var/lib/mysql
  4. socket=/tmp/mysql.sock
  5. symbolic-links=0
  6. [mysqld_safe]
  7. log-error=/var/log/mysql/mysql.log
  8. pid-file=/tmp/mysql.pid
  • PHP相关文件
  1. [root@localhost compose_lnmp]# cat php/Dockerfile
  2. FROM centos:7
  3. MAINTAINER crushlinux
  4. ENV TIME_ZOME Asia/Shanghai
  5. RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel
  6. ADD php-5.6.39.tar.gz /tmp/
  7. RUN cd /tmp/php-5.6.39 && \
  8. ./configure --prefix=/usr/local/php \
  9. --with-config-file-path=/usr/local/php/etc \
  10. --with-mysql --with-mysqli \
  11. --with-openssl --with-zlib --with-curl --with-gd \
  12. --with-jpeg-dir --with-png-dir --with-iconv \
  13. --enable-fpm --enable-zip --enable-mbstring && \
  14. make -j 4 && \
  15. make install
  16. RUN cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf && \
  17. sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.conf && \
  18. sed -i "21a daemonize=no" /usr/local/php/etc/php-fpm.conf && \
  19. echo "${TIME_ZOME}" > /etc/timezone && \
  20. ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime
  21. COPY php.ini /usr/local/php/etc/
  22. RUN rm -rf /tmp/php* && yum clean all
  23. WORKDIR /usr/local/php/
  24. EXPOSE 9000
  25. #将容器内该端口进行映射
  26. CMD ["./sbin/php-fpm","-c","/usr/local/php/etc/php-fpm.conf"]
  • wwwroot目录为网页测试文件
  1. [root@localhost compose_lnmp]# cat wwwroot/index.html
  2. www.join.com
  3. [root@localhost compose_lnmp]# cat wwwroot/index.php
  4. <?php
  5. phpinfo();
  6. ?>

三、测试

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

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

四、总结

  1. 以前学的docker知识印象都模糊了
  2. dockercompose工具生产环境大都不会采用
  3. 不管如何,docker的基础知识一定要积极跟上
  4. dockercompose的弊端以及和其他工具的区别随后会发布到博客
  5. 将docker的基础理论整理发布到博客

Docker Compose编排工具部署lnmp实践及理论(详细)的更多相关文章

  1. docker--docker compose 编排工具

    11 docker compose 编排工具 11.1 docker compose 介绍 根据前面所学的知识可知,想要使用Docker部署应用,就要先在应用中编写Dockerfile 文件来构建镜像 ...

  2. Docker 镜像编排并部署SpringBoot应用

    Docker-compose是一个基于Docker的编排工具,所谓编排个人理解就是将不同的镜像通过配置,组成一个新的运行环境,官方定义是:Compose is a tool for defining ...

  3. 使用Docker compose编排Laravel应用

    前言 Laravel官方开发环境推荐的是Homestead(其实就是一个封装好的Vagrant box),我感觉这个比较重,于是自己用Docker compose编排了一套开发环境,在这里分享下. 环 ...

  4. Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践

    Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践 Spring Boot + Nginx + Mysql 是实际工作中 ...

  5. Docker - 容器编排工具 compose 之安装

    准备 首先,在使用和安装 docker compose之前,我们应该确保我们已经安装了 docker engine. 安装 官网上面有好多种安装方式,由于我们现在是在使用Docker, 个人感觉应该以 ...

  6. Docker Compose 项目打包部署

    Docker Compose 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器.然而微服务架构的应用系统一 ...

  7. Docker环境的持续部署优化实践

    最近两周优化了我们持续部署的程序,收效显著,记录下来分享给大家 背景介绍 那年公司快速成长,频繁上线新项目,每上线一个项目,就需要新申请一批机器,初始化,部署依赖的服务环境,一个脚本行天下 那年项目发 ...

  8. Docker(二十六)-Docker Compose编排容器

    1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...

  9. Docker系列之(五):使用Docker Compose编排容器

    1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...

随机推荐

  1. Redis应用场景大全

    1.字符串使用场景 a) 缓存功能 典型使用场景:Redis作为缓存层,MySQL作为存储层,绝大部分请求的数据都是从Redis中获取,由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写和 ...

  2. Docker学习笔记——1.2 Docker组件

    Docker的核心组件包括: Docker客户端和服务器,也称为Docker引擎: Docker镜像: Registry: Docker容器. 1.Docker客户端和服务器 Docker是一个客户端 ...

  3. 【Leetcode_easy】941. Valid Mountain Array

    problem 941. Valid Mountain Array solution: class Solution { public: bool validMountainArray(vector& ...

  4. iOS label出现异常黑色问题

    在开发中,有时候会发现label周围有一层灰色的边框,但是我们无论是修改边框的宽度还是颜色,这个边框一直是这个样子,不会发生任何变化. 类似上面这个,有一条条的竖线, 这是因为当设置 UILabel ...

  5. instance与type区别

    class Foo(object): pass class Bar(Foo): pass obj = Bar() # isinstance用于判断,对象是否是指定类的实例 (错误的) # isinst ...

  6. 乐字节Java继承|方法重写、super和final关键字

    大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...

  7. SQL语言(一)

    数据定义语言:简称DDL(Data Definition Language) create database 数据库名 character set 'utf-8'; drop database 数据库 ...

  8. 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]

    1 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 2 思路和方法 先给定一个二叉树的样式: ...

  9. Linux基础-01-Linux基础命令

    1. Linux命令的格式 1) Linux命令的语法格式: 命令 [选项] [参数] 2) 命令格式中命令.选项.参数的具体含义 a) 命令:告诉Linux(UNIX)操作系统做(执行)什么. b) ...

  10. Django基础之django分页

    一.Django的内置分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views ...