• 微服务技术栈-Docker应用部署



    前言

    之前文章讲到过,docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器,接下来我们将介绍如何使用docker去部署Java web开发的常见服务。


    一、数据卷

    在之前的文章中我们介绍了容器之间使用沙箱机制,相互隔离。现在我们继续来思考几个Docker容器在使用过程中会出现的问题。

    • Docker 容器删除后,在容器中产生的数据还在吗?
    • Docker 容器和外部继器可以交换文件吗?
    • 容器之间想要进行数据交互?

    在解决上面几个问题之前,我们先来介绍一下Docker数据卷的概念。

    Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,需要通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来。如果没有docker commit,那么当容器删除后,数据自然也就没有了。为了避免反复生成新的镜像,且能将Docker容器的数据持久化的保存下来,我们引入了数据卷的概念。

    数据卷:宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。

    配置数据卷的方法:创建启动容器时,使用-v参数 设置数据卷。

    docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
    
    • 1

    二、Docker 应用部署

    学习完数据卷的概念之后,我们使用Docker来进行应用部署。

    1、MySQL部署

    回忆一下以前我们是怎么安装mysql的:
    1.去mysql官网下载我们需要的mysql压缩包。
    2.上传mysql并解压。
    3.按照依赖关系依次安装rpm包
    4.接着执行后面一系列的mysql初始化命令。

    我们可以看出利用原始方法安装MySQL非常繁琐,且执行的命令太多很容易出错。

    在Docker 容器中部署MySQL,并通过外部MySQL 客户端操作MySQL Server。要想在Docker容器中部署MySQL,我们只需要执行以下四步:

    1.搜索mysql镜像
    2.拉取mysql镜像
    3.创建容器
    4.操作容器中的mysql
    
    • 1
    • 2
    • 3
    • 4

    在使用Docker部署MySQL的时候,还会存在一个问题:容器内的网络服务和外部机器不能直接通信。

    解决方案:因为外部机器和宿主机可以直接通信且宿主机和容器可以直接通信,所以当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务,这种操作称为端口映射。

    1.搜索mysql镜像

    docker search mysql
    
    • 1

    2.拉取mysql镜像

    docker pull mysql:8.0
    
    • 1

    在这里插入图片描述
    3.创建容器,设置端口映射、目录映射。

    # 在/root目录下创建mysql目录用于存储mysql数据信息
    mkdir ~/mysql
    cd ~/mysql
    
    • 1
    • 2
    • 3
    docker run -d \
    -p 3306:3306 \
    -e MYSQL_ROOT_HOST=% \
    -e MYSQL_ROOT_PASSWORD=123456789 \
    -v $PWD/conf:/etc/mysql/conf.d
    -v $PWD/logs:/logs
    -v $PWD/data:/var/lib/mysql
    --name c_mysql \
    mysql:8.0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参数说明

    • -p 3306:3306:将容器的3306端口映射到宿主机的3306端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的conf/my.cnf挂载到容器/etc/mysql/my.cnf配置目录。
    • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs目录日志。
    • -v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql数据目录。
    • -e MYSQL_ROOT_PASSWORD=123456:初始化root 用户密码。
      在这里插入图片描述
      4.进入MySQL的容器,可以看到MySQL的欢迎提示。
      在这里插入图片描述

    2、Tomcat部署

    部署tomcat的方式跟mysql大差不差,也是搜索镜像、拉取镜像、创建容器。
    1.搜索Tomcat 镜像。

    docker search tomcat
    
    • 1

    2.拉取tomcat镜像。

    docker pull tomcat
    
    • 1

    3.创建容器,设置端口映射、目录映射。

    创建容器,设置端口映射、目录映射
    mkdir ~/tomcat
    cd ~/tomcat
    
    • 1
    • 2
    • 3
    docker run -id --name=c_tomcat \
    -p 8080:8080 \
    -v $PWD:/usr/local/tomcat/webapps \
    tomcat
    
    • 1
    • 2
    • 3
    • 4

    参数说明:
    - -p 8080:8080:将容器的8080端口映射到主机的8080端口
    - -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

    3、Nginx部署

    1.搜索Nginx镜像

    docker search nginx
    
    • 1

    2.拉取Nginx镜像

    docker pull nginx
    
    • 1

    3.创建容器,设置端口映射、目录映射

    #在/root目录下创建nginx目录用于存储nginx数据信息
    mkdir -p ~/nginx/conf
    mkdir -p ~/nginx/log
    mkdir -p ~/nginx/html
    
    
    
    # 生成容器
    docker run --name nginx -p 9001:80 -d nginx
    # 将容器nginx.conf文件复制到宿主机
    docker cp nginx:/etc/nginx/nginx.conf ~/nginx/conf/nginx.conf
    # 将容器conf.d文件夹下内容复制到宿主机
    docker cp nginx:/etc/nginx/conf.d ~/nginx/conf/conf.d
    # 将容器中的html文件夹复制到宿主机
    docker cp nginx:/usr/share/nginx/html ~/nginx/
    
    
    # 删除正在运行的nginx容器
    docker rm -f nginx
    
    
    #Docker 创建Nginx容器
    docker run \
    -p 9002:80 \
    --name c_nginx \
    -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v ~/nginx/conf/conf.d:/etc/nginx/conf.d \
    -v ~/nginx/log:/var/log/nginx \
    -v ~/nginx/html:/usr/share/nginx/html \
    -d nginx:lates
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4、Redis部署

    1.搜索Redis镜像

    docker search redis
    
    • 1

    2.拉取Redis镜像

    docker pull redis:6.0.8
    
    • 1

    3.创建容器,设置端口映射、目录映射

    docker run -id --name=c_redis -p 6379:6379 redis:6.0.8 --requirepass "100"
    
    • 1

    5、Kafka部署

    1.拉取zookeeper镜像

    docker pull wurstmeister/zookeeper
    
    • 1

    2.拉取kafka镜像

    docker pull wurstmeister/kafka
    
    • 1

    3.运行zookeeper镜像

    docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper
    
    • 1

    4.运行kafka镜像

    docker run -d --name kafka -p 9092:9092 --link zookeeper -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_ADVERTISED_HOST_NAME=localhost -e KAFKA_ADVERTISED_PORT=9092  wurstmeister/kafka
    
    • 1

    5.进入kafka镜像

    docker exec -it 镜像名 /bin/bash
    
    • 1

    6.测试kafka工作情况

    #先进入 kafka的bin 目录。
    cd /opt/kafka_2.12-2.5.0(这里看自己的目录版本号)/bin/
    #自己创建topic
    kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic mytopic
    
    • 1
    • 2
    • 3
    • 4

    7.修改kafka配置文件(要在宿主机里面改然后cp到容器中,因为在容器中改容器一启动就会失效)

    #拷贝到宿主机
    docker cp b8c5206770d1:/opt/kafka_2.13-2.8.1/config/server.properties  ~/server.properties
    #修改的配置文件内容:
    在kafka的应用下/config/server.properties下找到listeners=PLANTEXT://9092,去掉井号,并且将服务器ip或者域名加入到PLANTEXT:的后面,其中PLANTEXT是kafka默认使用的通信协议。在这个文件中,还有一个advertised.listeners的配置,这个主要用来配置公网ip
    #从宿主机拷贝到容器中
    docker cp ~/server.properties b8c5206770d1:/opt/kafka_2.13-2.8.1/config/server.properties
    #重启容器
    docker restart kafka
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    总结

    在本章中我们介绍了数据卷这个概念,数据卷解决了docker容器在运行过程中的数据持久化问题。然后我们利用Docker来部署了与Java Web开发联系非常紧密的几个服务,可以看出使用了docker之后我们的部署变得十分方便且管理起来非常清晰,在后续的文章中将介绍更多有关docker部署服务的知识。


  • 相关阅读:
    一文读懂 Prometheus 长期存储主流方案
    Hive Java API操作
    随笔一
    【MySQL系列】 MySQL表的增删改查(进阶)
    (min,max)=>Math.floor(Math.random()*(max-min+1)+min
    Android数据结构和算法总结-字符串相关高频面试题算法
    腰部外骨骼机器人线性自抗扰控制器参数优化
    05-在Idea中编写Servlet程序
    使用el-tree实现懒加载、请求接口的检索依次展开
    神经网络到底是怎样一回事,神经网络是什么意思
  • 原文地址:https://blog.csdn.net/qq_52173163/article/details/133610681