Docker-Compose

docker compose诞生的原因

在比较大规模的docker线上运行时候会产生一个问题:批量化的管理

  • 要从Dockerfile build image或Dockerhub pull image

  • 要创建多个的container

  • 要管理这些container(启动以及删除)

什么是docker-compose呢?

  • 简单说就是批处理
  • docker compose是一个工具
  • 这个工具可以通过一个yml文件定义多容器的docker应用
  • 通过一条命令就可以更具yml文件的定义去创建或是管理多个容器

dokcer compose官方文档:https://docs.docker.com/compose/install/

Title:compose的三大概念
Server->Networks: 定义
Networks->Volumes:定义
Networks->Server:引用
Volumes->Server:引用

compose的版本

至今以已经有3个大版本的诞生

  • version 1 (已经淘汰不再使用)
  • version 2(只能用与单机,兼并上版本)
  • version 3(多机器使用,兼并上版本)

compose-services

  • 一个service代表一个container,这个container可以从dockerhub的image来创建,或在从本地的Dockerfile build出来的image来创建

  • Service的启动类似docker run,我们可以给其指定network和volume,所以可以给service指定network和Volume的引用

使用示例

docker创建的方式(一):

services:
    db:
        image: postgres:9.4(镜像的名称)
        volume: 
            - "data:/var/lib/postgres/data"(连接到宿主机器的目录)
        networks:
            - back-tier(网卡的名称)

搭建一个简单的lnmp

docker run -d --network back-tier -v data:/var/lib/postgresql/data postgres:9.4

docker创建的方式(二):

services:
    worker:
        build: ./worker
        links:
            - db
            - redis
        networks:
            - back-tier

编写一个简单的compose

简单的yml文件

version: '3.3'      #使用conpose的版本
services:            #下面组中的
  web:              #服务的标识
    build: .          #构建镜像上下文的目录
    ports:          #构建映射的端口
      - "8888:80"

简单的dockerfile文件

FROM centos:7       #这里是使用的centos镜像版本
MAINTAINER this is centos apache    #镜像的描述
RUN yum -y install httpd php php-gd php-mysql
RUN echo "<?php phpinfo()?>" >/var/www/html/index.php
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
EXPOSE 80

启动第一个docker-compose部署

[root@docker compose_1]# docker-compose up
[root@docker compose_1]# docker-compose ps
     Name                    Command              State          Ports        
------------------------------------------------------------------------------
compose_1_web_1   /usr/sbin/httpd -D FOREGROUND   Up      0.0.0.0:8888->80/tcp
[root@docker compose_1]# curl 就可以访问PHPinfo

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

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

注意事项:

  • 1.不支持制表符tab的缩进,需要使用空格来缩进
  • 2.通常开头缩进2个空格
  • 3.字符后面缩进1个空格,如冒号,逗号,横杠
  • 4.用#号来注释
  • 5.如果包含特殊的字符用单引号来引用起来
  • 6.布尔值(ture、flase、yes、no、on、off)必须用引号括起来,这样分析器会将他们解释为字符串

实战演练部署wordpress

要求:
– 使用的docker compose一键部署wordpress
– 用yml编写代码
– 测试与调整

第一步

  • 环境使用的是Centos7.4安装docker默认不会安装compose所以需要去官方安装

官方下载docker-compose

curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-(uname -s)-(uname -m) -o /usr/local/bin/docker-compose

给二进制文件授权

chmod +x /usr/local/bin/docker-compose

查询当前的compose版本

[root@docker ~]# docker-compose --version
docker-compose version 1.21.0, build 5920eb0

编写yml文件

version: '3.3'
services:
  wordpress:
    image: wordpress
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:
      - my-bridge
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge
volumes:

运行docker-compose

mkdir /compose
vim dokcer-compose.yml      #写进去
docker-compose -f /compose/dokcer-compose.yml -d up     #指定执行的文件-d后台执行
docker-compose ps       #查看当前运行的docker容器
docker-compose exec mysql bash      #进入容器
docker-compose down     关闭正在运行的容器

实战使用compose部署架构

拓扑图

前言

为应付前端较大压力的访问量,需要临时加装机器,本次实验利用docker来实现,快速的横向扩展。承接访问的压力。

环境准备

  • haprxoy+4台flask写的网页+后端的redis

  • dockerfile构建私有镜像

  • 基于docker-compose.yml自动化部署

  • compose-scale实现这一切

代码的编写

app.py

from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80, debug=True)

Dockerfile

FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]

docker-compose.yml

