极客时间运维进阶训练营第一周作业
一、docker 基本认识
1、docker 基本概念:docker 是一种容器技术,它可以对软件及其依赖进行标准化的打包;容器之间相对独立,基于容器运行的应用之间也是相互隔离的;
并且容器之间是共享一个 OS kernel 的,充分利用服务器资源,容器可以运行在很多主流的操作系统之上,简单来说,容器就是将软件打包成标准化单元,以用于开发、交付和部署;
dokcer 是基于 namespace 与 cgroup 技术实现的。
2、容器与虚拟机的区别
(1)容器是在 linux 上运行,并与其它容器共享主机的内核,它运行一个独立的进程,不占用其它任何可执行文件的内存,非常轻量。
(2)虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
如图是容器与虚拟机的区别点:
二、namespace 技术与 cgroup 介绍
docker 本质就是宿主机的一个进程,docker 是通过 namespace 实现资源隔离,通过 cgroup 实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作,可以说 namespace 与 cgroup 是容器的基石。
(一)namespace 名称空间
1、namespace 是什么?
namespace 是 Linux 内核的一项特性,它可以对内核资源进行分区,使得一组进程可以看到一组资源;而另一组进程可以看到另一组不同的资源,简单来说 namespace 是由 Linux 内核提供的,用于进程间资源隔离的一种技术。
2、namespace 的六项隔离:namespace 的隔离一共有 6 种实现方式
(二)cgroup
1、cgroup 是什么?
cgroup 是 Linux 内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制。
cgroup 的全称是 control group,cgroup 为每种可以控制的资源定义了一个子系统,我们可以在/sys/fs/cgroup/这个路径下面查看相关信息。
2、cgroup 典型的子系统
三、docker 三要素
1、镜像(Image):镜像就是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
2、容器(Container):容器是用镜像创建的运行实例,我们可以把容器理解为一个精简版的 linux 操作系统,包括 root 用户权限,进程空间,用户空间和网络空间等等这些,然后加上再它之上运行的应用程序。
3、仓库(Repository):仓库是集中存放镜像文件的场所,仓库分为公开仓库和私有仓库,比较常见的是 harbor,Docker Hub。
四、dokcer 基本安装
(一)CentOS 安装 docker 之二进制安装
1、下载最新版本:Docker 官网下载地址: https://download.docker.com/linux/static/stable/x86_64/,我这里下载 docker-20.10.9.tgz 版本
2、解压安装包:tar -zxvf docker-20.10.9.tgz
3、创建 docker.service
vim /usr/lib/systemd/system/docker.service
[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.service containerd.serviceWants=network-online.target
[Service]Type=notifyExecStart=/usr/bin/dockerdExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityDelegate=yesKillMode=process
[Install]WantedBy=multi-user.target
4、运行 docker 并加入开机自启动
# 重新加载服务配置文件
systemctl daemon-reload
# 启动 docker
start docker
# 设置开机启动
systemctl enable docker
5、添加 docker 配置文件
vim /etc/docker/daemon.json
{"insecure-registries": ["xx.xx.xx.xx"], #远程仓库"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2", #存储引擎"live-restore": true,"graph":"/apps/docker", #存储位置"exec-opts": ["native.cgroupdriver=systemd"] #cgroups 驱动方式}
6、查看 docker 安装时候成功
systemctl status docker
五、Docker 数据卷介绍
Docker 的镜像是分层设计的,镜像层是只读的,通过镜像启动的容器添加了一层可读写的文件系统,用户写入的数据都保存在这一层当中。如果要将写入到容器的数据永久保存,则需要将容器中的数据保存到宿主机的指定目录,目前
Docker 的数据类型分为两种:
一、是数据卷(datavolume),数据卷实际上就是宿主机上的目录或者是文件,可以被直接 mount 到容器当中作为容器的本地文件系统使用,实际生产环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划,最终保证服务的可扩展性、稳定性以及数据的安全性。基于数据卷通过将
宿主机的文件或目录挂载到容器的指定目录,当容器中的挂载目录产生的新数据即可间接的保存到宿主机以实现持久化的目的。
二、是数据卷容器(Datavolumecontainer),数据卷容器是将宿主机的目录挂载至一个专用的数据卷容器,然后让其他容器通过数据卷容器继承挂载的目录或文件,以实现将新产生的数据持久化到宿主机的目的。
(一)数据库卷
1、特点:
(1)数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
(2)在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
(3)数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
(4)在容器里面的写入数据不会影响到镜像本身。
2、使用场景:
(1)容器数据持久化(mysql 数据、nginx 日志等类型)。
(2)静态 web 页面挂载应用配置文件挂载。
(3)多容器间的目录或文件共享。
3、常见命令:
#创建数据卷
docker volume create nginx-data
#查看数据卷
dockervolumels
#使用数据卷
dockerrun-it-d-p80:80-vnginx-data:/datanginx:1.20.2
注意:创建容器的时候指定参数会删除/var/lib/docker/containers/的容器数据目录,但是不会删除数据卷的内容。
(二)数据卷容器
数据卷容器功能是可以让数据在多个 docker 容器之间共享,即先要创建一个后台运行的 A 容器作为 Server,之后创建的 B 容器、C 容器等都可以同时访问 A 容器的内容,因此数据卷容器用于为其它容器提供卷的挂载继承服务,数据卷为其它
容器提供数据读写服务,A 容器称为 server 端、其它容器成为 client 端。
1、特点:
(1)适用于同类服务的数据卷共享
(2)client 会继承卷 server 挂载和挂载权限
(3)停止卷 server,也不影响已经运行的容器、甚至也不影响新建容器删除卷 server,不影响已经运行的容器,但是不能新建容器
2、使用:
创建数据卷容器:docker run -d --name volume-server -v /data/testapp:/usr/share/nginx/html/testapp nginx:1.19.0
client1:dockerrun-d--name web1 --volumes-from volume-server -p80:80 nginx:1.20.2
client2::dockerrun-d--name web2 --volumes-from volume-server -p81:80 nginx:1.20.2
六、Docker 网络介绍
docker 网络模式一共有 4 种:bridge 模式、host 模式、none 模式、container 模式
(一)bridge 模式:
docker 的默认模式即不指定任何模式就是 bridge 模式,也是目前使用比较多的网络模式,此模式创建的容器会为每一个容器分配自己的网络 IP 等信息,并将容器连接到一个虚拟网桥与外界通信。
(2)container 模式:
Container 模式即容器模式,使用参数--net=container:目标容器名称/ID 指定,使用此模式创建的容器需指定和一个已经存在的容器共享一个网络 namespace,而不会创建独立的 namespace,即新创建的容器不会创建自己的网卡也不会配置
自己的 IP,而是和一个已经存在的被指定的目标容器共享对方的 IP 和端口范围,因此这个容器的端口不能和被指定的目标容器端口冲突,除了网络之外的文件系统、用户信息、进程信息等仍然保持相互隔离,两个容器的进程可以通过 lo 网
卡及容器 IP 进行通信。
使用:
#docker run -it -d--name nginx-container-p80:80 --net=bridge nginx:1.22.0-alpine
#docker run -it -d--name php-container--net=container:nginx-container php:7.4.30-fpm-alpine
分别进入容器就可以验证 IP 信息,查看 IP 是否相同。
版权声明: 本文为 InfoQ 作者【LiaoWD】的原创文章。
原文链接:【http://xie.infoq.cn/article/86a377b4ee32cec9596ffc814】。文章转载请联系作者。
评论