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