文章目录

  • 一: Docker-compose 简介
    • 1.1 为什么使用 Docker-compose
    • 1.2 Docker-compose概述
  • 二: compose 的部署
    • 2.1 Docker Compose 环境安装
    • 2. 2YAML 文件格式及编写注意事项
      • 2.2.1 YAML 文件格式
      • 2.2.2 YAML格式的注意事项
      • 2.2.3 数据结构
    • 2.3 Docker Compose 配置常用字段
    • 2.4 Docker compose 常用命令
  • 三: 编写Docker Compose
    • 3.1 准备依赖文件,配置nginx
    • 3.2 配置mysql
    • 3.3 配置php
    • 3.4 编写docker-compose.yml

对docker容器集群的快速编排 Docker-compose

一: Docker-compose 简介

1.1 为什么使用 Docker-compose

我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍Docker官方产品Docker Compose 。
Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project, 即项目) ,例如一个web服务容器再加上后端的数据库服务容器等。

1.2 Docker-compose概述

Docker-Compose项目是Docker官方的开源项目**,负责实现对Docker容器集群的快速编排**。但是,只能在单机上面实现.
Docker-Compose将所管理的容器分为三层,分别是工程(project) ,服务(service)以及容器(container) 。Docker-Compose运行目录下的所有文件(docker-compose. yml, extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例, Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如Consul
Docker-Compose的工程配置文件默认为docker-compose .yml,可通过环境变量COMPOSE FILE或-1参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。Compose允许用户通过一个单独的docker-compose. ym1模板文件(YAMI格式)来定义一组相关联的应用容器为一个项目(project) 。Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

二: compose 的部署

2.1 Docker Compose 环境安装

Docker Compose 是Docker 的独立产品,因此需要安装Docker 之后在单独安装Docker Compose

#下载
[root@host103 ~]# curl -L https://github.com/docker/compose/releases/download/v2.0.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose#也可直接将docker compose 上传
[root@host103 opt]# ls docker-compose
docker-compose
#修改权限,给与执行权限
[root@host103 opt]# chmod  +x docker-compose
[root@host103 opt]# ll docker-compose
-rwxr-xr-x 1 root root 10867152 10月 15 14:10 docker-compose#将docker-compose 移动到/usr/local/bin
root@host103 opt]# mv docker-compose  /usr/local/bin/
[root@host103 opt]# docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3

2. 2YAML 文件格式及编写注意事项

2.2.1 YAML 文件格式

YAML 是一种标记性语言,他可以很直观的展示数据序列格式,可读性高。类似于XML数据描述语言,语法比XML简单的很多。

  • YAML 数据结构通过缩进来表示
  • 连续的项目通过减号来表示(列表)
  • 键值对用冒号分隔
  • 数组用中括号[ ] 括起来
  • hash 用花括号{ } 括起来

2.2.2 YAML格式的注意事项

  • 大小敏感
  • 通过缩进表示层级关系
  • 不支持制表符tab 键缩进,只能使用空格缩进
  • 缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2 个空格
  • 用 # 号注释
  • 符号字符后缩进 1 个空格,如 “冒号 :” “逗号 ,” " 短横杠 -"
  • 如果包含特殊字符,用单引号( ‘’) 引起来会作为普通字符串处理,双引号("") : 特殊字符作为本身想表示的意思

name:空格 “Him,\nTom”

2.2.3 数据结构

对象: 键值对的字典
animal: pets数组: 一组按次序排列的列表
- cat
- dog
- goldfish布尔值
debug: "true"
debug: "false"#Yaml示例
languages: - Java- Golang- Python
websites: Baidu: www.baidu.comWangyi: www.163.comSouhu: www.souhu.com#或者
languages: ["Java","Golong","Python"]
websites: Baidu: www.baidu.comWangyi: www.163.comSouhu: www.souhu.com#Json格式
{languages: ['Java','Golong','Python',],websites: [Baidu: 'www.baidu.com',Wangyi: 'www.163.com',Souhu: 'www.souhu.com',]
}

2.3 Docker Compose 配置常用字段

字段 描述
build 指定Dockerfile文件名(要指定的Dockerfile文件需要在build标签的子级标签中用dockerfile标签指定)
dockerfile 构建镜像上下文路径
context 可以是dockerfile路径,或者是执行git 仓库的url地址
image 指定镜像(已存在)
command 执行命令,会覆盖容器启动后默认执行的命令(会覆盖Dockerfile的CMD指令)
container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
enviroment 添加环境变量
networks 加入网络,引用顶级networks下条目
ports 暴露容器端口,与-p 相同,但是端口不能低于60
volumes 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级volumes 定义卷名称
volumes_from 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw
hostname 容器主机名
sysctls 在容器内设置内核参数
links 连接到另一个容器,- 服务名称[ : ]
restart 重启策略,定义是否重启容器; no(默认,不重启), always(总是重启), on-failure,(退出状态非0时重启), on-failure:3 ,在容器非正常退出时重启容器,最多重启3次, unless-stoped 在容器退出时总是重启容器,但是不考虑在Docker 守护进程启动时就已经停止了的容器
depends_on 此标签用于解决容器的依赖,启动先后问题。如启动应用容器,需要先启动数据库容器 php: depends_on: - apache - mysql

