Java进阶之路(八)Docker从入门到集redis集群、部署SpringBoot

Docker

架构

Java进阶之路(八)Docker从入门到集redis集群、部署SpringBoot_第1张图片

镜像(image)

镜像是一个模板,可以用来创建容器,一个镜像可以创建多个容器

容器(container)

独立运行一个或者一个组应用,通过镜像创建,可以看为一个简易linux系统

仓库(repository)

存放镜像的地方,分为公有仓库和私有仓库

运行原理

在本机寻找镜像——>有则运行,无则去DockerHub下载并运行

底层原理

docker是一个CS结构,守护进程运行在主机上,通过Socket从客户端访问

Docker为什么比VM快

Docker比虚拟机抽象层更少

利用的是宿主机的内核,而VM需要的是GuestOS

Docker常用命令

docker version
docker info
docker --help

###镜像命令
docker images #查看所有镜像 
#可选项:
#-a 显示所有 
#-q 只显示id

docker search #搜索镜像

docker pull mysql:5.7 #下载镜像
#如果不写tag,默认就是latest,随后进行分层下载,image的核心,联合文件系统
#会输出Digest:签名
#会输出docker.io/library/mysql:latest,即真实地址

docker rmi #删除镜像
#可选项
#docker rmi -f $(docker images -aq) 删除全部镜像
###容器命令
docker run #启动容器
#可选项
#--name 容器命名 --name="Name"
#-d 后台方式
#-it 交互方式
#-p 指定端口 -p 主机端口:容器端口
#-P 大写P就是随机指定端口

docker ps #列出容器
#可选项
#-a 列出所有容器,包括历史运行过的容器
#-q 只显示容器id

exit #容器内直接停止容器并退出
Ctrl+P+Q #容器不停止并退出

docker rm #删除容器
#可选项
#docker rm -f $(docker ps -aq) 删除全部容器

docker start 容器id			#启动容器
docker restart 容器id		#重启容器
docker stop 容器id  		#停止容器
docker kill 容器id  		#杀死容器

tips:docker容器使用后台运行,如果没有前台进程,则会自动停止

###其他命令
docker logs -tf --tail 10 容器id #查看日志
docker top 容器id 				#查看容器内的进程
docker inspect 容器id 		#查看镜像元数据
docker exec -it 容器id /bin/bash      #进入当前正在运行的容器,开启新终端
docker attach 容器id									#进入当前正在运行的容器,进入正在执行的终端
docker cp 容器id:容器内路径 当前目录

Docker镜像原理

UnionFS联合文件系统

是一种分层、轻量级并且高性能的文件系统。

bootfs包含BootLoader和kernel,前者引导加载kernel,linux启动的时候会加载bootfs。

rootfs在bootfs上层,包含的是典型Linux的/dev、/proc、/bin、/etc等文件,rootfs是各种不同的操作系统发行版,例如ubuntu或者arch。

对于不同的linux,bootfs基本一致,只有rootfs有区别,所以只需要一层bootfs(即docker内置的),而每个镜像都是不同的rootfs而已。

第三层:应用程序(redis等)
第二层:rootfs(centos等)
第一层:bootfs(kernel)
Docker镜像特点(开闭原则)

镜像是只读的,不可改变,启动容器时是新增了一个可写层被加载到镜像顶层,即容器层。

容器数据卷

由于如果数据都在容器中,那么容器删除的时候数据就会丢失,所以需要数据持久化。

可以通过容器数据卷的方式实现容器的持久化和同步操作。

#使用-v挂载
docker run -it -v 主机目录:容器内目录

本质上类似pd等vm的共享文件夹。

Docker网络

Docker0

每运行一个容器,Docker都会分配一个ip地址,这个虚拟设备接口是成对出现的,一边连着协议,一边彼此相连。

使用了veth-pair技术,充当一个桥梁。

Java进阶之路(八)Docker从入门到集redis集群、部署SpringBoot_第2张图片

所有容器在不指定网络情况下, 都是docker0路由的,docker会分配一个默认可用的ip。

使用–link实现高可用(不推荐使用)

因为每次重启容器ip地址都会改变,因此如果一旦崩溃了,通过ip就不可访问了,因此需要通过–link实现高可用。

本质上是修改了/etc/hosts,将ip地址映射给容器名了。

Docker0问题

不支持容器名连接访问。

自定义网络
#创建网络配置
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

#使用网络配置
docker run -itd --net mynet mysql

自定义的网络已经由docker维护好了对应的关系

实战:创建redis集群

#创建网络配置
docker network create redis --subnet 172.38.0.0/16

#使用脚本配置redis
for port in $(seq 1 6);\
do \
mkdir -p /home/redis/node-${port}/conf
touch /home/redis/node-${port}/conf/redis.conf
cat << EOF >/home/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

#运行容器
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /home/redis/node-${port}/data:/data \
-v /home/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis redis-server /etc/redis/redis.conf; \
done

#构建集群
docker exec -it redis-1 /bin/sh
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

把主机挂载的地址改为home目录 就可以解决 启动自动停止的问题

Java进阶之路(八)Docker从入门到集redis集群、部署SpringBoot_第3张图片

Java进阶之路(八)Docker从入门到集redis集群、部署SpringBoot_第4张图片

实战:部署springboot项目

首先mvn package得到jar包

随后编写Dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT["java","-jar","/app.jar"]

上传文件到服务器

docker build -t imagename .

docker run -d -P --name containername imagename

docker ps

curl localhost:32779/hello

你可能感兴趣的:(docker,linux,java,centos,网络)