Doker容器技术

Docker之父Solomon Hykes:Docker就好比传统的货运集装箱

什么是docker?

Docker是管理容器的引擎,为应用打包、部署平台,而非单纯的虚拟化技术 它具有以下几个重要特点和优势:

. 轻量级虚拟化

:Docker 容器相较于传统的虚拟机更加轻量和高效,能够快速启动和停止,节省系统资源。 例如,启动一个 Docker 容器可能只需要几秒钟,而启动一个虚拟机则可能需要几分钟。

一致性

:确保应用程序在不同的环境中(如开发、测试、生产)具有一致的运行表现。 无论在本地还是云端,应用的运行环境都能保持相同,减少了因环境差异导致的问题。

可移植性

:可以轻松地将 Docker 容器从一个平台迁移到另一个平台,无需担心依赖和环境配置的差 异。 比如,在本地开发的容器可以无缝部署到云服务器上

高效的资源利用

:多个 Docker 容器可以共享主机的操作系统内核,从而更有效地利用系统资 源。

易于部署和扩展

能够快速部署新的应用实例,并且可以根据需求轻松地进行水平扩展。 总之,Docker 极大地简化了应用程序的开发、部署和管理流程,提高了开发效率和运维的便利性。 它在现代软件开发和云计算领域得到了广泛的应用。

docker在企业中的应用场景

docker与虚拟化的对比

docker的优势

对于开发人员:Build once、Run anywhere。

对于运维人员:Configure once、Run anything

容器技术大大提升了IT人员的幸福指数!

部署docker

容器工作方法

容器站点

官方站点: https://docs.docker.com/

配置软件仓库

yum-config-manager --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker-ce并启动服务

在Linux rhel7 中需要激活内核

Docker的基本操作

Docker镜像管理

搜索镜像

拉取镜像

查看本地镜像

查看镜像信息

导出镜像

#保存镜像

docker image save nginx:latest -o nginx-latest.tar.gz

保存所有镜像

docker save `docker images | awk 'NR>1{print $1":"$2}'` o images.tar.gz

删除镜像

docker rmi nginx:latest

容器的常用操作

启动容器

查看容器运行信息

停停止和运行容器

docker stop busybox

docker start busybox

杀死容器可以使用信号

docker kill  busybox

删除容器

容器内容提交

系统中的文件和容器中的文件传输

查询容器内部日志

 docker镜像构建

docker镜像结构

共享宿主机的kernel

base镜像提供的是最小的Linux发行版

同一docker主机支持运行多种Linux发行版

采用分层结构的最大好处是:共享资源

镜像运行的基本原理

Copy-on-Write 可写容器层

容器层以下所有镜像层都是只读的

docker从上往下依次查找文件

容器层保存镜像变化的部分,并不会对镜像本身进行任何修改

一个镜像最多127层

镜像获得方式

基本镜像通常由软件官方提供

企业镜像可以用官方镜像+Dockerfile来生成

系统关于镜像的获取动作有两种:

     docker pull 镜像地址     docker load –i 本地镜像包

镜像构建

构建参数

示例

#ENV CMD   可被替代

EXPOSE VOLUME VOLUME

Dockerfile实例

建立构建目录,编写构建文件

vi Dockerfile

通过dockerfile生成镜像

docker build -t  (name):v1  .

测试镜像可用性

查看容器详情

镜像优化

示例

方法1.缩减镜像层

方法2.多阶段构建

方法3.使用最精简镜像

下载地址: https://github.com/GoogleContainerTools/distroless

下载镜像

docker pull gcr.io/distroless/base

docker仓库

Docker 仓库(Docker Registry) 是用于存储和分发 Docker 镜像的集中式存储库

它就像是一个大型的镜像仓库,开发者可以将自己创建的 Docker 镜像推送到仓库中,也可以从仓库中拉 取所需的镜像。

分为公有和私有

docker hub

官网: https://hub.docker.com/

Docker Hub 是 Docker 官方提供的一个公共的镜像仓库服务。

特点和优势:

1. 丰富的镜像资源:涵盖了各种常见的操作系统、编程语言运行时、数据库、Web 服务器等众多应用 的镜像。

