20230702作业-docker1

1.Linux容器技术实现基础:Namespaces、CGroups、容器运行时简介及对比

namespace的类型及功能

namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:
MNT Namespace(mount) 提供磁盘挂载点和文件系统的隔离能力
  每个容器都要有独立的根文件系统有 独立的用户空间,以实现在容器里面 启动服务并且使用容器的运行环境, 即一个宿主机是ubuntu的服务器,可 以在里面启动一个centos运行环境的 容器并且在容器里面启动一个Nginx 服务,此Nginx运行时使用的运行环 境就是centos系统目录的运行环境, 即在容器里面是不能直接访问宿主机 的文件系统。
 宿主机是使用了chroot技术把容器锁 定到一个指定的运行目录里面并作为 容器的根运行环境。
IPC Namespace(Inter-Process Communication) 提供进程间通信的隔离能力
 IPC namespce隔离进程间通信资源(同一个IPC namespace的进程可通过系 统调用实现进程间通信,但是不能通过系统调用与其它 namespace的进程直接通信)
UTS Namespace(UNIX Timesharing System) 提供主机名隔离能力
 UTS namespace(UNIX Timesharing System包含了运行内核的名称、版本、底层体系结 构类型等信息)用于系统标识, 其中包含了hostname 和域名 domainname ,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主 机系统和其上的其他容器。
PID Namespace(Process Identification) 提供进程隔离能力
 Linux系统中,有一个PID为1的进 程(init/systemd)是其他所有进程 的父进程,那么在每个容器内也 要有一个父进程来管理其下属的 子进程,那么多个容器的进程通过PID namespace进程隔离(比如 PID编号重复、器内的主进程生成 与回收子进程等)。
Net Namespace(network) 提供网络隔离能力
 每一个容器都类似于虚拟机一 样有自己的网卡、监听端口、 TCP/IP协议栈等,docker使用 network namespace启动一 个vethX接口,这样你的容器 将拥有它自己的桥接ip地址, 通常是docker0,而docker0 实质就是Linux的虚拟网桥,网 桥是在OSI七层模型的数据链 路层的网络设备,通过mac地 址对网络进行划分,并且在不 同网络直接传递数据。
User Namespace(user) 提供用户隔离能力
 各个容器内可能会出现重名的用户 和用户组名称,或重复的用户UID 或者GID,那么怎么隔离各个容器 内的用户空间呢?  User Namespace允许在各个宿 主机的各个容器空间内创建相同的 用户名以及相同的用户UID和 GID,只是会把用户的作用范围限 制在每个容器内,即A容器和B容 器可以有相同的用户名称和ID的账 户,但是此用户的有效范围仅是当 前容器内,不能访问另外一个容器 内的文件系统,即相互隔离、互不影响

cgroups作用是什么

Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能,Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽 等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。

常见的runtime

 runc:目前Docker和containerd默认的runtime,基于go语言开发,遵循OCI规范。

 crun: redhat推出的运行时,基于c语言开发,集成在podman内部,遵循OCI规范。

 gVisor:google推出的运行时,基于go语言开发,遵循OCI规范。

2.OCI、CRI、cri-dockerd、CRI-O、低级容器运行时与高级容器运行时

OCI(Open Container Initiative):2015年Google、docker、Redhat、IBM共同成立,定义了运行标准和镜像 标准。

CRI(Container Runtime Interface):2016 年12月Kubernetes 发布 CRI(容器运行时接口), 可以支持rkt等不同的运行时。

CRI-O:由redhat发起并开源,用于替代docker成为kubernetes的运行时,2016年开发,2019年4月8号进入 CNCF孵化。

什么是高级别运行时和低级别运行时

High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、 停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
Low-Level :接受高级别运行时的指令,按照响应的指令运行容器,因此低级别运行时是真正运行容器的地方,例如runc。

3.现代应用容器技术Docker的特性、架构与工作机制、存储引擎介绍

Docker 的优势

快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上

高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性 能和效率

节省开支: 提高服务器利用率,降低IT支出

简化配置: 将运行环境打包保存至容器,使用时直接启动即可

环境统一: 将开发,测试,生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问 题

快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将 应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台 更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横 向扩展,符合开发中高内聚,低耦合的要求,减少不同服务之间的相互影响

Docker 的缺点

多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和 繁琐 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费

Docker的架构

Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机, node节点

Docker 服务端(Server): Docker守护进程,运行docker容器

Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API

Docker 镜像(Images): 镜像可以理解为创建实例使用的只读模板,本质上就是一些程序文件的集合 Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库 harbor

Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中 的程序启动后生成的进程

Docker 存储简介

UnionFS是文件级的存储驱动,实现方式是把位于不同位置的目录或文件合并 mount到同一个目的目录中,简单来说 就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统,这种文件系统可以一层一层地叠加修改文件,无论底 下有多少层都是只读的,只有最上层的文件系统是可写的。

Docker容器的分层容器的数据分层目录
LowerDir: image 镜像层,即镜像本身,只读
UpperDir: 容器的上层,可读写 ,容器变化的数据存放在此处
MergedDir: 容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和 upperdir 合并完成 后给容器使用,最终呈现给用户的统一视图
WorkDir: 容器在宿主机的工作目录,挂载后内容会被清空,且在使用过程中其内容用户不可见

docker的存储引擎

Overlay:UnionFS文件系统,Linux内核3.18后支持。
overlay2: Overlay的升级版,到目前为止,所有Linux发行版推荐使用的存储类型。
devicemapper:是CentOS和RHEL的早期使用的存储驱动程序,因为之前的内核版本较低不支持overlay2,但是当前较新版本的CentOS和RHEL现在已经支持overlay2,因此推荐使overlay2。
ZFS(Sun-2005)/btrfs(Oracle-2007):目前没有广泛使用。

centos 7.2及之前的版本默认使用devicemapper存储引擎,不能直接使用overlay存储引擎,除非新添加一快磁盘作为docker的数据盘,并在格式化的时候指定格式化参数-n ftype=1,7.3后修复此问题。

vfs: 用于测试环境,适用于无法使用copy-on-write文件系统的情况。 此存储驱动程序的性能很差,通常不建议用于

生产。
AUFS(Another UnionFS): 是早期的一种UnionFS文件系统的实现,是Docker 18.06及更早版本使用的存储引擎。

4.安装Docker、对Docker进行镜像加速及使用systemd进行资源限制等参数优化;

熟练使用各种方式安装docker

Ubuntu 14.04/16.04(使用 apt-get 进行安装)

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

CentOS 7(使用 yum 进行安装)

如果你之前安装过 docker,请先删掉
# sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start

# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将[docker-ce-test]下方的enabled=0修改为enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

安装校验

root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
 Version:      17.03.0-ce
 API version:  1.26
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.0-ce
 API version:  1.26 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   3a232c8
 Built:        Tue Feb 28 07:52:04 2017
 OS/Arch:      linux/amd64
 Experimental: false

Docker优化配置

[root@ubuntu2004 ~]#vim /etc/docker/daemon.json
{
 "graph": "/var/lib/docker",
 "storage-driver": "overlay2",
 "insecure-registries": ["harbor.magedu.com","harbor.myserver.com","172.31.7.105"],
 "registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"],
 "exec-opts": ["native.cgroupdriver=systemd"],
 "live-restore": false,
 "log-opts": {
 "max-file": "5",
 "max-size": "100m"
 }
 }
 [root@ubuntu2004 ~]#systemctl daemon-reload ;systemctl restart docker.service
范例:Docker 实现代理功能
[root@ubuntu2204 ~]#mkdir -p /etc/systemd/system/docker.service.d
 [root@ubuntu2204 ~]#cat >> /etc/systemd/system/docker.service.d/http-proxy.conf 
<<EOF
 [Service]
 Environment="HTTP_PROXY=http://${PROXY_SERVER_IP}:${PROXY_PORT}/"
 Environment="HTTPS_PROXY=http://${PROXY_SERVER_IP}:${PROXY_PORT}/"
 Environment="NO_PROXY=127.0.0.0/8,172.17.0.0/16,10.0.0.0/24,10.244.0.0/16,192.16
 8.0.0/16,wang.org,cluster.local"
 EOF
 [root@ubuntu2204 ~]#systemctl daemon-reload && systemctl restart docker.service

5.Docker的管理命令精讲、以及常用的使用案例

常用查询命令

# docker version #显示docker client和docker server的版本信息

# docker ps #列出容器,加上-a是列出包含为运行的所有容器

# docker info #显示系统信息

# docker inspect 容器ID  #显示docker对象(镜像、网络、容器等)的详细信息

# docker stats #显示容器资源的实时统计信息

# docker diff 8ddf4ce923ef #对比容器和镜像有差异的文件或目录

# docker events #获取dockerd的实时事件,创建删除容器等操作

# docker logs -f nginx-container-test1 #持续查看容器标准输出和错误输出的日志

# docker port 81b344cff55d #列出一个容器端口映射关系

# docker search nginx #搜索镜像

镜像管理命令
# docker images #查看本地所有镜像
Usage: docker image COMMAND
Commands:
build #从Docker文件构建新的镜像
history #查询镜像的构建历史
# docker history centos:7.9.2009 #查看的镜像的构建历史
import #从本地或远程的压缩包等导入镜像,可以指定导入后的镜像名称
inspect #显示一个或多个镜像的详细信息
load #从一个tar包或标准输入导入镜像
# docker load -i nginx-1.20.2.tar.gz #从一个tar包或标准输入导入镜像
ls #列出本地的所有镜像
prune #删除本地未使用的镜像
pull #从镜像仓库下载镜像到本地
push #从本地上传镜像到镜像仓库
rmi #删除一个或者多个本地镜像
# docker rmi -f 53ec353d8dc4 90a4cd9dfe4c #删除一个或多个镜像
save #保存一个或者多个镜像到一个tar包(默认保存到当前终端的标准输出)
tag #对镜像打一个新的标签
# docker tag nginx:1.20.2 harbor.magedu.net/myserver/nginx:1.20.2 #为镜像添加一个新的tag
# docker build #从dockerfile 构建镜像
# docker commit -a "jack jack@magedu.com" -m "v2" --change="EXPOSE 80 443" 8ddf4ce923ef new-nginx-image #将容器
提交为一个本地镜像
容器管理命令
# docker cp 源 目的 #从容器和宿主机相互拷贝文件或目录
# docker create -it --name test1 nginx:1.20.2 #创建一个新的容器且创建后的容器处于退出状态
# docker events #获取dockerd的实时事件,创建删除容器等操作
# docker exec -it 40e6379cf371 sh/bash #推进入到容器执行命令操作,推荐使用此方式
# docker export 8ddf4ce923ef -o new-nginx-image.tar.gz #将容器的文件系统导出为一个本地压缩包,非镜像格式
# docker import new-nginx-image.tar.gz #导入export导出的压缩包,导入后的镜像不完整,不能用于创建容器
# docker kill $(docker ps -a -q) 强制关闭所有运行中的容器
# docker login #登录镜像仓库
# docker logout #登出镜像仓库
# docker pause 81b344cff55d #暂停一个或者多个容器
# docker port 81b344cff55d #列出一个容器端口映射关系
# docker pull nginx:1.20.2 #从镜像仓库下载镜像
# docker push nginx:1.20.2 #从本地上传镜像到镜像仓库(需要登录认证)
# docker rename awesome_cerf nginx-container1 #重命名容器
# docker restart ID/容器名称 #重启容器
# docker rm -f 11445b3a84d3 #强制删除运行中的容器
# docker rm -f `docker ps -aq -f status=exited` #批量删除已退出容器
# docker rm -f $(docker ps -a -q) #批量删除所有容器
# docker run -it docker.io/centos bash #创建并进入容器,ctrl+p+q退出容器不注销
# docker run -it --name nginx-test1 nginx:1.20.2 #自定义容器名称
# docker run -p 80:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-container-test1 nginx:1.20.2 #创建容器并指定多端口 映射
# docker run -d -p 80:80 --name nginx-container-test1 nginx:1.20.2 #后台运行容器
# docker run -it --rm --name nginx-delete-test nginx:1.20.2 bash #单次运行容器
# docker run -it -d centos:7.9.2009 /usr/bin/tail -f '/etc/hosts' #创建容器的时候传递命令及参数
# docker save 50fe74b50e0d > nginx-1.20.2.tar.gz #保存一个或多个镜像到一个压缩文件(默认是标准输出)
# docker start ID/容器名称 #启动一个或多个容器
# docker stop ID/容器名称 #停止一个或多个容器
# docker unpause 81b344cff55d #取消一个或多个容器的暂停
# docker update 容器 --cpus 2 #更新容器配置信息,比如资源限制的值
# docker wait #一直等待容器退出并显示容器的退出状态码

6.docker数据卷及数据卷容器

 数据卷的使用场景:

  • 容器数据持久化(mysql数据、nginx日志等类型)
  • 静态web页面挂载
  • 应用配置文件挂载
  • 多容器间的目录或文件共享

数据卷的特点及使用:

  • 数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
  • 在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
  • 数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
  • 在容器里面的写入数据不会影响到镜像本身

把容器目录挂载到宿主机目录

# docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -p 80:80 nginx:1.20.2
# docker run -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 81:80 nginx:1.20.2

把容器目录挂载到卷

# docker volume create nginx-data
# docker volume ls
DRIVER VOLUME NAME
local nginx-data
# docker run -it -d -p 80:80 -v nginx-data:/data nginx:1.20.2
多卷挂载

# mkdir /data/nginx/conf -p
# docker cp web1:/etc/nginx/nginx.conf /data/nginx/conf/
# docker run -d --name web3 -v /data/testapp:/usr/share/nginx/html/testapp -v
/data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -p 83:80 nginx:1.20.2

#创建容器并指定多端口 映射

# docker run -p 80:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-container-test1 nginx:1.20.2 

使用docker创建MySQL容器并把数据保存到宿主机的/data/mysql

docker run -it -d -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.38
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值