Docker
两个口号:
build、ship、run(创建、运输、运行)
Build once,Run anywhere(创建一次,到处运行)
文章目录
初识Docker
docker前世今生
- 容器(container)的概念其实很早就提出来了
- 2004年Jeffery Dean在OSDI(Operating Systems Design and Implementation)会议发表了MapReduce
- 2004年 ~ 2007年,Google 内部大规模使用 Cgroups 等的OS虚拟化技术。
- 2006年,Google开源内部使用的process container技术,后续更名为Cgroup。
- 2010年,dotCloud公司成立,主要业务是做PaaS平台,主要创始人是Solomon Hykes 。
- 2013年3月份,dotCloud开源了全部代码,Docker 就是其中之一,代码开源之后,由于Docker的使用门槛低、轻量级、可移植、虚拟化、语言无关等特点,使docker大放异彩,包括亚马逊、谷歌、IBM、微软、Red Hat 甚至虚拟化巨头 VMware在内 都表示全力支持 docker 。
- 2013年10月,dotCloud因此也将公司名字改为Docker Inc.,开始专心研发docker ,并把自己的PaaS业务出售给cloudControl公司。
- 2013年,Docker和CoreOS如胶似漆,Google鼎力支持。
- 2014年底,CoreOS与docker决裂,google站在了CoreOS一边,Kuberneters项目正式发布。
- 2015年,OCP(Open Container Project)项目成立,成员包括Docker,CoreOS,Google,Microsoft,Amazon,华为 等
- 2015年6月,Docker带头成立OCI组织(no artifical technical barriers)。
- 2015年7月,Google联合linux基金会成立了CNCF组织。至今CNCF仍然是控制整个容器化生态的主要的组织。
- 2017年,CNCF接受Containerd、rkt项目 。
- 2019年,rkt被提出CNCF,Containerd成为实际运行时实现标准。
都9102年了,还没听过docker?5分钟带你了解docker的前世今生!
docker架构
docker
-
docker包含了docker-client,dockerd,containerd,docker-shim,runc
-
我们通常使用的docker命令,实际上是docker-client
-
docker-client 通过Rest 与docker daemon进行交互
dockerd
-
dockerd 本身是对容器相关操作的api的最上层封装,直接面向操作用户。
-
dockerd守护进程负责和docker-client交互,并管理docker镜像、容器、数据卷。
-
dockerd作为容器管理的守护进程,最初是继承在docker命令中的。
- 在docker1.8之前,docker守护进程的命令为 docker -d
- 在docker1.8之后,启动命令为 docker daemon,在这个阶段,守护进程看上去更像docker命令的一个模块
- 在docker1.11开始,守护进程被单独剥离出来成为一个独立的二进制程序 dockerd
containerd
- containerd是容器标准化的产物。将容器运行时及管理功能从docker deamon剥离出来进行标准化。
- containerd是dockerd和runc之间的一个中间交流组件,主要职责是 镜像管理(镜像、元信息等)、容器执行(调用最终运行时组件执行)。
- 向上为docker engine提供接口,使用UnixSocket通信,协议是grpc。
- 向下负责管理shim,管理容器的生命周期等
- containerd本身也是一个守护进程,实际的容器运行时是runC
docker-containerd-shim
-
负责管理单个容器,启动一个容器,就会启动一个shim进程, containerd管理所有容器
-
他们之间的关系为:docker-client -->dockerd–(gRPC)–>containerd–(exec)–>docker-shim-(exec)–>runC
runC
- OCI定义了容器运行时标准,runC就是docker按照这种标准的一种实现
- runc直接与容器所依赖的cgroups/kernel等进行交互,负责容器所需环境
dockerd Vs containerd Vs runC
- runC 是一种容器运行时,理论上通过runC就可以创建一个容器。
- containerd 负责管理runC,还完成了外围系统适配,驱动适配等工作
- dockerd 在负责管理containerd,还集成了安全、网络、卷管理、分布式状态 等功能
Docker、Containerd、RunC…:你应该知道的所有
名词解释
OCI :Open Container Initiative
容器运行时标准,由docker提出。
包括运行时标准(runtime spec )和容器镜像标准(image spec)
CRI :Container Runtime Interface
容器运行时接口,由K8s提出。
容器管理系统和网络插件,创建容器网络空间(network namespace)、把网络接口(interface)放到对应的网络空间、给网络接口分配IP
CRI-O
OCI-based implementation of Kubernetes Container Runtime Interface
CNI Container Network Interface
基于CRI的OCI-based的实现
RUNC
满足OCI容器运行时标准的最小的内核。
Continerd
libContainer
libContainer= RUNC
使用Docker构建容器环境
安装docker
linux环境下安装
-
下载二进制安装文件,下载地址为: https://download.docker.com/linux/static/stable/x86_64/
-
下载二进制安装脚本,下载地址:https://github.com/liumiaocn/easypack/tree/master/docker
-
将安装文件和安装脚本放到linux机器的某个路径下
-
修改安装脚本执行权限:chomd +x install-docker.sh
-
执行安装脚本:./install-docker.sh docker-xx.xx.x-ce.tgz
-
查看docker info
-
修改Docker Root Dir默认路径(可选,建议修改)docker Root 默认的路径为 /var/lib/docker
-
新建目录:mkdir -p /opt/docker/root
-
修改docker的daemon.json,添加内容:{“graph”:"/opt/docker/root"},daemon.json默认路径是/etc/docker/daemon.json
-
重启docker和daemon,是修改生效
systemctl stop docker systemctl daemon-reload systemctl start docker
-
查看修改是否生效
docker info |grep "Dokcer Root Dir" Docker Root Dir:/opt/docker/root
-
官网提供各种环境的安装方式
docker三要素
Registry:镜像仓库,例如 dockerhub
Image:镜像
Container:容器
docker 命令
官网地址https://docs.docker.com/engine/reference/commandline
Commands:
Command | Options | Description | Example |
---|---|---|---|
docker attach | 连接到正在运行种的容器 | docker attach CONTAINER | |
–sig-proxy | 设置是否代理接收到的信号量到容器进程 | docker attach CONTAINER --sig-proxy=false | |
docker build | 根据Dockerfile创建镜像 | docker build -t $image_name:latest . | |
docker commit | 从容器创建一个新的镜像 | ||
-a, –author | 提交镜像的作者 | ||
-c, –change | 将Dockerfile指令应用于创建的映像, 支持Dockerfile指令CMD,ENTRYPOINT,ENV,EXPOSE,LABEL,ONBUILD,USER,VOLUME,WORKDIE | docker commit --change=‘CMD [“executable”,“param1”]’ -c “EXPOSE 80” CONTAINER IMAGE:TAG | |
-m, –message | 提交信息 | docker commit -m “generate image” CONTAINER IMAGE:TAG | |
-p, –pause | 提交期间是否暂停容器,默认是true,默认情况,正在提交的容器及进程将再镜像提交时暂停,这减少了在创建提交过程中遇到数据损坏的可能性。 | ||
docker cp | 用于容器与主机之间进行数据拷贝 | docker cp /tmp/src.zip CONTAINER:/usr/local/bin/ | |
docker create | 创建一个新的容器但不启动它 | docker create --name ngx nginx:latest | |
docker diff | 检查容器里文件结构的更改 | docker diff CONTAINER | |
docker events | 获取docker服务器事件信息 | ||
-f, –filter | 根据条件筛选信息 | docker events -f “image”=“nginx” | |
–since | 指定事件开始时间 | docker events --since 10s | |
–until | 执行时间结束时间 | ||
docker exec | 在运行的容器中执行命令 | docker exec [OPTIONS] CONTAINER COMMAND [ARG…] | |
-d, –detach | 在后台执行命令 | ||
-i | 即使没有附加也保持STDIN打开 | docker exec -it CONTAINER bash | |
-t | 分配一个伪终端 | ||
docker export | 将容器文件系统作为一个tar归档文件导出到STDOUT | docker export [OPTIONS] CONTAINER | |
-o | 输出到文件 | docker export -o mysql.tar CONTAINER | |
docker history | 查看指定镜像的创建历史 | docker history [OPTIONS] IMAGE | |
–format | 自定义输出格式 | docker history IMAGE:v1 --format “table {{.ID}}\t{{.CreatedBy}}” --no-trunc | |
-H, –human | 以可读的格式打印镜像大小和日期,默认为true; | ||
–no-trunc | 显示完整的提交记录 | docker history --no-trunc IMAGE:TAG | |
-q | 仅列出提交记录ID | ||
docker images | 查看镜像列表 | docker images [OPTIONS] [REPOSITORY[:TAG]] | |
-a, –all | 显示全部镜像(默认隐藏中间镜像) | docker images -a cache | |
–digests | 显示镜像摘要信息 | docker images --digests cache | |
-f, –filter | 显示满足条件的镜像 | docker images --filter “key=value” 支持的key有dangling、label、before、since、reference | |
–format | 指定返回模板 | docker images --format “{{.ID}}” | |
–no-trunc | 现在完整的镜像信息 | ||
-q, –quiet | 只显示镜像id | ||
docker import | 从归档文件中创建镜像 | docker import [OPTIONS] file|URL|- [IMAGE:TAG] | |
-c, –change | 应用docker指令创建镜像 | docker import -c “EXPOSE 80” cache.tar cache:v1 | |
-m, –message | 提交时的说明文字 | ||
docker info | 显示 Docker 系统信息,包括镜像和容器数。。 | docker info | |
docker inspect | 显示镜像或者容器的元数据 | ||
-f, –format | 格式化输出 | docker inspect --format="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" CONTAINER | |
-s, –size | 如果inspect一个容器,显示容器总的文件大小 | ||
–type | |||
docker kill | 杀掉一个运行中的容器 | docker kill [OPTIONS] CONTAINER | |
-s, –signal | 向容器内发送一个信号,默认发送“KILL” | docker kill -s KILL CONTAINER | |
docker load | Load an image from a tar archive or STDIN | docker load [OPTIONS] | |
-i –input | 指定导入的文件 | docker load -i cache.tar docker load < cache.tar | |
-q –quiet | 精简输出信息 | ||
docker login | 登录到一个Docker镜像仓库,如果未指定镜像残酷地址,默认为Docker hub | docker login [OPTONS] [SERVER] | |
docker logout | 等处一个Docker镜像仓管库 | ||
docker logs | 获取容器日志 | docker logs [OPTIONS] CONTAINER | |
–details | |||
-f –follow | 跟踪日志输出 | docker logs -f CONTAINER | |
–since | 显示某个开始时间的所有日志 | docker logs --since 1s CONTAINER | |
–tail | 仅列出最新N条容器日志(显示最后N行日志) | docker logs --tail=100 CONTAINER | |
-t, –timestamp | 显示时间戳 | ||
–until | |||
docker pause | 暂停容器中所有的进程 | docker pause CONTAINER | |
docker port | 查看指定容器端口映射情况 | docker port CONTAINER | |
docker ps | 显示容器列表 | docker ps [OPTIONS] | |
-a –all | 显示全部容器(默认只显示运行中的容器) | docker ps -a | |
-f –filter | 按条件筛选 | ||
–format | 按模板输出 | ||
-l –latest | 显示最近创建的容器 | ||
-n –last | 显示最近创建的n个容器 | ||
–no-trunc | 显示完整的容器信息 | ||
-q –quiet | 只展示容器编号 | ||
-s –size | 展示容器文件大小 | ||
docker pull | 从镜像仓库中拉取或更新指定仓库 | docker pull [OPTIONS] NAME[:TAG|@DIGEST] | |
-a –all-tags | 拉取所有tagged镜像 | docker pull -a cache | |
–disable-content-trust | 是否停用内容信任(默认值为true) | ||
docker push | |||
–disable-content-trust | 是否停用内容信任(默认值为true) | ||
docker rename | 给容器重命名 | docker rename CONTAINER NEW_NAME | |
docker restart | 重新启动容器 | docker restart CONTAINER | |
docker rm | 删除容器 | docker rm [OPTIONS] CONTAINER | |
-f –force | 通过SIGKILL 信号强制删除一个运行中的容器 | docker rm -f CONTAINER | |
-l –link | 移除容器间的网络连接 | docker rm -l LINKNAME | |
-v –volumes | 删除与容器关联的卷 | docker rm -v CONTAINER | |
docker rmi | 删除1个或多个镜像 | docker rmi IMAGE | |
-f –force | 强制删除镜像 | ||
–no-prune | 不移除该镜像的过程镜像,默认移除 | ||
docker run | 创建一个新的容器并运行一个命令 | docker run [OPTIONS] IMAGE [COMMAND] [ARG…] | |
docker save | docker save [OPTIONS] IMAGE [IMAGE…] | ||
-o –output | 输出到文件 | docker save -o cache.tar cache:v1 docker save cahce:v1 > cache.tar | |
docker search | 从docker hub查找镜像 | ||
docker start | 启动一个或多个stopped容器 | docker start [OPTIONS] CONTAINER [CONTAINER…] | |
docker stats | 显示容器资源使用统计信息的实时流 | docker stats [OPTIONS] [CONTAINER…] | |
docker stop | 停止一个或多个运行中的容器 | docker stop CONTAINER | |
docker tag | docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] | ||
docker top | 查看容器内的进程信息 | docker top CONTAINER | |
docker unpause | 将暂停的容器进程回复 | docker unpause CONTAINER | |
docker update | 更新容器配置 | docker update [OPTIONS] CONTAINER | |
docker version | 查看docker版本信息 | docker version | |
docker wait | 阻塞运行直到容器停止,然后打印出它的退出代码 | docker wait CONTAINER |
Management Commands:
Command | Options | Description | Example |
---|---|---|---|
builder | |||
config | |||
container | |||
engine | |||
image | |||
network | |||
node | |||
plugin | |||
secret | |||
service | |||
stack | |||
swarm | |||
system | |||
trust | |||
volume |
常用的一些docker命令
镜像操作
- docker pull user/cache:v1 从用户Registry拉取镜像
- docker push user/cache:v1 将镜像上传到用户Registry
- docker images 查看本地镜像列表
- docker rmi cache:v1 移除镜像cache:v1
- docker commit -m “commit image” e344ba30e4a7 cache:v2 从容器创建一个镜像
- docker export -o /usr/cache.tar CONTAINER 将容器文件系统导出成tar文件
- docker import /usr/cache.tar cache:latest 将docker export导出的tar文件创建成一个镜像
- docker save -o /usr/cache2.tar IMAGE 将镜像导出成一个tar文件
- docker load < /usr/cache2.tar 将docker save导出的tar文件生成镜像
- docker build -t cache:latest 根据Dockerfile创建一个镜像
- docker history cache:latest 查看镜像历史
容器操作
- docker create --name cache cache:v1 创建容器cache,不启动
- docker start cache 启动cache容器(给一个容器创建一个进程空间,一个容器只能拥有一个进程空间)
- docker stop cache 停止cache容器
- docker restart cache 重启cache容器
- docker rm cache 移除cache容器
- docker run -itd --name cache -v /tmp:/tmp -p 8080:80 cache:v1 “CMD” 创建并启动cache容器,并执行CMD命令
- docker kill cache 强制结束cache容器
- docker inspect cache查看cache容器详细信息
- docker inspect –format ‘{{json .State.Health.Status}}’ CONTAINERD 通过docker指令得到指定容器id的健康状态
- docker attach --sig-proxy=false cache 进入cache容器,不使用信号代理
- docker exec -it cache bash 进入cache容器并执行bash命令
- docker cp /usr/f/ cache:/usr/local/ 将本机/usr/f/文件夹复制到容器/usr/local/目录下
- docker logs --tail -f cache --since 1s 查看容器日志
- docker exec -it $(docker ps -f name=NAME -q) bash
- docker kill $(docker ps|grep NAME|awk ‘{print $1}’)
- docker stats {CONTAINER_ID} 查看容器状态
- docker run -itd --entrypoint="" cache:latest bash 以bash命令启动一个容器
service操作
- docker swarm init
- docker node ls
- docker node inspect {NODE_ID} 查看node详情
- docker node update --label-add NewLabel=true {NODE_ID} 添加label,用于docker service create时指定–constraint参数
- docker service logs --tail -f cache --since 1s
- docker service update --image=cache:v2 cache 更新容器配置
network操作
- docker network ls
- docker network create -d overlay --subnet=172.20.1.1/16 网络名称
- docker network connect
- docker network inspect
- docker network rm
docker service create Options
options | description |
---|---|
–config config | Specify configurations to expose to the service 指定service配置信息 |
–constraint list | Placement constraints 约束 |
–container-label list | Container labels 容器标签 |
–credential-spec credential-spec | Credential spec for managed service account (Windows only) |
-d, --detach | Exit immediately instead of waiting for the service to converge 立即退出(后台运行) |
–dns list | Set custom DNS servers 指定DNS |
–dns-option list | Set DNS options 设置DNS选项 |
–dns-search list | Set custom DNS search domains 设置DNS搜索域 |
–endpoint-mode string | Endpoint mode (vip or dnsrr) (default “vip”) 端点模式 |
–entrypoint command | Overwrite the default ENTRYPOINT of the image 重写ENTRYPOINT |
-e, --env list | Set environment variables 设置环境变量 |
–env-file list | Read in a file of environment variables 从文件读取环境变量 |
–generic-resource list | User defined resources |
–group list | Set one or more supplementary user groups for the container 为容器设置1个或多个用户组 |
–health-cmd string | Command to run to check health 健康检查命令 |
–health-interval duration | Time between running the check (ms/s/m/h) 健康检查间隔时间(ms/s/m/h) |
–health-retries int | Consecutive failures needed to report unhealthy 健康检查失败重试次数 |
–health-start-period duration | Start period for the container to initialize before counting retries towards unstable (ms |
–health-timeout duration | Maximum time to allow one check to run (ms 允许一次健康检查最长运行时间 |
–host list | Set one or more custom host-to-IP mappings (host:ip) 设置一个或多个自定义主机到ip映射 |
–hostname string | Container hostname 容器名称 |
–init | Use an init inside each service container to forward signals and reap processes 在每个服务容器中使用init来转发信号并收集进程(涉及到容器内一号进程知识) |
–isolation string | Service container isolation mode 服务容器隔离模式 |
-l, --label list | Service labels 服务标签 |
–limit-cpu decimal | Limit CPUs CPU限制 |
–limit-memory bytes | Limit Memory 内存限制 |
–log-driver string | Logging driver for service 服务的日志驱动 |
–log-opt list | Logging driver options 日志驱动选项 |
–mode string | Service mode (replicated or global) (default “replicated”) 服务模式(复制模式或全局模式) |
–mount mount | Attach a filesystem mount to the service 挂载 |
–name string | Service name 服务名称 |
–network network | Network attachments 指定网络 |
–no-healthcheck | Disable any container-specified HEALTHCHECK 不进行健康检查 |
–no-resolve-image | Do not query the registry to resolve image digest and supported platforms 不使用远程仓库的镜像(只使用本地镜像) |
–placement-pref pref | Add a placement preference 添加偏好 |
-p, --publish port | Publish a port as a node port 发布端口 |
-q, --quiet | Suppress progress output 精简输出 |
–read-only | Mount the container’s root filesystem as read only 将容器的根目录文件系统挂载为只读 |
–replicas uint | Number of tasks 同时运行的副本数 |
–reserve-cpu decimal | Reserve CPUs 为本服务需要预留的cpu资源 |
–reserve-memory bytes | Reserve Memory 备用内存资源 |
–restart-condition string | Restart when condition is met (“none”/“on-failure”|“any”) default "any" 满足条件时重新启动 |
–restart-delay duration | Delay between restart attempts (ns/us/ms/s/m/h) default 5s 每次进行重启尝试时间隔的时间段 |
–restart-max-attempts uint | Maximum number of restarts before giving up 重启最大次数 |
–restart-window duration | Window used to evaluate the restart policy (ns |
–rollback-delay duration | Delay between task rollbacks (ns/us/ms/s/m/h) default 0s 任务回滚的时间间隔 |
–rollback-failure-action string | Action on rollback failure (“pause”/“continue”) default “pause” 任务回滚失败后执行的操作 |
–rollback-max-failure-ratio float | Failure rate to tolerate during a rollback (default 0) 回滚期间可以容忍的失败率 |
–rollback-monitor duration | Duration after each task rollback to monitor for failure (ns/us/ms/s/m/h) default 5s 每次任务回滚后监视失败的持续时间 |
–rollback-order string | Rollback order (“start-first”/“stop-first”) default "stop-first" 回滚选项 |
–rollback-parallelism uint | Maximum number of tasks rolled back simultaneously (0 to roll back all at once) (default 1) 同时回滚的最大任务数 |
–secret secret | Specify secrets to expose to the service 指定公开给服务的密钥 |
–stop-grace-period duration | Time to wait before force killing a container (ns/us/ms/s/m/h) default 10s 在kill容器之前等待的时间 默认10s |
–stop-signal string | Signal to stop the container 发出信号停止容器 |
-t, --tty | Allocate a pseudo-TTY 分配伪终端 |
–update-delay duration | Delay between updates (ns 更新之间的延迟 |
–update-failure-action string | Action on update failure (“pause”|“continue”|“rollback”) default "pause" 更新失败后的操作 |
–update-max-failure-ratio float | Failure rate to tolerate during an update (default 0) 更新期间容忍的故障率 |
–update-monitor duration | Duration after each task update to monitor for failure (ns 每次task更新监视失败的持续时间 |
–update-order string | Update order ("start-first" 更新选项 |
–update-parallelism uint | Maximum number of tasks updated simultaneously (0 to update all at once) (default 1) 同时更新的最大任务数 |
-u, --user string | Username or UID (format: <name|uid>[:<group|gid>]) |
–with-registry-auth | Send registry authentication details to swarm agents 将注册表验证详细信息发送给swarm代理 |
-w, --workdir string | Working directory inside the container 指定容器内工作目录 |
docker create options
docker 命令详解(run篇)https://www.cnblogs.com/yfalcon/p/9044246.html
docker build 参数详解 https://blog.csdn.net/taiyangdao/article/details/71718805
Docker 中的内容信任(content trust)
内容信任用于对镜像进行签名验证
Docker 默认是禁用内容信任的,可以通过设置环境变量DOCKER_CONTENT_TRUST=1来开启内容信任
Export DOCKER_CONTENT_TRUST=1
开启内容信任之后,等价于在执行docker push、build、create、pull、run命令时,添加–disable-content-trust=false
设置DOCKER_CONTENT_TRUST=1等价于–disable-content-trust=false
–disable-content-trust 是否禁用内容信任,默认值是true,表示禁用内容信任
例如:已经设置DOCKER_CONTENT_TRUST=1,然后要docker pull一个不受信任的镜像,就需要执行 docker pull --disable-content-trust IMAGE对该操作禁用内容信任,关闭验证
–disable-content-trust=false表示开启内容信任,不管是否设置DOCKER_CONTENT_TRUST都会对镜像进行签名验证。
– | DOCKER_CONTENT_TRUST=0 | DOCKER_CONTENT_TRUST=1 |
---|---|---|
空 | 禁用 | 启用 |
–disable-content-trust 默认值是true,等价于 –disable-content-trust=true | 禁用 | 禁用 |
–disable-content-trust=false | 启用 | 启用 |
Docker 生产环境之使用可信镜像 - Docker 中的内容信任(content trust)https://blog.csdn.net/kikajack/article/details/79600066
Dockerfile
Docker实践
build_image.sh
make tmp
cp resource tmp/
docker build -t xxx:latest .
docker tag xxx:latest xxx:v1
docker save xxx:latest xxx"v1 -o xxx.tar
cp xxx.tar /.../bin
Dockerfile
FROM algoimage
COPY tmp /usr/local/bin
ENV Path="$Path:/usr/bin/python3"
RUN groupadd xxxuser -g 969 && \
useradd xxxuser -u 969 -g xxxuser -s /usr/sbin/nologin -M && \
mkdir -m 750 /etc/xxxuser && \
mkdir -m 750 /home/xxxuser && \
chown -R xxxuser:xxxuser /etc/xxxuser && \
rm -f /etc/localtime && \
ln -sf /usr/localtime/localtime /etc/localtime
USER aimgmt
WORKDIR /usr/local/bin
ENTRYPOINT ["xxxx"]
HEALTHCHECK --interval=30s --timeout=10s --retries=30 CMD curl=fail http://.../service||exit1
docker service create
docker service create
--no-resolve-image // 只使用本地镜像
--detch // 后台运行
--quiet // 简化输出
--name TestService // 定义名称
--constraint "nodel.Role=manager" // 定义约束
--hostname={{.Mode.ID}}-{{.Task.ID}} // 指定hostname
--network Ov_Network // 指定网络
--mode global // 指定模式
--log-driver syslog // 日志:系统日志
--log-opt syslog-facility=local6 // 日志配置
--limit-memory 2g // 内存限制
--limit-cpu 1 // cpu限制
--mount type=bind,source=/var/test,destination=/var/test // 挂载
--env Service_Name=TestService // 服务名称
--env Search_Switch=true
--env mode=Fusxxx
--env ScenarIO=ENT
--health-interval 30s
--health-timeout 10s
--health-retries 30
--env Overlay_prefix=10.255.64.0/20
--env north_prefix=10.255.48.0/20
--mount type=bind,source=/var/xxx/localtime,destination=/var/localtime
test
启动一个docker容器
Dockerfile
- FROM 指定基础镜像
- MAINTAINER 指定维护者信息
- RUN 每一个RUN就是一层,所以尽量减少RUN的次数,在一个RUN里用&连接多个命令
- ADD
- WORKDIR
- VOLUME
- EXPOSE
- CMD
UFS UNION FILE SYSTEM
CNM Container NetWork Modl
CNI
仓库
镜像
用于创建Docker容器的模板
镜像创建的三种方式
- 基于已有的镜像文件创建:docker commit testcontainer opt/test:v1
- 基于本地模板导入:cat testimg.tar|docker import - testimg
- 基于Dockerfile创建:docker build -t opt/test:v1 .
数据管理
数据卷
挂载一个主机目录作为数据卷,通过-v参数,格式为:
例:docker run -v /opt/tmp:/opt/tmp --name testcontainer testimg bash
数据卷容器
-
创建一个名为data的的容器,并把主机的/test/data挂载到/data目录
docker run -itd -v /test/data:/data --name data centos:6
-
其他容器使用–volumes-form 命令去改在data数据卷
docker run -itd --volumes-form data --name test1 centos:6;
docker run -itd --volumes-form data --name test2 centos:6;
容器网络与端口映射
docker的5种网络模式:
- host:使用与宿主机一样的IP和端口(共用宿主机host)
- container:与已存在的容器共享一个Network Namespace
- none:没有网络模式,不创建网络,可以自己实现网络
- bridge:相当于VMware的NAT模式,容器使用独立的Network Namespace,并连接到docker虚拟网络上,通过docker0网桥以及iptables nat表配置与宿主机通信,在这个模式下,连到统一网桥的容器可以相互通信。
- overlay:容器跨节点数据传输和路由方案,所有的宿主机都加入同一个Overlay Network(类似局域网),实现跨主机通信。
端口映射
使用-p指定要映射的端口
支持的格式:
- IP:Hostport:Containerport
- IP::Containerport
- Hostport:Containerport
容器
以内核的cgroup和namespace技术为基础,为应用创建一个隔离的空间
Dockerfile:
FROM 格式 FROM :
MAINTAINER MAINTAINER
WORKDIR WORKDIR
COPY COPY 复制本地主机的到容器中的
RUN RUN [“executable”,“param1”,“param2”] 例如 RUN ["/bin/bash","-c",“echo hello”],每条RUN指令将再当前镜像基础上执行指定命令并提交为新的镜像,当镜像较长时可以使用 \ 来进行换行
ADD ADD 将文件从src复制到容器中的dest
EXPOSE EXPOSE 在容器运行中对外暴露端口
ENTRYPOINT ENTRYPOINT [“executable”,“param1”,“param2” --] 每个Dockerfile中只能有一个ENTRYPOINT ,当有多个时只有最后一个生效
CMD CMD的作用是为ENTERYPOINT提供参数
USER 指定容器进程使用的默认用户
Dockerfile常见误区:
-
容器基础镜像没有做层合并,导致容器层过多,浪费存储空间
Dockerfile中的每一条命令,在执行过程中都会生成为新镜像的一层,因此在命令写作过程中,应该将可以合并的命令合并到一行
-
容器中的业务镜像应该由非root用户拉起,指定USER
容器生命周期管理最佳实践
容器启动:
容器启动一般流程:
- docker-client --> docker-daemon
- docker-daemon --> docker image
- docker-daemon --> docker-containerd
- docker-containerd --> docker-containerd-shim
- docker-containerd-shim --> docker-runc
- docker-runc --> 容器内1号进程
容器内1号进程:
容器化环境中,往往直接运行应用程序,而缺少初始化系统(如systemd、sysinit等)。这可能需要应用程序来处理系统信号,接管子进程,进而导致容器无法停止、产生僵尸进程等问题。
对于linux来说,pid为1的进程,由着特殊的使命:
- 传递信号,确保子进程完全退出
- 等待子进程退出
如果pid为1的进程无法向其子进程传递信号,会导致容器向父进程发送SIGTERM信号之后,父进程等待子进程退出,此时如果父进程无法把信号传递给子进程,会导致容器无法正常退出。除非向父进程发送SGNKILL信号,使其强行退出
比如一个进程(P1)拉起了另一个进程(P2),P1为P2的父进程
当P1收到SIGNTERM信号之后,不会向子进程传递这个信号,会导致P2进程无法退出。
在传统linux系统下,父进程先于子进程终止,当父进程退出时,系统会让init进程(1号进程)接管子进程,成为其子进程。
而在容器环境下,这样的行为会让子进程失去父进程,所以父进程不会退出
init应用程序另一个任务是接管子进程,确保其正常退出。但是一般应用程序不会考虑接管子进程的功能,当应用程序在容器中运行时,其子进程创建的子进程就有可能成为僵尸进程。
当前CSP自研了c-init,解决了上述两个问题:向子进程代理发送信号和接管子进程。默认情况下,c-init会向子进程的进程组发送器收到的信号,另外c-init会接收失去父进程的子进程,确保其能正常退出。
容器资源限制(内存&CPU)
容器内存还在那用的资源需要考虑如下几个方面:
- 容器自身占用的内存,包括容器文件系统、公共进程的内存占用
- 业务进程内存空间需求
- 业务进程调用的子进程内存空间需求
- 业务进程读写文件时的需要建立的文件缓存
容器CPU占用的资源需要考虑如下几个方面:
- 容器自身占用的CPU,包括容器pid为1的进程CPU占用
- 业务i进程CPU需求
- 业务进程调用的子进程CPU需求
容器健康检查
docker-daemon会自动监控容器内pid为1的进程
Docker提供了原生健康检查的参数:
- –interval=<间隔>:两个健康检查的间隔,默认为30秒
- –timeout=<间隔>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认30秒
- –retries=<次数>:当连续失败指定次数后,则将容器状态视为unhealthy,默认3次
- –start-period=<间隔>:应用的启动的初始化时间,在启动过程中的健康检查失效不会计入,默认0秒
容器HOOKS
HOOKS能是容器感知器生命周期内的事件并且当响应的生命周期钩子被调用时运行在处理程序中实现的代码。
- PostStart 在容器创建后立即执行,不保证在ENTRYPOINT之前运行
- PreStop 在容器种植之前立即被调用。它是阻塞的,意味着它是同步的,所以它必须在删除容器的调用发出之前完成。
钩子的实现:
- Exec - 在容器的cgroups和命名空间内执行一个特定的命令,比如 pre-stop.sh,该命令消耗的资源被计入容器。
- HTTP - 对容器上的特点的端点执行HTTP请求。
容器存储最佳实践
容器可写层
镜像存储
- Device mapper
- OverlayFS:包含upperdir和lowerdir分别对应docker的容器层和镜像层
Overlay和Device mapper的区别:
Overlay是文件级存储,Device mapper是块级存储,当文件特别大而修改的内容很小,Overlay不管修改的内容小大都会复制整个文件,对大文件进行修改显示要比小文件要消耗更多的时间,而块级无论是大文件还是小文件都值复制需要修改的块,并不是整个文件,在这种场景下,显然device mapper要快一些。因为块级的是直接访问逻辑盘,适合IO密集的场景,而对于程序内部复杂,大并发但少IO的场景,Overlay的性能相对要强一些。
本地存储
- HOST-PATH:HostPath卷将主机节点的文件系统中的文件或目录挂载到容器中。该功能为某些应用程序提供了一个强大的解决方法。比如将主机的目录挂载到容器中,供程序日志使用
- 逻辑卷动态按需分配
容器网络
参考kubernets官网关于容器网络的介绍
容器安全
主机安全隔离
- Docker主机必须进行加固
- 使用最新的Docker
- 只允许可信用户加入Docker用户组
- 主机提供对Docker守护进程审计功能
- 主机提供对Docker关键文件和目录的审计功能
Docker守护进程安全配置
- 限制容器间的网络通信
- 不要直接配置Docker守护进程暴露于外部网络
- 禁止使用不带证书的Docker Registry
- 禁用用户空间代理
- 开启守护进程日志
构建安全容器镜像
- 容器禁止以root用户运行
- 扫描和重建镜像,以加入安全补丁
- Dockerfile中禁止使用ADD指令
- 不在Dockerfile中存储机密信息
- 开启Content trust
容器运行时保护
- 限制运行容器的Linux内核Capability能力
- 不使用特权容器
- 不在容器上挂载主机系统敏感目录
- 容器中只运行需要的软件
- 只打开容器需要的端口
- 不要共享主机网络命名空间
COPY
上下文:Docker镜像构建上下文(Context)https://blog.csdn.net/weixin_30905133/article/details/97178700?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-2-97178700.nonecase&utm_term=dockerfile的上下文&spm=1000.2123.3001.4430
Dockerfile
save load vs import export
ADD vs COPY
CMD vs ENTERPOINT
应用流程
go环境docker
进阶-swarm-k8s
资料
docker save和docker export的区别
docker copy?
todo :
containerd简介:https://www.cnblogs.com/sparkdev/p/9063042.html
docker命令详解(run)篇:https://www.cnblogs.com/yfalcon/p/9044246.html
Dockerfile构建镜像并理解上下文:https://blog.csdn.net/runner668/article/details/80955710