Java分布式微服务3——Docker

文章目录

Docker介绍

大项目组件多,运行环境复杂

  • 每个组件需要的依赖和函数库可能版本不同,容易不兼容
  • 开发、测试、生产环境有差异,甚至操作系统都不一样

Docker可以在任何Linux机器上一键部署,一键移除

Docker与虚拟机区别

  • Docker直接用打包的系统函数库调用OS内核,性能较好,硬盘占用小,启动快
  • 虚拟机需要用函数库调用模拟的OS,指令经过Hypevisor转换后调用真正OS的内核,性能一般,硬盘占用大,启动慢

DockerRegistry: 镜像托管服务器,DockerHub、阿里云镜像

安装Docker

Docker安装和配置

Docker基础操作

Docker服务的启动

sh 复制代码
systemctl enable docker # 开机自启
service start docker

在命令后加上--help就能打开帮助文档

镜像命令

官方镜像拉取参考DockerHub网站

下面我们要:

  1. 拉取一个nginx镜像
  2. 查看镜像
  3. 将其保存成tar
  4. 删除dokcer中的nginx镜像
  5. 从tar中加载这个镜像
  6. 对这个镜像打标签说明这是我们开发的第一个版本
sh 复制代码
docker pull nginx[:tag] # 拉取镜像,不指定版本就自动拉取最新版,tag为latest
docker images # 查看镜像
docker save -o nginx.tar nginx:latest # 保存镜像到tar压缩文件,-o是output,后面跟要保存到的文件名
docker rmi nginx:latest# 删除镜像
docker load -i nginx.tar# 加载刚刚保存的镜像,-i是input,后面跟镜像压缩包文件名
docker tag nginx:latest mynginx:1.0 # 给一个镜像打标签为mynginx:1.0

容器命令

下面我们要:

1. 从docker hub去查看Nginx容器的运行命令

容器一开始是完全隔离的,端口映射就是暴露一个接口(可以理解成和宿主机之间接了条通道,只有宿主机能把请求给它)

容器端口一般取决于应用本身很少变化,宿主机端口可以任意指定可用的
具体怎么启动建议在DockerHub中搜索

sh 复制代码
docker run --name mynginx -p 80:80 -d nginx

2. 查看所有容器状态

默认只能查看到未被停止的,加-a能看到所有

sh 复制代码
docker ps

3. 查看容器日志

sh 复制代码
docker logs mynginx # 查看日志
docker logs -f mynginx # 持续跟踪显示日志,-f=follow

4. 进入Nginx容器执行命令,修改Html内容,添加"Hello World"

实际工作中不建议在容器内修改文件

  • docker exec: 进入容器内部,执行一个命令
  • -it = interaction terminal 给当前进入的容易创建一个标准输入输出终端
  • bash是这里进入容器后要执行的命令,它本身是一个指令处理器
sh 复制代码
docker exec -it mynginx bash

docker容器里有一套自己的简易文件系统

找到nginx的html页面并打开查看

sh 复制代码
cd /usr/share/nginx/html/
cat index.html

修改html内容

sh 复制代码
sed -i 's#Welcome to nginx#Hello World#g' index.html
sed -i 's#<head>#<head><meta charset="utf-8>#g' index.html

5. 停止与开始容器

sh 复制代码
docker stop mynginx
docker start mynginx

6. 删除容器

sh 复制代码
docker rm mynginx # 要先停止容器
docker rm -f mynginx # 强制删除

数据卷

1. 为什么需要数据卷

怎么修改容器中的文件呢?

  • 使用一个虚拟目录交给容器使用,实际上对应的是宿主机的一个真实目录。
  • 如果多个虚拟目录挂载在同一个真实目录上,还能完成文件共享
  • 就算容器被删了,文件还是在宿主机文件夹里

2. 数据卷的操作

  1. 创建数据卷
sh 复制代码
docker volume create myvolume
  1. 列出所有数据卷
sh 复制代码
docker volume ls
  1. 查看数据卷详细信息
sh 复制代码
docker volume inspect myvolume
  1. 删除未使用的数据卷
bash 复制代码
docker volume prune
  1. 删除指定数据卷
bash 复制代码
docker volume rm myvolume

3. 数据卷的挂载

创建容器 的时候通过-v参数将一个数据卷挂载到某个容器目录,如果没有这个数据卷会自动创建一个

bash 复制代码
docker run\
	--name mn\
	-v myvolume:/usr/share/nginx/html\ # 把myvolume数据卷挂载到容器内的/usr/share/nginx/html这个目录上
	-p 80:80\
	nginx

4. 目录与文件挂载

也可以直接把宿主机目录挂载到某个容器目录

挂载文件会直接覆盖容器内的文件

Dockerfile自定义镜像

分层方便迭代,只用改上面几层

DockerCompose集群部署

可以基于Compose文件快速部署分布式应用,无需手动逐个创建和运行容器

Compose文件是个文本文件夹,通过指令定义集群中每个容器如何运行,内容约等于多个docker run的集合

详情参考官网DockerCompose文档

安装dockerCompose

使用DockerCompose部署微服务

最好先自己部署好Nacos再一键部署其他微服务,否则找不到地方注册

镜像仓库

仓库也可以自己建私有仓库

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

1.简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:

sh 复制代码
docker run -d \
    --restart=always \
    --name registry	\
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    registry

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

2.带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

yaml 复制代码
version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

3.配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

sh 复制代码
# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker
相关推荐
李小白6639 分钟前
二叉树的练习题(中)
java·数据结构·算法
骑鱼过海的猫12342 分钟前
【redis】redis
java·数据库·redis
漫天转悠42 分钟前
Java21和Java8性能优化详细对比
java
y25081 小时前
《抽象类和接口》
java·开发语言
脸红ฅฅ*的思春期1 小时前
Java安全—log4j日志&FastJson序列化&JNDI注入
java·安全·log4j·fastjson·jndi注入
NMBG221 小时前
[JAVAEE] 网络编程
java·服务器·网络·tcp/ip·udp·java-ee
chunmiao30321 小时前
自建k8s集群,利用开源的GitLab、Jenkins和Harbor实现CI/CD和DevOps的过程回顾
java·开发语言
无敌最俊朗@1 小时前
c#————委托Action使用例子
java·前端·c#
single5941 小时前
【c++笔试强训】(第五篇)
java·开发语言·c++·vscode·学习·算法·牛客
独自等待你2 小时前
java 泛型中的 ?
java