Docker (六)【Docker Compose】

六、Docker Compose


简介

DockerFile build run 手动操作,单个容器

Docker Compose 能够高效管理容器,运行多个容器

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

  • 官方介绍

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.
  • 翻译

Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以使用 YAML 文件来配置应用程序的服务。然后,使用一个命令,您可以从您的配置中创建并启动所有服务。要了解有关 Compose 的所有功能的更多信息,请参阅功能列表

Compose 适用于所有环境:生产、上线、开发、测试以及 CI 工作流程。您可以在常见用例中了解有关每个案例的更多信息

使用 Compose 基本上是一个三步过程:

  1. 使用一个Dockerfile定义你的应用程序的环境,以便可以在任何地方复制它
  2. 定义构成你的应用程序的服务,docker-compose.yml 以便它们可以在隔离环境中一起运行
  3. 运行docker compose upDocker compose 命令启动并运行您的整个应用程序。您也可以docker-compose up使用 docker-compose 二进制文件运行
  • 作用:批量容器编排

Compose 是 Docker 官方的开源项目,需要安装

简单的Compose实例(docker-compose.yml)

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "8000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
  • 解析:有两个服务:web、redis,并且这两个服务的网络连接起来了

6.1 安装 Compose

下载地址:https://docs.docker.com/compose/install/

国内地址:https://get.daocloud.io/#install-compose

# 使用国内镜像下载,可根据自己的情况指定下载后的路径
# /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose

在这里插入图片描述

  • 安装成功

在这里插入图片描述

6.2 快速开始(按照官方说明)

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

创建文件

  1. 为工程建立文件目录
 # 选择在 /home 目录下创建,可自定选择
 mkdir composetest
 cd composetest
  1. 在当前文件下创建一个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)

创建Dockerfile文件

[root@vinjcent composetest]# pwd
/home/composetest
[root@vinjcent composetest]# vim Dockerfile
# =================================文件内容=================================
# syntax=docker/dockerfile:1
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"]
# =================================文件内容=================================

在Compose文件中定义所需的服务

  1. 在当前目录下创建一个docker-compose.yml文件
version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

在这里插入图片描述

使用Compose构建和运行app

】需要从当前的工程文件下运行,必须有这四个文件

# 运行命令,后台运行添加参数 -d 即可
 docker-compose up

在这里插入图片描述

  • 查看正在运行的docker容器

在这里插入图片描述

  • 测试访问web
[root@vinjcent composetest]# curl localhost:8000

在这里插入图片描述

在这里插入图片描述

  • 查看下载镜像

在这里插入图片描述

# 查看所有docker服务
[root@vinjcent composetest]# docker service ls

默认的服务名 文件名-服务名-num

num 代表副本的数量

  • 项目中的内容都在同一个网络下(手动配置),网络自动生成

在这里插入图片描述

  • 查看网络信息

在这里插入图片描述

在这里插入图片描述

如果在同一个网络下,可以直接通过域名访问

有效避免了服务出现故障之后,重新启动服务时,容器分配的域名发生改变(从172.27.0.2 => 172.27.0.3),保证HA(高可用)

在这里插入图片描述

停止运行Compose

# 需要在容器外部的存放yml文件的目录下执行
docker-compose down
# 快捷键需要在容器启动的地方使用
Ctrl + C	

在这里插入图片描述

6.3 Compose配置编写规则

yml 规则

主要有三层

官方说明文档https://docs.docker.com/compose/compose-file/compose-file-v3/

##### 三层
### 第一层: 版本
version: "" 	# 版本
services:		# 多个服务配置
  redis: 		# 服务1
  	### 第二层: 服务配置(docker容器的配置)
    container_name: my-redis-container	# 容器名称
    images: redis:latest				# 镜像拉取
    build: .
    depends_on:		# 设置启动顺序依赖,先启动db服务,再启动redis
      - db
      - redis
    network			# 网络配置
    ...
  web: 			# 服务2
    ...
  mysql: 		# 服务3
    ...

### 第三层: 其它配置: 网络、卷、全局规则...
volumes: 
networks:
configs: 

在这里插入图片描述

在这里插入图片描述

6.4 使用Compose一键部署博客

用例测试

# 在 /home 目录下创建一个文件目录 my_wordpress
mkdir my_wordpress
cd my_wordpress/

# 创建一个docker-compose.yml文件
mkdir 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@vinjcent my_wordpress]# docker-compose up

测试访问:http://192.168.159.100:8000/

  • 注册自己的账号密码

在这里插入图片描述

在这里插入图片描述

  • 登录个人博客

在这里插入图片描述

在这里插入图片描述

6.5 SpringBoot微服务上线

  1. 编写一个springboot项目
  2. dockerfile 构建镜像
  3. docker-compose.yml 编排项目
  4. 打包springboot项目,并将三个文件上传到Linux
  5. 运行命令 docker-compose up

1)创建一个SpringBoot工程,导入依赖

    <dependencies>
    	<!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
         <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2)编写controller

package com.vinjcent.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;

@SuppressWarnings("all")
@RestController
public class HelloController {

    @Autowired
    StringRedisTemplate redisTemplate;

    @GetMapping("/hello")
    public String hello() {
        long views = redisTemplate.opsForValue().increment("views");
        return "hello,vinjcnet,views: "+ views;
    }

}

3)在该工程下创建一个Dockerfile文件

FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=3035"]

EXPOSE 3035

ENTRYPOINT ["java","-jar","/app.jar"]

4)在该工程下创建一个docker-compose.yml文件

version: '3.9'
services:
  vinjcentapp:
    build: .
    image: vinjcentapp:1.0
    depends_on:
      - redis
    ports:
      - "3035:3035"
  redis:
    image: "redis:alpine"

5)将该工程打成一个jar包

在这里插入图片描述

6)将三个文件上传到 Linux 上的文件夹中

在这里插入图片描述

7)在该目录下运行命令

docker-compose up
# 重新构建
docker-compose up --build

8)测试访问

curl localhost:3035

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值