文章目录

  • 一: 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. Java集合之并发容器
  2. 本机电脑与 Android 设备如何进行文件传输?
  3. 扬尼斯定律:程序员的开发效率每6年提高一倍
  4. 9008刷机模式写入超时刷机帮_刷机时没有成功,然后变成黑砖,usb接口直接变成未知设备~希望大神救助!...
  5. 【Cisco技术资料汇总】
  6. 虚拟机如何配置网络ip地址_木杉入门Elasticsearch(2):虚拟机IP地址配置
  7. sql server分页_SQL Server中的分页简介
  8. JQuer实战第一讲:验证用户名是否可用
  9. angular学习笔记(九)-css类和样式2
  10. java怎么使用floor_Java NavigableSet floor()用法及代码示例
  11. Windows - 修复所有快捷方式的打开方式
  12. AHP权重计算方法案例
  13. java判断用户是PC端访问还是手机端访问
  14. poi处理office转pdf
  15. 【Unity】在Inspector上显示自定义的位掩码枚举(Flags)
  16. python -使用pytesseract识别文字时遇到的问题
  17. R非独立样本的 t 检验
  18. java字母正则表达式,带有国际字母的Java正则表达式
  19. [INSTALL_FAILED_DUPLICATE_PERMISSION perm=quicksdk_packageName.permission.JPUSH_MESSAGE pkg=com.shou
  20. EasyDSS视频直播点播平台无法播放4K视频的原因排查与解决

热门文章

  1. c语言个人账册报告的课题来源,C语言个人账簿管理系统报告
  2. linux批量安装 五大开源软件挨个看,51CTO_Linux运维和管理:自动化监测.pdf
  3. python学习详解_Python学习入门到精通:Python列表讲解
  4. linux实用小工具,Linux系统小工具使用大用途---1
  5. 实现弹出悬浮页面_30秒快速实现Excel每页标题行的打印!
  6. 使用ajax实现无刷新邮箱验证码,AJAX和WebService实现邮箱验证(无刷新)
  7. ER-Studio的五种关系说明 .
  8. 用 pandas + matplotlib 绘制精美的K线图
  9. Python开发者的完美终端工具
  10. 一个神级般的 Python 调试神器