文章目录
- 前言
- 一、数据卷
- 二、Docker 应用部署
- 1、MySQL部署
- 2、Tomcat部署
- 3、Nginx部署
- 4、Redis部署
- 5、Kafka部署
- 总结
前言
之前文章讲到过,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部署服务的知识。