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


前言

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


一、数据卷

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

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

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

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

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

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

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

二、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

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

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

1.搜索mysql镜像

docker search mysql

2.拉取mysql镜像

docker pull mysql:8.0

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

# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
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

参数说明

  • -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

2.拉取tomcat镜像。

docker pull tomcat

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

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

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

3、Nginx部署

1.搜索Nginx镜像

docker search nginx

2.拉取Nginx镜像

docker pull nginx

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

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

4、Redis部署

1.搜索Redis镜像

docker search redis

2.拉取Redis镜像

docker pull redis:6.0.8

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

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

5、Kafka部署

1.拉取zookeeper镜像

docker pull wurstmeister/zookeeper

2.拉取kafka镜像

docker pull wurstmeister/kafka

3.运行zookeeper镜像

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

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

5.进入kafka镜像

docker exec -it 镜像名 /bin/bash

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

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

总结

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JinziH Never Give Up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值