1.Docker容器学习之新生入门必备基础知识

发布于 2022年 04月 02日 07:02

腾讯服务器

88 / 年

  • 上海/北京/广州...
  • 2核 2G 4M
  • Linux/Windows
新年大优惠

腾讯服务器

425 / 年

  • 上海/北京/广州...
  • 4核 8G 10M
  • Linux/Windows
年度最便宜

腾讯服务器

1249 / 年

  • 上海/北京/广州...
  • 8核 16G 14M
  • Linux/Windows
点击查看

0x00 Docker 快速入门

1.基础介绍

描述:Docker [ˈdɑ:kə(r)] 是一个基于Go语言开发实现的遵循Apache 2.0协议开源项目,目标是实现轻量级的操作系统虚拟化解决方案; ,诞生于2013年初最初发起者是dotCloud公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,后续由于docker的发展后来也改名为Docker Inc,它是仅次于OpenStack最受欢迎的云计算开源项目;Docker 从 17.03版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)

Docker 的目标是"Build,Ship and Run Any App,Anywhere",通过对应用组件的封装\[Packaging]-> 分发\[Distribution] -> 部署\[Deployment] -> 运行\[Runtime]等生命周期进行管理,达到应用级别"一次封装,到处运行"; 例如:它可以独立运行一个Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器;

Apache 2.0 授权 Github 项目开源 : github.com/docker/dock…


Dcoker与OpenStack的区别?

  • 部署难度:Docker非常简单;OpenStack组件多部署繁琐
  • 启动速度:秒级;分钟级
  • 执行性能:和物理机几乎是一致;VM会占用一些资源
  • 镜像体积:镜像是MB级别的;虚拟机镜像是GB级别的
  • 管理效率:关键简单;组件相互依赖且管理复杂
  • 隔离性:隔离性高;彻底隔离
  • 可管理性:单进程;完整的系统管理
  • 网络连接:比较弱;借助于Neutron可以灵活组件各类网络架构

完整的Docker由以下几部分构成:

  • (1) 守护进程(Daemon):Docker守护进程(dockerd)侦听Docker API请求并管理Docker对象,可以与客户端在同一个节点或者运行在不同节点上,如图像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。
  • (2) REST API: 主要与Docker Daemon进行交互,比如Docker Cli或者直接调用REST API;
  • (3) 客户端(Docker Client): 它是与Docker交互的主要方式通过命令行接口(CLI)客户端(docker命令),客户机将命令通过REST API发送给守护进程dockerd并执行其命令;(注意:一个客户端可以与多个守护进程通信)
  • (4) Register Repository 镜像仓库: Docker注册表存储Docker镜像,可以采用Docker Hub是公共注册仓库,或者采用企业内部自建的Harbor私有仓库;
  • (5) Image 镜像: 映像是一个只读模板,带有创建Docker容器的指令。映像通常基于另一个映像,还需要进行一些额外的定制,你可以通过Docker Hub公共镜像仓库进行拉取对应的系统或者应用镜像;
  • (6) Container 容器: 容器是映像的可运行实例。您可以使用Docker API或CLI创建、启动、停止、移动或删除容器。您可以将一个容器连接到一个或多个网络,将存储附加到它,甚至根据它的当前状态创建一个新映像。
  • (7) Services : Docker引擎支持集群模式服务允许您跨多个Docker守护进程(一个群的每个成员都是一个Docker守护进程)扩展管理容器,服务允许您定义所需的状态,例如在任何给定时间必须可用的服务副本的数量。默认情况下,服务在所有工作节点之间进行负载平衡。对于使用者来说Docker服务看起来是一个单独的应用程序;


Linux容器基础之LXC技术介绍:

描述:Docker引擎的基础是Linux容器(Linux Containers,LXC)技术,容器有效的将各个操作系统管理的资源划分到孤立的组,以便更好的在孤立的组之间平衡有冲突的资源使用需求。 容器可以在核心CPU本地运行指令,并不需要任何专门的解释机制;最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具;用户操作容器就像操作一个轻量级虚拟机那样简单,也可以将容器比作为一种沙盒(Sandbox);


