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

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


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

相关文章:

  • 刷新页面一次,错误地进行了多次重复调用后端服务
  • 仓颉语言实战——1. 类型
  • Spring5.1.3 @Autorwired注解原理重新回顾
  • TF-IDF(Term Frequency-Inverse Document Frequency)详解:原理和python实现(中英双语)
  • 代码随想录Day56 108. 冗余连接,109. 冗余连接II。
  • Pinpoint 是一个开源的分布式追踪系统
  • 基于阿里云服务的移动应用日志管理方案—日志的上传、下载、存档等
  • JS补原型链
  • h5小游戏5--杀死国王(附源码)
  • three.js 纹理(Texture)、深度纹理(DepthTexture)、视频纹理(VideoTexture)
  • Flutter主题最佳实践
  • 力扣1381:设计一个支持增量操作的栈
  • 【快速小项目】蛋糕商城首页展示
  • 大数据-193 Apache Tez - DAG 作业计算框架 核心解释 工作原理 配置集成
  • 力扣91~95题
  • Android 获取OAID
  • [BUG]warn(f“Failed to load image Python extension: {e}“)的解决办法
  • linux服务器LAMP的搭建
  • 深入理解Linux内核网络(九):容器网络虚拟化
  • 国标GB28181摄像机接入EasyGBS国标GB28181视频平台的亮点深入分析
  • ubantu系统之实现Ubuntu与Windows之间的复制粘贴
  • 计算机低能儿从0刷leetcode | 31.下一个排列
  • 重学SpringBoot3-Spring WebFlux之HttpHandler和HttpServer
  • Flux-IP-Adapter-V2版本发布,效果实测!是惊喜还是意外?
  • 【PythonWeb开发】Flask-RESTful风格编程
  • itertools模块的combinations很牛