docker组成:
镜像: 类似于只读模板 —— 对象
容器: 通过镜像创建容器 —— 类 容器类似于一个简易的linux环境和运行在其中的程序
仓库: 存放镜像文件的地方 公开库 私有库
docker本身: Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,
这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
interactive i
t tyy
docker 架构:
docker 是一个c/s模式的架构, 后端是一个松耦合架构,众多模块各司其职
基本流程:
1. 用户通过docker client 和 docker daemon建立通信,client发送请求给daemon
2. daemon 作为docker架构主体部分,首先提供docker server的功能使其能接收docker client 的请求
3. docker engine执行docker内部一系列工作,每一项工作以一个job形式存在
4. job运行过程中,当需要容器镜像时,则从docker registry中下载镜像,并通过镜像管理驱动graph driver将下载镜像以graph形式存储 graph镜像存储位置
5. 当需要为docker创建网络环境时,通过网络管理驱动network driver 创建并配置docker容器网络环境
6. 当需要限制docker容器运行资源或执行用户指令等操作时,通过exec driver来完成
execdriver作为Docker容器的执行驱动,负责创建容器运行时的命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。
7. ibcontainer是Docker架构中一个使用Go语言设计实现的库,设计初衷是希望该库可以不依靠任何依赖,直接访问内核中与容器相关的系统调用。
正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操作容器的namespaces、cgroups、apparmor、网络设备以及防火墙规则等。
这一系列操作的完成都不需要依赖LXC或者其他包。
https://blog.csdn.net/cbmljs/article/details/123353108
常用命令:
1. 前台运行
docker run -it redis:6.0.8 /bin/bash 放在镜像名后的是命令,这里我们希望有个交互式 Shell
2. 后台运行
docker run -d redis:6.0.8
3. 查看容器日志
docker logs 容器id
4. 查看docker 概要信息
docker info
5. 查看镜像、容器、数据卷所占空间
docker system df
6. 查看容器内部细节
docker inspect
7. 重新进入容器
docker attach 容器id exit会退出
docker exec 容器id exit不会退出
8. 从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
9. 导入和导出容器
docker export 容器id > 文件名.tar
从归档文件创建镜像 docker import 文件名.tar 镜像名:版本号
unionFS(联合文件系统)
union文件系统一种分层、轻量级、高性能的文件系统
支持对文件系统的修改作为一次提交来一层层的叠加,同时将不同目录挂载在同一虚拟文件系统下
union文件系统是docker镜像的基础。镜像可以通过分层进行继承,基于基础镜像,可以制作各种具体应用镜像
镜像加载原理:
docker 镜像实际上由一层一层文件系统组成
docker 镜像的最底层是引导系统bootfs
rootfs在bootfs之上,小
各发行版本的linux 的bootfs大致一样,可公用
镜像分层的好处:
共享资源 复用
有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
docker镜像层是只读的,容器层是可写的
当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
docker commit -m="描述信息" -a="作者" 容器id 镜像名:标签名
将本地镜像推送到私有库
1. docker pull registry 相当于本地有个私有的docker hub
2. docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
本机文件位置:容器文件位置
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
3. 容器上执行apt-get update apt-get install net-tools
4. commit 新镜像 docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
5. curl验证私服库上有什么镜像
curl -XGET http://192.168.0.15:5000/v2/_catalog
6. 将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
7. 修改配置文件使之支持http
{
"registry-mirrors": ["https://aa25jngu.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.111.162:5000"]
}
8. push推送到私服库
docker push 192.168.111.162:5000/zzyyubuntu:1.2
9. 验证私服库上有什么镜像
curl -XGET http://192.168.111.162:5000/v2/_catalog
docker容器数据卷
卷的目的: 数据永久化
docker的数据直接保存在宿主机中
--privileged=true centos7 selinux 安全性提高,扩大权限
公式:
docker run -it -v /宿主机目录:/容器内目录:rw ubuntu /bin/bash
继承
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
dockerfile:
是什么:用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
常用保留字:
FROM:· 基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
MAINTAINER:镜像维护者的姓名和邮箱地址
RUN· 容器构建时需要运行的命令
EXPOSE· 当前容器对外暴露出的端口
ENV· 用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
也可以在其它指令中直接使用这些环境变量,
WORKDIR· 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
USER· 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ADD· 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY· 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME· 容器数据卷,用于数据保存和持久化工作
CMD· 指定容器启动后的要干的事情
· Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT
· 也是用来指定一个容器启动时要运行的命令
· 类似于 CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
构建· docker build -t 新镜像名字:TAG .
运行· docker run -it 新镜像名字:TAG
docker网络:
查看网络· docker network ls
查看网络源数据· docker network inspect XXX网络名字
删除网络· docker network rm XXX网络名字
能干啥:
· 容器间的互联和通信以及端口映射
· 容器IP变动时候可以通过服务名直接网络通信而不受到影响
因为:· docker容器内部的ip是有可能会发生改变的
bridge:
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,
这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
docker容器内部的ip是有可能会发生改变的
host:
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
· docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增
http://宿主机IP:8080/
none:
在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo
需要我们自己为Docker容器添加网卡、配置IP等。
container:
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,
而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离
· docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
Docker-compose容器编排
Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,
写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器
下载:· https://docs.docker.com/compose/install/
安装:
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)"
-o /usr/local/bin/docker-compose
· docker-compose.yml
命令:
启动服务:docker-compose up -d 后台运行
停止删除容器、网络、卷、镜像:docker-compose down
进入容器实例内部:docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
展示当前docker-compose编排过的运行的所有容器:docker-compose ps
查看容器输出日志:docker-compose logs yml里面的服务id
检查配置,有问题才有输出:docker-compose config -q
Docker轻量级可视化工具Portainer
Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。