Docker 优势:

  • 1.更高效的利用系统资源:Docker容器不需要进行硬件虚拟以及运行完整操作系统等额外开销(资源远远小于虚拟机);
  • 2.更快速的启动时间:直接运行于宿主内核无需启动完整的操作系统,可以做到秒级、甚至毫秒级的启动时间;
  • 3.更快速的交付和部署:实现持续集成(Continuous Integration)、持续交付、自动部署(Continuous Delivery/Deployment),大量节约开发,测试,部署的时间;
  • 4.更高效的资源利用:不需要额外的虚拟化管理程序VMM以及Hypervisor的支持;
  • 5.更容易学习、迁移和扩展:一致的运行环境Docker 可以在很多平台上运行无论是物理机、虚拟机、公有云、私有云
  • 6.更简单的更新管理:使用Dockerfile只需要小小的配置修改,可以快速创建和删除容器,Docker hub 提供镜像平台方便共享镜像;
  • 7.基于 Docker 的 CI 持续集成和 CD 持续支付
  • 8.基于 Kubernetes, Docker Swarm 的集群弹性扩容和缩容

什么是虚拟化技术? 虚拟化技术是一个通用的概念,在不同的领域有不同的理解;在计算机领域一般指的是计算机虚拟化(Computer Virtualization)或者说是服务器虚拟化;虚拟化的核心是对资源进行抽象和管理,目标往往是为了在同一个主机上运行多个系统或者应用,从而提高系统资源的利用率,同时带来降低成本,方便管理和容错和容灾等好处;

  • 硬件虚拟化:真正意义上的基于它的技术不多见,少数网卡中的单根多IO虚拟化等技术;
  • 软件虚拟化(Virtualization)
    • 1.应用虚拟化
    • 2.平台虚拟化:细分
      • 2.1 完全虚拟化
      • 2.2 硬件辅助虚拟化:利用硬件CPU辅助支持虚拟化技术Intel-VT和AND-V处理铭感指令来实现完全虚拟化的功能;
      • 2.3 部分虚拟化:只对部分硬件资源进行虚拟化,客户端系统需要进行修改;
      • 2.4 准虚拟化(Paravirtualization):如xen
      • 2.5 操作系统级虚拟化:内核通过创建多个虚拟化的操作系统实例内核和库来隔离不同的进程,dokcer以及其他容器都在这个范畴之内;

传统虚拟机的比较:


传统虚拟化方式与Docker虚拟化方式

  • 传统虚拟化方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层,然后在该系统上运行业务所需程序;
  • Docker虚拟化方式是在宿主系统层面上实现虚拟化,直接复用本地主机的操作系统与内核,容器内没有自己的内核,所以容器内的应用进程实际运行于宿主机内核,因此更加轻量级;

  • 虚拟机是为提供系统环境而生,容器是为了提供应用环境而生的;


物理机-虚拟机-Docker容器容易理解的对比

  • 一栋楼一户人家,独立地基独立花园(别墅)
  • 一栋楼包含多套房,一套房一户人家,共享地基、共享花园、独立卫生间、厨房和宽度(二室一厅)
  • 一套房隔成多个小隔间,每个小隔间住一位租户(胶囊式公寓)

Docker 应用场景

  • 使用docker容器开发、测试、部署服务:自动化测试和持续集成、发布;
  • 在服务型环境中部署与扩展Webapp以及调整数据库或其他应用;
  • 统一、优化和加速本地开发和构建流程;创建隔离的运行环境,测试环境
  • 构建多用户的平台即服务(PaaS)基础设施
  • 提供软件即服务(SaaS)的应用程序
  • 高性能、超大规模的宿主机部署,web应用的自动化打包和发布

2.Docker 架构