2.4 Docker compose 常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示正在运行的容器进程
logs 查看服务容器的输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

三: 编写Docker Compose

[root@host103 compose_nginx]# yum -y install tree[root@host103 compose_nginx]# tree /opt/compose_nginx/ -L 2
/opt/compose_nginx/
├── docker-compose.yml
├── mysql
│   ├── Dockerfile
│   ├── my.cnf
│   └── mysql-boost-5.7.20.tar.gz
├── nginx
│   ├── Dockerfile
│   └── nginx-1.12.0.tar.gz
├── php
│   ├── Dockerfile
│   └── php-7.1.10.tar.bz2
└── wwwroot├── index.html├── wordpress└── wordpress-4.9.4-zh_CN.tar.gz

3.1 准备依赖文件,配置nginx

#创建项目目录 compose_nginx;
#创建服务子目录
[root@host103 ~]# mkdir /opt/compose_nginx/
[root@host103 ~]#cd /opt/compose_nginx
[root@host103 compose_nginx]# mkdir nginx mysql php wwwroot#上传wordpress软件包
[root@host103 nginx]# cd /opt/compose_nginx/wwwroot/
[root@host103 wwwroot]# ls wordpress-4.9.4-zh_CN.tar.gz
wordpress-4.9.4-zh_CN.tar.gz
[root@host103 wwwroot]# tar xf wordpress-4.9.4-zh_CN.tar.gz
[root@host103 nginx]# tar xf wordpress-4.9.4-zh_CN.tar.gz #上传nginx软件包
[root@host103 compose_nginx]# cd nginx/
[root@host103 nginx]# ls nginx-1.12.0.tar.gz
nginx-1.12.0.tar.gz #编写nginx的Dockerfile文件
[root@host103 nginx]# vim Dockerfile
FROM centos:7
MAINTAINER this is nginx image <zhi>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make -j8&& make install
ENV PATH /usr/local/nginx/sbin:$PATH
RUN sed -i 's/#charset koi8-r;/charset utf-8;/' /usr/local/nginx/conf/nginx.conf \&& sed -i '45 s/index  index.html index.htm;/index  index.html index.php;/' /usr/local/nginx/conf/nginx.conf \&& sed -i '65,71 s/#//' /usr/local/nginx/conf/nginx.conf \&& sed -i 's/fastcgi_pass   127.0.0.1:9000;/fastcgi_pass   172.18.0.30:9000;/' /usr/local/nginx/conf/nginx.conf \&& sed -i 's#/scripts#/usr/local/nginx/html#' /usr/local/nginx/conf/nginx.confEXPOSE 80
EXPOSE 443
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

3.2 配置mysql

