每天5分钟玩转Docker 学习总结(一)

Docker 学习总结(一)

《每天5分钟玩转Docker容器技术》总结

加速docker daocloud.io

  • curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://a1152ee2.m.daocloud.io
  • systemctl restart docker.service 重启docker deamon服务

第二篇 容器技术

第二章 容器核心知识概述

2.1 什么是容器?

  • 虚拟机需要安装整个操作系统
  • 容器由应用程序本身和相关依赖组成,与操作系统的其他进程隔离

2.2 为什么需要容器?

  • 开发:Build Once、 Run Anywhere
  • 运维:Configure、 Run Anything

2.3 容器时如何工作的?

1、Docker 架构

  • Docker 客户端:client
  • Docker 服务端:Docker daemon
  • Docker 镜像:Image
  • Registry
  • Docker 容器:Container

Docker 采用的是Client/Server架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个Host上,客户端也可以通过socket或REST API与远端的服务器通信。

2、Docker 客户端

  • 最常用的Docker客户端是Docker命令,通过命令可以方便地在Host上构建和运行容器。
  • 除Docker命令行工具,用户也可通过REST API与服务器通信

3、Docker服务器

  • Docker daemon是服务器组件,以Linux后台服务的方式运行
  • Docker daemon运行在Docker daemon上,负责创建、运行、监控容器,构建、存储镜像。
  • 默认情况Docker daemon只能相应来自本地Host的客户端请求。如需允许远程客户端请求,需要在配置文件中打开TCP监听。

4、Docker镜像

  • 看做只读模板,通过它创建Docker容器

5、Docker容器

  • Docker镜像运行的实例

6、Registry 镜像仓库

第三章 docker镜像

3.1镜像的内部结构

  • base镜像:不依赖其他镜像,从scratch构建,其他镜像可以以之为基础进行扩展
    • Linux操作系统由内核空间和用户空间组成。镜像只提供用户空间的文件系统rootfs就够了
      • 注:base镜像只是在用户空间与发行版一致,kernel版本与发行版不同
      • 容器只能使用Host的kernel,且不能修改
      • 只有当需要修改时才复制一份数据,称为”copy-on-write”

3.2 构建镜像

  • docker commit 命令
    • 运行容器、修改容器、将容器保存为新的镜像
  • Dockerfile构建文件: docker build
    • 从base镜像运行一个容器
    • 执行一条指令,对容器做修改
    • 执行类似docker commit的操作,生成一个新的镜像层
    • Docker再基于刚刚提交的镜像运行一个新容器
    • 重复2-4步,直到Dockerfile中所有指令执行完毕

3.3 RUN vs CMD vs ENTRYPOINT

  • RUN:执行命令并创建新的镜像层,RUN经常用于安装软件包
  • CMD:设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令参数替换
  • ENTRYPOINT:容器启动时运行的命令

最佳实践:

  • 使用RUN指令安装应用和软件包,构建镜像
  • 如果Docker镜像的用途是运行应用程序或服务,比如运行一个MySQL,应该优先使用Exec格式的ENTRYPOINT。CMD可以为ENTRYPOINT提供额外的默认参数,同时可利用docker run命令行替换默认参数
  • 如果想为容器设置默认的启动命令,可使用CMD指令。用户可在docker run 命令行中替换此默认命令。

小结:

  • 命令:
    • images:显示镜像列表
    • history:显示镜像构建历史
    • commit:从容器创建新镜像
    • build:从Dockerfile构建镜像\tag\pull
    • push:将镜像上传到registry
    • rmi:删除镜像
    • search:搜索Docker Hub中的镜像

第四章 Docker 容器

4.1 运行容器

指定容器启动时执行命令的三种方式

  • CMD命令
  • ENTRYPOINT指令
  • 在docker run 命令中指定

让容器长期运行

  • -d:以后台方式启动容器

进入容器的两种方式

  • docker attach:可以attach到容器启动命令的终端
  • docker exec:docker exec -it ID bash以交互方式执行
  • attach VS exec:
    • attach直接进入容器启动命令的终端,不会启动新的进程
    • exec则是在终端中查看命令的输出,并且可以启动新的进程
    • 如果想在终端中查看启动命令的输出,用attach,其他用exec

运行容器的最佳实践

  • 容器分为两类:服务类容器和工具类容器
    • 服务类容器以daemon的形式运行,对外提供服务,如web、数据库等。如需排查错误,通过exex -it 进入容器
    • 工具类容器通常提供一个临时的工作环境,通常以run -it方式运行

4.2 stop/start/restart 容器

  • docker stop:向该进程发送一个SIGTERM信号,如果想快速停止容器docker kill发送SIGKILL信号
  • docker start可以保留容器第一次启动的所有参数
  • docker run -d --restart=always nginx
    • 无论容器因何种原因退出(包括正常退出),都立即重启

4.3 pause/unpause

  • 暂停、恢复容器

4.4 删除容器

  • docker rm -v ${docker ps -aq} 删除所有已经退出的容器

4.6 资源限制

  • 内存限制: -m 设置内存的使用限额
  • CPU限额: -c 默认为1024,不是资源的数量,而是权重值(优先级)

Block IO 带宽限制

  • –blkio-weight 与CPU类似设置的是相对权重值

4.7 实现容器的底层技术

4.7.1 cgroup 实现资源限额

  • Linux通过cgroup可以设置进程使用CPU、内存和IO资源的限额。之前的–cpu-shares、-m、–device-write-bps实际就是在配置cgroup
  • /sys/fs/cgroup/cpu/docker目录中,Linux会为每个容器创建一个cgroup目录

4.7.2 namespaces 资源隔离

  • namespaces管理着host中全局唯一的资源,并让每个容器都觉得只有自己在使用它。实现了容器间资源的隔离。

Linux使用了6种namespaces

  • Mount namespace:让容器看上去拥有整个文件系统
  • UTS namespace:让容器拥有自己的hostname
  • IPC namespace:让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与host和其他容器的IPC混在一起
  • PID namespace:容器以进程的形式运行,使容器拥有自己独立的一套PID
  • Network namespace:让容器又有自己独立的网卡、IP、路由等资源
  • User namespace 让容器能够管理自己的用户,host不能看到容器中创建的用户

4.8 容器命令小结:

  • create:创建容器
  • pause\unpause:暂停、恢复容器
  • stop:发送SIGTERM停止容器
  • kill:发送SIGKILL快速停止容器
  • start\restart:启动、重启容器
  • attach:attach到容器启动进程的终端
  • exec:在容器中启动新进程,通常使用-it参数
  • logs:显示容器启动进程的控制台输出,用-f持续打印
  • rmc:从磁盘中删除容器

你可能感兴趣的:(docker)