Linux云计算 |【第五阶段】CLOUD-DAY4
主要内容:
Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用
一、容器介绍
容器(Container) 是一种轻量级的虚拟化技术,用于在操作系统级别隔离应用程序及其依赖项。容器允许开发者在同一台主机上运行多个独立的应用程序,每个应用程序都运行在自己的容器中,互不干扰。容器技术在现代软件开发和部署中扮演着重要角色,特别是在微服务架构和持续集成/持续交付(CI/CD)流程中。
1、主要特点
轻量级:
- 容器共享主机的操作系统内核,因此比传统的虚拟机(VM)更轻量级。容器启动速度快,占用资源少。
隔离性:
- 容器提供了进程级别的隔离,确保不同容器之间的应用程序不会相互干扰。每个容器都有自己的文件系统、进程空间和网络接口。
可移植性:
- 容器封装了应用程序及其依赖项,使其可以在不同的环境中运行,无论是开发、测试还是生产环境。
一致性:
- 容器确保应用程序在不同环境中具有一致的运行环境,避免了“在我的机器上可以运行”的问题。
快速部署:
- 容器可以快速启动和停止,适合频繁的部署和扩展。
2、容器技术的核心组件
1)容器引擎(Container Engine):
负责创建、运行和管理容器的软件。最著名的容器引擎是 Docker。
2)容器镜像(Container Image):
包含应用程序及其依赖项的只读模板。容器镜像可以从容器注册表(如 Docker Hub)下载,并在容器引擎中运行。
3)容器注册表(Container Registry):
用于存储和分发容器镜像的仓库。常见的容器注册表包括 Docker Hub、Google Container Registry (GCR) 和 Amazon Elastic Container Registry (ECR)。
4)容器编排工具(Container Orchestration Tool):
用于自动化容器的部署、扩展和管理。最流行的容器编排工具是 Kubernetes。
3、Cgroup 和 NameSpace
Cgroup(Control Groups) 和 Namespace 是 Linux 内核中的两个关键技术,它们共同构成了容器技术的核心基础。Cgroup 用于资源管理和限制,而 Namespace 用于隔离和虚拟化。这两项技术使得容器能够在同一台主机上运行多个独立的应用程序,同时确保它们之间的资源隔离和安全性。
1)Cgroup(Control Groups)
Cgroup 是 Linux 内核的一个功能,用于限制、记录和隔离一组进程的资源使用(如 CPU、内存、磁盘 I/O、网络等)。Cgroup 允许系统管理员为每个容器分配特定的资源配额,从而防止某个容器过度消耗系统资源,影响其他容器的正常运行。
Cgroup 采用层次结构,类似于文件系统中的目录结构。每个 Cgroup 可以包含子 Cgroup,形成一个树状结构。每个 Cgroup 节点可以设置不同的资源限制和控制策略。
资源限制:可以为每个 Cgroup 设置资源使用上限,如 CPU 时间、内存使用量、磁盘 I/O 带宽等。
优先级控制:可以调整不同 Cgroup 之间的资源分配优先级,确保关键任务获得足够的资源。
资源统计:可以记录每个 Cgroup 的资源使用情况,用于监控和计费。
进程控制:可以对 Cgroup 中的进程进行冻结、恢复和终止操作。
2)Namespace
Namespace 是 Linux 内核的另一个重要功能,用于隔离系统资源,使得每个容器看起来像一个独立的系统。Namespace 提供了以下几种隔离机制:
PID Namespace:
- 隔离进程 ID 空间,使得每个容器有自己的进程树,进程 ID 在容器内是唯一的。
Network Namespace:
- 隔离网络资源,使得每个容器有自己的网络接口、IP 地址、路由表和防火墙规则。
Mount Namespace:
- 隔离文件系统挂载点,使得每个容器有自己的文件系统视图。
UTS Namespace:
- 隔离主机名和域名,使得每个容器可以有自己的主机名和域名。
IPC Namespace:
- 隔离进程间通信资源,使得每个容器有自己的消息队列、信号量和共享内存。
User Namespace:
- 隔离用户和用户组 ID,使得每个容器可以有自己的用户和用户组。
Cgroup Namespace:
- 隔离 Cgroup 视图,使得每个容器只能看到自己的 Cgroup 层次结构。
Cgroup 和 Namespace 共同构成了容器的核心机制:
- Namespace 提供了隔离性,使得每个容器看起来像一个独立的系统,拥有自己的进程、网络、文件系统等资源。
- Cgroup 提供了资源管理,确保每个容器在资源使用上受到限制,不会过度消耗系统资源。
通过结合这两项技术,容器可以在同一台主机上运行多个独立的应用程序,同时确保它们之间的资源隔离和安全性。
4、容器与虚拟机的区别
- 优点:
① 相比于传统的虚拟化技术,容器更加简洁高效(轻量级)
② 传统虚拟机需要给每个VM安装操作系统;
③ 容器使用的共享公共库和程序;
- 缺点:
① 容器的隔离性没有虚拟化强;
② 共用Linux内核,安全性有先天缺陷;
特性 | 容器 | 虚拟机 |
---|---|---|
隔离级别 | 进程级别隔离 | 操作系统级别隔离 |
启动时间 | 毫秒级 | 秒级到分钟级 |
资源占用 | 轻量级,共享主机内核 | 较重,每个虚拟机有自己的操作系统内核 |
性能 | 接近原生性能 | 由于虚拟化层的存在,性能略有下降 |
部署灵活性 | 快速部署和扩展 | 部署和扩展相对较慢 |
适用场景 | 微服务架构、CI/CD、开发测试环境 | 传统应用、需要完全隔离的环境 |
Docker和容器的关系:Docker是完整的一套容器管理系统,Docker提供了一组命令,让用户更加方便直接地使用容器技术,而不需要过多关心底层内核技术;
5、容器技术的应用场景
微服务架构:容器非常适合微服务架构,每个微服务可以运行在自己的容器中,实现松耦合和高可扩展性。
持续集成/持续交付(CI/CD):容器可以确保开发、测试和生产环境的一致性,加速软件交付流程。
开发测试环境:容器可以快速创建和销毁开发测试环境,提高开发效率。
多租户环境:容器可以隔离不同租户的应用程序,确保安全性和隔离性。
安装Docker示例:
配置系统环境
- ① 需要64位操作系统
- ② 至少RHEL6.5以上版本,推荐RHEL7
- ③ 关闭防火墙,因Docker软件会自动管理防火墙
步骤1:安装前准备
① 禁用SELinux,[SELINUX=disabled],模板机镜像已完成
② 卸载防火墙,[yum -y remove firewalld-*],模板机镜像已完成
③ docker软件安装包在 \kubernetes\docker 目录下,将docker目录上传到跳板机
④ 准备两台2cpu,4G内存的云主机
主机名 | IP地址 | 最低配置 |
docker-0001 | 192.168.1.31 | 2CPU,2G内存 |
docker-0002 | 192.168.1.32 | 2CPU,2G内存 |
步骤2:拷贝docker软件到跳板机的私有YUM仓库并发布(proxy操作)
[root@ecs-proxy ~]# cd kubernetes/
[root@ecs-proxy kubernetes]# cp -a docker /var/ftp/localrepo/
[root@ecs-proxy kubernetes]# cd /var/ftp/localrepo/
[root@ecs-proxy localrepo]# createrepo --update .
# 在node节点验证YUM源,并查看软件包
[root@docker-0001 ~]# yum makecache //更新缓存
[root@docker-0001 ~]# yum list docker-ce*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
docker-ce.x86_64 18.06.3.ce-3.el7 local_repo
步骤3:开启路由转发(docker-0001、docker-0002操作,以docker-0001为例)
[root@docker-0001 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@docker-0001 ~]# sysctl -p
vm.swappiness = 0
net.core.somaxconn = 1024
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.ip_forward = 1
步骤4:通过连接跳板机的YUM源,安装docker软件(版本为docker-ce)
[root@docker-0001 ~]# yum install -y docker-ce
[root@docker-0001 ~]# systemctl enable --now docker //开启服务并自动启动
[root@docker-0001 ~]# ifconfig
[root@docker-0001 ~]# docker version
二、镜像管理
镜像(Image) 是容器技术中的一个核心概念,它是一个轻量级、独立的、可执行的软件包,包含了运行应用程序所需的一切:代码、运行时、库、环境变量和配置文件。镜像是一个只读的模板,用于创建容器实例。
1、主要特点
只读性:
- 镜像是只读的,这意味着一旦创建,就不能直接修改。如果需要修改镜像,通常是通过创建一个新的镜像层来实现。
分层存储:
- 镜像采用分层存储结构,每一层代表一个文件系统的更改。这种分层结构使得镜像可以共享公共层,从而节省存储空间和网络带宽。
可移植性:
- 镜像可以在不同的环境中运行,无论是开发、测试还是生产环境。这种可移植性确保了应用程序在不同环境中的一致性。
版本控制:
- 镜像可以进行版本控制,每个版本都有一个唯一的标识符(如 SHA256 哈希值)。这使得可以轻松地回滚到之前的版本。
依赖管理:
- 镜像包含了应用程序的所有依赖项,确保应用程序在任何环境中都能正常运行。
2、镜像的组成
镜像是启动容器的核心,在Docker中容器是基于镜像启动的,镜像采用分层技术,一个镜像通常由多个层(Layer)组成,每个层代表一个文件系统的更改。最底层通常是一个基础镜像(Base Image),包含了操作系统的基本组件(如 Linux 发行版)。上层镜像可以基于基础镜像构建,添加应用程序代码、库、配置文件等。
镜像的层级结构:
1)基础镜像(Base Image):
包含操作系统的基本组件,如 Linux 发行版。
2)中间层(Intermediate Layer):
基于基础镜像构建,添加了应用程序所需的库、运行时环境等。
3)应用层(Application Layer):
包含应用程序代码、配置文件等。
3、如何获取镜像
- ① 从官方镜像仓库下载:https://hub.docker.com
- ② 构建镜像
补充:镜像通常使用 Dockerfile 来定义和构建。Dockerfile 是一个文本文件,包含了一系列指令,用于描述如何构建镜像。
# 使用官方的 Python 3.8 基础镜像
FROM python:3.8-slim# 设置工作目录
WORKDIR /app# 将当前目录下的所有文件复制到镜像的 /app 目录
COPY . /app# 安装应用程序所需的依赖项
RUN pip install --no-cache-dir -r requirements.txt# 设置环境变量
ENV PYTHONUNBUFFERED=1# 暴露应用程序的端口
EXPOSE 8000# 定义容器启动时执行的命令
CMD ["python", "app.py"]
使用 docker build 命令可以基于 Dockerfile 构建镜像:
docker build -t my-app-image .
4、docker镜像管理命令
补充:docker search 和 docker pull 、docker push都需要能访问互联网
5、镜像的名称和标签
指定镜像的方法:
- ① 每一个镜像都对应唯一的镜像id
- ② 镜像名称(文件名称) + 标签(路径) == 唯一
- ③ 每一个镜像都有标签,如果没写,默认标签为latest
- ④ 在调用镜像时,如果没指定表,默认标签也为latest
6、镜像的存储和分发
镜像通常存储在容器注册表(Container Registry)中,如 Docker Hub、Google Container Registry (GCR) 和 Amazon Elastic Container Registry (ECR)。容器注册表提供了镜像的存储、分发和管理功能。
推送镜像到注册表:
- 使用 docker push 命令可以将本地构建的镜像推送到容器注册表:
docker push my-app-image
从注册表拉取镜像:
- 使用 docker pull 命令可以从容器注册表拉取镜像:
docker pull my-app-image
镜像的运行:
- 使用 docker run 命令可以基于镜像创建并运行容器:
docker run -d -p 8000:8000 my-app-image
例如1:练习下载busybox镜像(images、search、pull)
[root@docker-0001 ~]# docker images //查看本机镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker-0001 ~]# docker search busybox //从官方仓库查找镜像(OFFICIAL官方)
[root@docker-0001 ~]# docker pull busybox //下载镜像
[root@docker-0001 ~]# docker images
例如2:备份busybox镜像并在0002上还原(save、load)
[root@docker-0001 ~]# docker save busybox:latest -o busybox.tar //备份镜像为tar包
[root@docker-0001 ~]# ls
busybox.tar
[root@docker-0001 ~]# gzip busybox.tar //压缩镜像tar包(建议压缩)
[root@docker-0001 ~]# ls
busybox.tar.gz
[root@docker-0001 ~]# scp busybox.tar.gz 192.168.1.32:/root
[root@docker-0001 ~]# ssh 192.168.1.32
[root@docker-0002 ~]# ls
busybox.tar.gz
[root@docker-0002 ~]# docker load -i busybox.tar.gz //导入备份的镜像文件
[root@docker-0002 ~]# docker images
例如3:删除镜像,不能删除已经创建容器的镜像(rmi)
[root@docker-0001 ~]# docker rmi ubuntu:latest
Untagged: ubuntu:latest
Deleted: sha256:20bb25d32758db4f91b18a9581794cfaa6a8c5fbad80093e9a9e42211e131a48
Deleted: sha256:7b2bffd1a66cacd8cd989f06cee49a1fba28c1d149806a0f7b536229270ddfd2
Deleted: sha256:80f6e37bc2041d00cbd950851c20f0f16b81b8f323290f354279a8a7b62bb985
Deleted: sha256:2069390c92947b82f9333ac82a40e3eeaa6662ae84600a9b425dd296af105469
Deleted: sha256:adcb570ae9ac70d0f46badf9ee0ecd49fbec2ae0bc26254653f99afa60046a4e
[root@docker-0001 ~]# docker images
常见报错:删除已创建容器的镜像会提示报错,必须先删除该镜像启动的所有容器
[root@docker-0001 ~]# docker rmi centos:latest
Error response from daemon: conflict: unable to remove repository reference "centos:latest" (must force) - container 63b6fb3f44e7 is using its referenced image 76d6bc25b8a5
[root@docker-0001 ~]# docker ps -a //查看所有容器[root@docker-0001 ~]# docker rm d762b7fcdb2a //删除容器
d762b7fcdb2a
[root@docker-0001 ~]# docker rm 63b6fb3f44e7 //删除容器
63b6fb3f44e7
[root@docker-0001 ~]# docker rmi centos:latest //删除镜像
Untagged: centos:latest
Deleted: sha256:76d6bc25b8a5685072a1a99d9ac7c2e52dc3070081c872034a1889ca2d4bcf8c
Deleted: sha256:bcc97fbfc9e1a709f0eb78c1da59caeb65f43dc32cd5deeb12b8c1784e5b8237
例如4:查看镜像的详细信息(inspect)
[root@docker-0001 ~]# docker inspect centos:latest
…
"Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash" //默认启动命令],
…
例如5:查看镜像的历史信息(history)
[root@docker-0001 ~]# docker history nginx:latest
例如6:给镜像添加新的名词和标签(tag)
[root@docker-0001 ~]# docker tag ubuntu:latest oo:xx
[root@docker-0001 ~]# docker images
[root@docker-0001 ~]# docker rmi oo:xx //删除镜像
Untagged: oo:xx
补充:该方式创建新镜像名:标签,类似软链接指向,且不占用磁盘空间,IMAGE ID相同,在删除时,有链接的镜像先删除链接镜像;
操作示例:
为2台node节点导入centos、nginx、redis、ubuntu四个镜像的tar.gz包 (可使用 lftp 或 scp 方法),镜像素材在云盘的 kubernetes/docker-images/ 目录下
[root@ecs-proxy docker-images]# scp centos.tar.gz nginx.tar.gz redis.tar.gz ubuntu.tar.gz 192.168.1.31:/root/
[root@ecs-proxy docker-images]# scp centos.tar.gz nginx.tar.gz redis.tar.gz ubuntu.tar.gz 192.168.1.32:/root/
# docker-0001导入并查看镜像
[root@docker-0001 ~]# docker load -i centos.tar.gz
[root@docker-0001 ~]# docker load -i nginx.tar.gz
[root@docker-0001 ~]# docker load -i redis.tar.gz
[root@docker-0001 ~]# docker load -i ubuntu.tar.gz
[root@docker-0001 ~]# docker images
# docker-0002导入并查看镜像
[root@docker-0002 ~]# docker load -i centos.tar.gz
[root@docker-0002 ~]# docker load -i nginx.tar.gz
[root@docker-0002 ~]# docker load -i redis.tar.gz
[root@docker-0002 ~]# docker load -i ubuntu.tar.gz
[root@docker-0002 ~]# docker images
三、容器管理
1、docker运行容器命令(docker run)
- - 格式:docker run -参数 镜像名称:标签 启动命令
- - docker run命令常用参数:
[ -i ] 交互式
[ -t ] 终端
[ -d ] 后台运行
[ --name ] 容器名字
补充:查看run的参数
① docker help run
② man docker-run
提示:run = 创建 + 启动 + 进入 //创建的是全新的容器,与旧容器无关
2、docker容器管理命令
使用快捷键【ctrl+pq】退出容器,且保证容器不关闭(类似Ctrl+Z)
补充:
① attach 连接的是上帝进程,直接exit退出会导致容器关闭;
- 退出attach而不关闭容器的快捷键【Ctrl+pq】
- 有些进程是无法与用户交互的,连接上帝进程不能管理容器;
- 这种方式主要用于排错;
② exec启动新的进程连接,exit退出不会导致容器关闭
- 自定义运行新的命令与上帝进程无关;
补充:上帝进程
就是系统创建之初产生的第一个进程;没有父进程,所有进程都是它的子进程;上帝进程死亡,系统实例也就不存在;
例如1:使用docker命令启动容器,通估计主机名提示符判定是否进入容器(run)
[root@docker-0001 ~]# docker run -it centos:latest /bin/bash
[root@63b6fb3f44e7 /]#
# 查看NameSpace的隔离的命名空间(UTS、MOUNT、PID、USER)
例如2:有关镜像启动命令
① 启动系统镜像(busybox、ubuntu、centos)
[root@docker-0001 ~]# docker run -it centos:latest //默认启动命令
[root@2dd4b018a107 /]# exit
exit
[root@docker-0001 ~]# docker run -it centos:latest /bin/bash //指定启动命令
[root@6a2e148fbb1e /]# exit
exit
解释:启动系统镜像时,可不指定启动命令,因系统镜像中默认封装了启动命令,可通过docker inspect 镜像名:标签 方式查看镜像的默认启动命令。
② 启动服务镜像(nginx、redis)
[root@docker-0001 ~]# docker run -it nginx:latest //启动服务镜像(挂在前台运行)
^C //退出服务[root@docker-0001 ~]# docker run -itd nginx:latest //【-d】放在后台运行
9dbf3c786a7d473249d9f01b9da58c78c9eed03c4c65708d2dd206f686f013a1 //容器id
[root@docker-0001 ~]# docker ps
[root@docker-0001 ~]# docker run -it nginx:latest /bin/bash //启动服务镜像(交互式)
root@b4541269d871:/# exit //退出容器,上帝进程也结束
exit[root@docker-0001 ~]# docker ps -a
例如4:查看容器,-a所有容器包含未启动的,-q只显示id(ps)
[root@docker-0001 ~]# docker ps //查看运行的容器
[root@docker-0001 ~]# docker ps -a //查看所有的容器
[root@docker-0001 ~]# docker ps -q //查看运行的容器,仅显示容器ID
[root@docker-0001 ~]# docker ps -aq //查看所有的容器,仅显示容器ID
例如5:删除容器(rm)
[root@docker-0001 ~]# docker rm b4541269d871 b4541269d871
例如6:启动、停止、重启容器(start、stop、restart)
[root@docker-0001 ~]# docker start 6a2e148fbb1e
[root@docker-0001 ~]# docker stop 6a2e148fbb1e
[root@docker-0001 ~]# docker restart 6a2e148fbb1e
例如7:一次性删除所有容器,Docker支持命令重入【 $() 】,原理类似管道
[root@docker-0001 ~]# docker rm $(docker ps -aq)
9dbf3c786a7d
6a2e148fbb1e
[root@docker-0001 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
例如8:把本机的repo文件拷贝到容器内(上传),并安装软件包(cp)
[root@docker-0001 ~]# docker run -it centos:latest
[root@bc4c888f69ad /]# rm -rf /etc/yum.repos.d/*
[root@bc4c888f69ad /]# ls /etc/yum.repos.d/
# 使用ctrl+pq 快捷键退出,则可保证容器不关闭
[root@docker-0001 ~]# docker cp /etc/yum.repos.d/CentOS-Base.repo bc4c888f69ad:/etc/yum.repos.d/ //上传到容器
[root@docker-0001 ~]# docker exec -it bc4c888f69ad /bin/bash //进入容器
[root@bc4c888f69ad /]# ls /etc/yum.repos.d/
CentOS-Base.repo
[root@bc4c888f69ad /]# yum -y install net-tools bash-completion //安装软件包
[root@bc4c888f69ad /]# ifconfig
例如9:把容器内的文件拷贝到本机(下载)(cp)
[root@docker-0001 ~]# docker exec -it bc4c888f69ad /bin/bash //进入容器
[root@bc4c888f69ad /]# ls /root/
anaconda-ks.cfg
[root@bc4c888f69ad /]# exit //exec进入容器再exit退出时,容器不会关闭
exit
[root@docker-0001 ~]# docker cp bc4c888f69ad:/root/anaconda-ks.cfg /tmp/ //下载到本地
[root@docker-0001 ~]# ls /tmp/ | grep anaconda
anaconda-ks.cfg
例如10:查看容器详细信息(inspect),与查看容器详细信息相同
[root@docker-0001 ~]# docker inspect bc4c888f69ad
…"IPAddress": "172.17.0.2",
…
例如11:进入容器的默认进程(上帝进程),退出后容器会关闭(attach)
[root@docker-0001 ~]# docker attach bc4c888f69ad
[root@bc4c888f69ad /]# echo $$ //进入容器的默认进程
1
[root@bc4c888f69ad /]# exit //退出后容器会关闭
exit
补充:使用exit退出,直接Kill了上帝进程,使用ctrl+pq 快捷键退出,则可保证容器不关闭
例如12:进入容器新的进程,退出后容器不会关闭(exec)
[root@docker-0001 ~]# docker exec -it bc4c888f69ad /bin/bash
[root@bc4c888f69ad /]# echo $$ //进入容器的新进程
62
[root@bc4c888f69ad /]# exit //退出后容器不会关闭
exit
— 示例:使用exec进入nginx服务镜像容器,修改网页页面,并完成访问;
[root@docker-0001 ~]# docker start b7062b16edc8
b7062b16edc8
[root@docker-0001 ~]# docker exec -it b7062b16edc8 /bin/bash
root@b7062b16edc8:/# cd /usr/share/nginx/html/
root@b7062b16edc8:/usr/share/nginx/html# echo "Hello world" > index.html
root@b7062b16edc8:/usr/share/nginx/html# exit
exit //直接可以退出容器,不影响进程运行
[root@docker-0001 ~]# docker inspect b7062b16edc8 //查看镜像详细信息
…"IPAddress": "172.17.0.3",
…
[root@docker-0001 ~]# curl http://172.17.0.3
Hello world
— 示例:使用attach进入nginx服务镜像容器,实时查看状态页面
[root@docker-0001 ~]# docker attach b7062b16edc8 //进入容器,等待状态页面变化
# 不要退出终端,在另一个终端测试访问不存在页面;
[root@docker-0001 ~]# curl http://172.17.0.3/abc.html
# 再次返回查看容器状态变化;
容器内部署应用示例:
① 清理所有已存在的容器
[root@docker-0001 ~]# docker stop $(docker ps -aq)
bc4c888f69ad
[root@docker-0001 ~]# docker rm $(docker ps -qa)
bc4c888f69ad
[root@docker-0001 ~]# docker ps -a //未有多余的容器
② 运行一个centos镜像的容器,并命名为myapache;
[root@docker-0001 ~]# docker run -it --name myapache centos:latest
[root@18139799502e /]# rm -f /etc/yum.repos.d/*.repo
[root@18139799502e /]# ls /etc/yum.repos.d/
# 不要退出该终端,在另一个终端拷贝yum配置文件到容器
[root@docker-0001 ~]# docker cp /etc/yum.repos.d/CentOS-Base.repo myapache:/etc/yum.repos.d/
# 返回创建容器的终端继续执行命令
[root@18139799502e /]# ls /etc/yum.repos.d/
CentOS-Base.repo
③ 安装软件包及编写网页文件
[root@18139799502e /]# yum -y install httpd //安装软件包
[root@18139799502e /]# echo "Hello My World" > /var/www/html/index.html //编写网页文件
[root@18139799502e /]# cat /var/www/html/index.html
Hello My World
注意:由于systemd就是上帝进程,而进入容器后自己本身就是上帝进程,但systemctl是由上帝进程调用来执行服务,所以此次示例需要人为手动到service找到对应
[root@18139799502e /]# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted
[root@18139799502e /]# echo $$
1 //容器的启动进程就是上帝进程,PID=1
提示1:systemd启动服务是通过服务的service文件方式启动
[root@18139799502e /]# rpm -ql httpd | grep service
/usr/lib/systemd/system/httpd.service
[root@18139799502e /]# cat /usr/lib/systemd/system/httpd.service
提示2:$OPTIONS环境变量,在/etc/sysconfig/httpd文件中,其中$OPTIONS为空,下方定义了一个LANG=C系统语言;(Apache启动需基于ASCALL编码语言,则不会导致乱码)
[root@18139799502e /]# cat /etc/sysconfig/httpd
④ 启动HTTPD服务
[root@18139799502e /]# LANG=C
[root@18139799502e /]# /usr/sbin/httpd -DFOREGROUND
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
# 启动服务以后,Ctrl+pq退出容器
[root@docker-0001 ~]# docker inspect myapache
…"IPAddress": "172.17.0.2",
…
[root@docker-0001 ~]# curl http://172.17.0.2
Hello My World
思维导图:
小结:
本篇章节为【第五阶段】CLOUD-DAY4 的学习笔记,这篇笔记可以初步了解到 Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用,除此之外推荐参考相关学习网址:
- docker-ce-linux-centos安装包下载_开源镜像站-阿里云
- Docker Dockerfile | 菜鸟教程
- Docker 教程 | 菜鸟教程
- 史上讲解最好的 Docker 教程,从入门到精通(建议收藏的教程)-腾讯云开发者社区-腾讯云
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。
相关文章:

Linux云计算 |【第五阶段】CLOUD-DAY4
主要内容: Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用 一、容器介绍 容器(Container) 是一种轻量级的虚拟化技术,用于在操作系统级别隔离应用程序及其依赖项。容器允许开发者在同一台主机上运行多个独立的应…...

为什么QNAP威联通NAS的APP center无法安装APP?
创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 如题,大王带你一起来排查一下,可能遇到的问题。如有帮助,请给个关注鼓励,互谢~ 1 首先,安装…...

Kafka 基础入门
文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …...
网络问题排查
1.ping 域名发现响应时间很长,怎么分析卡在哪里? 当你在 Linux 系统中 ping 一个域名并发现响应时间很长时,可能存在于多个环节的问题。以下是一些步骤和工具,可以帮助你分析和诊断问题出在哪里: 1. 检查 DNS 解析时…...

webGlL变量的声明与使用
抢先观看: 变量的声明格式:<存储限定符><类型限定符><变量名> 存储限定符:const, attribute, uniform, varying, buffer。 类型限定符:void, bool, int, float, double, vec2, vec3, vec4, mat2, mat3, mat4, s…...

qt的c++环境配置和c++基础【正点原子】嵌入式Qt5 C++开发视频
QT c 环境配置和c基础 c环境配置和工程创建 1.配置步骤 2.新建qt 工程目录和工程 3.重启qt后打开最近的qt项目 c基础-类和对象 1.什么是类和对象 A.类的定义 B.类的结构表示 C.类的访问权限 D.对象的定义 E.类和对象的关系 2.类…...

中间件安全(三)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞(cve_2021_41773)。 靶场链接:Vulfocus 漏洞威胁分析平台 一,漏洞简介。 cve_2021_41773漏洞…...

唱戏机上的内存卡怎么加密?教你两个方法
唱戏机是中老年人群休闲时光的好伴侣。然而,很多唱戏机商家都会面临一个困扰:如何保护唱戏机上内存卡中的音频,避免他人随意复制呢?今天这篇文章看完,问题将迎刃而解~ 数据隐藏 将内存卡插到电脑上,对卡里…...

MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler
MyBatis的SQL执行过程 在前面一系列的文档中,我已经分析了 MyBatis 的基础支持层以及整个的初始化过程,此时 MyBatis 已经处于就绪状态了,等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程,该过程比较复杂ÿ…...
webpack解决使用window.open方法打开history路由页面提示404的问题
问题: 一般情况下应该使用history.push(/ssh)打开history路由页面 但项目中使用window.open(/ssh),然后使用new WebSocket进行通信 开发环境下启动项目后,/ssh页面打开却显示cannot get /ssh,控制台提示404 排查问题: 在React开发环境中使用 window.open 打开路由页面时&a…...

怎么把视频的声音转化为文字免费?7个小妙招,视频转文字轻松解决!
您是否也曾在做会议记录时,希望能免费把视频的声音转化为文字呢?在如今我们的办公生活中,用视频记录会议、记录的生活似乎已经成为了我们一项必备技能,但也并非所有人都能轻松获取视频中的信息。尤其是有着听力障碍的人群…...

【无标题】2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题
2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题已发布~,本届初赛时间为:2024年10月25日18:00至2024年11月1日20:00。本次赛题分为A,B两道,所有参赛队从赛道 A、B 中任选一题作答。在报名系统内选择自己队伍的赛道时&am…...

新能源行业必会基础知识---电力现货问答---第9问---什么是输电权?什么是输电权市场?
新能源行业必会基础知识-----电力现货问答-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/142909208 虽然这本书已经出来有几年了,现货市场已经产生了一定变化,但是原理还是相通的。还是推荐大家买来这本书进行阅读观看&#…...

视频文案素材获取渠道分享
做视频时为文案发愁?别担心!今天为大家推荐几个实用的视频文案素材网站,让你灵感爆棚,轻松创作文案。 蛙学网 首先要推荐的是蛙学网。作为专业短视频素材库,不仅有修牛蹄、解压视频等热门素材,还为短视频创…...

尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记
#1024程序员节|征文# public/index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>redux</title></head><body><div id"root"></div></body> </html&…...
VB中如何创建和使用自定义控件
在Visual Basic(VB)中,创建和使用自定义控件是一个高级功能,它允许开发者根据特定需求创建具有独特行为和外观的控件。以下是在VB中创建和使用自定义控件的一般步骤: 一、创建自定义控件 打开VB开发环境: …...
Java继承的super关键字
在Java中,super关键字用于调用父类的构造方法、访问父类的成员变量和成员方法。 调用父类的构造方法: 在子类的构造方法中,可以使用super关键字来调用父类的构造方法。这可以帮助子类初始化从父类继承的属性。调用父类的构造方法要使用以下语…...
3D点云与2D图像的相互转换:2D图像对应像素的坐标 转为3D空间的对应坐标
2d ----> 3d 对应像素到空间坐标的转换 参考:深度相机,通过2d检测得到目标坐标系的3d检测框_深度图到相机坐标-CSDN博客...
查找算法简记
一、简单查找(顺序查找) 最基本的查找,相当于遍历,从头到尾一个一个找。 二、二分查找 1、简述 二分查找的输入是一个有序的元素列表。 如果要查找的元素包含在列表中,二分查找返回其位置; 否则返回null。…...

算法竞赛(Python)-状态间的奇妙转移(动态规划)
文章目录 一、初探动态规划1 拼图游戏(从搜索到动态规划)2 物流仓库——状态的转移 二、状态的巧妙定义1 不同的状态和转移2 流浪猫的家——状态压缩与状态剪枝 三 转移方式的神奇优化1 运输计划——在转移中剪枝2 会议安排——在决策中剪枝 三、经典的动…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...