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操作)

bash 复制代码
[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源,并查看软件包

bash 复制代码
[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为例)

bash 复制代码
[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)

bash 复制代码
[root@docker-0001 ~]# yum install -y docker-ce
[root@docker-0001 ~]# systemctl enable --now docker   //开启服务并自动启动
[root@docker-0001 ~]# ifconfig
bash 复制代码
[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、如何获取镜像

补充:镜像通常使用 Dockerfile 来定义和构建。Dockerfile 是一个文本文件,包含了一系列指令,用于描述如何构建镜像。

bash 复制代码
# 使用官方的 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)

bash 复制代码
[root@docker-0001 ~]# docker images    //查看本机镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
[root@docker-0001 ~]# docker search busybox   //从官方仓库查找镜像(OFFICIAL官方)
bash 复制代码
[root@docker-0001 ~]# docker pull busybox    //下载镜像
[root@docker-0001 ~]# docker images

例如2:备份busybox镜像并在0002上还原(save、load)

bash 复制代码
[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)

bash 复制代码
[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

**常见报错:**删除已创建容器的镜像会提示报错,必须先删除该镜像启动的所有容器

bash 复制代码
[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)

bash 复制代码
[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)

bash 复制代码
[root@docker-0001 ~]# docker history nginx:latest

例如6:给镜像添加新的名词和标签(tag)

bash 复制代码
[root@docker-0001 ~]# docker tag ubuntu:latest oo:xx
[root@docker-0001 ~]# docker images
bash 复制代码
[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/ 目录下

bash 复制代码
[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导入并查看镜像

bash 复制代码
[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导入并查看镜像

bash 复制代码
[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)

bash 复制代码
[root@docker-0001 ~]# docker run -it centos:latest /bin/bash
[root@63b6fb3f44e7 /]#

查看NameSpace的隔离的命名空间(UTS、MOUNT、PID、USER)

例如2:有关镜像启动命令

① 启动系统镜像(busybox、ubuntu、centos)

bash 复制代码
[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)

bash 复制代码
[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
bash 复制代码
[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)

bash 复制代码
[root@docker-0001 ~]# docker ps      //查看运行的容器
bash 复制代码
[root@docker-0001 ~]# docker ps -a //查看所有的容器
bash 复制代码
[root@docker-0001 ~]# docker ps -q //查看运行的容器,仅显示容器ID
bash 复制代码
[root@docker-0001 ~]# docker ps -aq //查看所有的容器,仅显示容器ID

例如5:删除容器(rm)

bash 复制代码
[root@docker-0001 ~]# docker rm b4541269d871 b4541269d871

例如6:启动、停止、重启容器(start、stop、restart)

bash 复制代码
[root@docker-0001 ~]# docker start 6a2e148fbb1e
[root@docker-0001 ~]# docker stop 6a2e148fbb1e
[root@docker-0001 ~]# docker restart 6a2e148fbb1e

例如7:一次性删除所有容器,Docker支持命令重入【 $() 】,原理类似管道

bash 复制代码
[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)

bash 复制代码
[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 快捷键退出,则可保证容器不关闭

bash 复制代码
[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)

bash 复制代码
[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),与查看容器详细信息相同

bash 复制代码
[root@docker-0001 ~]# docker inspect bc4c888f69ad
...
           "IPAddress": "172.17.0.2",
...

例如11:进入容器的默认进程(上帝进程),退出后容器会关闭(attach)

bash 复制代码
[root@docker-0001 ~]# docker attach bc4c888f69ad
[root@bc4c888f69ad /]# echo $$    //进入容器的默认进程
1
[root@bc4c888f69ad /]# exit    //退出后容器会关闭
exit

补充:使用exit退出,直接Kill了上帝进程,使用ctrl+pq 快捷键退出,则可保证容器不关闭

例如12:进入容器新的进程,退出后容器不会关闭(exec)

bash 复制代码
[root@docker-0001 ~]# docker exec -it bc4c888f69ad /bin/bash
[root@bc4c888f69ad /]# echo $$   //进入容器的新进程
62
[root@bc4c888f69ad /]# exit    //退出后容器不会关闭
exit

--- 示例:使用exec进入nginx服务镜像容器,修改网页页面,并完成访问;

bash 复制代码
[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服务镜像容器,实时查看状态页面

bash 复制代码
[root@docker-0001 ~]# docker attach b7062b16edc8    //进入容器,等待状态页面变化
 

不要退出终端,在另一个终端测试访问不存在页面;

bash 复制代码
[root@docker-0001 ~]# curl http://172.17.0.3/abc.html

再次返回查看容器状态变化;


容器内部署应用示例:

① 清理所有已存在的容器

bash 复制代码
[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;

bash 复制代码
[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配置文件到容器

bash 复制代码
[root@docker-0001 ~]# docker cp /etc/yum.repos.d/CentOS-Base.repo myapache:/etc/yum.repos.d/

返回创建容器的终端继续执行命令

bash 复制代码
[root@18139799502e /]# ls /etc/yum.repos.d/
CentOS-Base.repo

③ 安装软件包及编写网页文件

bash 复制代码
[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找到对应

bash 复制代码
[root@18139799502e /]# systemctl start httpd
Failed to get D-Bus connection: Operation not permitted
[root@18139799502e /]# echo $$
1     //容器的启动进程就是上帝进程,PID=1

提示1:systemd启动服务是通过服务的service文件方式启动

bash 复制代码
[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编码语言,则不会导致乱码)

bash 复制代码
[root@18139799502e /]# cat /etc/sysconfig/httpd

④ 启动HTTPD服务

bash 复制代码
[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退出容器

bash 复制代码
[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、镜像管理、容器管理、容器部署应用,除此之外推荐参考相关学习网址:


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

相关推荐
墨北x16 分钟前
2025 年福建省职业院校技能大赛网络建设与运维赛项Linux赛题解析
linux·运维·服务器
码农000000117 分钟前
Linux开启3306端口,开启远程连接
linux·运维·服务器
深圳安锐科技有限公司38 分钟前
高速边坡监测成本高?自动化如何用精准数据省预算?
运维·自动化
污斑兔40 分钟前
在Mac环境下搭建Docker环境的全攻略
docker
孤寂大仙v1 小时前
【Linux笔记】——进程信号的保存
java·linux·笔记
Clockwiseee1 小时前
SSTI记录
运维·服务器·redis·学习
Huazzi.1 小时前
使用SSH协议克隆详细步骤
linux·运维·学习·ssh·编程
Christal_pyy1 小时前
树莓派4基于Debian GNU/Linux 12 (Bookworm)开启VNC,使用MobaXterm连接VNC出现黑屏/灰屏问题
linux·运维·debian
珹洺1 小时前
Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载
linux·运维·服务器
modest —YBW1 小时前
Ollama+OpenWebUI+docker完整版部署,附带软件下载链接,配置+中文汉化+docker源,适合内网部署,可以局域网使用
人工智能·windows·docker·语言模型·llama