当前位置: 首页 > article >正文

docker-基础

概述

一、起源

最初的容器是以chroot为代表的文件隔离方式,但这并不完美,如主机名、网络、系统进程、用户等都无法隔离。

二、名称空间与控制组

1、名称空间

为了实现完美的隔离机制,Linux引入了一种由内核直接提供的全局资源封装的全新隔离机制(名称空间)用来解决隔离的问题。Linux内核支持UTS、IPC、PID、NETWORK、MOUNT等多个名称空间。

2、控制组

Linux解决资源配额的方案是控制组(Cgroups),它与名称空间一样直接由内核提供功能,用于隔离或者说分配并限制某个进程组能够使用的资源量,包括占用CPU时间、内存大小、磁盘I/O速度等等。

三、Docker容器技术

以应用为核心,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段。

Docker 的容器中没有系统。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接,,更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)。

四、三大概念

容器:容器是一个运行在隔离环境中的程序

镜像:镜像是只读的模板,包含了创建容器所需的所有文件和配置信息

仓库:用来存储、分发、管理镜像的地方

镜像管理

一、镜像概述

镜像是创建容器的核心

镜像使用CoW技术

镜像采用分层设计

镜像始终都是只读的

二、如何创建容器

首先使用Cow为镜像创建一个读写层,容器在读写层运行;

这种方式可以让一个镜像创建无数个容器。

三、镜像加速添加

[root@docker ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["这里配置镜像仓库加速器地址"],
    "insecure-registries":[]
}
[root@docker ~]# systemctl restart docker

# 查看 docker 服务配置信息
[root@docker ~]# docker info

四、镜像管理命令

镜像管理命令说明
docker images查看本机镜像
docker pull 镜像名称:标签下载镜像
docker save 镜像名称:标签 -o 文件名备份镜像为tar包
docker load -i 备份文件名称导入备份的镜像文件
docker history 镜像名称:标签查看镜像的制作历史

容器管理

一、容器管理命令

容器管理命令说明
docker run -it(d) 镜像名称:标签 [启动参数]创建容器
docker ps [-a 显示所有容器,-q 只显示id]查看容器的信息
docker inspect 镜像名称|容器名称查询(容器/镜像)的详细信息
docker [start|stop|restart] 容器id启动、停止、重启容器
docker exec -it 容器ID 命令在容器内执行命令

docker cp 本机文件路径 容器id:容器内路径

docker cp 容器id:容器内路径 本机文件路径

拷贝文件
docker rm 容器ID删除容器
docker logs 容器ID查看容器日志
docker tag 镜像ID:标签 镜像名称:新的标签创建新的镜像名称和标签
docker rmi 镜像名称:标签删除镜像(必须先删除该镜像启动的所有容器)

二、docker run 常用参数

-i        交互式

-t        分配终端

-d        后台运行

--name        容器名字

--rm        容器结束后自动删除

传入后台快捷键(ctrl-p + ctrl-q)

镜像与服务

一、自定义镜像

镜像采用分层设计

创建读写层

修改配置

重新打包

二、简单镜像制作

使用现有镜像启动容器,在该容器基础上修改

使用commit制作新镜像

# 使用基础镜像创建一个容器
[root@docker ~]# docker run -itd --name linux rockylinux:8.5
# 删除容器内的Yum配置文件
[root@docker ~]# docker exec -it linux rm -rf /etc/yum.repos.d
# 拷贝宿主机的Yum配置文件到容器内
[root@docker ~]# docker cp /etc/yum.repos.d linux:/etc/
# 在容器内安装工具软件包
[root@docker ~]# docker exec -it linux dnf install -y net-tools vim-enhanced tree bash-completion iproute procps-ng psmisc
# 清理缓存文件
[root@docker ~]# docker exec -it linux dnf clean all
# 停止容器
[root@docker ~]# docker stop linux
# 把容器制作成镜像
[root@docker ~]# docker commit linux mylinux:latest
sha256:7a4449e20f4c59d1f6c4db838b4724cbf63c8f4195513c5f17d053c7752891d5
# 查看新制作的镜像
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mylinux      latest    b64da40467ae   3 seconds ago   249MB
rockylinux   8.5       210996f98b85   13 months ago   205MB
# 删除制作镜像的容器
[root@docker ~]# docker rm -f linux
linux

