本篇文章给大家带来了关于docker核心技术之容器操作,以及dockerfile详解等等相关问题,希望对大家有帮助。
一. docker1. 简介基于linux内核的cgroup, namespace, 以及union fs等技术,对进程进行封装隔离,属于操作系统层面的虚拟技术,由于隔离的进程独立于宿主和其它的隔离进程,因此称为容器最初实现是基于lxc, 从0.7以后开始去除lxc, 转而使用自行开发的libcontainer, 从1.11开始, 则进一步演进为使用runc和containerddocker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得docker技术比虚拟机技术更为轻便、快捷2. docker优势更高效地利用系统资源更快速的启动时间一致的运行环境持续交付和部署更轻松的迁移更轻松地维护和扩展3. docker与虚拟机对比
二. docker安装参考文章安装: install docker engine on ubuntu | docker documentation
三. 容器操作启动:docker run:
-it 交互
-d 后台运行
-p 端口映射
-v 磁盘挂载
启动已终止容器docker start
停止容器docker stop
查看容器进程docker ps
查看容器细节docker inspect
拷贝文件到容器内docker cp file1 <containerid>:/file_to_path
docker退出容器,而不关闭容器: ctrl+q+pdocker退出容器,而关闭容器: exit查询docker所有镜像docker images
docker镜像仓库docker hub: https://hub.docker.com
创建私有镜像仓库: docker run -d -p 5000:5000 registry
四. dockerfile详解dockerfile一般分为四个部分:基础镜像信息、维护信息、镜像操作指令和容器启动时操作指令
常用命令from:指定基础镜像, 必须为第一个指令格式:
from <image>
from <image>:<tag>
from <image>@<digest>
示例:
from ubuntu
maintainer: 维护信息格式:
maintainer <name>
示例
maintainer ribbon
run:构建镜像时执行的命令格式:
shell执行:run <command>
exec执行:run [executable, param1, param2]
示例:
run apk update
run [/etc/execfile, arg1, arg2]
run apt-get update && apt-get install这两条命令永远用&&连接,否则apt-get update构建层被缓存,会导致新package无法安装
add: 将本地文件添加到容器中,tar等类型会自动解压,可以访问网络资源,类似于wget格式:
add <src> ... <dest>
示例:
add bin/amd64/httpserver /httpserver
copy: 功能类似于add,但是不会解压缩文件,不能访问网络资源在dockerfile中使用multi-stage: dockerfile 中的 multi-stage(多阶段构建) - sparkdev - 博客园
格式:
copy<src> ... <dest>
示例:
copybin/amd64/httpserver /httpserver
cmd: 构建容器后调用,也就是在容器启动时才进行调用格式:
cmd [executable,param1,param2] (执行可执行文件,优先)
cmd [param1,param2] (设置了entrypoint,则直接调用entrypoint添加参数)
cmd command param1 param2 (执行shell内部命令)
示例:
cmd [ethtool, --help]
cmd echo 1111
entrtpoint: 配置容器,使其可执行化。格式:
entrypoint [executable, param1, param2] (可执行文件, 优先)
entrypoint command param1 param2 (shell内部命令)
范例:
entrypoint /httpserver
cmd [-c]
labal: 用于为镜像添加源数据格式:
label <key>=<value> <key>=<value> <key>=<value> ...
范例:
label multi.label1=value1 multi.label2=value2 other=value3
env: 设置环境变量格式:
env <key> <value>
范例:
env my_service_port=80 udp_port=90
expose: 指定外界交互的端口格式:
expose <port> [<port>...]
示例:
expose 80
expose 80/tcp
expose 80 90
volume: 用于指定持久化目录格式:
volume [<path>]
范例:
volume [/data, /usr1/jenkins]
user:指定运行容器时的用户名或 uid,后续的 run 也会使用指定用户。格式:
user user
user user:group
user uid
user uid:gid
user user:gid
user uid:group
示例:
user www
arg: 用于指定传递给构建运行时的变量格式:
arg <name>[=<default value>]
示例:
arg build_user=ribbon
五. linux namespace详解 namesspace详解:linux namespace_frank_abagnale的博客-csdn博客 这篇文章比较详细的介绍,可以参考这篇
namespace的常用操作查看当前系统的namespace:lsns -t <type>
查看某进程的namespace:ls -la /proc/<pid>/ns/
查看某namespace运行命令nsenter -t <pid> -n
六. linux cgroups详解cgroups详解容器核心:cgroups - 简书 可以参考这篇文章来进行了解
模拟cgroups控制cpu资源通过模拟来更好的熟悉cgroups控制资源的效果, 首先创建cpudemo文件夹
执行top可以看到busyloop占用两个cpu资源
将进程添加进cgroup进程配置组
设置cpuquota
可以看到成功将占用200%cpu资源的降低成1%
模拟cgroups超过限定memory资源被oom kill/sys/fs/cgroup/memory目录下创建memorydemo文件夹
运行消耗内存程序, 使用watch查询内存使用情况
将进程配置进cgroups配置组
设置最大内存大小
等待程序被oom kill, dmesg可以看到杀死信息
备注:删除自主创建的cgroup文件夹, 需要使用cgroup-tools
七. union fsdocker前面使用的技术都是源于linux的技术并没有创新,而docker的创新正是文件系统。
1. 概念: 将不同目录挂载在同一个虚拟文件系统下的文件系统支持为每一个成员目录设定readonly、readwrite和without-able权限文件系统分层,对readonly权限的目录可以进行逻辑上的修改,这里的修改属于增量的,不影响readonly部分通常union fs的用途: 多个disk挂载到同一个目录下, 另一个是将readonly部分和writeable的目录联合在一起2. 图解union fs docker镜像的设计中,引入了层(layer)的概念,也就是说,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs(一个目录),这样应用a和应用b所在的容器共同引用相同的ubuntu操作系统层、golang环境层(作为只读层),而各自有各自应用程序层,和可写层。启动容器的时候通过unionfs把相关的层挂载到一个目录,作为容器的根文件系统。
3. 容器存储驱动
4. 模拟union fs更好理解效果
由于docker当前版本上使用的是overlayfs的存储驱动,所以我们就以overlay挂载方式来进行实验, overlayfs通过三个目录:lower目录、upper目录、以及work目录实现,其中lower目录可以是多个,work目录为工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为为merged目录。
执行如下命令:
mkdir upper lower merged workecho lower > lower/in_lower.txtecho from lower > lower/in_both.txtecho from upper > upper/in_both.txtecho upper > upper/in_upper.txtpath=$(pwd)mount -t overlay overlay -o lowerdir=${path}/lower,upperdir=${path}/upper,workdir=${path}/work ${path}/merged
可以看到使用overlay存储驱动文件挂载实现的效果。实验完成后恢复环境需要先umount merged目录后, 再将四个目录进行删除操作,先删除其他的可能会出现rm: cannot remove 'merged/': device or resource busy,导致merged目录删除不掉。
八. docker网络1. 安装工具centos系统:
$ yum install bridge-utils
ubuntu系统:
$ apt-get install bridge-utils
2. docker网络模式
查询docker内置的网络模式
docker run选择运行的网络模式 1)host模式:使用 --net=host 指定。 跟host公用一套net
2)none模式:使用 --net=none 指定。网络配置需要由自己来进行配置
3)bridge模式:使用 --net=bridge 指定,默认设置。
docker网络逻辑图 网桥和nat
4)container模式:使用 --net=container:name_or_id 指定。使用其他容器的网络配置
网络模式图大概如下图所示
3. 模拟docker起网桥的操作创建--net=none nginx
创建network namespace
建立网络namespace链接
检查当前已经创建的网桥设备
创建veth对
进行a网络配置
进行b网络配置 生成eth0网络设备在nginx docker中
给eth0配置ip 网关
nginx可以访问
配置nat, 让windows通过ip也可以访问
使用完删除指定nat规则
推荐学习:《docker视频教程》
以上就是最系统的掌握docker核心技术(总结分享)的详细内容。