例如,您可以轻松找到 Ubuntu、CentOS 等操作系统的镜像,以及 MySQL、Redis 等数据库 的镜像。

2. 官方支持:提供了由 Docker 官方维护的一些重要镜像,确保其质量和安全性。

3. 社区贡献:开发者们可以自由上传和分享他们创建的镜像,促进了知识和资源的共享。

4. 版本管理:对于每个镜像,通常都有多个版本可供选择,方便用户根据需求获取特定版本。

5. 便于搜索:用户可以通过关键词轻松搜索到所需的镜像

docker hub的使用方法

docker login   登录

cd .docker/          登陆信息保存位置

ls

vi config.json

{ "auths": { "https://index.docker.io/v1/": { "auth": "dGltaW5nbGVlOjY3NTE1MTVtaW5nemxu" } }

docker tag gcr.io/distroless/base-debian11:latest timinglee/base-debian11:latest

docker push timinglee/base-debian11:latest

docker仓库的工作原理

pull  push 原理

pull

镜像拉取分为以下几步:

1.docker客户端向index发送镜像拉去请求并完成与index的认证

2.index发送认证token和镜像位置给dockerclient

3.dockerclient携带token和根据index指引的镜像位置取连接registry

4.Registry会根据client持有的token跟index核实身份合法性

5.index确认此token合法性

6.Registry会根据client的请求传递镜像到客户端

push 

步骤

1.client向index发送上传请求并完成用户认证

2.index会发方token给client来证明client的合法性

3.client携带index提供的token连接Registry

4.Registry向index合适token的合法性

5.index证实token的合法性

6.Registry开始接收客户端上传过来的镜像

搭建docker的私有仓库

docker公司已经将registry开源,我们可以快速构建企业私有仓库 地址: https://docs.docker.com/registry/deploying/

搭建简单的Registry仓库

下载Registry镜像

docker pull registry

开启Registry

上传镜像到仓库中

注意  

在文件daemon.json只能写一个否则会报错

查看

查看镜像上传

为Registry提加密传输

生成认证key和证书

启动

为客户端建立证书

cp /root/certs/timinglee.org.crt /etc/docker/certs.d/reg.timinglee.org/ca.crt

restart

curl -k https://reg.timinglee.org/v2/_catalog

为仓库建立登陆认证

下载安装

建立认证文件

添加认证到registry容器中

构建企业级私有仓库

下载软件包地址 https://github.com/goharbor/harbor/releases

主要功能和特点

1. 基于角色的访问控制(RBAC):可以为不同的用户和用户组分配不同的权限,增强了安全性和管理 的灵活性。

2. 镜像复制:支持在不同的 Harbor 实例之间复制镜像,方便在多个数据中心或环境中分发镜像。 3. 图形化用户界面(UI):提供了直观的 Web 界面,便于管理镜像仓库、项目、用户等。

4. 审计日志:记录了对镜像仓库的各种操作,有助于追踪和审查活动。

5. 垃圾回收:可以清理不再使用的镜像,节省存储空间。

部署harbor

./install.sh --with-chartmuseum

管理仓库

登陆进入

上传镜像

图形化

登录

查看

docker网络 

docker安装后会自动创建3种网络:bridge、host、none

docker原生bridge网络     

bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。

容器通过宿主机的NAT规则后可以访问外网

设置iptables

查看

docker的自定义网络

自定义桥接网络

由于桥接IP与打开次序有关如图

自定义后

先自定义

可用name ping通

如何让不同的自定义网络互通?

让net1 net2可联通

也可ping通

joined容器网络

            示例

利用容器部署phpmyadmin管理mysql

                          

                                            

容器访问内外网

docker 跨主机网络

macvlan网络方式实现跨主机通信

打开网卡混杂模式:

.添加macvlan网络

测试

Docker 数据卷管理及优化

Docker 数据卷是一个可供容器使用的特殊目录,它绕过了容器的文件系统,直接将数据存储在宿主机 上。

这样可以实现以下几个重要的目的:

数据持久化:即使容器被删除或重新创建,数据卷中的数据仍然存在,不会丢失。

数据共享:多个容器可以同时挂载同一个数据卷,实现数据的共享和交互。

独立于容器生命周期:数据卷的生命周期独立于容器,不受容器的启动、停止和删除的影响

docker提供了两种卷:

bind mount                 docker   managed volume

bind mount 数据卷

是将主机上的目录或文件mount到容器里。

使用直观高效,易于理解。

使用 -v 选项指定路径,格式

-v选项指定的路径,如果不存在,挂载时会自动创建

docker managed 数据卷

bind mount必须指定host文件系统路径,限制了移植性

docker managed volume 不需要指定mount源,docker自动为容器创建数据卷目录

默认创建的数据卷目录都在 /var/lib/docker/volumes 中

如果挂载时指向容器内已有的目录,原有数据会被复制到volume中

示例

清理未使用的 Docker 数据卷

docker volume prune

建立及查看卷

建立数据卷容器

使用数据卷容器

bind mount 数据卷和docker managed 数据卷的对 比

备份与迁移数据卷

[root@docker ~]# docker run --volumes-from datavol \-v `pwd`:/backup busybox \

Docker 的安全优化

Docker容器的安全性,很大程度上依赖于Linux系统自身

评估Docker的安全性时,主要考虑以下几个方面:

Linux内核的命名空间机制提供的容器隔离安全

Linux控制组机制对容器资源的控制能力安全。

Linux内核的能力机制所带来的操作权限安全

Docker程序(特别是服务端)本身的抗攻击性。

其他安全增强机制对容器安全性的影响

#在rhel9中默认使用cgroup-v2 但是cgroup-v2中不利于观察docker的资源限制情况,所以推荐使用 cgroup-v1  

修改cgroup

命名空间隔离的安全

当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。

命名空间提供了 最基础也最直接的隔离。

与虚拟机方式相比,通过Linux namespace来实现的隔离不是那么彻底。

容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作 系统内核。

在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,比如:磁盘等等

进程的namespace

控制组资源控制的安全

当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。

Linux Cgroups提供了很多有用的特性,确保各容器可以公平地分享主机的内存、CPU、磁盘IO等 资源。

确保当发生在容器内的资源压力不会影响到本地主机系统和其他容器,它在防止拒绝服务攻击 (DDoS)方面必不可少

内核能力机制

能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。

大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。

默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。

Docker服务端防护

使用Docker容器的核心是Docker服务端,确保只有可信的用户才能访问到Docker服务。

将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全 问题。

允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。 这些子进程只允许在特定范围内进行操作

默认docker是用root用户控制资源的

Docker的资源限制

Linux Cgroups 的全称是 Linux Control Group。

是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

对进程进行优先级设置、审计,以及将进程挂起和恢复等操作。

Linux Cgroups

给用户暴露出来的操作接口是文件系统 它以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。

执行此命令查看:mount -t cgroup

在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫子系统。

在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录)。