#进入mysql子目录
[root@host103 ~]# cd /opt/compose_nginx/mysql/
#将mysql包上传到此目录
[root@host103 mysql]# ls mysql-boost-5.7.20.tar.gz
mysql-boost-5.7.20.tar.gz#编写mysql的Dockerfile文件
[root@host103 mysql]# vim Dockerfile
FROM centos:7
MAINTAINER this is mysql image <zhi>
RUN yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make
RUN useradd -M -s /sbin/nologin  mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src/
WORKDIR /usr/local/src/mysql-5.7.20/
RUN cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8  \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1 && make -j8 && make install
RUN chown -R mysql:mysql /usr/local/mysql/
ADD my.cnf /etc/
RUN chown mysql:mysql /etc/my.cnf
ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql/
RUN bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
CMD /usr/local/mysql/bin/mysqld
#配置myslq主配置文件my.cnf(用来复制到容器)
[root@host103 mysql]# vim my.cnf
[client]
port = 3306
socket = /usr/local/mysql/mysql.sock[mysql]
port = 3306
socket = /usr/local/mysql/mysql.sock[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1sql_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.3 配置php

[root@host103 php]# cd /opt/compose_nginx/php/
#将php包上传
[root@host103 php]# ls php-7.1.10.tar.bz2
php-7.1.10.tar.bz2#编写php的dockerfile
[root@host103 php]# vim Dockerfile
FROM centos:7
MAINTAINER this is php image <zhi>
RUN yum -y install gd \
libjpeg libjpeg-devel \
libpng libpng-devel \
freetype freetype-devel \
libxml2 libxml2-devel \
zlib zlib-devel \
curl curl-devel \
openssl openssl-devel \
gcc gcc-c++ make pcre-devel
RUN useradd -M -s /sbin/nologin nginx
ADD php-7.1.10.tar.bz2 /usr/local/src/
WORKDIR /usr/local/src/php-7.1.10
RUN ./configure \
--prefix=/usr/local/php \
--with-mysql-sock=/usr/local/mysql/mysql.sock \
--with-mysqli \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg-dir \
--with-png-dir \
--with-freetype-dir \
--with-openssl \
--enable-fpm \
--enable-mbstring \
--enable-xml \
--enable-session \
--enable-ftp \
--enable-pdo \
--enable-tokenizer \
--enable-zip && make && make install
ENV PATH /usr/local/php/bin:/usr/local/php/sbin:$PATHRUN \cp  /usr/local/src/php-7.1.10/php.ini-development /usr/local/php/lib/php.ini \  && sed -i 's#mysqli.default_socket =#mysqli.default_socket = /usr/local/mysql/mysql.sock#' /usr/local/php/lib/php.ini \  && sed -i '939 s#;date.timezone =#date.timezone = Asia/Shanghai#' /usr/local/php/lib/php.iniRUN \cp /usr/local/php/etc/php-fpm.conf.default  /usr/local/php/etc/php-fpm.conf \&& sed -i '17 s/^;//' /usr/local/php/etc/php-fpm.confRUN \cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf \&& sed -i 's#user = nobody#user = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \&& sed -i 's#group = nobody#group = nginx#' /usr/local/php/etc/php-fpm.d/www.conf \  && sed -i 's#listen = 127.0.0.1:9000#listen = 172.18.0.30:9000#' /usr/local/php/etc/php-fpm.d/www.confEXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

3.4 编写docker-compose.yml

#先拉取镜像centos:7
[root@host103 compose_nginx]# docker pull cetos:7[root@host103 ~]# vim /opt/compose_nginx/docker-compose.yml
#使用版本2(3版本不支持指令volumes_from)
version: '2'
services:#配置nginx服务nginx:#设置主机名为nginxhostname: nginx#使用dockerfile创建镜像。Dockerfile文件在当前目录的nginx目录下,文件名为Dockerfilebuild:context: ./nginxdockerfile: Dockerfile#容器名为nginxcontainer_name: nginx#暴露端口80和443ports:- 80:80- 443:443#加入到lnmp网络中,使用ip172.18.0.0.10networks:lnmp:ipv4_address: 172.18.0.10#将当前目录的wwwroot目录挂载到容器的/usr/local/nginx/htmlvolumes:- ./wwwroot/:/usr/local/nginx/html#配置服务mysqlmysql:hostname: mysqlbuild:context: ./mysqldockerfile: Dockerfilecontainer_name: mysqlports:- 3306:3306networks:lnmp:ipv4_address: 172.18.0.20#设置/usr/local/mysql为数据卷volumes:- /usr/local/mysql#配置服务php    php:hostname: phpbuild:context: ./phpdockerfile: Dockerfilecontainer_name: phpports:- 9000:9000networks:lnmp:ipv4_address: 172.18.0.30#从nginx容器和mysql容器获取数据卷    volumes_from:- nginx- mysql#php容器需要在nginx和mysql之后启动  depends_on:- nginx- mysql#php和容器nginx,容器mysql连接   links:- nginx- mysql
#配置网络模式和网络名
networks:#设置网络名lnmplnmp:#网络模式为bridge桥接莫斯driver: bridgeipam:config:#使用的网段为172.18.0.0/16- subnet: 172.18.0.0/16#在工作目录使用此命令。
#-f: --file-name, 指定模板文件。默认为docker-compose.yml
#-p: --project-name NAME ,指定项目名称,默认使用目录名
#-d: 在后台运行
[root@host103 compose_nginx]# docker-compose -f docker-compose.yml up -d
#在工作目录,使用docker-compose ps 可以看到启动的容器状态
[root@host103 compose_nginx]# docker-compose ps
Name               Command               State                                   Ports
-----------------------------------------------------------------------------------------------------------------------
mysql   /bin/sh -c /usr/local/mysq ...   Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp
nginx   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:443->443/tcp,:::443->443/tcp, 0.0.0.0:80->80/tcp,:::80->80/tcp
php     /usr/local/php/sbin/php-fpm -F   Up      0.0.0.0:9000->9000/tcp,:::9000->9000/tcp                              #进入mysql容器,配置用户授权.
[root@host103 mysql]# docker exec -it mysql /bin/bash
[root@mysql mysql]# mysqlmysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)mysql> grant all privileges on wordpress.* to 'wordpress'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123';
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)#访问网站
[root@host103 compose_nginx]# firefox http://192.168.23.103/wordpress/index.php

