狂神说学习笔记:Docker进阶-Docker Compose

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 适用于所有环境:生产、登台、开发、测试以及 CI 工作流。

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

  1. 使用 定义您的应用程序的环境,Dockerfile 以便它可以在任何地方复制。
  2. 定义组成您的应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。
  3. 运行docker compose updocker compose command启动并运行你的整个应用程序。您也可以docker-compose up使用 docker-compose 二进制文件运行。

作用:批量容器编排

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

Dockerfile 让程序在任何地方运行。

一个docker-compose.yml看起来像这样:

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: {}

安装

1、下载

sudo curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

# 这个可能快点
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/2.12.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

image-20221027091215098

2、授权

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

image-20221027102606860

体验

地址:https://docs.docker.com/compose/gettingstarted/

1、应用 app.py

  1. 为项目创建一个目录:

    $ mkdir composetest && cd composetest
    
  2. 创建一个 app.py 文件 并写入:

    vim 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)
    
  3. 创建 requirements.txt 文件并写入

    flask
    redis
    

2、Dockerfile 应用打包为镜像

  1. 创建 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"]
    

这告诉 Docker:

  • 从 Python 3.7 映像开始构建映像。
  • 将工作目录设置为/code.
  • 设置flask命令使用的环境变量。
  • 安装 gcc 和其他依赖项
  • 复制requirements.txt并安装 Python 依赖项。
  • 将元数据添加到图像以描述容器正在侦听端口 5000
  • .项目中的当前目录复制到.镜像中的workdir 。
  • 将容器的默认命令设置为flask run.

3、创建 docker-compose.yml 文件 (定义整个服务,需要的环境。web、redis)

version: "3.9"
services:
  web:
    build: .
    ports:
      - "8000:5000"
  redis:
    image: "redis:alpine"

这个 Compose 文件定义了两个服务:webredis.

4、启动compose 项目(docker-compose up)

$ docker-compose up

image-20221027103041427

自动默认规则

image-20221027103428827

docker images

image-20221027103644624

image-20221027103721290

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

多个服务器。集群。

redis服务=>4个副本

集群状态。服务都不可能只有一个运行实例。弹性。

网络规则

image-20221027103927301

10个服务 => 项目( 项目中的内容都在通过网络下。域名访问)

image-20221027104349181

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

停止 Ctrl + C

需要在项目目录下输入这个命令

image-20221027104610013

docker-compose

以前都是单个docker run启动容器

现在通过docker-compose 编写yaml配置文件、可以通过compose一键启动所有服务、!

小结:

1、Docker镜像。 run => 容器

2、DockerFile 构建镜像(服务打包)

3、docker-compose 启动项目(编排、多个微服务/环境)

4、Docker 网络!

compose配置编写规则

docker-compose.yaml 核心!

https://docs.docker.com/compose/compose-file/

# 3层!

version: '' # 版本
services: # 服务
	服务1: web
		# 配置
		images
		build
		network
		......
	服务2: redis
		......
	服务3: mysql
		......
# 其他配置  网络/卷/全局规则
volumes:
networkds:
configs:

image-20221027105633052

使用compose 一键部署 WP 博客

https://docs.docker.com/samples/wordpress/

1、创建一个空的项目目录。

$ mkdir my_wordpress && cd my_wordpress

2、创建一个docker-compose.yml文件来启动您的 WordPress博客和一个单独的MySQL实例,该实例具有用于数据持久性的卷挂载:

services:
  db:
    image: mysql:5.7
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=somewordpress
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
    expose:
      - 3306
      - 33060
  wordpress:
    image: wordpress:latest
    volumes:
      - wp_data:/var/www/html
    ports:
      - 80:80
    restart: always
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data:
  wp_data:

3、docker-compose up -d 启动项目

访问, https://yourIp:80/

image-20221027113506925

然后一步步进行就OK了!

非常简单!

实战

1、创建一个springboot新项目

导入依赖

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

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

写一个计数器

@RestController
public class HelloController {

   @Autowired
   RedisTemplate redisTemplate;

   @GetMapping("/hello")
   public String hello() {
      Long views = redisTemplate.opsForValue().increment("views");
      return "hello, docker-compose,views" + views;
   }

}

编写application.yml

server:
  port: 8080
spring:
  redis:
    host: redis

2、dockerfile构建镜像

FROM java:8

COPY *.jar /app.jar

CMD ["--server.prot=8080"]

EXPOSE 8080

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

3、docker-compose.yaml 编排项目

version: '3.8'
services:
  kuangapp:
    build: .
    image: kuangapp
    depends_on:
      - redis
    ports:
      - "8080:8080"
  redis:
    image: "library/redis:alpine"

4、丢到服务器 docker-compose up

测试

image-20221027115613946

假设项目要重新部署打包

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

总结:

工程、服务、容器

项目compose:三层

  • 工程 Project
  • 服务 服务
  • 容器 运行实例!
posted @ 2022-10-27 12:05  D..T  阅读(134)  评论(0编辑  收藏  举报