version: "3.3"
services:
  redis:
    image: redis
  web:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      REDIS_HOST: redis
  lb:
    image: dockercloud/haproxy
    links:
      - web
    ports:
      - 8080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

启动服务

 docker-compose up --scale web=4 -d     #后台执行且web4个haproxy=1个

测试是否负载均衡

总结

  • scale伸缩性,高峰期增加服务器,访问量减少也减少,弹性伸缩

  • 真正的秒级别启动

  • 可移植性强

docker-compose部署一套完整的投票系统

  • 架构拓扑图

  • 部署要求

    使用docker容器实现快速上线实现基础的微服务,快速的服务上线。用完即可回收,弹性伸缩。

  • 编写dockerfile-result

FROM node:0.10

RUN mkdir /app
WORKDIR /app

ADD package.json /app/package.json
RUN npm install && npm ls
RUN mv /app/node_modules /node_modules

ADD . /app

ENV PORT 80
EXPOSE 80

CMD ["node", "server.js"]
  • 编写dockerfile-voting
# Using official python runtime base image
FROM python:2.7

# Set the application directory
WORKDIR /app

# Install our requirements.txt
ADD requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt

# Copy our code from the current folder to /app inside the container
ADD . /app

# Make port 5000 available for links and/or publish
EXPOSE 80 

# Define our command to be run when launching the container
CMD ["python", "app.py"]
  • 编写dockerfile-java-work
FROM java:7

RUN apt-get update -qq && apt-get install -y maven && apt-get clean

WORKDIR /code

ADD pom.xml /code/pom.xml
RUN ["mvn", "dependency:resolve"]
RUN ["mvn", "verify"]

ADD src /code/src
RUN ["mvn", "package"]

CMD ["/usr/lib/jvm/java-7-openjdk-amd64/bin/java", "-jar", "target/worker-jar-with-dependencies.jar"]
  • 编写docker-编排.yml
version: "3.3"

services:
  voting-app:
    build: ./voting-app/.
    volumes:
     - ./voting-app:/app
    ports:
      - "5000:80"
    links:
      - redis
    networks:
      - front-tier
      - back-tier

  result-app:
    build: ./result-app/.
    volumes:
      - ./result-app:/app
    ports:
      - "5001:80"
    links:
      - db
    networks:
      - front-tier
      - back-tier

  worker:
    build: ./worker
    links:
      - db
      - redis
    networks:
      - back-tier

  redis:
    image: redis
    ports: ["6379"]
    networks:
      - back-tier

  db:
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
    networks:
      - back-tier

volumes:
  db-data:

networks:
  front-tier:
  back-tier:

部署开始

docker-compose up -f /app/docker-compose.yml -d         #阿里云小水管慢,等待大约10分钟

部署成功

访问网站


Compose部署Nginx_tomcat

编写一个docker运行Nginx

FROM centos:7       #镜像Centos7
MAINTAINER This is Nginx        #描述
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel        #在容器中运行安装编译Nginx需要的依赖
ADD nginx-1.12.1.tar.gz /tmp        #将本地的Nginx导入镜像中
RUN cd /tmp/nginx-1.12.1 && ./configure --prefix=/usr/local/nginx && make -j 4 && make install      #编译
RUN rm -f /usr/local/nginx/conf/nginx.conf      #执行删除容器中的镜像文件
COPY nginx.conf /usr/local/nginx/conf       #拷贝当前目录下的镜像文件去容器中
EXPOSE 80       #暴露80端口
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

Nginx的配置文件

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;      upstream www.example.com {         #ip_hash;       server tomcat01:8080;     server tomcat02:8080;     server tomcat03:8080;     }      server {         listen 80;         server_name localhost;      location / {         proxy_pass http://www.example.com;     }          location ~ \.(html|css|js|jpg|png|gif) {
            root /opt/webapps/ROOT;
        }
    }
}

编写dockerfile启动tomcat

FROM centos:7
MAINTAINER This is tomcat
ADD jdk-8u45-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_45
ADD apache-tomcat-8.0.46.tar.gz /usr/local
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf
EXPOSE 8080
ENTRYPOINT ["/usr/local/apache-tomcat-8.0.46/bin/catalina.sh", "run"]

Mysql配置文件

[mysqld]
user=mysql
port=3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysql/mysql.pid
log_error=/var/log/mysql/error.log
character_set_server = utf8
max_connections=3600

Docker-Compose》有2个想法

  1. hello!,I really like your writing so much! proportion we communicate more approximately your post on AOL? I need an expert in this space to resolve my problem. May be that’s you! Having a look forward to peer you.

发表评论

电子邮件地址不会被公开。 必填项已用*标注