描述:Docker对使用者来讲是一个C/S模式(使用客户机-服务器)的架构而Docker的后端是一个非常松耦合的架构,模块各司其职并有机组合支撑Docker的运行。

具体流程:

  • (1) 用户使用Docker客户机与Docker守护进程通信,后者负责构建、运行和分发Docker容器等繁重的工作。
  • (2) Docker Daemon作为Docker架构中的主体部分,首先提供Server的功能使其可以接受Docker Client的请求;
  • (3) Docker客户端和守护进程可以运行在同一个系统上,或者您可以将一个Docker客户端连接到一个远程Docker守护进程。
  • (4) Docker客户机和守护进程之间通过UNIX套接字或网络接口使用REST API进行通信


Docker 内部具体实现:

  • Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
  • Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;
  • 当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;
  • 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。
  • libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。


3.Docker 资源隔离

Docker 本质是宿主机上的一个进程,docker通过namespace实现资源隔离以及轻量级虚拟化容器服务,通过cgroup实现了资源限制,通过写时复制技术(Copy-on-write)实现了高效的文件操作;

Docker通过由内核namespace提供实现的隔离,namespace的API包括clone(),sents()以及unshare()还有在/proc下的部分文件

  • 文件系统隔离:每个容器都有自己的 root 文件系统
  • 进程隔离:每个容器都运行在自己的进程环境中
  • 网络隔离:容器间的虚拟网络接口和 IP 地址都是分开的
  • 资源隔离和分组:使用 cgroups 将 CPU 和内存之类的资源独立分配给每个 Docker 容器

即namespace的六项隔离(内核实现 namespace 资源隔离内容 - 系统调用参数 )如下标所示:

名称宏定义隔离的内容
IPCCLONE_NEWIPCSystem V IPC, POSIX message queues (since Linux 2.6.19) 信号量消息队列和共享内存
NETWORKCLONE_NEWNETnetwork device interfaces, IPv4 and IPv6 protocol stacks, IP routing tables, firewall rules, the /proc/net and /sys/class/net directory trees, sockets, etc (since Linux 2.6.24) 网络设备,网络栈,端口等
MOUNTCLONE_NEWNSMount points (since Linux 2.4.19) 挂载点(文件系统)
PIDCLONE_NEWPIDProcess IDs (since Linux 2.6.24) 进程编号
UserCLONE_NEWUSERUser and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) 用户和用户组(3.8后内核支持)
UTSCLONE_NEWUTSHostname and NIS domain name (since Linux 2.6.19) 主机名与域名(自Linux 2.6.19)
CgroupCLONE_NEWCGROUPCgroup root directory (since Linux 4.6) Cgroup根目录(自Linux 4.6)

cgroup的特点与功能:

  • cgroup的API以一个伪文件系统来实现的,用户态的程序通过文件操作实现cgroup的组织管理;
  • cgroup的组织管理操作单元可以细粒度级别,另外用户可以创建和销毁cgroup,从而实现资源再分配和利用;
  • 所有资源管理的功能都以子吸引的方式实现接口统一,子任务创建之初与其父任务处于同一cgroup的控制组;
  • cgroup四大功能:资源限制(资源总额进行限制),优先级分配(分配CPU时间片数量以及磁盘IO带宽大小),资源统计(CPU时长/内存用量),任务控制(执行挂起/恢复等操作);

4.Docker 容器文件系统

描述:从下面的图片可以看见出以下几点:

  • Docker 镜像代表了容器的文件系统里的内容,是容器的基础,镜像一般是通过 Dockerfile 生成的;
  • Docker 的镜像是分层的,所有的镜像(除了基础镜像)都是在之前镜像的基础上加上自己这层的内容生成的;
  • Docker 中每一层镜像的元数据都是存在 json 文件中的,除了静态的文件系统之外,还会包含动态的数据;
  • Docker 镜像生产容器后会在此基础之上加入挂载点到安装Docker宿主机文件系统之中,并提供一个读写层(Read-Write Layer),所以容器进程的所有操作都在读写层进行;

