docker学习笔记

Docker

两个口号:

build、ship、run(创建、运输、运行)

Build once,Run anywhere(创建一次,到处运行)

初识Docker

docker前世今生

  1. 容器(container)的概念其实很早就提出来了
  2. 2004年Jeffery Dean在OSDI(Operating Systems Design and Implementation)会议发表了MapReduce
  3. 2004年 ~ 2007年,Google 内部大规模使用 Cgroups 等的OS虚拟化技术。
  4. 2006年,Google开源内部使用的process container技术,后续更名为Cgroup。
  5. 2010年,dotCloud公司成立,主要业务是做PaaS平台,主要创始人是Solomon Hykes 。
  6. 2013年3月份,dotCloud开源了全部代码,Docker 就是其中之一,代码开源之后,由于Docker的使用门槛低、轻量级、可移植、虚拟化、语言无关等特点,使docker大放异彩,包括亚马逊、谷歌、IBM、微软、Red Hat 甚至虚拟化巨头 VMware在内 都表示全力支持 docker 。
  7. 2013年10月,dotCloud因此也将公司名字改为Docker Inc.,开始专心研发docker ,并把自己的PaaS业务出售给cloudControl公司。
  8. 2013年,Docker和CoreOS如胶似漆,Google鼎力支持。
  9. 2014年底,CoreOS与docker决裂,google站在了CoreOS一边,Kuberneters项目正式发布。
  10. 2015年,OCP(Open Container Project)项目成立,成员包括Docker,CoreOS,Google,Microsoft,Amazon,华为 等
  11. 2015年6月,Docker带头成立OCI组织(no artifical technical barriers)。
  12. 2015年7月,Google联合linux基金会成立了CNCF组织。至今CNCF仍然是控制整个容器化生态的主要的组织。
  13. 2017年,CNCF接受Containerd、rkt项目 。
  14. 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…:你应该知道的所有

docker架构及工作流程

Containerd概述

名词解释

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环境下安装
  1. 下载二进制安装文件,下载地址为: https://download.docker.com/linux/static/stable/x86_64/

  2. 下载二进制安装脚本,下载地址:https://github.com/liumiaocn/easypack/tree/master/docker

  3. 将安装文件和安装脚本放到linux机器的某个路径下

  4. 修改安装脚本执行权限:chomd +x install-docker.sh

  5. 执行安装脚本:./install-docker.sh docker-xx.xx.x-ce.tgz

  6. 查看docker info

  7. 修改Docker Root Dir默认路径(可选,建议修改)docker Root 默认的路径为 /var/lib/docker

    1. 新建目录:mkdir -p /opt/docker/root

    2. 修改docker的daemon.json,添加内容:{“graph”:"/opt/docker/root"},daemon.json默认路径是/etc/docker/daemon.json

    3. 重启docker和daemon,是修改生效

      systemctl stop docker
      systemctl daemon-reload
      systemctl start docker
      
    4. 查看修改是否生效

      docker info |grep "Dokcer Root Dir"
      Docker Root Dir:/opt/docker/root
      
官网提供各种环境的安装方式

https://docs.docker.com/

docker三要素

Registry:镜像仓库,例如 dockerhub

Image:镜像

Container:容器

docker 命令

官网地址https://docs.docker.com/engine/reference/commandline

