Linux云计算 |【第五阶段】CLOUD-DAY4

news2024/10/29 0:06:55

主要内容:

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:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MaskGCT,AI语音克隆大模型本地部署(Windows11),基于Python3.11,TTS,文字转语音

前几天,又一款非自回归的文字转语音的AI模型:MaskGCT,开放了源码,和同样非自回归的F5-TTS模型一样,MaskGCT模型也是基于10万小时数据集Emilia训练而来的,精通中英日韩法德6种语言的跨语种合成。数据集Emili…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类:物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一,连续图像和离散图像的概念 二,图像的采样 1, 不同采样频率采样同一张图…

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测

SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测 目录 SSA-CNN-LSTM-MATT多头注意力机制多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-CNN-LSTM-MATT麻雀算法优化卷积神经网络-长短期记忆神经网络融合多头注意力机制多特征分类预测&…

ComfyUI - 视觉基础任务 检测(Detection) 和 分割(Segmentation) 的 Impact-Pack 流程 教程

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/141140498 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 在 Com…

【音视频 | ADPCM】音频编码ADPCM详细介绍及例子

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

租房市场新动力:基于Spring Boot的管理系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

深入理解数据链路层:以太网帧格式、MAC地址、交换机、MTU及ARP协议详解与ARP欺骗探究

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 目录 数据链路层 认识以太网以太网帧格式 认识 MAC 地址交换机与碰撞域的划分认识 MTUMTU 对 IP 协议的影响MTU 对 UDP 协议的影响 MTU 对…

SolidWorks 导出 URDF 中的惯性矩阵错误问题

系列文章目录 前言 一、 dsubhasish09于2021年5月23日发表评论 在装配体中定义由多个零件组成的 link 时,单个零件质心处各自的惯性值(在使用相似性变换使其与关节坐标系平行后)会直接相加,从而得到净惯性矩阵,而不是…

使用linuxdeployqt打包Qt程序问题及解决方法

dpkg: 处理归档 libmysqlclient18_5.6.25-0ubuntu1_amd64.deb (--install)时出错: 预依赖问题 - 将不安装libmysqlclient18:amd64 在处理时有错误发生: libmysqlclient18_5.6.25-0ubuntu1_amd64.deb下载libmysqlclient18/5.6.25 libmysqlclient18/5.6.25-0ubuntu1 安装 s…

如何把图片转换成pdf?这几种转换方法看了就能学会!

如何把图片转换成pdf?在当今这个高度数字化的世界里,图片文件和PDF文件无疑是我们日常生活中最常接触到的两种文件格式,它们各自拥有独特的特性和功能,为我们的工作与生活带来了诸多便利,图片文件,以其卓越…

Android Activity SingleTop启动模式使用场景

通知栏 当用户点击通知栏中的通知时,可以使用单顶启动模式来打开对应的活动,并确保只有一个实例存在。 简单集成极光推送 创建应用 获取appkey参数 切换到极光工作台 极光sdk集成 Project 根目录的主 gradle 配置 Module 的 gradle 配置 Jpush依赖配置 配置推送必须…

乐维网管平台(一):如何精准掌控 IP 管理

业网络已成为支撑业务运转的关键基础设施,而在企业网络管理中,IP 管理至关重要,它就像是网络秩序的守护者,确保网络的高效运行、安全可靠。 一、为什么企业要进行 IP 管理 1. 优化资源分配 IP 地址作为网络中的重要资源&#xf…

c++数据结构算法复习基础--7--线性表-队列-常用操作接口-复杂度分析

1、队列 特点:先进先出,后进后出 环形队列(依赖数组实现,单必须实现环形) 链式队列(依赖链表实现) 2、环形队列 理论 常规数组思想随着队列的不断使用,会出现越界 所以要将其…

拍拍贷鸿蒙版H5容器之路

背景介绍 业务背景 2024年1月18日华为宣布:HarmonyOS NEXT 将不再支持 Android系统,基于以上背景及国内信贷业务现状,公司决定启动借款App鸿蒙化项目。 下图是2024年6月华为HDC大会上,华为宣布 HarmonyOS NEXT 将面向开发者和先…

Cisco Packet Tracer 8.0 路由器的基本配置和Telnet设置

文章目录 构建拓扑图配置IP地址配置路由器命令说明测试效果 构建拓扑图 1,添加2811路由器。 2,添加pc0。 3,使用交叉线连接路由器和pc(注意线路端口)。 4,使用配置线连接路由器和pc(注意线路…

IT监控对接华三CAS云管平台监控方案

概述 CAS云管平台是新华三集团自主研发的虚拟化和云计算管理平台,它主要面向数据中心,提供虚拟化和云计算管理,在教育行业、网络安全领域、高性能计算业务、企业IT部门等领域被广泛应用。在信创国产化背景下,以CAS、Fusion等为代…

rtp协议:rtcp包格式和传输间隔

RTP Control Protocol -- RTCP-rtp控制协议 实时传输控制协议(RTCP)基于对会话中的所有参与者定期传输控制包,使用与数据包相同的分发机制。底层协议必须提供数据包和控制包的多路复用,例如使用UDP时使用不同的端口号。RTCP执行四…

LLMs 入门实战系列大全:LLMs应用、领域大模型介绍、大模型常见面经汇总

1. 常见大模型介绍 1.1 ChatGLM-6B 系列 ChatGLM2-6B [【ChatGLM2-6B 入门】清华大学开源中文版 ChatGLM-6B 模型学习与实战] 更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目…

sa-token 所有的异常都是未登录异常的问题

在使用satoken的时候,有这么一个问题,就是不管我是什么错误,都会弹出未登录异常,起初的时候我以为satoken的拦截器会拦截所有的异常,但是今后测试才发现忽略了一点,也是最重要最容易忽视的一点。 如果我现在…

动态规划 —— 路径问题-不同路径

1. 不同路径 题目链接: 62. 不同路径 - 力扣(LeetCode)https://leetcode.cn/problems/unique-paths/description/ 2. 算法原理 1. 状态表示:以莫一个位置为结尾 dp[i]表示:以[i,j]位置为结尾时&#xff0…