总结:

  • Docker通过为Linux容器技术提供更简洁的使用和管理方案、更高效的版本控制,Docker 让容器技术一下子变得灵活易用,随着云计算(Cloud Computing)的发展,它在Virtualization中的地位越来越重要.
  • 四大核心概念:镜像 [image] / 容器 [Container] / 仓库 [Repository] / Dockerfile

参考书籍:Docker技术入门与实战


0x01 Docker 安装

1. Linux

系统环境:docker最低支持centos7且在64位平台上,内核版本在3.10以上 官方安装文档:docs.docker.com/install/lin… 镜像开源安装站点:mirrors.tuna.tsinghua.edu.cn/help/docker…

  • Docker Engine改为Docker CE(社区版): 它包含了CLI客户端、后台进程/服务以及API。用户像以前以同样的方式获取。
  • Docker Data Center改为Docker EE(企业版): 在Docker三个定价层增加了额外的支付产品和支持。

官方一键安装脚本 补充时间:[2020年4月22日 11:00:59]

一键安装Docker-ce以及Docker-compose:

##[docker]
#国外
curl -fsSL https://get.docker.com | bash -s docker
#国内
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -fsSL https://get.docker.com -o get-docker.sh && chmod +x get-docker.sh && ./get-docker.sh
#测试安装结果
docker-info

##[docker-compose]
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
#测试安装结果
docker-compose version

Yum安装Docker / Docker-compose

#删除历史docker版本
yum remove -y  docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#下载docker repo包
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
#或者手动设置官方源
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

#下载安装docker-ce社区版本
#Docker Community Edition (CE)对于希望开始使用Docker并尝试基于容器的应用程序的开发人员和小型团队来说非常理想。
#Docker CE有三种更新通道:稳定通道、测试通道和夜间通道:
sudo yum install -y docker-ce docker-compose  #手动官方源执行 docker-ce-cli containerd.io

# 更新docker-ce
yum -y upgrade docker-ce

#按照版本号从高到低排序
[root@zabbix log]$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64            3:18.09.5-3.el7                    docker-ce-stable
docker-ce.x86_64            3:18.09.5-3.el7                    @docker-ce-stable  #当前使用版本

# Docker 是一个 C/S 架构的服务,安装好 docker 之后需要启动 docker 软件后才能使用 docker 命令;
systemctl start/status docker  # 启动docker-ce

# 查看docker启动状态
docker version
Client:
 Version:           18.09.5
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        e8ff056
 Built:             Thu Apr 11 04:43:34 2019
 OS/Arch:           linux/amd64

# 移出docker-ce
$ sudo yum remove docker-ce
#主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有图像、容器和卷:
$ sudo rm -rf /var/lib/docker

#测试 docker 下载 hello-world 或者 alpine
docker pull hello-world
docker images
docker run hello-world

docker-compose的安装补充时间:[2020年1月22日 10:54:55]

  • 方式1:安装 docker-compose: [需要安装大于或者等于1.6版本的 Docker ]

docs.docker.com/compose/ -> 选择InstallCompose

#安装docker-compose
#切换为root权限下载并安装docker-compose ( current stable release (v1.25.0)  )
$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose  
$ chmod +x /usr/local/bin/docker-compose    #添加执行权限
  • 方式2:安装Docker-Compose
#在centos7中使用python-pip安装docker-compose
$yum install -y python3
$pip3 install pip --upgrade
[root@vm-1575613390 ~]# pip --version
pip 19.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

$pip3 install docker-compose

补充说明:[2020年4月22日 10:58:21]

  • 目前最新版本的 docker 默认优先采用 overlay2 的存储驱动,对于已支持该驱动的 Linux 发行版,不需要任何进行任何额外的配置

其它操作系统参考: Ubuntu的安装:docs.docker.com/install/lin…


