赞
踩
传统的Java项目部署需要自己进行打包,redis,nignx等中间件需要安装以及进行很多配置,稍微繁琐,而Docker使用了容器化的技术把这一过程封装为一条指令解决,而这取决于它的架构设计,该图来自官网,如下
下面解释下每个模块的意思,如下
Docker_HOST: docker的服务端,简单可以理解为一个linux服务器
Client: docker的客户端,用于操作docker服务端提供的功能的
以上是客户端和服务端的组件,相对好理解,主要是下面的三个概念
Images: 官方称之为镜像,可以简单理解为windows的exe文件,类似于打开就可以进行使用了,对于一些稍微复杂的安装配置可以由制作镜像的人提前写好即可
Containers: 容器,用于承载运行Images的组件,一个Images可以运行在多个容器中,而一个Linux服务器可以运行成千上万个容器,容器可以理解为在一个大的linux服务器下面的小linux服务器
Registry: Docker 仓库,保存其他用户制作的Images镜像的,其他用户通过制作镜像上传到仓库后就可以给所有人进行使用了
Docker 要求 CentOS 系统的内核版本高于 3.10,可以通过 uname -r 指令查看,一般情况下你的CentOs版本是7.0就一定满足了
1. 安装基本准备步骤
yum -y update 保证yum源是最新的
yum install -y yum-utils 下载相关需要的依赖
sudo yum remove -y docker* 如果有旧版本的docker则卸载,否则跳过就行,执行也可以
设置yum源,并更新 yum 的包索引
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
2. 真正开始安装docker
yum list docker-ce --showduplicates | sort -r 查找所有可以安装的docker版本
一般来说不选择最新的版本,因为可能要Bug,可以稍微选择次新的即可
yum install -y docker-ce-3:19.03.9-3.el7.x86_64 # 这是指定版本安装
systemctl start docker 启动docker
systemctl enable docker 开机自动启动docker,如果需要的话
docker version 验证是否安装成功,如果出现以下内容就是成功了
安装其实并不复杂,安装完以后就可以进行使用docker了,也不复杂了
阿里云提供了加速地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,可以到上面看看,上面有具体的介绍
这里也说下怎么弄吧,并不复杂,如下
在 /etc/docker 目录下创建daemon.json文件,内容如下
{
"registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]
}
然后执行以下命令即可
systemctl daemon-reload
systemctl restart docker
查看容器占用磁盘大小指令
# 查看所有容器的大小
cd /var/lib/docker/containers # 进入docker容器存储目录
du -sh * # 查看所有容器的大小
du -sh <容器完整id> #查看某一个容器的大小
查看容器资源使用情况的指令
docker stats # 返回容器资源的实时使用情况,1秒刷新一次
docker stats --no-stream # 返回容器当时的资源使用情况
docker使用的优化技术:写时复制、用时分配,这里就不细说了
docker的使用也并不复杂,步骤主要有以下几步
1. 搜索Images镜像
2. 通过docker客户端指令拉取Image镜像实例
3. 通过docker客户端指令把Image运行到容器中
是不是很简单,只是刚开始接触这些概念可能不太懂,操作几次就会觉得很简单了,下面就来说下具体的操作
1. 搜索Image镜像,搜索有两种方案
方案一,使用命令行 docker search redis
上面有很多的redis镜像,一般我们选择 OFFICIAL表示官方,STARS表示使用人数,所以我们一般使用最好的,但是这种搜索看不到版本号,所以一般建议使用方式二进行搜索
方式二搜索
从官网进行搜索: https://hub.docker.com/
在搜索框直接输入 redis,结果如下
选择Tags可以看到版本号,对后面下载有比较大的帮助
2. 找到镜像后就是进行下载了,下载命令如下
docker pull redis:5
下载名字为redis,版本号为5的镜像,也可以直接复制方式二旁边的指令
如果想下载最新版本可以省略后面的版本号,如下,也就是说:latest也可以不写
docker pull redis:latest
3. 下载完以后查看本地的镜像
docker images
4. 只要镜像有了就是通过容器进行运行了,执行创建同时启动的指令
docker run -d -p 6379:6379 redis:5
该指令会创建一个容器并且启动
-d 表示在后台运行
-p 6379:6379 表示指定端口,左边的是docker服务器所在端口,右边的是容器内的端口
redis:5 为镜像的名称和版本号
5. 执行后再使用下面的指令查看有哪些正在运行的容器
docker ps
到此为止,redis就安装成功了,通过命令行执行也是正常的,是不是很简单
Image镜像相关命令
docker images //列出本地镜像
docker rmi redis:5 //删除本地镜像
docker rmi $(docker images -q) //删除所有的镜像
容器相关命令
docker run -d -p 6379:6379 redis:5 //创建容器并启动
docker ps //列出所有运行的容器
docker stop f0b1c8ab3633 //停止容器,f0b1c8ab3633 为容器id
docker kill f0b1c8ab3633 //强制停止容器
docker start f0b1c8ab3633 //启动已经创建的容器
docker inspect f0b1c8ab3633 //查看容器的信息
docker container logs f0b1c8ab3633 //查看容器日志信息
docker top f0b1c8ab3633 //查看容器内的top进程
docker exec -it f0b1c8ab3633 /bin/bash (有的容器要把 /bin/bash 换成 bin/sh) //进入容器内
docker rm f0b1c8ab3633 //删除容器
docker rm -f $(docker ps -a -q) //删除所有容器
docker cp <containerId>:/path/to/file /host/path/target //把容器内的数据复制到宿主机
以上为常用的命令行,更多的可以参考官网的介绍
https://docs.docker.com/engine/reference/run/
注:容器只需要创建一次即可,可以通过命令 docker ps -a 查看如果对应的镜像已经有容器了,再通过docker start 容器id 启动容器即可,不需要每次都创建容器
至此,通过docker安装redis的步骤就已经结束了,应该很简单吧,多弄几次就明白了,关键还是我们如何部署Java项目,下面弄一个简单的项目来试试看,如下
直接的java项目没办法直接部署到docker容器中,需要我们先把Java项目包装为一个docker镜像,下面就来说下如何进行包装
1. 准备一个jar项目,只是用来测试,非常简单,如下,只是一个接口,端口为8080,在本地访问http://localhost:8080/docker/test可以看到内容
2. 创建一个Dockerfile文件,内容如下
# 基于哪个镜像,如果java:8执行失败就改为 openjdk:8
From java:8
# 复制文件到容器
ADD dockerTest-0.0.1-SNAPSHOT.jar/app.jar
# 声明需要暴露的端口
EXPOSE 8080
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
3. 创建一个文件夹名字随意,把jar包和这个Dockerfile放在一起,然后执行命令生成一个镜像:
结构如下
然后在该目录下使用命令生成镜像,命令如下
docker build -t dockertest:0.0.1 .
dockertest:0.0.1 左边为镜像名,右边为版本号
. 表示Dockerfile所在的路径
执行成功后可以再看镜像,docker images 可以看到已经生成镜像了,如下
可以看到镜像已经生成了,接下来的步骤就是启动容器了,启动命令跟上面的一致,只是换镜像名称和暴漏的端口,如下
docker run -d -p 80:8080 dockertest:0.0.1
我映射的是80端口,方便点,然后就是访问看正不正常了,我访问是正常的,如下
项目启动添加JVM参数
***首先Dockerfile文件内容改为
# 基于哪个镜像
From java:8
# 复制文件到容器
ADD dockerTest-0.0.1-SNAPSHOT /app.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar主要是ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar 这句话,其他的一致
***其次是启动的时候添加如下参数
docker run -e JAVA_OPTS='-Xms1028M -Xmx1028M -Xmn512M -Xss512K' --cap-add=SYS_PTRACE -d -p 80:8080 dockertest:0.0.1
其中--cap-add=SYS_PTRACE参数是为了在容器内支持jinfo等命令
-e JAVA_OPTS 是 docker支持的命令
***证明可以进入容器内进行查看是否生效,常规的jps然后jinfo 进程id -flags便可以看到
docker exec -it 容器id /bin/bash 进入容器内(有些容器要用 sh进入)
docker exec -it 容器id sh
剩下的操作就是常规操作了,这里就不细说了
如果我们要把自己制作的本地镜像发给其他人使用,也是非常简单的,比如把我上面的那个分享到仓库中,只需要进行以下几步
1. 到 https://hub.docker.com/ 注册账号, 我也是第一次注册,目前仓库是没有内容的,如下
2. 制作自己的镜像,其实上面已经制作好了,但是为了区分,我们一般会在镜像面前加上自己的特殊标记,命令如下:
docker tag dockertest:0.0.1 zxcuser/dockertest:0.0.1
tag是打版本的意思
dockertest:0.0.1 是我上面制作好的镜像
zxcuser/dockertest:0.0.1: 等于是个新的镜像,只是有所区分
注意:前缀需要是你的账号名(我这里是zxcuser ),不然可能推不上去。
3. 使用 docker login 登录到中央仓库中,然后输入账号密码,如下
4. 然后就简单了,使用一条push命令直接推送即可,如下
docker push zxcuser/dockertest:0.0.1
注:这个过程有时候可能比较慢,因为受到网络问题了,没办法,只能等
5. 推送完以后再看你的仓库,有如下的镜像就是成功了
到此为止,其他人就可以使用你的镜像了,上面的search pull 等命令啥的
到此,就结束了,Docker的使用到这里就结束了,不过这里有个问题,如果一个项目还好,部署一下就行了,如果有十几个微服务呢,那就比较麻烦了,需要手工一个个部署,会耗费大量的时间并且容易出错,因为Docker出了一个任务编排的技术,也就是Docker Compose技术,下面我们就来聊聊这个技术,也不是很难,如下
上面也说了,就是为了在多任务的时候可以方便的启动
# 下载安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x
/usr/local/bin/docker-compose
#配置权限
sudo chmod +x /usr/local/bin/docker-compose
#校验是否安装成功
docker-compose --version
其实主要是编写docker-compose.yml文件,文件内容和介绍如下
version: '3'
services:
redis-project:
image: myredis #镜像名称
container_name: redisproject #容器名,建议指定
build: ./redis #指 定 Dockfile所 在 路 径 #跟Docker所在的配置一样
ports:
- "80:80" #端口的映射关系,跟上面的一样
expose:
- 80 #所暴漏出来的端口
redis:
image: redis:5
container_name: redis
command: redis-server --appendonly yes --requirepass 123456
volumes:
- /opt/dockerTest/zxcCompose/redis/data:/data #数 据 文 件 挂 载
ports:
- 6379:6379
version: 为docker-compose支持的版本,看你安装的支持多少
services :下面有哪些服务,跟version在同一个标签
redis-project: 为我自己的项目,类似于上面的dockerTest-0.0.1-SNAPSHOT.jar
准备后配置文件后基本就行了,只需要执行以下命令即可,如下
docker-compose up (后面加-d可以后台启动)
docker-compose up 命令还有一些参数,如下
-f docker-compose.yml : 指定编排任务文件,默认为docker-compose.yml可以省略
--build:默认情况下compose会确定有没有容器,有就不会重新创建,这个参数是强制每次都会进行重建
docker-compose down 是下线
执行完就可以了,剩下的就不仔细介绍了,其他的命令可以参考下官网资料
Compose file build reference | Docker Documentation
因为主要还是上面的配置,具体的细节我也还没咋研究
再放一些常用的docker compose的常用命令
# 查看compose内的容器
docker-compose -f docker-compose-app.yml ps
# 关闭或启动或重启compose内的某个容器
docker-compose -f docker-compose-app.yml stop/start/restart <服务名>
# 关闭或重启compose所有容器
docker-compose -f docker-compose-app.yml stop/restart
# 查看compose所有容器的运行日志
docker-compose -f docker-compose-app.yml logs -f
# 查看compose下某个容器的运行日志
docker-compose -f docker-compose-app.yml logs -f <服务名>
# 也可以把compose的容器日志输出到日志文件里去,然后用tail -f 随时查看
docker-compose -f docker-compose-app.yml logs -f >> myDockerCompose.log &
# 重新构建有变化的镜像并更新到容器再启动
docker-compose -f docker-compose-app.yml up --build -d
# 重新创建docker-compose.yml配置有变化的容器并启动
docker-compose -f docker-compose-app.yml up --force-recreate -d
#停掉容器再删除容器
docker-compose -f docker-compose-app.yml down
首先,我们准备一个任务编排文件,内容如下,名称为:docker-compose-env.yml
version: '3'
services:
redis:
image: redis:5
container_name: redis
command: redis-server --appendonly yes --requirepass 123456
volumes:
- /opt/dockerTest/zxcCompose/redis/data:/data #数据文件挂载
- /etc/localtime:/etc/localtime:ro #同步宿主机与容器时间,ro代表readonly只读
ports:
- 6379:6379
实际上就是一个redis,单个服务也可以用任务编排来做,文件配置完就可以使用上面说的命令启动容器: docker-compose -f docker-compose-env.yml up -d
我的目录结构如下,不需要的文件忽略即可
接下来就可以看下网络信息了,docker-compose会创建一个基于目录名_default的网络(会忽略目录名大小写),使用命令查看:docker network ls 内容如下
接下来可以看到网络下面包含哪些服务,使用命令: docker network inspect zxccompose_default
内容如下:
Containers里面的redis就是上面 docker-compose-env.yml文件services指定的,这个有什么用呢,如果你其他的docker-compose文件想使用这些服务,可以直接使用redis进行引用
最后就说一下挂载是啥东西
就如同上面说的,容器就像是一个小的服务器,像我们redis的数据文件默认是放在容器里面的,如果创建的容器删除了,再重新创建的话那么数据就会丢失,但是这样就会造成数据的丢失,所以docker提供了一个挂载的功能,就是让容器内的文件跟真实的linux服务器的某个目录进行同步,容器内生成的数据会同步到外面的数据,具体的命令如下
docker run -d -p 8761:8761 -v /log:/container-log dockertest:0.0.1
也就是说把容器内的/container-log目录挂载到 /log 真实的Linux服务器的目录下,这样就算你的容器误删除了,只要重新创建容器的时候还是挂载到这个目录数据就不会丢失了
容器时间跟主机时间好像会相差几个小时,可以加上时间的挂载,如下
volumes:
- /etc/localtime:/etc/localtime:ro #同步宿主机与容器时间,ro代表readonly只读
这篇文章只是简单的记录下docker的基本使用,使用上其实并不难,而且docker方便的主要是我们部署项目
docker技术比vm虚拟机其实方便多了,因为一台docker服务器可以部署成千个容器,vm虚拟机可能跑个几十个就没了,因为docker实现了服务隔离,可以支持更多的服务同时启动,只要没有过高的并发,可以部署很多个服务
好了,到此为止,谢谢各位
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。