Contents
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/
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
Helpful info. Lucky me I discovered your website by accident, and I am shocked why this twist of fate did not happened earlier! I bookmarked it.