控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定

限制cpu使用

限制前

限制后   (限制使用的周期和长度)

限制cpu 优先级

限制内存使用

限制容器使用内存大小

查看

安装

示例

自建控制器

mkdir -p /sys/fs/cgroup/memory/x1/

内存+swap控制

限制docker的磁盘io

查看磁盘

指定容器使用硬盘io的速率

oflag=direct 设定dd命令直接写入磁盘

查看速率和修改后的

Docker的安全加固

Docker默认隔离性

解决Docker的默认隔离性

LXCFS 是一个为 LXC(Linux Containers)容器提供增强文件系统功能的工具。

主要功能

1. 资源可见性:

2415 LXCFS 可以使容器内的进程看到准确的 CPU、内存和磁盘 I/O 等资源使用信息。

在没有 LXCFS 时,容器内看到的资源信息可能不准确,这会影响到在容器内运行的应用程序对资源的评估和 管理。

2. 性能监控:

方便对容器内的资源使用情况进行监控和性能分析。

通过提供准确的资源信息,管理员和开发 人员可以更好地了解容器化应用的性能瓶颈,并进行相应的优化。

安装

lxcfs-5.0.4-1.el9.x86_64.rpm lxc-libs-4.0.12-1.el9.x86_64.rpm lxc-templates 4.0.12-1.el9.x86_64.rpm

运行lxcfs并解决容器隔离性

ps ax 

容器特权

在容器中默认情况下即使我是容器的超级用户也无法修改某些系统设定