使用Docker Compose 搭建lnmp相关推荐

  1. Docker Compose搭建consul群集环境(了解Docker Compose及常用命令,Docker四种网络,Doker指定端口)

    文章目录 Docker Compose搭建consul群集环境 认识Docker Compose IConsul Docker Compose容器编排 Dasker Compose配置常用字段 Bos ...

  2. Docker学习之路05:五分钟用docker compose搭建一个自己的个人博客网站!

    五分钟用docker compose搭建一个自己的个人博客网站! Docker学习路线传送门: Docker学习之路01:Docker的安装 Docker学习之路02:阿里云镜像加速器 Docker学 ...

  3. Docker Compose搭建TDengine集群

    文章目录 1. Linux上安装Docker 2. 安装Docker Compose 3. 自定义Docker 网络 4. 搭建集群 4.1 基础配置 4.2 查看启动效果 4.3 测试节点 4.3. ...

  4. 教你三分钟用docker compose搭建一个自己的个人博客网站

    hi,大家好,我是 jack xu,今天和大家聊一个轻松.好玩.易懂的话题,就是教大家搭建一个自己的个人博客网站,可以在同事朋友面前炫耀一把.事情的缘由是我们公司有个同事,有一天他给了我一个网站,我打 ...

  5. Docker使用docker compose搭建Jellyfin私人媒体服务器 个人电影网站

    ->Docker及docker compose的安装点这里 创建 docker-compose.yml 文件 version: "3" services:jellyfin:i ...

  6. docker compose搭建NACOS集群

    使用docker搭建NACOS集群 SpringCloud Alibaba,必然会使用Nacos进行服务注册与配置管理.然而,在实际的生产环境中,使用单服务器搭建nacos服务器是十分危险的,如若发生 ...

  7. 基于Docker Compose搭建的Mysql8.0主从复制(1主3从,多主机)

    系统环境 CentOs 7 mysql 8.0.19 docker 18.09.9-ce docker-compose 1.26.1-rc3 安装docker-compose环境 docker-com ...

  8. Docker Compose 搭建 Docker Registry 私服

    简介 官方的 Docker Hub 是一个用于管理公共镜像的地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.你也可以选择通过 Docker Registry 搭建一个属于自己的 ...

  9. Docker Compose——搭建Redis集群

    环境配置 Docker 18.x Docker-Compose 3.7 Redis 6.2.5 主从(Master-Slave)模式 主从复制模式中包含一个主数据库实例(master)与一个或多个从数 ...

最新文章

  1. Python 语法错误:“SyntaxError: invalid character in identifier“,原因及解决方法
  2. 【转】节点预测与边预测任务实践
  3. 前端学习(2531):Vuex中getter
  4. Java Servlet API中的forward()方法和redirect()方法的区别
  5. 【Spring】Spring 依赖注入之手动注入
  6. 树的平衡之AVL树——错过文末你会后悔,信我
  7. SAP License:MM自动过账科目特殊库存杂谈
  8. avedev matlab,avedev(avedev是什么函数)
  9. 【元胞自动机】基于matlab激进策略元胞自动机三车道(不开放辅路,软件园不影响)交通流模型【含Matlab源码 1296期】
  10. 【STM32+cubemx】0013 HAL库开发:SPI总线访问气压计BMP280/BME280
  11. Grafana panel 图形高级定制
  12. 实现虚拟机与板卡/树莓派网络互联,并通过笔记本wifi共享上网
  13. qq企业邮箱的发送邮件服务器地址,腾讯企业邮箱smtp发邮件
  14. twitter、facebook、pinterest、linkedin 分享代码
  15. RuoYi(若依) 微服务分离版 启动及常见问题总结
  16. 技术天才米勒 oracle,奇迹中的奇迹 WW之功能炫技篇
  17. 数控车椭圆编程实例带图_数控车床加工椭圆的宏程序实例
  18. wifi转串口芯片——ESP8266:配置与使用
  19. c语言比其他语言都高级,9.以下说法中正确的是( ) a.C语言比其他语言高级 b.C语言不用编译就能被计算机执行 c.C语言以接近英语国...
  20. Mysql_sql存储过程

热门文章

  1. 查看git安装目录_一、Linux和Windows下安装Git
  2. 中柏平板触摸驱动_一文总览2019年最新最全的工业平板电脑定制化服务
  3. c语言 在线oj系统,开源的在线评测系统——Vakuum
  4. f12控制台如何查看consul_如何打印consul的错误信息
  5. springcloud @EnableDiscoveryClient注解作用
  6. xp查看计算机mac地址查询,mac地址查询,教你用dos命令查看mac地址的方法
  7. python与seo应用_【张亚楠】Python在我SEO工作中的应用(1)
  8. 活动执行手册_1-200家门店,标准化不等于手册!而是标准+训练+督导,缺一不可!...
  9. 2018常见的java面试题_2018新版Java常见面试题
  10. mfc 隐藏主窗口 visible_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...