Docker Compose编排工具部署lnmp实践及理论(详细)
一、理论概述
Docker Compose是一个定义及运行多个Docker容器的工具,它自身我们可以简单的理解为就是一个二进制文件(命令),是我们可以更方便易于管理的构建基于docker的复杂应用
- 使用Compose的过程:三步
- 使用Dock而file定义单个应用程序的环境,以便在任何地方进行复制。
- 在docker-compose.yml中定义组成该应用程序的服务,将单个应用程序组成一个整体,它们各自处在相对隔离的环境中,却可以通过端口映射来进行协同工作。
- 运行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
进行操作
四、总结
- 以前学的docker知识印象都模糊了
- dockercompose工具生产环境大都不会采用
- 不管如何,docker的基础知识一定要积极跟上
- dockercompose的弊端以及和其他工具的区别随后会发布到博客
- 将docker的基础理论整理发布到博客
Docker Compose编排工具部署lnmp实践及理论(详细)的更多相关文章
- docker--docker compose 编排工具
11 docker compose 编排工具 11.1 docker compose 介绍 根据前面所学的知识可知,想要使用Docker部署应用,就要先在应用中编写Dockerfile 文件来构建镜像 ...
- Docker 镜像编排并部署SpringBoot应用
Docker-compose是一个基于Docker的编排工具,所谓编排个人理解就是将不同的镜像通过配置,组成一个新的运行环境,官方定义是:Compose is a tool for defining ...
- 使用Docker compose编排Laravel应用
前言 Laravel官方开发环境推荐的是Homestead(其实就是一个封装好的Vagrant box),我感觉这个比较重,于是自己用Docker compose编排了一套开发环境,在这里分享下. 环 ...
- Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践
Spring Boot 2 (五):Docker Compose + Spring Boot + Nginx + Mysql 实践 Spring Boot + Nginx + Mysql 是实际工作中 ...
- Docker - 容器编排工具 compose 之安装
准备 首先,在使用和安装 docker compose之前,我们应该确保我们已经安装了 docker engine. 安装 官网上面有好多种安装方式,由于我们现在是在使用Docker, 个人感觉应该以 ...
- Docker Compose 项目打包部署
Docker Compose 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器.然而微服务架构的应用系统一 ...
- Docker环境的持续部署优化实践
最近两周优化了我们持续部署的程序,收效显著,记录下来分享给大家 背景介绍 那年公司快速成长,频繁上线新项目,每上线一个项目,就需要新申请一批机器,初始化,部署依赖的服务环境,一个脚本行天下 那年项目发 ...
- Docker(二十六)-Docker Compose编排容器
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
- Docker系列之(五):使用Docker Compose编排容器
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
随机推荐
- 了解美杜莎(Medusa)
(1).美杜莎介绍 Medusa(美杜莎)是一个速度快,支持大规模并行,模块化的暴力破解工具.可以同时对多个主机,用户或密码执行强力测试.Medusa和hydra一样,同样属于在线密码破解工具.Med ...
- 【pip升级导致错误】 多个pip导致明明已经安装了包但是报no module错误
原来一直用apt install 默认安装的pip 8.01版本,今天因为一些原因,将pip升级到了19.01.升级后就导致了错误. 直接pip installl --upgrade pip,发现报权 ...
- Xpath定位和CSS定位(***重)
1.XPath是一种在XML文档中定位元素的语言.因为HTML可以看作XML的一种实现, 所以Selenium用户可以使用这种强大的语言在Web应用中定位元素. 1.1 绝对路径定位 参考baidu. ...
- 15、Vue CLI 3+tinymce 5富文本编辑器整合
富文本编辑器里大佬们都说tinymce NB! 插件安装 inymce官方提供了一个vue的组件tinymce-vue 如果有注册或购买过服务的话,直接通过组件配置api-key直接使用,懒的注册或者 ...
- Python机器学习基础教程-第2章-监督学习之K近邻
前言 本系列教程基本就是摘抄<Python机器学习基础教程>中的例子内容. 为了便于跟踪和学习,本系列教程在Github上提供了jupyter notebook 版本: Github仓库: ...
- Caused by: java.lang.NullPointerException: Location is required
将 Parent root = FXMLLoader.load(getClass().getResource("xml/MainUI.fxml")); 改为: Parent roo ...
- windows添加“以管理员身份运行”
方法: 新建一个txt文件,命名为"admin.txt",记得打开"显示后缀名",要求看到.txt并可修改之. 将下列代码粘贴进去. Windows Regis ...
- LeetCode 442. 数组中重复的数据(Find All Duplicates in an Array) 17
442. 数组中重复的数据 442. Find All Duplicates in an Array 题目描述 Given an array of integers, 1 ≤ a[i] ≤ n (n ...
- [转帖]Linux内核系统体系概述
Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...
- (一)linux 学习 -- 在文件系统中跳转
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap03.html 文章目录 文件系统 根目录 打 ...