docker
镜像:就是一个叠加的文件系统,基于镜像文件创建的容器和宿主机共享内核,所有容器共用宿主机的相关资源
核心原理
容器间互联
每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中
命名空间为新创建的进程隔离了文件系统、网络并与宿主机器之间的进程相互隔离,但是命名空间并不能够为我们提供物理资源上的隔离
CGroups
# 查看当前的 CGroup 中有哪些子系统
lssubsys -m
# 结果
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
每一个 CGroup 下面都有一个 tasks 文件,其中存储着属于当前控制组的所有进程的 pid,作为负责 cpu 的子系统,cpu.cfs_quota_us 文件中的内容能够对 CPU 的使用作出限制,如果当前文件的内容为 50000,那么当前控制组中的全部进程的 CPU 占用率不能超过 50%
# demo
docker run -di --name=mycentos --cpu-period=100000 --cpu-quota=20000 centos:7
制作镜像
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load –i 压缩文件名称
dockerfile制作镜像
demo1 自定义centos7镜像
# 指定父镜像
FROM centos:7
# 作者信息
MAINTAINER jojo<jojo@jojo.cn>
# 执行命令
RUN yum install -y vim
# 工作目录
WORKDIR /usr
# 容器启动命令
CMD /bin/bash
docker build –f dockerfile文件路径 –t 镜像名称:版本
demo2 发布springboot项目
# 指定父镜像
FROM java:8
# 作者信息
MAINTAINER jojo<jojo@jojo.cn>
# 将jar包添加到容器
ADD springboot.jar app.jar
# 定义容器启动执行的命令
CMD java–jar app.jar
docker build –f dockerfile文件路径 –t 镜像名称:版本
demo3 制作安装了JDK的容器
# 父镜像
FROM centos:7
# 作者
MAINTAINER jojo
# 工作目录
WORKDIR /usr
# 执行命令
RUN mkdir /usr/local/java
# 添加jdk
ADD jdk1.8.0_181 /usr/local/java/
# 环境变量
ENV JAVA_HOME /usr/local/java/
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 创建镜像文件,最后的 . 表示Dockerfile文件所在的路径:为当前命令执行时所在的目录
docker build -f Dockerfile -t myjdk1.8:1.0 .
服务编排