Docker Compose
Docker-compose简介
官网:https://docs.docker.com/compose/
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 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,我们可以通过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。
Compose 的使用方式非常简单,基本上就是下面的三板斧:
- 定义 Dockerfile
- 定义 docker-compose.yml
- 运行 docker-compose up
其实 compose 提供的命令可以管理应用的整个生命周期:
- Start, stop, rebuild services
- 查看运行中 service 的状态
- 输出运行中 service 的日志
- 在 service 中执行一次性的命令
Compose是Docker官方的开源项目,需要安装
Dockerfile让程序在任何地方运行,web服务,redis、mysql、nginx…多个容器
Compose
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
compose安装
- 下载
#国外
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内,建议使用
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2,授权
[root@yuan bin]# chmod +x /usr/local/bin/docker-compose

compose初体验
常用命令
在使用docker-compose命令时,默认会在当前目录下查找docker-compose.yml文件
#基于docker-compose.yml启动管理的容器
docker-compose up -d
#关闭并删除容器
docker-compose down
#开启、关闭、重启已经存在的有docker-compose管理的容器
docker-compose start|stop|restart
#查看由docker-compose管理的容器
docker-compose ps
#查看日志
docker-compose logs -f
地址:https://docs.docker.com/compose/gettingstarted/
cd /home新建一个文件
[root@yuan home]# mkdir composetest
#进入新建的目录
[root@yuan home]# cd composetest
#编辑app.py
[root@yuan composetest]# vim app.py
#查看app.py的内容
[root@yuan composetest]# cat app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
#创建requirements.txt文件
[root@yuan composetest]# vim requirements.txt
[root@yuan composetest]# cat requirements.txt
flask
redis
#Dockerfile应用打包为镜像
#创建Dockerfile文件
[root@yuan composetest]# vim Dockerfile
[root@yuan composetest]# cat Dockerfile
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
#docker-compose.yml文件(定义整个服务于,需要的环境,web、redis)
[root@yuan composetest]# vim docker-compose.yml
[root@yuan composetest]# cat docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
#运行测试
[root@yuan composetest]# docker-compose up
docker-compose up的执行流程
1、创建网络
2、执行Docker-compose yaml
3、启动服务
Creating composetest_web_1 … done
Creating composetest_redis_1 … done




docker-compose会自动把需要的依赖下载下来

自动的默认规则
1、文件名 composetest
2、服务
默认的服务名 文件名_num
多个服务器,集群 A B_num 副本数量
服务redis服务=>4个副本
集群状态,服务都不可能只有一个运行实例。弹性、10 HA 高并发
网络规则

通过 docker network inspect composetest_default 查看compose的网络信息,在同一个网络下,通过域名访问

如果在同一个网络下,我们可以通过域名进行访问
停止
docker-compose down
或者:Ctrl+C

编写compose.yml规则
网址:https://docs.docker.com/compose/compose-file/#compose-file-structure-and-examples
# 3层
version: '' # 版本
services: # 服务
服务1: web
# 服务配置
images
build
network
......
服务2: redis
.....
服务3: mysql
.....
# 其他配置 网络/卷 全局规则
volumes:
networks:
configs

使用Compose一键部署WP博客
阿里云和宝塔要开启端口
网站地址:https://docs.docker.com/samples/wordpress/
[root@yuan home]# mkdir my_wordpress
[root@yuan home]# cd my_wordpress
[root@yuan my_wordpress]# vim docker-compose.yml
[root@yuan my_wordpress]# cat docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
#前台运行
[root@yuan my_wordpress]# docker-compose up
#后台运行
[root@yuan my_wordpress]# docker-compose up -d
浏览器访问:http://ip地址:8000/即可
实战编写自己的微服务上线
-
导入redis和web的依赖
-
编写文件
package com.springbootcompose.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello(){
Long views = redisTemplate.opsForValue().increment("views");
return "hello yuan:"+views;
}
}
application.properties
server.port=9000
spring.redis.host=redis
docker-compose.yml
version: "3.8"
services:
yuanapp:
build: .
image: yuanapp
depends_on:
- redis
ports:
- "9000:9000"
redis:
image: "redis:alpine"
Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=9000"]
EXPOSE 9000
ENTRYPOINT ["java","-jar","/app.jar"]
- 打包镜像打服务器上

