zoukankan      html  css  js  c++  java
  • Docker从入门到精通(八)——Docker Compose

    恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具。

    1、为什么需要 Docker Compose?

    官网镇楼:https://www.runoob.com/docker/docker-compose.html

    一句话概括:

    帮助我们批量有规则的管理容器。

    前面基础教程,我们介绍了 Dockerfile ,启动服务都是通过 Dockerfile 构建镜像,启动容器,对于几个服务,我们一个一个的build,run 还能接收,但是实际生产环境是有几百上千个的,这个时候难道我们还有手动一个一个启动吗?

    另外,服务与服务之间是有依赖关系的,比如一个 Tomcat 部署的服务依赖MySQL,依赖Redis,我们启动 Tomcat 服务时,需要先启动MySQL和Redis,这个顺序也是很重要的。

    有了 Docker Compose ,那我们就可以告别手动繁琐的步骤,提前定义好规则,统一管理即可。

    2、Docker Compose 局限性

    首先说明,Docker Compose 虽然是官方提供的容器编排工具,但是实际生产环境是不用的(用什么?比如Swarm、K8S,后面会介绍),因为其局限性很大,这里介绍大家了解即可。

    只支持单机多容器,不支持集群环境管理。

    3、安装

    参考官方文档即可:https://docs.docker.com/compose/install/

    Mac/Windows 安装docker默认提供了 Docker Compose,所以不需要我们安装,但是Linux环境需要手动安装。

    3.1 下载

    sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    上面是官方提供的,但是下载会比较慢,可以使用国内的下载地址:

    sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    3.2 授权

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

    3.3 验证安装

    docker-compose version
    

    3.4 卸载

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

    4、用法

    根据官方提示,使用 Docker Compose 分为三个步骤:

    • 第一步:使用 Dockerfile 定义应用程序的环境。
    • 第二步:使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    • 第三步:执行 docker-compose up 命令来启动并运行整个应用程序。

    具体如何用,下面我通过两个小例子来演示说明。

    5、部署WP博客

    这也是官方提供的实例:https://docs.docker.com/samples/wordpress/

    WordPress是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP语言和MySQL数据库开发的,用户可以在支持 PHP 和 MySQL数据库的服务器上使用自己的博客。

    5.1 创建项目目录

    名称任意,用来存放 docker-compose.yml 文件

    mkdir my_wordpress
    

    我们按照官方创建一个名为 my_wordpress 目录。

    5.2 创建 docker-compose.yml

    新建一个 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:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
    volumes:
      db_data: {}
      wordpress_data: {}
    

    5.3 构建项目

    docker-compose up -d
    

    注意要切换到my_wordpress 目录,否则要增加 -f 参数指定 docker-compose.yml 文件。

    看到上面截图即表示启动成功。

    5.4 访问页面

    http://宿主机IP:8000

    另外,我们通过 docker ps 命令,也能看到启动了两个容器。

    6、docker-compose.yml 规则

    上面的例子很简单,但是里面有一个核心就是 docker-compsoe.yml 文件的编写,下面我们就来详细介绍这个文件的编写规则。

    官方规则介绍:

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

    # 第一层:版本
    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:3306
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
    # 第三层:其他配置,包括网络,容器卷等等
    volumes:
      db_data: {}
      wordpress_data: {}
    

    其实主要就是三层配置,具体的每个配置项,大家可以看名知意,然后不懂的官网其实也有很详细的说明。

    7、Docker Comopose 部署自定义服务

    下面我们自己写一个服务,不用官方服务,带着大家手动玩一遍。

    每次访问 Tomcat的服务,Redis计数器加1

    7.1 编写 Tomcat服务

    新建一个springboot项目,然后新建一个controller类:

    package com.itcoke.counter.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;
    import javax.servlet.http.HttpServletRequest;
    
    @RestController
    public class CounterController {
    
        @Autowired
        StringRedisTemplate redisTemplate;
    
        @GetMapping("/visit")
        public String count(HttpServletRequest request){
            String remoteHost = request.getRemoteHost();
            Long increment = redisTemplate.opsForValue().increment(remoteHost);
            return remoteHost +"访问次数"+increment.toString();
        }
    }
    
    

    Springboot 服务的配置文件 application.yml:

    server:
      port: 8080
      servlet:
        context-path: /counter
    spring:
      redis:
        host: counterRedis
    
    

    7.2 Dockerfile

    FROM openjdk:8-jdk
    
    COPY *.jar /counter.jar
    
    CMD ["--server.port=8080"]
    
    EXPOSE 8080
    
    ENTRYPOINT ["java","-jar","/counter.jar"]
    

    7.3 docker-compose.yml

    version: "3.8"
    services:
      itcokecounter:
        build: .
        image: itcokecounter
        depends_on:
          - counterRedis
        ports:
          - "8080:8080"
      counterRedis:
        image: "redis:6.0-alpine"
    

    7.4 测试

    在Linux服务器新建 counter 文件夹,把下面三个文件拷贝到其中。

    然后执行如下命令构建:

    docker-compose up

    执行完成便会出现如下启动成功界面:

    image-20211116221332395

    然后,我们在浏览器输入网址:

    http://{ip}:8080/counter/visit

    每刷新一次,还会增加一次。

    作者:IT可乐

    资源:微信搜【IT可乐】关注我,回复 【电子书】有我特别筛选的免费电子书。
    本文版权归作者所有,欢迎转载,但未经作者同意不能转载,否则保留追究法律责任的权利。
  • 相关阅读:
    Python:Lasso方法、GM预测模型、神经网络预测模型之财政收入影响因素分析及预测
    ARIMA模型构建、预测——基于Python
    家用电器用户行为分析与事件识别学习笔记
    JQData数据提取及MySQL简单操作——基于Python
    android 沉浸通知栏
    PullToRefreshScrollView 修改下拉刷新图标
    Android AlertDialog 设置setSingleChoiceItems不显示列表的原因【setMessage和setSingleChoiceItems不能同时使用】
    图片跑马灯抽奖,本地图片变换简单实现
    android知识点大总结
    Android 面试精华题目总结
  • 原文地址:https://www.cnblogs.com/ysocean/p/15659183.html
Copyright © 2011-2022 走看看