三、容器部署应用

1、安装部署apache

如何在容器内启动服务?

  • 由于容器内没有 systemd,参考服务文件手工执行启动程序
  • 服务文件路径:/usr/lib/systemd/system/httpd.service
  • 查看服务文件,设置环境变量执行服务启动程序
  • 如果没有 service 文件,自己想办法喽(官方手册配置、启动服务,网上资料)
# 删除所有容器
[root@docker ~]# docker rm -f $(docker ps -aq)

# 创建一个名为 myweb 的容器
[root@docker ~]# docker run -it --rm --name myweb mylinux:latest

# 在容器内安装部署 apache
[root@a7f9d0c3e3e2 /]# dnf install -y 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

# 在另一个终端完成访问验证

2、为apache添加解析php文件的支持

# ctrl + c 终止 httpd 服务运行

# 安装 php 软件包
[root@a7f9d0c3e3e2 /]# dnf install -y php

# 修改配置文件
[root@a7f9d0c3e3e2 /]# vim /etc/httpd/conf.modules.d/00-mpm.conf
11: LoadModule mpm_prefork_module ... ... # 去掉注释 
17: # LoadModule mpm_event_module ... ... # 注释配置

# 重新启动服务 
[root@a7f9d0c3e3e2 /]# /usr/sbin/httpd -DFOREGROUND

# 服务不要关闭,在其他终端完成测试

3、验证配置

[root@docker ~]# docker cp info.php myweb:/var/www/html/
[root@docker ~]# 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

四、容器服务原理

1、上帝进程

1)、什么是上帝进程

系统创建之初产生的第一个进程

2)、特点
  • 没有父进程,PID == 1
  • 是所有程序的根进程
  • 上帝进程死亡系统实例也就关闭了

2、容器有没有上帝进程

  • 容器的启动进程就是上帝进程
  • 如果容器的启动进程关闭等同于容器关闭

3、前台服务VS后台服务

  • 前台服务是占有控制终端的进程,可以在终端与用户交互式的访问与操作,一旦终端关闭,这个进程也随之消失
  • 后台进程也叫守护进程,不受终端控制,它不需要交互;后台进程的本质是向系统托管进程服务

4、容器的启动进程能否放在后台运行

  • 容器没有操作系统,所以无法实现进程托管
  • 如果强行把容器的启动进程放后台,将导致容器直接关闭
  • 容器的启动进程必须放在前台运行

http://www.kler.cn/a/430555.html

相关文章:

  • SmartPipe完成新一轮核心算法升级
  • 【数据结构篇】时间复杂度
  • 实验六 项目二 简易信号发生器的设计与实现 (HEU)
  • Spring的AOP的JoinPoint和ProceedingJoinPoint
  • DeepSeek-R1 本地部署教程(超简版)
  • Shadow DOM举例
  • 连锁美业门店管理系统【数据分析】功能能为门店经营带来什么帮助?
  • Excel 合并工具 将文件复制到目标工作表中与操作日志记录
  • C# 异常处理全解析:让程序告别崩溃噩梦
  • 在多个分布式机器间设置和使用 NFS(Network File System)共享目录的步骤如下:
  • 家校通小程序实战教程06口令验证
  • ArrayBuffer,TypedArray,Int8Array 和Blob的关系
  • python爬虫常用数据保存模板(Excel、CSV、mysql)——scrapy中常用数据提取方法(CSS、XPATH、正则)(23)
  • EFCore PostgreSQL在.NET9生成迁移文件错误
  • 【前端】浏览器输入url到页面呈现发生了什么?
  • csrf漏洞复现
  • Copilot for Microsoft 365 Plugins 示例项目教程
  • FM25V20A-DGQ:耐用、快速、低功耗的F-RAM
  • kcat - Apache Kafka producer and consumer tool
  • 调度系统:基于 Couchbase 构建数仓 Temporal、Apache Airflow 和 DonpinScheduler 的详细比较
  • IdentityServer4框架、ASP.NET core Identity
  • ios使用UIScrollView和PageControl创建图片轮播
  • selenium学习:等待方式
  • 网络安全法-网络运行安全
  • Scala正则表达式
  • UAC2.0 speaker——带反馈端点的 USB speaker(16bit 单声道)