但是由于某些需要求,容器需要控制一些默认控制不了的资源,如何解决此问题,这时我们就要设置容 器特权

示例

如果添加了--privileged 参数开启容器,容器获得权限近乎于宿主机的root用户

容器特权的白名单

--privileged=true 的权限非常大,接近于宿主机的权限,为了防止用户的滥用,需要增加限制,只提供 给容器必须的权限。此时Docker 提供了权限白名单的机制,使用--cap-add添加必要的权限

限制容器对网络有root权限

可以设定网络 但不能管理磁盘

容器编排工具Docker Compose

Docker Compose 介绍

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。 其是官方的一个开源项目,托管到github上

网址  https://github.com/docker/compose

主要功能

1. 定义服务:

使用 YAML 格式的配置文件来定义一组相关的容器服务。每个服务可以指定镜像、端口映射、 环境变量、存储卷等参数。

例如,可以在配置文件中定义一个 Web 服务和一个数据库服务,以及它们之间的连接关系。

2. 一键启动和停止:

通过一个简单的命令,可以启动或停止整个应用程序所包含的所有容器。这大大简化了多容器 应用的部署和管理过程。

例如,使用 docker-compose up 命令可以启动配置文件中定义的所有服务,使用 compose down 命令可以停止并删除这些服务。

3. 服务编排:

docker 可以定义容器之间的依赖关系,确保服务按照正确的顺序启动和停止。例如,可以指定数据库 服务必须在 Web 服务之前启动。

支持网络配置,使不同服务的容器可以相互通信。可以定义一个自定义的网络,将所有相关的 容器连接到这个网络上。

4. 环境变量管理:

可以在配置文件中定义环境变量,并在容器启动时传递给容器。这使得在不同环境(如开发、 测试和生产环境)中使用不同的配置变得更加容易。

例如,可以定义一个数据库连接字符串的环境变量,在不同环境中可以设置不同的值。

工作原理

1. 读取配置文件:

Docker Compose 读取 YAML 配置文件,解析其中定义的服务和参数。

2. 创建容器:

根据配置文件中的定义,Docker Compose 调用 Docker 引擎创建相应的容器。它会下载所需 的镜像(如果本地没有),并设置容器的各种参数。

3. 管理容器生命周期:

Docker Compose 监控容器的状态,并在需要时启动、停止、重启容器。 它还可以处理容器的故障恢复,例如自动重启失败的容器。

Docker Compose 中的管理层

1. 服务 (service) 一个应用的容器,实际上可以包括若干运行相同镜像的容器实例

2. 项目 (project) 由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中 定义

3. 容器(container)容器是服务的具体实例,每个服务可以有一个或多个容器。容器是基于服务定义 的镜像创建的运行实例

Docker Compose 的常用命令参数

vi docker-compose.yml(默认文件)

常用命令:

docker compose  -d   (指定默认的配置文件名的配置文件)

-f  可指定非默认配置文件名的配置文件

docker compose        -f  文件名 -d   

停止并删除配置文件中定义的所有服务以及相关的网络和存储卷。

启动已经存在的服务,但不会创建新的服务。start

启动和关闭

服务状态查看

构建和重新构建服务

build

vi docker-compose.yml

yml文件

网络

services: test: image: busybox1 command: ["/bin/sh","-c","sleep 3000"] restart: always network_mode: default container_name: busybox test1: image: busybox2 command: ["/bin/sh","-c","sleep 3000"] restart: always container_name: busybox1 networks:- mynet1 test3: image: busybox3 command: ["/bin/sh","-c","sleep 3000"] restart: alwaysservices:

 test:

 image: busybox1

 command: ["/bin/sh","-c","sleep 3000"]

 restart: always

 network_mode:  default

 container_name: busybox

 test1:

 image: busybox2

 command: ["/bin/sh","-c","sleep 3000"]

 restart: always

 container_name: busybox1

 networks:- mynet1

 test3:

 image: busybox3

 command: ["/bin/sh","-c","sleep 3000"]

 restart: always

container_name: busybox1

networks:

    - mynet1

networks:

 mynet1:

 driver: bridge         

default:

 external: true         

name: bridge           

mynet2:

 ipam:

 driver: default

 config:- subnet: 172.28.0.0/16

 gateway: 172.28.0.254

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值