Commands:
CommandOptionsDescriptionExample
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归档文件导出到STDOUTdocker 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 loadLoad an image from a tar archive or STDINdocker load [OPTIONS]
-i
–input
指定导入的文件docker load -i cache.tar
docker load < cache.tar
-q
–quiet
精简输出信息
docker login登录到一个Docker镜像仓库,如果未指定镜像残酷地址,默认为Docker hubdocker 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 savedocker 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 tagdocker 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:
CommandOptionsDescriptionExample
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
optionsdescription
–config configSpecify configurations to expose to the service
指定service配置信息
–constraint listPlacement constraints
约束
–container-label listContainer labels
容器标签
–credential-spec credential-specCredential spec for managed service account (Windows only)
-d, --detachExit immediately instead of waiting for the service to converge
立即退出(后台运行)
–dns listSet custom DNS servers
指定DNS
–dns-option listSet DNS options
设置DNS选项
–dns-search listSet custom DNS search domains
设置DNS搜索域
–endpoint-mode stringEndpoint mode (vip or dnsrr) (default “vip”)
端点模式
–entrypoint commandOverwrite the default ENTRYPOINT of the image
重写ENTRYPOINT
-e, --env listSet environment variables
设置环境变量
–env-file listRead in a file of environment variables
从文件读取环境变量
–generic-resource listUser defined resources
–group listSet one or more supplementary user groups for the container
为容器设置1个或多个用户组
–health-cmd stringCommand to run to check health
健康检查命令
–health-interval durationTime between running the check (ms/s/m/h)
健康检查间隔时间(ms/s/m/h)
–health-retries intConsecutive failures needed to report unhealthy
健康检查失败重试次数
–health-start-period durationStart period for the container to initialize before counting retries towards unstable (ms
–health-timeout durationMaximum time to allow one check to run (ms
允许一次健康检查最长运行时间
–host listSet one or more custom host-to-IP mappings (host:ip)
设置一个或多个自定义主机到ip映射
–hostname stringContainer hostname
容器名称
–initUse an init inside each service container to forward signals and reap processes
在每个服务容器中使用init来转发信号并收集进程(涉及到容器内一号进程知识)
–isolation stringService container isolation mode
服务容器隔离模式
-l, --label listService labels
服务标签
–limit-cpu decimalLimit CPUs
CPU限制
–limit-memory bytesLimit Memory
内存限制
–log-driver stringLogging driver for service
服务的日志驱动
–log-opt listLogging driver options
日志驱动选项
–mode stringService mode (replicated or global) (default “replicated”)
服务模式(复制模式或全局模式)
–mount mountAttach a filesystem mount to the service
挂载
–name stringService name
服务名称
–network networkNetwork attachments
指定网络
–no-healthcheckDisable any container-specified HEALTHCHECK
不进行健康检查
–no-resolve-imageDo not query the registry to resolve image digest and supported platforms
不使用远程仓库的镜像(只使用本地镜像)
–placement-pref prefAdd a placement preference
添加偏好
-p, --publish portPublish a port as a node port
发布端口
-q, --quietSuppress progress output
精简输出
–read-onlyMount the container’s root filesystem as read only
将容器的根目录文件系统挂载为只读
–replicas uintNumber of tasks
同时运行的副本数
–reserve-cpu decimalReserve CPUs
为本服务需要预留的cpu资源
–reserve-memory bytesReserve Memory
备用内存资源
–restart-condition stringRestart when condition is met (“none”/“on-failure”|“any”) default "any"
满足条件时重新启动
–restart-delay durationDelay between restart attempts (ns/us/ms/s/m/h) default 5s
每次进行重启尝试时间隔的时间段
–restart-max-attempts uintMaximum number of restarts before giving up
重启最大次数
–restart-window durationWindow used to evaluate the restart policy (ns
–rollback-delay durationDelay between task rollbacks (ns/us/ms/s/m/h) default 0s
任务回滚的时间间隔
–rollback-failure-action stringAction on rollback failure (“pause”/“continue”) default “pause”
任务回滚失败后执行的操作
–rollback-max-failure-ratio floatFailure rate to tolerate during a rollback (default 0)
回滚期间可以容忍的失败率
–rollback-monitor durationDuration after each task rollback to monitor for failure (ns/us/ms/s/m/h) default 5s
每次任务回滚后监视失败的持续时间
–rollback-order stringRollback order (“start-first”/“stop-first”) default "stop-first"
回滚选项
–rollback-parallelism uintMaximum number of tasks rolled back simultaneously (0 to roll back all at once) (default 1)
同时回滚的最大任务数
–secret secretSpecify secrets to expose to the service
指定公开给服务的密钥
–stop-grace-period durationTime to wait before force killing a container (ns/us/ms/s/m/h) default 10s
在kill容器之前等待的时间 默认10s
–stop-signal stringSignal to stop the container
发出信号停止容器
-t, --ttyAllocate a pseudo-TTY
分配伪终端
–update-delay durationDelay between updates (ns
更新之间的延迟
–update-failure-action stringAction on update failure (“pause”|“continue”|“rollback”) default "pause"
更新失败后的操作
–update-max-failure-ratio floatFailure rate to tolerate during an update (default 0)
更新期间容忍的故障率
–update-monitor durationDuration after each task update to monitor for failure (ns
每次task更新监视失败的持续时间
–update-order stringUpdate order ("start-first"
更新选项
–update-parallelism uintMaximum number of tasks updated simultaneously (0 to update all at once) (default 1)
同时更新的最大任务数
-u, --user stringUsername or UID (format: <name|uid>[:<group|gid>])
–with-registry-authSend registry authentication details to swarm agents
将注册表验证详细信息发送给swarm代理
-w, --workdir stringWorking directory inside the container
指定容器内工作目录
docker create options

docker 命令详解(run篇)https://www.cnblogs.com/yfalcon/p/9044246.html

Docker命令详解(build篇)

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=0DOCKER_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容器的模板

镜像创建的三种方式
  1. 基于已有的镜像文件创建:docker commit testcontainer opt/test:v1
  2. 基于本地模板导入:cat testimg.tar|docker import - testimg
  3. 基于Dockerfile创建:docker build -t opt/test:v1 .

数据管理

数据卷

挂载一个主机目录作为数据卷,通过-v参数,格式为:

例:docker run -v /opt/tmp:/opt/tmp --name testcontainer testimg bash

数据卷容器
  1. 创建一个名为data的的容器,并把主机的/test/data挂载到/data目录

    docker run -itd -v /test/data:/data --name data centos:6

  2. 其他容器使用–volumes-form 命令去改在data数据卷

    docker run -itd --volumes-form data --name test1 centos:6;

    docker run -itd --volumes-form data --name test2 centos:6;

Docker教程小白实操入门(20)–如何删除数据卷

容器网络与端口映射

docker的5种网络模式:
  1. host:使用与宿主机一样的IP和端口(共用宿主机host)
  2. container:与已存在的容器共享一个Network Namespace
  3. none:没有网络模式,不创建网络,可以自己实现网络
  4. bridge:相当于VMware的NAT模式,容器使用独立的Network Namespace,并连接到docker虚拟网络上,通过docker0网桥以及iptables nat表配置与宿主机通信,在这个模式下,连到统一网桥的容器可以相互通信。
  5. overlay:容器跨节点数据传输和路由方案,所有的宿主机都加入同一个Overlay Network(类似局域网),实现跨主机通信。
端口映射

使用-p指定要映射的端口

支持的格式:

  1. IP:Hostport:Containerport
  2. IP::Containerport
  3. 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常见误区:

  1. 容器基础镜像没有做层合并,导致容器层过多,浪费存储空间

    Dockerfile中的每一条命令,在执行过程中都会生成为新镜像的一层,因此在命令写作过程中,应该将可以合并的命令合并到一行

  2. 容器中的业务镜像应该由非root用户拉起,指定USER

容器生命周期管理最佳实践

容器启动:

容器启动一般流程:

  1. docker-client --> docker-daemon
  2. docker-daemon --> docker image
  3. docker-daemon --> docker-containerd
  4. docker-containerd --> docker-containerd-shim
  5. docker-containerd-shim --> docker-runc
  6. docker-runc --> 容器内1号进程
容器内1号进程:

容器化环境中,往往直接运行应用程序,而缺少初始化系统(如systemd、sysinit等)。这可能需要应用程序来处理系统信号,接管子进程,进而导致容器无法停止、产生僵尸进程等问题。

对于linux来说,pid为1的进程,由着特殊的使命:

  1. 传递信号,确保子进程完全退出
  2. 等待子进程退出

如果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的区别

hello docker

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

【Docker】涨姿势,深入了解Dockerfile 中的 COPY 与 ADD 命令

docker build 命令后 . 号的意思

docker常用命令详解

16-Docker service更新,不中断业务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值