docker学习
docker利用的都是现有的linux技术
docker 组成
架构图
nameSpace
docker nameSpace隔离 类似于 系统级别的隔离 ;通过nameSpace 实现轻量级的 命名空间隔离,进程间隔离测试:
一:linux中
1. ps -aux 可以看到很多进程
2. unshare --fork --pid --amount-proc bash 新进入了一个进程空间
再查询 ps-aux 就只能看到两个root进程
docker容器应该和这个类似
二:执行docker 中的命令
使用docker ps 可以查看docker 列表
启动一个busybox容器 docker run -it busybox ; 就是运行一个容器 (-it 可交互的terminal终端)
在这个里面可以使用命令 查看docker的参数: ps -aux
也是只能看到两个进程
CGroups 资源配额
能用多少是要管控的使用的是CGroups controller groups 项目
linux要是2.6.24版本,才集成了这个项目。
能限制cpu、内存、网络。测试:
让一个进程占满CPU while : ; do : ; done &
通过这个命令,就可以运行 并查看当前命令的进程号;
之后根据top可以看占用情况。
这里有个小知识:cd /sys/fs/cgroup/cpu 这个是linux自带的日志位置
这里可以建个空的测试文件夹。系统会自动在里面生成文件。这里的文件都是配额。-1就是不限制。
写入cpu限制,是写入cpu.cfs-quota-us文件,是毫秒,意为每1scpu 有多少cpu是给这个用的。 20000 就是20%cpu时间
把想管理的进程写入这个目录的task文件里,意为要管理的进程。
在看top,现在最高只有20%了再看看docker是怎么实现这个功能的
docker run -it --cpu=".5" nginx /bin/sh 运行docker 在可操作终端 给cpu最大50% 运行nginx
进入 cd /sys/fs/cgroup/cpu cat一下cpu.cfs-quota-us 就看到了50000。所以docket就是用这个命令的。
小结:k8s的limit memory 调用的docket 的--cpu那个 底层就是用的linux的配额限制。
docket镜像(docket真正的创新)
运行环境的隔离,但是如何快速迁移复制到其他环境运行(水平扩容),一次构建,处处运行。docket镜像应运而生。
docket镜像特性:
具备应用运行需要的所有依赖。一次构建处处运行。基于checkSum去重存储,降低存储空间。
常用命令:
docker pull nginx 拉取镜像 如果本地没做配置 拉取的就是docker官方的配置好的镜像。
docket image |grep nginx 可以看到nginx的版本在容器中有哪些。
创建docket在docket官网的自己账号上。
看看本地镜像在哪里。 docker info 命令 查看Docket root dir 是本地存储路径
cd /var/lib/docket centos镜像默认都是这个地方。
镜像存储文件在overlay2
进去之后可以看到很多的文件夹存储,叫:layer层
其中的文件夹里有:commit diff link lower work 这几个
diff
差异,操作系统镜像是不变的。
通过diff进行增量存储所有文件,管理镜像。
创建项目的docket镜像
打一个项目的包。mvn package
在项目路径下建Dockfile
#基于哪个镜像 基础镜像版本
FROM registry.XXX.com/xxx/pepper-java:1.4
# 指定包名
ARG jarName
# 拷贝文件到容器,也可以直接写成ADD microservice-discovery-eureka-0.0.1-SNAPSHOT.jar /app.jar
# 容器外的目录 添加到容器内
ADD "build/libs/$jarName" /app.jar
COPY start.sh /start.sh
#PORT WEB 暴露端口 这个端口会被转发到docker容器里
EXPOSE xxx
#PORT GRPC 暴露端口
EXPOSE xxx
# 配置容器启动后执行的命令
ENTRYPOINT ["sh", "/start.sh"]
构建Docker 镜像
1.进入DockerFile所在目录
cd /root/kubeblog/Final
2.构建docker镜像
docker build -t kubeblog .(当前目录)
3.查看docker镜像
docker images
有了镜像就存到这个机器上了。其他节点拉不到这个镜像,因为是本地的。
共享有两种办法:1.上传公网dockerhub。注册一下上传就行
2.安装本地私有docker镜像,公司内部有限共享
4.上传镜像到Dockerhub
docker tag kubeblog:1.0 XXX/kubeblog:1.0
推完之后就可以集群之间共享了,这种软件分享的方式比较好
运行
docker -run --name kubeblog -d -p 5000:5000 --link mysqll57 kubeblog:1.0 run运行-d 后台运行-p 端口映射 宿主机:容器端口--link 对mysql进行端口打通1.0 版本号
docker exec -it kubeblog sh 进入docket之后
printenv 可以查看环境
--link 已经把/etc/host加了一条记录。
docker stop 可以停止服务