【学习笔记】《每天5分钟玩转Docker容器技术》

【学习笔记】《每天5分钟玩转Docker容器技术》

文章目录

    • 【学习笔记】《每天5分钟玩转Docker容器技术》
      • 镜像下载加速
      • 容器和虚拟机
      • Docker架构
      • Dockerfile
      • RUN、CMD和ENTRYPOINT
      • Shell与Exec(推荐)
      • attach与exec
      • pause / unpause容器
      • 删除容器
      • 内存限额
      • CPU限额
    • 实现容器的底层技术
      • cgroup(Control Group)
      • namespace
        • Mount namespace
        • UTS namespace
        • IPC namespace
        • PID namespace
        • Network namespace
        • User namespace
      • Docker 网络
        • host 网络
        • bridge网络
        • bridge网络

镜像下载加速

  • 在daocloud.io免费注册一个用户
  • 登录后,单击顶部菜单“加速器”
  • copy命令在host中执行
#示例
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无须任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行

容器和虚拟机

容器由两部分组成:1.应用程序本身;2.依赖:比如应用程序需要的库或者其他软件容器在Host操作系统的用户空间中运行,与操作系统的其他进程隔离

传统的虚拟化技术,如VMWare,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖,还得安装整个操作系统

Q:为什么需要容器?容器到底解决的是什么问题?

A:容器使软件具备了超强的可移植能力

Docker架构

  • Docker 客户端:Client(最常用的就是docker命令)
  • Docker 服务器:Docker daemon
    • 以linux后台服务的方式运行
    • Docker daemon运行在Docker host上,负责创建、运行、监控容器,构建、存储镜像
    • 默认配置下,Docker daemon只能响应来自本地的Host的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开TCP监听(p30)
systemctl status docker.service
  • Docker 镜像:Image
    • 只读模板
  • Registry
    • docker pull 命令可以从Registry下载镜像
    • docker run 命令则是先下载镜像(如果本地没有),然后再启动容器
  • Docker 容器:Container
    • Docker容器就是Docker镜像的运行实例

对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段

【学习笔记】《每天5分钟玩转Docker容器技术》_第1张图片

镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器

base镜像有两层含义:1.不依赖其他镜像,从scratch构建;2.其他镜像可以以之为基础进行扩展

  • 所以能称作base镜像的通常都是各种linux发行版的docker镜像
  • base镜像只是在用户空间与发行版移植,kernel版本与发行版是不同的
  • 容器只能使用Host的kernel,并且不能修改
  • 对于base镜像而言,底层直接用Host的kernel,自己只需提供rootfs就行了

内核空间是kernel,linux刚启动时会加载bootfs文件系统,之后bootfs会被卸载掉。用户空间的文件系统是rootfs,包含我们熟悉的/dev、/proc、/bin等目录

不同linux发行版的区别主要就是rootfs

Dockerfile

  • Docker将build context中的所有文件发送给Docker Daemon

  • build context为镜像构建提供所需要的文件或目录,该目录下的所有文件和子目录都会被发送给Docker Daemon

  • 使用build context得小心

  • docker history会显示镜像的构建历史,也就是Dockerfile的执行过程

  • 用docker run -it启动镜像的一个容器可用来调试镜像

RUN、CMD和ENTRYPOINT

  • RUN:执行命令并创建新的镜像层,RUN经常用于安装软件包

  • CMD:设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令行参数替换,同下

  • ENTRYPOINT:配置容器启动时运行的命令,命令执行完后容器退出

  • 只要命令不结束,容器就不会退出。可用“while true;do sleep 1;done”类似命令

Shell与Exec(推荐)

#Shell格式
<instruction> <command>
#例子
RUN apt-get install python3
#Exec格式
<instruction> ["executable","param1","param2",...]
#例子
RUN ["apt-get","install","python3"]

p54:为镜像命名

#指定容器名字   --name "my_http_server"
docker run --name "my_http_server" -d httpd

ctrl + p然后 ctrl + q 退出容器

attach与exec

  • attach直接进入容器启动命令的终端,不会启动新的进程(需要长ID)
  • exec则是在容器中打开新的终端,并且可以启动新的进程
  • 如果想直接在终端中查看启动命令的输出,用attach;其他情况用exec

pause / unpause容器

pause,让容器暂停工作一段时间

暂停状态的容器不会占用CPU资源,直到通过docker unpause 恢复运行

删除容器

注意:docker rm是删除容器,而docker rmi是删除镜像

docker rm id1 id2
#批量删除所有已经退出的容器
docker rm -v $(docker ps -aq -f status=exited)

【学习笔记】《每天5分钟玩转Docker容器技术》_第2张图片

内存限额

#-m或-memory:设置内存限额;--memory-swap:设置内存+swap的使用限额
#允许该容器最多使用200M的内存和100M的swap。两个参数默认为-1,即对容器内存和swap的使用没有限制
docker run -m 200M --memory-swap=300M ubuntu
#如果在启动容器时只指定-m而不指定--memory-swap,那么--memory-swap默认为-m的两倍
#--vm 1:启动1个内存工作线程
#--vm-bytes 280M:每个线程分配280M内存
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

CPU限额

cpu share并不是CPU资源的绝对数量,而是一个相对的权重值

通过cpu share可以设置容器使用CPU的优先级

#A的cpu share是B的两倍,即当两个容器都需要CPU资源时,A时B的两倍
docker run --name "container_A" -c 1024 ubuntu docker run --name "container_B" -c 512 ubuntu

实现容器的底层技术

cgroup(Control Group)

linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额。在、sys/fs/cgroup中找到它

namespace

namespace实现了容器间资源的隔离。linux使用了6种namespace,分别对应6种资源:Mount、UTS、IPC、PID、Network和User

Mount namespace

Mount namespace让容器看上去拥有整个文件系统。容器有自己的 / 目录,可以执行mount和umount命令

UTS namespace

UTS namespace让容器有自己的hostname。默认容器的hostname是它的短ID,可以通过-h或–hostname参数设置

IPC namespace

IPC namespace让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与host和其他容器的IPC混在一起

PID namespace

容器在host中以进程的形式进行

ps axf

进程的PID不同于host中对应进程的PID,容器中的PID=1的进程当然也不是host的init进程

Network namespace

Network namespace让容器拥有自己独立的网卡、IP、路由等资源

User namespace

User namespace让容器能够管理自己的用户,host不能看到容器中的创建的用户

Docker 网络

Docker在安装时会自动在host上创建三个网络

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8b0d117bc3e9        bridge              bridge              local
141547838fdc        host                host                local
ccad61ac09be        none                null                local

host 网络

  • 连接到host网络的容器共享Docker host的网络栈,容器的网络配置与host完全一样。可以通过–network=host指定使用host网络。
  • 使用Docker host的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择host网络
  • 容器可以直接配置host网络

bridge网络

  • Docker安装时会创建一个命名为docker0的linux bridge。如果不指定–network,创建的容器默认都会挂到docker0上

的网络配置与host完全一样。可以通过–network=host指定使用host网络。

  • 使用Docker host的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择host网络
  • 容器可以直接配置host网络

bridge网络

  • Docker安装时会创建一个命名为docker0的linux bridge。如果不指定–network,创建的容器默认都会挂到docker0上

你可能感兴趣的:(linux,docker,linux)