1

Docker-compose快速编排

 2 years ago
source link: https://blog.51cto.com/u_15382481/5096239
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Docker-compose快速编排

我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍Docker官方产品Docker Compose。

单机编排 docker-compose
跨主机编排(集群编排) K8S docker swam marathon mose

Dockerfile可以让用户管理一个单独的应用容器;而icompose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project,即项目),例如一个 web 服务容器再加上后端的数据库服务容器等。

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-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。

使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。

在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)

Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

Compose部署

Docker Compose环境安装

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

#下载 在Linux上我们可以从GitHub上下载它的二进制包来使用,此命令是下载Docker Compose的当前稳定版本'
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#安装 
chmod +x /usr/local/bin/docker-compose
#查看版本
docker-compose --version

Docker-compose快速编排_docker

Docker-compose快速编排_mysql_02

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

YAMI是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于XML数据描述语言,语法比XML简单的很多。YAMN数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来,hash用花括号 {} 括起来。

使用YAML时需要注意下面事项

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

数据结构:

  • 对象:键值对的字典
animal: pets
  • 数组:一组按次序排列的列表
- cat
- Dog
- Goldfish
["Cat, "Dog", "Goldfish"]
debug: true
debug: false
# yaml
languages: 
  - Java
  - Golang
  -Python
websites: 
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G
  
# Json
{
  languages: [
    'Java',
    'Golang',
    'Python'
  ],
  resources: {
    cpu: '2',
    memory: '1024M',
    swap: '2048M',
    disk: '60G'
  }
}

Docker Compose配置常用字段

字段 介绍

build 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定

dockerfile 构建镜像上下文路径

context 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址

image 指定镜像

command 执行命令,覆盖默认命令

container_name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法 scale

deploy 指定部署和运行服务相关配置,只能在 Swarm 模式使用

environment 添加环境变量

networks 加入网络

ports 暴露容器端口,与 -p 相同,但端口不能低于 60

volumes 挂载宿主机路径或命令卷

volumes_from 从另一个服务或容器挂在卷,可选参数 :ro 和 :rw,仅版本 ‘2’ 支持

hostname 容器主机名

sysctls 在容器内设置内核参数

links 连接到另外一个容器,- 服务名称[:服务别名]

privileaged 用来给容器root权限,注意不是安全的

restart 重启策略,默认 no,always,no-failure,unless-stoped

no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器

depends_on
在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。

php:
  depends_on:
    - apache
    - mysql

Docker Compose常用命令

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

Docker Compose文件结构

yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml              #创建模板脚本
├── nginx
│?? ├── Dockerfile                  #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz         #复制源码包
│?? └── run.sh                      #启动服务脚本
└── wwwroot
    └── index.html                  #站点网页

Compose部署lnmp

创建工作目录并移动相应安装包、配置文件

----------------------nginx-----------------------------
1.mkdir -p /opt/compose-lnmp/nginx
2.cd  /opt/compose-lnmp/nginx
3.把nginx-1.12.0.tar.gz和wordpress-4.9.4-zh_CN.tar.gz和nginx的配置文件nginx.conf移进来(配置文件都已经修改好)
----------------------mysql-----------------------------
1.mkdir -p /opt/compose-lnmp/mysql
2.cd  /opt/compose-lnmp/mysql
3.把boost_1_59_0.tar.gz和mysql-5.7.17.tar.gz和mysql配置文件my.cnf移动到本目录(配置文件都已经修改好)
----------------------php--------------------------------
1.mkdir -p /opt/compose-lnmp/php
2.cd  /opt/compose-lnmp/php
3.把php-7.1.10.tar.bz2、php-fpm.conf、php.ini、www.conf移动到本目录(配置文件都已经修改好)

compose部署nginx

(1)准备依赖文件

mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.12.0.tar.gz ./
 
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
 
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <jzm 2022-03-10>
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传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 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf    #关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

echo "this is test web" > /opt/compose_nginx/wwwroot/index.html

(2)编写配置文件docker-compose.yml

vim /opt/compose_nginx/docker-compose.yml
version: '2'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1314:80
      - 1315:443
    container_name: nginx
    networks:
      lnmp:
        ipv4_address: 172.20.0.10
    volumes: 
      - ./nginx/html/:/usr/local/nginx/html
      - ./nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
            
networks:   
  lnmp:    
    driver: bridge
    ipam:     
      config: 
        - subnet: 172.20.0.0/16
----------------------------------------------------------------------------------------------------------
-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行
----------------------------------------------------------------------------------------------------------
 
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b48dceee248f compose_nginx_nginx "/run.sh" About a minute ago Up About a minute 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
 
cd /opt/compose_nginx/
docker-compose ps   #必须在docker-compose.yml所在目录执行此命令  

浏览器访问: http://192.168.80.17:1314

Docker-compose快速编排_docker_03

compose部署lnmp

[root@localhost opt]# tree /opt/compose/ -L 2
/opt/compose/
├── docker-compose.yml
├── mysql
│   ├── Dockerfile
│   ├── my.cnf
│   └── mysql-boost-5.7.20.tar.gz
├── nginx
│   ├── Dockerfile
│   ├── html
│   ├── nginx-1.12.0.tar.gz
│   ├── nginx.conf
│   ├── wordpress-4.9.4-zh_CN.tar.gz
│   └── wwwroot
└── php
    ├── Dockerfile
    ├── php-7.1.10.tar.bz2
    ├── php-fpm.conf
    ├── php.ini
    └── www.conf
 
5 directories, 13 files

配置nginx

[root@localhost nginx]# ls
Dockerfile  html  nginx-1.12.0.tar.gz  nginx.conf  wordpress-4.9.4-zh_CN.tar.gz  wwwroot
[root@localhost nginx]# cat Dockerfile
FROM centos:7
MAINTAINER this is nginx image <jzm 2022-03-10>
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 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/
#ADD wordpress-4.9.4-zh_CN.tar.gz /usr/local/nginx/html/
RUN chmod 777 -R /usr/local/nginx/html/
EXPOSE 80
EXPOSE 443
CMD [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
[root@localhost nginx]# cd html/
[root@localhost html]# ls
wordpress  

配置MySQL

[root@localhost compose]# cd mysql/
[root@localhost mysql]# ls
Dockerfile  my.cnf  mysql-boost-5.7.20.tar.gz
[root@localhost mysql]# cat 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 = 1
 
sql_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
[root@localhost mysql]# cat Dockerfile
FROM centos:7
MAINTAINER this is mysql image <jzm 2022-03-10>
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 -j4 && make install
RUN chown -R mysql:mysql /usr/local/mysql/
ADD my.cnf /etc/my.cnf
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
#RUN systemctl enable mysqld
#VOLUME [ "/usr/local/mysql" ]
CMD  /usr/local/mysql/bin/mysqld

配置PHP

[root@localhost compose]# cd php/
[root@localhost php]# ls
Dockerfile  php-7.1.10.tar.bz2  php-fpm.conf  php.ini  www.conf
[root@localhost php]# cat Dockerfile
FROM centos:7
MAINTAINER this is php image <jzm 2022-03-10>
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:$PATH
ADD php.ini /usr/local/php/lib/
ADD php-fpm.conf /usr/local/php/etc/
ADD www.conf /usr/local/php/etc/php-fpm.d/
EXPOSE 9000
ENTRYPOINT [ "/usr/local/php/sbin/php-fpm", "-F" ]

配置Docker-compose.yml文件

[root@localhost compose]# ls
docker-compose.yml  mysql  nginx  php
[root@localhost compose]# vim docker-compose.yml
[root@localhost compose]# cat docker-compose.yml
version: '2'   #使用版本2,版本3不包含volumes-from
services:
   nginx:
     build:
       context: ./nginx
       dockerfile: Dockerfile
     container_name: nginx
     ports:
       - 1314:80
       - 1315:443
     networks:
       lnmp:
         ipv4_address: 172.20.0.10
     volumes:
       - ./nginx/html/:/usr/local/nginx/html
   mysql:
     build:
       context: ./mysql
       dockerfile: Dockerfile
     container_name: mysql
     ports:
        - 3306:3306
     networks:
       lnmp:
         ipv4_address: 172.20.0.20
     volumes:
        - /usr/local/mysql
   php:
     build:
       context: ./php
       dockerfile: Dockerfile
     container_name: php
     ports:
       - 9000:9000
     networks:
       lnmp:
         ipv4_address: 172.20.0.30
     volumes_from:
       - nginx
       - mysql
     depends_on:
       - nginx
       - mysql
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16  

Docker-compose快速编排_nginx_04

运行docker compose

[root@localhost compose]# ls
docker-compose.yml  mysql  nginx  php
[root@localhost compose]# docker-compose -f docker-compose.yml up -d  

Docker-compose快速编排_docker_05

Docker-compose快速编排_nginx_06

Docker-compose快速编排_docker_07

进入MySQL容器并授予权限

docker-compose ps	#运行结果
docker exec -it mysql bash

mysql
create database wordpress;
grant all privileges on wordpress.* to 'wordpress'@'%' identified by 'abc123';
grant all privileges on *.* to 'root'@'%' identified by 'abc123';
flush privileges;

Docker-compose快速编排_nginx_08

  • 关于无法进入数据:关闭运行的镜像,然后去镜像库再启动,注:再次启动需要-p 3306:3306来指定端口

Docker-compose快速编排_mysql_09

浏览器访问测试 http://192.168.80.17:1314/wordpress/index.php

Docker-compose快速编排_mysql_10



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK