企业级容器技术Docker
1 Docker 介绍和基础操作
移植性比较好----拥有独自的仓库,但要内核新
可移植性,标准化,隔离性)
1.1.2 Docker 是什么
Docker 是基于 Linux 内核实现,最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可以提供轻量级的虚拟化 。虚拟化技术 KVM(KernelKernel-based Virtual Machine Machine) 基于 模块实现, 后来Docker 改为自己研发并开源的 runc 技术运行容器,彻底抛弃了LXC。
Docker 架构C/S ,比虚拟机交付速度更快,资源消耗更低,使用远程API来管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器。
docker三大理念:build(构建),ship(运输),run(运行),Docker遵从apache 2.0协议,并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等。
Docker 的主要目标
Build, Ship and Run Any App, Anywhere,即通过对应用组件的封装(Packaging)、分发部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。
容器和虚拟机比较
- 传统虚拟机要虚拟出一个主机硬件,并且运行一个完整的操作系统,然后在这个系统上安装和运行软件。
- 容器上的应用直接运行在宿主机的内核上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化。
- 容器之间是相互隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间。所以在同一个宿主机上的多个容器之间彼此不会相互影响。
表现比较
- 资源利用率高:开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压缩到极致,虚拟机会有5-20%的损耗,容器运行基本无损耗
- 启动速度更快,可以在数秒内完成启动
- 占用空间更小,容器占用的磁盘空间以MB为单位,而虚拟机以GB
- 集成性更好,和CI/CD(持续集成,持续部署)相关技术结核性更好,实现打包镜像发布测试可以一键运行,做到自动化并快使用的部署管理。
比如: 一台96G内存的物理服务器,为了运行java程序的虚拟机一般需要分配8G内存/4核的资源,只能运行13台左右虚拟机,但是改为在docker容器上运行Java程序,每个容器只需要分配4G内存即可,同样的物理服务器就可以运行25个左右容器,运行数量相当于提高一倍,可以大幅节省IT支出,通常情况下至少可节约一半以上的物理设备
1.1.4 Docker 的组成
docker 官网: http://www.docker.com
帮助文档链接: https://docs.docker.com/
docker 镜像: https://hub.docker.com/
docker 中文网站: http://www.docker.org.cn/
- Docker主机(Host):一个物理机和虚拟机,用于运行Docker服务进程和容器,也称宿主机,node节点
- Docker服务端(Server):Docker守护进程,运行docker容器
- Docker客户端(Client):客户端使用Docker命令或其他工具调用docker API
- Docker镜像(Images):镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合
- Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓库harbor
- Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程
无状态:相对比较稳定,访问无变化,nginx 静态 index.html
有状态:MySQL 访问有变化
*1.1.5 Namespace
逻辑上的名称空间
隔离类型
User Namespace
隔离类型 | 功能 | 系统调用参数 | 内核版本 |
---|---|---|---|
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 |
Net Namespace(network) | 提供网络隔离能力,包括网络设备,网络栈,端口等 | CLONE_NEWNET | 2.6.29 |
PID Namespace(Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.6.19 |
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.6.19 |
1.1.6 Control groups
限制管理资源
Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能.
如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等
Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)。
Cgroups在内核层默认已经开启,从CentOS 和 Ubuntu 不同版本对比,显然内核较新的支持的功能更多。
1.1.7 容器管理工具
1.1.7.2 docker
Docker 先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。
Docker的镜像是分层的,镜像底层为库文件且只读层即不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个可写层,其写入的数据会复制到宿主机上对应容器的目录,但是容器内的数据在删除容器后也会被随之删除。
1.1.7.4 Podman
什么是Podman?
Podman即Pod Manager tool,从名称上可以看出和kubernets的pod的密切联系,不过就其功能来说,简而言之: alias docker = podman ,是CentOS 8 新集成的功能,或许不久的未来会代替docker
Podman是一个 为 Kubernetes 而生的开源的容器管理工具,原来是 CRI-O(即容器运行时接口CRI 和开放容器计划OCI) 项目的一部分,后来被分离成一个单独的项目叫 libpod。其可在大多数Linux平台上使用,它是一种无守护程序的容器引擎,用于在Linux系统上开发,管理和运行任何符合OpenContainer Initiative(OCI)标准的容器和容器镜像。
Podman 和docker不同之处
docker 需要在系统上运行一个守护进程(docker daemon),这会产生一定的开销,而podman 不需要
因为docke有docker daemon,所以docker启动的容器支持 --restart 策略,但是podman不支持
docker需要使用root用户来创建容器。 这可能会产生安全风险,尤其是当用户知道docker run命令的–privileged选项时。podman既可以由root用户运行,也可以由非特权用户运行
docker在Linux上作为守护进程运行扼杀了容器社区的创新。 如果要更改容器的工作方式,则需要更改docker守护程序并将这些更改推送到上游。 没有守护进程,容器基础结构更加模块化,更容易进行更改。 podman的无守护进程架构更加灵活和安全
1.1.8容器的优势
移植性比较好
标准:runtime —runc
快速部署 高效虚拟化 节省开支
简化配置 环境统一 快速迁移和扩展
更好的实现面向服务的架构
缺点
- 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底
- 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐
- 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重复浪费
容器编排工具
centos7
--------------------------------------------------------
vim /etc/yum.repos.d/docker.repo
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7.0/x86_64/stable/
gpgcheck=0yum list | grep docker
KVM --单机
open stack -- 多机 vmware vcenter 多机
docker 单机
k8s 多机
yum -y install
vim docker-ce.repo-------------------------------------
ubuntu
-----------------------------------
apt list docker.io
apt install docker.ioyum -y install docker-ce最新版的
--------------------------
ubuntu
服务器端
-ddocker info ---查看更多的信息Cgroup 客户端apt install docker.io ------最新版root@ubuntu2004:~# systemctl status docker
● docker.service - Docker Application Container EngineLoaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)Active: active (running) since Sat 2022-07-02 12:02:27 CST; 29min ago
TriggeredBy: ● docker.socketDocs: https://docs.docker.comMain PID: 4494 (dockerd)Tasks: 9Memory: 30.4MCGroup: /system.slice/docker.service└─4494 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
centos
yum list --showduplicates docker.ce ---展示版本yum install doceker docker-ce-version
yum install docker-ce-3:20.10.10-3.el8 docker-ce-cli-1:20.10.10-3.el8
docker version
systemctl enable --now docker.service
指定版本
# 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]
apt-get update
二进制安装
-----------------------------------------------------
centos 7
wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-20.10.10.tgz[root@centos ~]# tar xf docker-20.10.10.tgz
[root@centos ~]# ls
anaconda-ks.cfg docker-20.10.10.tgz initial-setup-ks.cfg reset.sh 下载 图片 桌面 视频
docker docker-ce.repo offline_install_docker.sh reset_v6.sh 公共 文档 模板 音乐
[root@centos ~]# cd docker
[root@centos docker]# ls
containerd containerd-shim containerd-shim-runc-v2 ctr docker dockerd docker-init docker-proxy runc
[root@centos docker]# ll
total 200804
-rwxr-xr-x. 1 ehuo ehuo 33908392 Oct 25 2021 containerd
-rwxr-xr-x. 1 ehuo ehuo 6508544 Oct 25 2021 containerd-shim
-rwxr-xr-x. 1 ehuo ehuo 8609792 Oct 25 2021 containerd-shim-runc-v2
-rwxr-xr-x. 1 ehuo ehuo 21131264 Oct 25 2021 ctr
-rwxr-xr-x. 1 ehuo ehuo 52885064 Oct 25 2021 docker
-rwxr-xr-x. 1 ehuo ehuo 64763136 Oct 25 2021 dockerd
-rwxr-xr-x. 1 ehuo ehuo 708616 Oct 25 2021 docker-init
-rwxr-xr-x. 1 ehuo ehuo 2784353 Oct 25 2021 docker-proxy
-rwxr-xr-x. 1 ehuo ehuo 14308904 Oct 25 2021 runc
[root@centos docker]# cp * /usr/bin/
[root@centos docker]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos docker]# cd
[root@centos ~]#
-------------------------------------------------------------------
#创建service文件 可以参考yum安装的文件
cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
EOF--------------------------------------------------------------------
systemctl daemon-reload -----后台执行
systecmtl status docker.service #查看状态
systcmctl enable --now docker.service #开机自启
一键二进制安装
DOCKER_VERSION=20.10.10
URL=https://mirrors.aliyun.comprepare () {if [ ! -e docker-${DOCKER_VERSION}.tgz ];thenwget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgzfi[ $? -ne 0 ] && { echo "文件下载失败"; exit; }
}install_docker () {tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/cp /usr/local/docker/* /usr/bin/cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
}start_docker (){systemctl enable --now dockerdocker version
}
prepare
install_docker
start_docker
static-stable x8-64 二进制包
-e 判断存在fi
[$? -ne 0] && {echo "文件失败";exit;}
docker command
---------------------------------------
docker image xxxx # 管理镜像------------------------------------------
docker network #管理网络
1.3 镜像管理
1.3.1 镜像结构和原理
镜像即创建容器的模版,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快速的创建并启动容器
容器、镜像和父镜像关系;
一个典型的 Linux文件系统由 bootfs 和 rootfs 两部分组成
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要用于引导加载 kernel,Linux刚启动时会加载bootfs文件系统,当boot加载完成后,kernel 被加载到内存中后接管系统的控制权,bootfs会被 umount 掉
rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件,不同的 linux 发行版(如 ubuntu 和 CentOS ) 主要在 rootfs 这一层会有所区别。
Linux 完整的系统组成结构
/boot(grub+kernel) + /(lib.etc.bin.....) + app镜像=/contrainer= /() -根文件系统 + app =jdk+java(jdk +)
企业级容器技术Docker相关推荐
- 企业级容器技术 Docker
企业级容器技术 Docker docker隔离级别中包含两个核心组成: Namespace(名称空间):namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内 ...
- 【云原生之企业级容器技术 Docker实战一】Docker 介绍
目录 一.Docker 介绍 1.1 容器历史 1.2 Docker 是什么 1.3 Docker 和虚拟机,物理主机 1.4 Docker 的组成 1.5 Namespace 1.6 Control ...
- 企业级容器技术docker(12)docker swarm
docker srack部署 写一个compose文件 version: '3' services:web1:image: passyt.com/library/nginxports:- " ...
- 云漫圈 | 容器技术docker应用场景解析
戳蓝字"CSDN云计算"关注我们哦! 作者:channingbreeze 文章转载自程序员乔戈里 话说小史已经接受了A厂的offer,这不,已经在公司附近租好了房子,准备搬家过去住 ...
- 漫画 | 从搬家到容器技术 Docker 应用场景解析
作者 | channingbreeze 责编 | 仲培艺 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 生活现场 话说小史已经接受了 A ...
- 容器技术 - docker
文章目录 一.Docker简介 1.1 Docker诞生 1.2 Docker相关解释 1.3 Docker与传统虚拟化对比 1.4 Docker的构成 二.Docker安装 2.1 Docker的安 ...
- 容器技术Docker
文章目录 一.引言 1.1 环境不一致 1.2 隔离性 1.3 弹性伸缩 1.4 学习成本 二.Docker介绍 2.1 Docker的由来 2.2 Docker的思想 三.Docker的安装 3.1 ...
- 【容器技术——docker管理】
文章目录 容器是什么? Docker安装 Docker的安装方式 Docker容器管理 Docker镜像管理 镜像仓库构建 1)官方仓库构建 2)Harbor构建 Docker网络管理 1)Docke ...
- 容器技术——docker小白入门
docker是什么: Docker的主要目标是"Build,Ship and Run Any App,Anywhere",也就是通过对应用组件的封装.分发.部署.运行等生命周期的管 ...
最新文章
- 【特征匹配】ORB原理与源码解析
- 2020年国际学术会议参考列表
- 使用 ftrace 调试 Linux 内核【转】
- python方法测试_python 测试常用小方法
- 20135203齐岳 信息安全系统设计基础第十三周学习总结
- 【转】IE浏览器快捷键大全
- C#中HashTable、Dictionary、ConcurrentDictionary区别
- 128.Two Sum
- python常用函数的用法_python3 文件操作常用函数用法示例
- 【剑指offer - C++/Java】12、数值的整数次方
- 诗与远方:无题(七十三)
- SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.解决方法
- 2017-3-01 test
- CSS盒模型详解(图文教程)
- ctor/dtor 与线程安全
- redis之AOF和RDB持久化
- 寒假大一2.15考试
- DNS 区域传送漏洞(dns-zone-tranfer)学习
- 阿里内部干货分享 曾鸣:淘宝是怎样从 0 做到 0.1 的?
- Spark数据清洗案例
热门文章