一、Docer基本概念
1. 什么是Docker?
Docker 是一个基于Go语言开发的开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
2. Docker的优势
- 交互和部署快速。
- 资源高效利用。对资源的消耗较低。
- 易扩展、兼容性强。
- 管理方便。
- 启动迅速(秒级)
3. Docker相关组件
- 客户端(dockerclient):一个用于交互/发送指令的接口。是命令行或遵循了docker api规则的客户端。
- 服务端(dockerserver):一般在宿主机后台运行的,主要用于处理相关请求。
- dockerd:主要作为服务端接受客户端的请求。
- containerd:为dockerd的子进程,提供gORPC接口响应来自dockerd的请求,主要管理runC镜像和容器环境。
- docker-proxy:是dockerd的子进程,主要负责容器端口映射时的网络映射配置。
- containerd-shim:是containerd的子进程,为runC容器提供支持,也是容器内的进程的根进程。
4. Docker与虚拟机相比
Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。Docker是在系统层面上实现虚拟化,传统方式是在硬件层面上实现虚拟化。
二、Docer基本命令
分类 | 命令 | 定义 | 参考 |
---|
镜像 | | | | | images | 显示镜像 | -a:列出本地所有 -p:只显示镜像ID | | search | 查找镜像 | docker search imagesName | | pull | 下载镜像 | docker pull imagesName | | commit | 保存镜像 | docker commit -m “提交的描述信息” -a “作者” 容器ID 要创建的目标镜像名称:[标签名]提交容器使之成为一个新的镜像 | | rmi | 删除镜像 | docker rmi imagesName | 容器 | | | | | diff | 列出容器内部的变化 | docker diff container | | export | 导出容器作为一个tar包 | docker export -o container | | port | 列出容器端口映射 | | | update | 更新容器的配置 | docker update 需要更新的配置 container | | run | 运行容器 | docker run [OPTIONS] IMAGE | | ps/container ls | 列出容器 | -a:列出所有 -l:列出最近创建 | | start | 启动容器 | docker start containerID或containerIDName | | restart | 重新启动容器 | docker restart containerID或containerIDName | | stop | 停止容器 | docker stop containerID或containerIDName | | kill | 强制停止容器 | docker kill containerID或containerIDName | | rm | 删除容器 | docker rm containerID或containerIDName | | logs | 查看容器日志 | -f : 查看实时日志 -t : 查看日志产生的日期 --since : 此参数指定了输出日志开始日期,即只输出指定日期之后的日志 --tail=10 : 查看最后的10条日志 | | inspect | 查看容器内部信息 | docker inspect containerID或containerIDName | | attach | 进到容器内 | docker attach containerID | | exec | 进到容器内 | docker exec containerIDC 进入方式 | | cp | 从容器内拷贝文件到宿主机. | docker cp 容器ID:容器内的文件路径 宿主机路径 | 网络 | Docker network | | | | create | 创建网stats络 | | | connect | 连接网络 | | | ls | 列出网络 | | | rm | 删除网络 | | | inspect | 列出网络内部详细信息 | | | disconnect | 断开网络 | | 卷积 | Docker volume | | | | create | 创建卷积 | | | ls | 列出卷积 | | | rm | 删除卷积 | | | prune | 清理无用的卷积 | | | inspect | 列出卷积内部详细信息 | |
三、Docer部分命令详解
1.create下容器运行模式相关参数
参数 | 说明 | 样式 |
---|
-d | 后台运行 | | -i,–interactive=true/false | 保持标准输入打开默认false | | –net= | 指定网络模式 | | -P(大) | 随机映射临时端口 | | -p(小) | 指定映射端口 | | -t,–tty= | 是否分配伪终端 | | -v | 挂载文件卷到容器,实现文件共享 | | -w | 指定工作目录 | | –net="" | 网络模式 | host:与主机共享网络命名空间;container:与容器共享命名空间;none:独立命名空间,且未配置;bridge:桥接模式,创建一个名为docker0的虚拟网桥。(默认) | –expose=[] | 指定容器端口暴露或端口范围 | | –detach-keys="" | 从attach模式退出的快捷键 | | –entrypoint=“” | 镜像入口命令设置 | 镜像命令如有。则覆盖 | -i,–interactive=true/false | 保持标准输入打开,默认false | | –ipc="" | 容器ipc命名空间 | | —isolation=“default” | 隔离机制 | | –log-driver= | 容器日志启动类型 | json-file:json, 默认的logdriver驱动;syslog:写入指定的syslog地址;journald:写入指定jounald;gelf:以gelf格式发送日志;fluentd:发送到指定的fluentd服务;awslogs:发送到指定的Amazon CloudWatch Logs;splunk:发送到指定的splunk服务;etwlogs:发送到Event Tracing for Windows, 仅支持windows平台;gcplogs:发送到Google Cloud日志系统;none:丢弃容器输出。 | –log-opt=[] | 传递给日志选项 | | –pid=host | 容器pid命名空间 | | –userns="" | 启用userns-remap 时配置用户命名空间的模式 | | –ust=host | 容器uts命名空间策略 | | –restart="" | 容器重启策略 | always:自动;no:不重启;on-failure[:max-retry]:非正常退出时最多重启次数;unless-stopped:退出时总是重启容器。 | –rm=true/false | 容器退出后是否自动删除,不能与-d连用 | | -t,–tty=false/true | 是否分配一个伪终端 | | –tmpfs=[] | 挂载临时文件到容器 | | –valume-driver="" | 挂载文件卷的驱动类型 | | –valume-from=[] | 从其他容器挂载卷 | |
注:命名空间:隔离相关资源,保证容器间互不影响。
- pid命名空间:进程编号。不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。
- ust命名空间:主机与域名。允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
- ipc命名空间:信号量、消息队列和共享内存。容器的进程间交互实际上还是 host 上具有相同 pid 命名空间中的进程间交互。
- network命名空间:网络设备、网络栈、端口等
- mount命名空间:挂载点,文件系统。mnt 命名空间允许不同命名空间的进程看到的文件结构不同。
- user命名空间:用户和用户组。
2.create下容器环境配置
参数 | 说明 | 样式 |
---|
–name=" " | 容器别名 | | -h,-- hostname=" " | 指定容器主机名 | | –link= [:alias] | 容器间相互链接 | | -e,–env= [] | 指定容器内环境变量 | | – add-host=[] | 主机和ip地址的映射关系 | | – device= [] | 主机物理设备与容器的映射关系 | | –dns - search= [] | dns搜索域 | | –dns -opt= [] | 自定义的DNS选项 | | –dns= [] | 自定义的DNS服务器 | | –env-file= [] | 从文件中读取环境变量到容器内 | | –ip=" " | 指定IPv4地址 | | –ip6=" " | 指定IPv6地址 | | –link-local-ip= [] : | 链接地址列表 | | –mac-address=" " | 容器Mac地址 | |
3.create下容器资源限制和安全保护的相关配置
参数 | 说明 | 样式 |
---|
–kernel-memory=" " | 限制容器使用内核的内存大小,单位可以是b、k、m或g | | -m,–memory=" " | 限制容器内应用使用的内存,单位可以是b、k、m或g | | –memory-reservation="" | 当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值 | | –memory-swap=“LIMIT” | 限制容器使用内存和交换区的总大小 | | –oom-kill-disable=true | false | 内存耗尽时是否杀死容器 | –cpu-shares=0 | 允许容器使用CPU资源的相对权重,默认一个容器能用满个核的 CPU | | –cap-add=[] | 增加容器的Linux指定安全能力 | | –cpu-quota=0 | 限制容器在CFS调度器下的CPU配额 | | –device-read-bps=[] | 挂载设备的读吞吐率(以bps为单位)限制 | | –device-write-bps=[] | 挂载设备的写吞吐率(以bps为单位)限制 | | –device-read-iops=[] | 挂载设备的读速率(以每秒io次数为单位)限制 | | –device-write-iops=[] | 挂载设备的写速率(以每秒i/o次数为单位)限制 | | –health-cmd=" " | 指定检查容器健康状态的命令 | | –health-interval=0s | 执行健康检查的间隔时间,单位可以为ms、s、 m或h | | –health-retries=int | 健康检查失败重试次数,超过则认为不健康 | | –health-start-period=0s | 容器启动后进行健康检查的等待时间,单位可以为ms、s、m或h | | –health-timeout=0s | 健康检查的执行超时,单位可以为ms、s、m或h | | –userns="" | 指定用户命名空间 | | –blkio-weight=10~1000 | 容器读写块设备的1/0性能权重,默认为0 | | –blkio-weight-device=[DEVICE_ NAME : WEIGHT] | 指定各个块设备的I/O性能权重 | | –cap-drop=[] | 移除容器的Linux指定安全能力 | | –cgroup-parent=" " | 容器cgroups 限制的创建路径 | | –cidfile="" | 指定容器的进程ID号写到文件 | | –cpu-period=0 | 限制容器在CFS调度器下的CPU占用时间片 | | –cpuset-cpus=" " | 限制容器能使用哪些CPU核心 | | –cpuset-mems=" " | NUMA架构下使用哪些核心的内存 | | –no-healthcheck=true | false | 是否禁用健康检查 | –init | 在容器中执行-一个init进程,来负责响应信号和处理僵尸状态子进程 | | –oom-score-adj="" | 调整容器的内存耗尽参数 | | –pids-limit="" | 限制容器的pid个数 | | –privileged-true | false | 是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐 | –read-only=true | false | 是否让容器内的文件系统只读 | –security-opt= [] | 指定一些安全参数,包括权限、安全能力、apparmor等 | | –stop-signal=SIGTERM | 指定停止容器的系统信号 | | – shm-size="" | /dev/shm的大小 | | –sig-proxy=true | false | 是否代理收到的信号给应用,默认为true,不能代理SIGCHLD、SIGSTOP和SIGKILL信号 | –memory-swappiness=“0~100” | 调整容器的内存交换区参数 | | -U,–user="" | 指定在容器内执行命令的用户信息 | | –ulimit=[] | 通过ulimit来限制最大文件数、最大进程数 | |
四、Docerfile命令详解
1. Dockerfile书写规范
- 精简镜像用途,尽可能的使每个镜像的用途比较集中单一。
- 选用合适的基础镜像。尽可能避免过大的父镜像。{应用镜像:slim;系统镜像:alpine、busybox或debian}
- 提供注释和维护信息。方便后面的扩展和他人的使用。
- 使用正确的版本号,尽可能的避免latest。避免环境不一致问题。
- 减少镜像层数,即精简Run命令。
- 使用(.dockertignore/cache),加快创建镜像速度。前者通过标记在执行docker build 时忽略的路径和文件,避免发送一些不必要文件;后者减少内容目录下的文件。
- 及时删除临时文件和缓存文件。
- 调整合理的指令顺序。将可变和不可变的命令相互分离。
- 减少外部源的干扰。当外部引用数据时,使用指定的持久地址并带有版本信息等。
-
2. Dockerfile基本命令说明
命令 | 定义 | 样式 |
---|
arg | 用于存储创建镜像过程中引用的外部变量。可通过- build-arg来赋值。创建镜像时存在,创建结束销毁 | | env | 指定环境变量,在被后续run时使用,在镜像启动成的容器中也会存在。 | | from | 指定用于创建镜像所使用的基础镜像 | | label | 为生成的镜像添加元数据标签信息。相关信息可以辅助过滤特定镜像 | | expose | 指定镜像内服务监听的端口 | | entrypoint | 指定镜像的默认入口命令,该入口命令在容器启动时会作为根命令执行,所有传入值均为该命令参数。但只能有一个entrypoint ,重复则最后一个有效。 | | vulume | 创建一个数据卷挂载点。 | | workdir | 为后续的run,cmd,entrypoint指定工作目录。 | | user | 运行容器时的用户名或uid。 | | onbuild | 产生子镜像时,自动执行的操作命令。 | | stopsignal | 指定所创建镜像启动的容器接收退出的信号值。 | | healthcheck | 配置健康检查 | | shell | 指定其他命使用shell时的默认shell类型 | | run | 创建镜像的过程中运行。 | | cmd | 容器启动时默认执行的命令 | | add | 从容器外部复制内容到镜像,可以是本地文件、url和tar。 | | copy | 从容器外部复制内容到镜像,只能是宿主机本地文件。 | |
如有问题,请回复区指正。谢谢
|