往期回顾:
云端技术驾驭DAY01——云计算底层技术奥秘、云服务器磁盘技术、虚拟化管理、公有云概述
云端技术驾驭DAY02——华为云管理、云主机管理、跳板机配置、制作私有镜像模板
云端技术驾驭DAY03——云主机网站部署、web集群部署、Elasticsearch安装
云端技术驾驭DAY04——Logstash安装部署及插件模块
云端技术驾驭DAY06
容器技术探秘
容器概述
容器技术起源
- Linux容器的起源
– 容器的起源可以追溯到1979年UNIX系统中的chroot命令,容器最初的设计是为了隔离计算机中的各类资源,以便降低软件开发、测试阶段的风险,或者充当蜜罐、吸引黑客的攻击,以便监视黑客的行为
– 最初的容器是以chroot为代表的文件隔离技术,但这并不完美,如主机名、网络、系统进程、用户等都无法个隔离 - 名称空间与控制组
– 为了实现完美的隔离机制,2002年Linux引入了一种由内核直接提供的全局资源封装的全新隔离机制(名称空间)用来解决隔离的问题,至2009年,Linux内核已经支持了UTS、IPC、PID、NETWORK、MOUNT等多个名称空间
– Linux解决资源配额的方案是控制组(Cgroups),它与名称空间一样直接由内核提供功能,用于隔离或者说分配并限制某个进程组能够使用的资源量,包括占用CPU时间、内存大小、磁盘I/O速度等等 - 容器诞生
– 当文件系统、访问、资源都可以被隔离后,容器已经有它降生所需的全部条件,Linux内核开始提供Cgroups的同一时间,就马上发布了名为LXC的系统级虚拟化功能
– LXC带着令人瞩目的光环登场,但是LXC眼中的容器是一种封装系统的轻量级虚拟机,这种局限的思想也决定了LXC不可能形成今天的容器生态的,所以接下来舞台的聚光灯终于落到了Docker身上
docker概述
- 2013年3月,一个名为Docker的项目宣布开源
– 它的出现促使“容器”逐渐走向整个IT舞台的中央,数年时间,就已经成为开发、测试、部署等各个环节都难以或缺的基础支撑。 - Docker的容器理念
– 促使Docker的一问世就惊艳世间的,不是什么黑科技式的秘密武器,而是其符合历史潮流的创意与设计理念,还有充分开放的生态环境
– 早期的容器技术是一种封装系统的轻量级虚拟化、Docker严重的“容器技术”是一种以应用为核心,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段
– Docker的容器中没有系统 - 开放的理念
– 2014年,Docker开源了自己用Golang开发的Libcontainer
– 2015年,在Docker的主导和倡议下,多家公司联合制定了“开放容器交互标准(OCI)”,这是一个关于容器格式和运行时的规范文件,其中包含:运行时标准、容器镜像标准、镜像分发标准 - 三大概念
– 容器:容器是一个运行在隔离环境中的程序
– 镜像:镜像是只读的模板,包含了创建容器所需的所有文件和配置信息
– 仓库:仓库是用来存储、分发、管理镜像的地方
docker安装部署
环境准备
主机名 | IP | 配置 |
---|---|---|
docker-0001 | 192.168.1.31 | 2vCPUs,4GiB内存 |
docker-0002 | 192.168.1.32 | 2vCPUs,4GiB内存 |
docker安装
- 下载docker相关软件,并添加到跳板机的自定义yum仓库中
[root@ecs-proxy ~]# ls docker/ // 实验所需软件包
containerd.io-1.6.12-3.1.el8.x86_64.rpm docker-compose-plugin-2.12.2-3.el8.x86_64.rpm
docker-ce-20.10.21-3.el8.x86_64.rpm docker-distribution-2.6.2-2.git48294d9.el8.x86_64.rpm
docker-ce-cli-20.10.21-3.el8.x86_64.rpm docker-scan-plugin-0.21.0-3.el8.x86_64.rpm
docker-ce-rootless-extras-20.10.21-3.el8.x86_64.rpm
[root@ecs-proxy ~]# rsync -av docker/ /var/localrepo/docker/
[root@ecs-proxy ~]# createrepo --update /var/localrepo
- 在docker-0001和docker-0002安装docker(只演示一台)
[root@docker-0001 ~]# echo 'net.ipv4.ip_forward = 1' >>/etc/sysctl.conf // 开启路由转发
[root@docker-0001 ~]# sysctl -p
[root@docker-0001 ~]# dnf -y install docker-ce
[root@docker-0001 ~]# systemctl enable docker --now
[root@docker-0001 ~]# docker version // 查看服务器与客户端版本
- 查询版本信息
命令 | 解释 |
---|---|
docker version | 查看服务器与客户端版本 |
docker info | 查看 docker 服务配置信息 |
镜像与容器
镜像管理
镜像概述
- 概述
– 镜像是创建容器的核心
– 镜像使用CoW技术
– 镜像采用分层设计
– 镜像始终都是只读的 - 如何创建容器
– 首先使用CoW为镜像创建一个读写层,容器在读写层运行
– 这种方式可以让一个镜像创建无数个容器
镜像管理命令
- 指定镜像的方法
– 每一个镜像都对应唯一的镜像id
– 每一个镜像都有标签,默认标签为latest
– 我们在调用镜像的时候,如果没有指定标签,也是latest
命令 | 解释 |
---|---|
docker images | 查看本机镜像 |
docker pull 镜像名称:标签 | 下载镜像 |
docker push 镜像名称:标签 | 上传镜像 |
docker save 镜像名称:标签 | 备份镜像为tar包 |
docker load -i 备份文件名称 | 导入备份的镜像文件 |
docker history 镜像名称:标签 | 查看镜像分层历史 |
docker tag 镜像ID:标签 镜像名称:新的标签 | 创建新的镜像名称和标签 |
docker rmi 镜像名称:标签 | 删除镜像(必须先删除该镜像启动的所有容器) |
获取镜像
-
镜像可以从官方镜像仓库下载,也可以自己制作
-
官方镜像仓库:docker.com
-
官方下载较慢,可以使用国内的镜像站加速
-
添加镜像加速
[root@docker-0001 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["这里添加上图获取的镜像仓库加速器地址"],
"insecure-registries":[]
}
[root@docker-0001 ~]# systemctl restart docker
[root@docker-0001 ~]# docker info // 查看docker服务配置信息
- 下载镜像
[root@docker-0001 ~]# docker pull busybox:latest
镜像的备份与恢复
- 备份busybox:latest镜像为tar包
[root@docker-0001 ~]# docker save busybox:latest -o busybox.tar
- 使用备份文件恢复镜像
[root@docker-0001 ~]# docker load -i myos.tar.xz
- 案例:在docker-0001备份rockylinux:8.5,在docker-0002恢复
[root@docker-0001 ~]# docker save rockylinux:8.5 -o rockylinux.tar
[root@docker-0001 ~]# rsync -avX rockylinux.tar 192.168.1.32:
[root@docker-0002 ~]# docker load -i rockylinux.tar
- 删除镜像
– docker rmi (-f 强制删除) 镜像名称/ID
– 如果镜像创建了容器,就不能被删除
[root@docker-0001 ~]# docker rmi -f busybox:latest // 强制删除
- 给镜像设置一个新的名称标签
– docker tag 镜像 新名称:标签
容器管理
创建容器
- 如何创建容器?
– 使用docker run命令创建容器 - 命令详解
– 语法格式:docker run -参数 镜像名称:镜像标签 - docker run常用参数
参数 | 解释 |
---|---|
-i | 交互式 |
-t | 分配终端 |
-d | 后台运行 |
–name | 容器名称 |
–rm | 创建内存容器(容器结束后自动删除) |
- 启动容器
[root@docker-0001 ~]# docker run -it busybox:latest
- 服务型容器需要放在后台运行
[root@docker-0001 ~]# docker run -itd myos:httpd
- 给容器起名字,方便管理
[root@docker-0001 ~]# docker run -itd --name web1 myos:httpd
容器管理命令
- 查看容器:
docker ps // 查看运行中的容器
docker ps -a // 查看所有容器
docker ps -aq //-q选项意思是只显示id
- 启动、关闭、重启
docker start|stop|restart 容器ID
- docker使用技巧:批量启动、关闭、重启
docker stop $(docker ps -aq)
- 查询详细信息
– docker inspect 镜像名称/容器ID
docker inspect myos:httpd // 查询镜像
docker inspect dc2edbdb98a6 // 查询容器
- 在容器内执行命令
– docker exec -it 容器ID 命令
[root@docker-0001 ~]# docker exec -it dc2edbdb98a6 ls -l // 执行非交互命令
[root@docker-0001 ~]# docker exec -it dc2edbdb98a6 /bin/bash // 执行交互命令
- 拷贝文件
– 上传:docker cp 本机文件路径 容器ID:容器内路径
– 下载:docker cp 容器ID:容器内路径 容器ID:容器内路径
– 容器内文件必须使用绝对路径
[root@docker-0001 ~]# docker cp dc2edbdb98a6:/var/www ./ // 拷贝容器内文件到本地
[root@docker-0001 ~]# docker cp /etc/passwd dc2edbdb98a6:/root/pwd // 拷贝本地文件到容器内
- 删除容器
– 管理命令:docker rm (-f 强制删除) 容器ID
[root@docker-0001 ~]# docker rm -f dc2edbdb98a6 // 强制删除运行中的容器
[root@docker-0001 ~]# docker rm $(docker ps -aq) // 删除所有容器
- 查看容器日志
– docker logs 容器ID
[root@docker-0001 ~]# docker logs a3b3ad23248d
- 管理命令总结
命令 | 解释 |
---|---|
docker run -it(d) 镜像名称:标签 | 创建容器 |
docker ps | 查看容器的信息 |
docker [start/stop/restart] 容器id | 启动、停止、重启容器 |
docker inspect 镜像名称 | 容器名称 查询(容器/镜像)的详细信息 |
docker exec -it 容器ID 启动命令 | 在容器内执行命令 |
docker cp 路径1 路径2 | 拷贝文件:路径格式(本机路径、容器ID/路径) |
docker rm 容器ID | 删除容器 |
docker logs 容器ID | 查看容器日志 |
快捷键:CTRL-P+CTRL-Q | 转入后台运行 |
镜像与服务
自定义镜像
-
镜像采用分层设计
-
创建读写层
-
修改配置
-
重新打包
-
使用现有镜像启动容器,在该容器基础上修改
-
使用commit制作新镜像
[root@docker-0001 ~]# docker run -itd --name linux rockylinux:8.5
[root@docker-0001 ~]# docker exec -it linux rm -rf /etc/yum.repos.d/
[root@docker-0001 ~]# docker cp /etc/yum.repos.d/ linux:/etc/yum.repos.d/
[root@docker-0001 ~]# docker exec -it linux dnf -y install net-tools vim-enhanced tree bash-completion iproute procps-ng psmisc // 安装常用软件包
[root@docker-0001 ~]# docker exec -it linux dnf clean all // 清理缓存文件
[root@docker-0001 ~]# docker stop linux
[root@docker-0001 ~]# docker commit linux mylinux:latest // 把容器制作成镜像
[root@docker-0001 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mylinux latest e048abdba77b 32 seconds ago 250MB
rockylinux 8.5 210996f98b85 2 years ago 205MB
[root@docker-0001 ~]# docker rm -f linux // 删除用于制作镜像的临时容器
容器服务原理
- 什么是上帝进程?
– 简单的说就是系统创建之初产生的第一个进程 - 特点:
– 没有父进程,PID==1
– 是所有程序的根进程
– 上帝进程死亡,系统实例也就关闭了 - 容器有没有上帝进程?
– 容器的启动进程就是上帝进程
– 如果容器的启动进程关闭等同于容器关闭 - 前台服务与后台服务
– 前台服务是占有控制端的进程,可以在终端与用户交互式的访问与操作,一旦终端关闭,这个进程也随之消失
– 后台进程也叫守护进程,不受终端控制,它不需要交互
– 后台进程的本质是向系统托管进程服务
容器内部署应用
- 目标:在容器中安装部署apache服务
- 如何在容器内启动服务?
– 由于容器内没有system,参考服务文件手工执行启动程序
– 服务文件路径:/usr/lib/systemd/system/httpd.service
– 查看服务文件,设置环境变量执行服务启动程序
[root@docker ~]# docker run -it --rm --name myweb mylinux:latest // 创建一个名为myweb的容器
[root@a7f9d0c3e3e2 /]# dnf -y install httpd
[root@a7f9d0c3e3e2 /]# echo "Hello World ." >/var/www/html/index.html
[root@a7f9d0c3e3e2 /]# cat /usr/lib/systemd/system/httpd.service
[root@a7f9d0c3e3e2 /]# export LANG=C // 设置语言,防止乱码
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND // 让httpd在前台运行,开启新终端访问验证
- 为apache添加解析php文件支持
[root@a7f9d0c3e3e2 /]# dnf install -y php
[root@a7f9d0c3e3e2 /]# vim /etc/httpd/conf.modules.d/00-mpm.conf
11: LoadModule mpm_prefork_module ... ... // 去掉注释
23: # LoadModule mpm_event_module ... ... // 注释配置
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND
- 验证配置
// 在另一个终端拷贝info.php 到 docker 主机的html目录
[root@docker-0001 ~]# docker cp info.php myweb:/var/www/html/
[root@docker-0001 ~]# curl http://172.17.0.2/info.php
<pre>
Array
(
[REMOTE_ADDR] => 172.17.0.1
[REQUEST_METHOD] => GET
[HTTP_USER_AGENT] => curl/7.61.1
[REQUEST_URI] => /info.php
)
php_host: 616e75df56ae
1229