2. Windows

Windows 下安装 Docker:www.docker.com/products/do… 使用CPU虚拟化检测工具(LeoMoon CPU-V)检测环境:


window 7 Step 1.下载 docker Tool box 进行全安装FULL Installation

Step 2.安装成功后会在桌面出现virtual VM,docker,Kitematic(Alpha)等等

  • Kitematic(Alpha):是一个Docker GUi工具.用户可能运行命令(docker run hello-world)在Docker客户端启动一个容器,在Kitematic中能观察结果. 用GitHub账号登陆.就可以看到自己创建的镜像,或是在GitHub上down下来的镜像.

Oracle VM VirtualBox:虚拟机管理器,可以创建虚拟机;也可对当前正在运行的虚拟机进行管理.

Step 3.点击 Docker Quickstart Terminal进行下载boot2docker.iso 运气好不报错的话可以说明安装完成

Step 4.而我win7启动 Docker Quickstart Terminal报错,解决方法也是很简单

下载后放在C:\Users\WeiyiGeek.docker\machine\cache\boot2docker.iso即可

解决上述问题后,验证安装:

docker pull hello-world
docker images
docker run hello-world


Step 5.安装后的docker是可以通过ssh连接的,boot2docker用户和密码 ```bash docker tcuser ssh root command:sudo -i (docker用户下执行) ``` ![WeiyiGeek.dockerssh](https://cdn.jsdelivr.net/gh/WeiyiGeek/blogimage/2019/20190505215933.png)

window 10 描述: 现在在Windows 10 Pro, Enterprise, and Education等系统版本中可以进行下载安装Docker Desktop for Windows下载地址-当前版本2.3.0.3,它可以进行使用的界面来操作查看docker中的容器,以此来简化了学习成本; Step 1.设置docker进行安装,加入到PATH之中 Step 2.安装成功,关闭窗口 Step 3.安装后利用powershell进行查看docker版本

> docker version
> docker run hello-world

Step 4.查看docker pull下来得镜像,并且运行

> docker images  #查看镜像
> docker run -it hello-world


3. MAC


4. 加速器配置

方式1:使用DaoCloud加速器 简介:DaoCloud 加速器 是广受欢迎的 Docker 工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。 DaoCloud官网: www.daocloud.io/mirror#acce…


方式2:使用阿里云容器镜像服务加速器 推荐安装1.10.0以上版本的Docker客户端,您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

#方法1.常规加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xlx9erfu.mirror.aliyuncs.com"]
}
EOF

#方法2:对于 1.12 以前的版本, dockerd 换成 docker daemon 
#注:编辑docker.service文件
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --registry-mirrors=https://xlx9erfu.mirror.aliyuncs.com

#方法3:Docker-CE17.12版本以及之后(CentOS7.0)
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --registry-mirror=https://xlx9erfu.mirror.aliyuncs.com

#通用启动
sudo systemctl daemon-reload   #重载守护
sudo systemctl restart docker

#检查加速器是否生效
sudo ps -ef | grep dockerd
root 5346 1 0 19:03 ? 00:00:00 /usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com

补充一键配置:

# Docker中国 mirror
# export REGISTRY_MIRROR="https://registry.docker-cn.com"
# 腾讯云 docker hub mirror
# export REGISTRY_MIRROR="https://mirror.ccs.tencentyun.com"
# 华为云镜像
# export REGISTRY_MIRROR="https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com"
# DaoCloud 镜像
# export REGISTRY_MIRROR="http://f1361db2.m.daocloud.io"
# 阿里云 docker hub mirror
# export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
export REGISTRY_MIRROR=https://xlx9erfu.mirror.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/set_mirror.sh | sh -s ${REGISTRY_MIRROR}

WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少。

博主 Blog 镜像站点(友链交换请邮我哟):

更多原创学习笔记文章请关注 WeiyiGeek 公众账号

点击我关注

推荐文章