- 运行即可
docker-compose up --build
- 浏览器测试访问成功

实战编写自己的微服务上线2
准备一个jar包和一个Dockerfile文件在同级目录下

Dockerfile文件
#java环境
FROM java:1.8
#创建目录
RUN mkdir -p /news/certification
#设置工作目录
WORKDIR /news/certification
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#复制jar到容器
ADD yuan-biz-0.0.1-SNAPSHOT.jar /news/certification
#启动的时候运行jave -jar包
CMD java -jar yuan-biz-0.0.1-SNAPSHOT.jar
在同级目录下输入
#-f 指定Dockerfile文件 -t去名称为new-biz
docker build -f ./Dockerfile -t new-biz .
这里进行了数据库连接需要和Mysql进行容器互联,所以还要启动mysql
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v, /root/mysql5.7/conf:/etc/mysql/conf.d \
-v /root/mysql5.7/logs:/var/log/mysql \
-v /root/mysql5.7/data:/var/lib/mysql \
--name c1_mysql mysql:5.7
最后将启动自己发布的镜像和mysql进行以Ping通,通过--link
#将news容器和c1_mysql PING通
docker run -d -p 8082:8082 --name news --link c1_mysql new-biz
最后通过浏览器访问服务器或者虚拟机

实战使用docker-compose部署

Dockerfile文件
#java环境
FROM java:1.8
#创建目录
RUN mkdir -p /news/certification
#设置工作目录
WORKDIR /news/certification
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
#复制jar到容器
ADD yuan-biz-0.0.1-SNAPSHOT.jar /news/certification
#启动的时候运行jave -jar包
CMD java -jar yuan-biz-0.0.1-SNAPSHOT.jar
docker-compose.yml
version: '3.1'
services:
mysql:
restart: always #只要docker启动,这个容器就会启动
image: mysql:5.7 #指定本地下载的mysql版本
container_name: c_mysql #指定mysql的名称
ports:
- 3310:3306 #对外暴露的端口3301
environment:
MYSQL_ROOT_PASSWORD: root #设置数据库密码
TZ: Asia/Shanghai #设置时区
volumes: #设置容器数据卷
- /root/mysql5.7/conf:/etc/mysql/conf.d
- /root/mysql5.7/logs:/var/log/mysql
- /root/mysql5.7/data:/var/lib/mysql
news-biz: #自己自定义Java代码的模块,名称答意即可 ,可以有多个模块
restart: always #只要docker启动,这个容器就会启动
build:
#相对于docker-comppose的路径
context: ./
#指定Dockerfile的名称
dockerfile: Dockerfile
#通过Docker构建出来的镜像名称
image: news-bizs
ports:
- 8082:8082 #暴露8082端口
#和mysql PING 通
links:
- mysql
浏览器访问

实战使用docker-compose多模块部署

docker-compose.yml
version: '3.1'
services:
mysql:
restart: always #只要docker启动,这个容器就会启动
image: mysql:5.7 #指定本地下载的mysql版本
container_name: c_mysql #指定mysql的名称
ports:
- 3310:3306 #对外暴露的端口3301
environment:
MYSQL_ROOT_PASSWORD: root #设置数据库密码
TZ: Asia/Shanghai #设置时区
volumes: #设置容器数据卷
- /root/mysql5.7/conf:/etc/mysql/conf.d
- /root/mysql5.7/logs:/var/log/mysql
- /root/mysql5.7/data:/var/lib/mysql
#这里有多少个模块就加多少个自定义模块,这里是登录模块和业务模块
news-biz: #字段自定义Java代码的模块,名称答意即可
restart: always #只要docker启动,这个容器就会启动
build:
#相对于docker-comppose的路径
context: ./news-biz
#指定Dockerfile的名称
dockerfile: Dockerfile
#通过Docker构建出来的镜像名称
image: news-biz
ports:
- 8082:8082 #暴露8082端口
#和mysql PING 通
links:
- mysql
news-login: #字段自定义Java代码的模块,名称答意即可
restart: always #只要docker启动,这个容器就会启动
build:
#相对于docker-comppose的路径
context: ./news-login
#指定Dockerfile的名称
dockerfile: Dockerfile
#通过Docker构建出来的镜像名称
image: news-login
ports:
- 8081:8081 #暴露8081端口
#和mysql PING 通
links:
- mysql
...