docker进阶--docker compose

我们之前在使用docker的时候,如使用spring boot连接MySQL ,我们先使用dockerfile创建Java的镜像,然后 在dockerfile里面写上各种 RUN 命令。当我们需要使用其他内容时,如redis,nginx,那么就又需要写各种 RUN ,我们会感觉到十分麻烦,那么docker-compose就可以轻松的高效管理容器,可以解决我们的问题

Docker Compose

概述

docker Compose来轻松的高效管理容器,定义并允许多个容器
使用compose的三步骤:

  1. 编写dockerfile ,保证我们的项目可以在任何地方运行
  2. 编写 docker-compose.yml(必须是这个文件名)
  3. 使用 docker compose up 命令来启动项目

作用: 批量容器编排

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

我们如果原来的容器里需要各种环境,如web,redis,mysql等等,那么我们需要在Dockerfile里面一个个RUN ,但是compose能简化我们的操作。

先来看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: {}
  • 服务service: 容器、应用,这里就是使用了web和redis这两个容器
  • 项目project : 一组关联的容器,所有容器合起来作为了一个项目

卸载docker compose:

sudo rm /usr/local/bin/docker-compose

安装docker 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCXt67G8-1620814905871)(E:\Docker\images\36.png)]

然后就需要授权:sudo chmod +x /usr/local/bin/docker-compose

进入 /usr/local/bin目录下,使用命令 查看版本确认安装成功:docker-compose version

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFwrqqkh-1620814905873)(E:\Docker\images\37.png)]

快速开始:

  • 创建一个compose项目: mkdir composetest并切换目录 cd composetest

  • 创建python文件: aap.py,这是使用python编写的web应用

    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)
    

    这里连接Redis时主机名设置的是 redis而不是localhost或者是ip地址,是因为docker-compose在连接其他容器时可以直接使用服务名

  • 创建 requirements.txt

    flask
    redis
    
  • 创建Dockerfile

shell
#syntax=docker/dockerfile:1
#使用 Python 3.7镜像
FROM python:3.7-alpine
RUN sed -i 's/https/http/' /etc/apk/repositories
RUN apk add curl
#调整工作目录为 /code
WORKDIR /code
#配置环境变量
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
#安装gcc等依赖
RUN apk add --no-cache gcc musl-dev linux-headers
#复制我们的 requirements.txt文件
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
#把宿主机的当前的 . 目录复制到镜像里的 . 目录
COPY . .
#配置默认指令  flask run
CMD ["flask", "run"]

要注意,shell文件里面表示注释必须是 单独一行开头使用 #

  • 创建 docker-compose文件 docker-compose.yml

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

    docker compose配置文件里定义了两个 service : web和redis

    web service使用 . 目录下的dockerfile来创建镜像 并绑定了主机的5000端口号

    redis service使用dockerhub上的redis镜像

  • 构建并运行compose: docker-compose up

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KmyGc1GO-1620814905876)(E:\Docker\images\39.png)]

如图就是启动成功了,我们可以访问服务器的 5000端口:

在这里插入图片描述

docker-compose up用于构建、启动容器,那么我们使用 docker ps查看:

在这里插入图片描述

可以发现,我们在 docker_compose.yml文件里配置的两个service都被启动了

步骤:

  1. 编写应用 app.py
  2. Dockerfile将应用打包为镜像
  3. Docker-compose.yml文件,定义整个服务,需要的环境(web,redis),完整的上线服务
  4. 启动compose项目 (docker-compose up)
  5. 创建网络
  6. 执行docker-compose.yaml
  7. 启动服务(我们在docker-compose.yml里定义的服务service)

我们在compose.yml里面所有写的 image ,docker-compose自动帮我们下载并运行容器了

docker-compose 启动项目(编排,一次性运行多个容器,适用于多个微服务、环境)

docker-compose.yml

这个文件只有三层:

  • version : 版本

  • services :服务

    services:
      redis:
      #服务配置,在docker run时添加的配置均可以写在这
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
      vote:
        image: dockersamples/examplevotingapp_vote:before
    
  • 其他配置: volumes (卷),networks(网络),configs(全局配置)

Services

services中的服务配置具体有哪些可以查看官网:docker-compose

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqSF7R1y-1620814905879)(E:\Docker\images\38.png)]

其中 depends_on是设置启动顺序的,如果web的depends_on中有redis,那么启动顺序就是先启动redis后启动web

如:

version: "3.9"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres
  • 我们使用 docker-compose up启动服务的时候就会用依赖的顺序,先是db,redis,最后是web
  • 使用 docker-compose up web也会创建和启动db和redis
  • 使用 docker-compose stop停止服务时,是先 web,后 db,最后 redis

docker-compose+wordpress

我们使用doker-compose可以很容易的部署我们的项目,加上wordpress就可以很容易地部署个人博客了

Compose and WordPress

跟着上面做出部署有手就行,这里就不写了

spring boot使用 docker-compose 部署

我们要写redis+spring boot,依赖:

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

编写Controller:

@RestController
public class HelloController {
    @Autowired
    StringRedisTemplate stringRedisTemplate;

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

配置文件:

server.port=8080
spring.redis.host=redis  #这里主机名是redis而不是ip地址

然后我们要把项目使用docker-compose来部署,那就必须要Dockerfile

FROM java:8

COPY *.jar /app.jar

CMD ["----server.port:8080----"]

EXPOSE 8080

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

也需要docker-compose.yml:

version: '3.9'
services:
  kuangapp:
    build: .
    image: kuangapp
    depends_on:
      - redis
    ports:
      - "8181:8080"  # 映射到宿主机是8181端口,容器内是8080
  redis:
    image: redis:alpine

然后使用maven package把项目打包成jar包,把jar包dockerfiledocker-compose.yml都放到Linux里去,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JvpCUAve-1620814905879)(E:\Docker\images\42.png)]

然后我们在 该目录下直接使用docker-compose up即可运行

如果报错,修改文件后,需要重新部署的话使用 docker-compose up --build 来重新构建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Psrk2eBa-1620814905880)(E:\Docker\images\43.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lROC8mZz-1620814905880)(E:\Docker\images\44.png)]

如图,就是启动成功了,我们可以访问服务器的8181端口:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7OGYPiQ6-1620814905881)(E:\Docker\images\45.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值