3、容器基础与Docker入门指南
容器基础与Docker入门指南
1. 容器与虚拟机对比
在资源使用方面,容器和虚拟机有着显著的差异。在数据库中,单个数据库里的多个模式(schemas)会共享数据字典。添加模式不会增加后台进程数量或内存使用量,唯一受影响的系统资源是元数据和新对象所需的存储空间。同样,容器在主机内核和环境中共享资源,通过减少或消除重复文件,并与主机操作系统共享管理进程,从而占用更小的空间。
虚拟机则如同为应用中的每个模式运行独立的数据库,每个都有自己的管理、撤销和临时表空间、内存结构、后台进程等。这使得虚拟机相对“沉重”,而容器则被称为“轻量级”。
| 对比项 | 容器 | 虚拟机 |
|---|---|---|
| 资源占用 | 共享主机资源,占用小 | 每个有独立资源,占用大 |
| 启动速度 | 快,无需启动操作系统 | 慢,需启动操作系统 |
| 应用场景 | 适合快速部署和扩展 | 适合需要完整操作系统环境的场景 |
2. 容器相关概念和术语
2.1 镜像(Images)
镜像是用于启动和运行容器的文件包,类似于Vagrant盒子、VirtualBox镜像,对于熟悉Oracle多租户架构的人来说,也可将其视为种子数据库。镜像具有以下特性:
- 标签(Tags) :通常用于标识仓库中镜像的版本。仓库是相关镜像的集合,如Linux或Python镜像。标签与仓库名结合,形成易读的镜像名,格式为 repository-name:tag 。有一个特殊标签 latest ,可引用镜像的当前工作版本。需要注意的是,标签是任意约定,并非绝对标识符。构建镜像会生成唯一的SHA256哈希值,用于识别镜像是否相同。
- 可移植性(Portable) :Docker镜像具有可移植性,可在任何运行Docker或兼容容器运行时的系统上运行,包括Podman、LXC等替代方案以及云供应商提供的容器服务。这种可移植性不仅保证了兼容性,还确保用户在每个平台上有相同的体验。
- 不可变性(Immutable)和无状态性(Stateless) :镜像不可更改,若修改并保存为新镜像,其哈希值会改变。不可变性保证了在多个环境中共享的镜像相同,无状态性确保每个镜像从相同起点开始并产生相同结果。
2.2 容器(Containers)
容器是通过“运行”镜像创建的,用于执行工作。从主机角度看,容器像系统上的单个进程;但在容器内部,环境看起来像一个完整的主机,有文件系统、进程、用户和网络。容器具有以下特性:
- 有状态性(Stateful) :容器的状态会被保留,停止和重启容器(或其主机)时不会丢失数据。在容器文件系统上添加和修改的文件和内容会在停止 - 启动周期中持续存在,而删除的目录和文件不会重新出现。
- 临时性(Ephemeral) :通常容器完成工作后会消失,一般被视为临时进程。但实际上,容器不会过期,可以运行数天、数月甚至数年。
容器使用主机的CPU、内存和存储资源,Docker提供了管理和限制单个容器及Docker运行时资源使用的方法。此外,容器还可与主机进行其他交互,如访问本地存储和暴露网络连接。
3. 容器的资源交互
3.1 卷(Volumes)
卷是一种在本地主机和容器之间共享文件系统的机制,可将数据与软件分离。卷类似于主机和容器都可见的NFS文件系统,允许访问高性能和弹性设备以及共享数据。它简化了一些操作活动,例如:
- 补丁和升级 :停止并移除运行的容器,用升级后的版本替换,运行升级后步骤,然后启动数据库。
- 移动和迁移 :容器具有可移植性,可在任何兼容环境中运行,方便将数据和数据库迁移到新的本地主机或云环境。
- 克隆数据库 :分离数据和软件后,克隆数据库只需复制数据卷并启动引用该数据位置的新容器。
- 创建参考数据集 :为QA和开发团队创建数据的黄金镜像,停止容器、更换数据并重启,或删除并使用新数据集重新创建容器,以确保团队使用干净、一致的数据进行测试。
移除容器会删除其数据,除非数据存储在卷上。将数据和配置文件存储在卷上可使数据独立于容器存在。
3.2 网络(Networking)
容器默认隔离运行,连接仅限于主机上的特权用户。不过,Docker可以将容器的端口暴露并映射到本地主机,应用程序、用户和其他容器可通过主机上的映射端口访问容器。只有在镜像中故意打开的端口才能进行映射,例如Oracle的Docker镜像暴露了端口1521和5500。
4. 其他相关术语
4.1 运行时(Runtimes)
容器运行时包含构建、管理和运行容器的一系列功能。Windows和Mac用户可使用Docker Desktop,Linux用户可使用Docker Engine,它们可从www.docker.com免费下载。运行时提供了管理和使用容器的命令集,大多数Docker命令以 docker 开头,后跟关键字和一个或多个标志来设置选项。运行时会连接到仓库,当用户执行 docker run ubuntu 命令时,运行时会在仓库中搜索名为 ubuntu 的认证镜像并自动下载。
4.2 Docker文件(Dockerfiles)
Docker文件是用于填充镜像文件的指令集或代码。它运行命令并调用脚本以安装和配置最终镜像,还定义了运行该镜像的容器的环境,包括变量、端口和映射到主机资源的目录。此外,Docker文件还决定了容器启动时运行的脚本,并定义了报告容器健康状况的检查。
5. Docker命令行基础
5.1 命令概述
Docker命令行指令以 docker 关键字开头,命令列表相对简短,且大多含义明确。例如, docker start 启动容器, docker logs 显示容器日志, docker run 运行容器等。一些Docker命令源于Unix/Linux的文件和进程管理命令,对于Windows用户可能不太直观。
5.2 运行第一个容器
在运行Oracle数据库之前,我们可以使用Ubuntu这个流行的Linux发行版来了解Docker的基本操作。
- 列出镜像 :在安装了Docker Desktop的计算机上打开shell会话,运行 docker images 命令,输出会显示标题但没有容器信息,这表明系统上没有镜像。
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
- 运行容器 :即使系统上没有镜像,也可以尝试运行Ubuntu Linux容器,执行
docker run -it ubuntu命令。
> docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50
ae288f3322
Status: Downloaded newer image for ubuntu:latest
root@4a9ddd43e0e2:/#
该命令执行过程如下:
1. Docker在本地找不到Ubuntu镜像。
2. 由于本地没有镜像源,它会从仓库“拉取”或下载镜像。
3. Docker报告拉取的镜像的哈希值和状态。
4. 显示一个命令提示符。
整个过程只需要几秒钟。
通过以上步骤,我们对容器和Docker有了更深入的了解,包括容器与虚拟机的对比、镜像和容器的特性、容器的资源交互以及Docker命令行的基本操作。后续我们可以进一步探索如何使用这些知识来构建和管理容器化应用。
容器基础与Docker入门指南(续)
6. 操作流程总结
为了更清晰地了解使用Docker运行容器的流程,下面用mermaid流程图展示整个过程:
graph LR
A[开始] --> B[检查本地镜像]
B -->|有镜像| C[运行容器]
B -->|无镜像| D[从仓库拉取镜像]
D --> C
C --> E[容器运行]
E --> F[执行操作(如数据处理等)]
F --> G[停止容器]
G --> H[是否需要保存数据]
H -->|是| I[使用卷保存数据]
H -->|否| J[移除容器]
I --> K[结束]
J --> K
7. 注意事项与常见问题
在使用容器和Docker的过程中,有一些注意事项和常见问题需要关注:
- 镜像管理 :
- 定期清理不再使用的镜像,以节省磁盘空间。可以使用 docker image prune 命令清理未使用的镜像。
- 注意镜像的版本管理,使用标签来准确区分不同版本的镜像。
- 容器状态 :
- 理解容器的有状态性和临时性,对于需要持久化数据的应用,务必使用卷来保存数据。
- 当容器出现异常停止时,查看容器日志(使用 docker logs 命令)来排查问题。
- 网络配置 :
- 确保映射的端口在主机上未被其他应用占用,避免端口冲突。
- 对于生产环境,考虑使用更安全和高效的网络解决方案,如Docker Compose和Kubernetes提供的网络管理功能。
8. 实际应用案例
以下是一个简单的实际应用案例,展示如何使用Docker容器运行一个简单的Web应用:
1. 准备Dockerfile :
# 使用基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制应用文件到容器
COPY . .
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口
EXPOSE 5000
# 运行应用
CMD ["python", "app.py"]
- 编写应用代码(假设是一个简单的Flask应用) :
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
- 构建镜像 :
在包含Dockerfile和应用代码的目录下,执行以下命令构建镜像:
docker build -t my-web-app:latest .
- 运行容器 :
docker run -d -p 5000:5000 my-web-app:latest
此时,在浏览器中访问 http://localhost:5000 ,就可以看到 Hello, Docker! 的输出。
9. 总结
通过前面的介绍,我们全面了解了容器和Docker的相关知识:
- 资源使用 :容器在资源共享方面比虚拟机更高效,占用空间小,启动速度快。
- 概念特性 :镜像具有可移植性、不可变性和无状态性,而容器具有有状态性和临时性。
- 资源交互 :卷用于数据持久化,网络用于容器与外部的通信。
- 命令操作 :掌握了基本的Docker命令行操作,如列出镜像、运行容器等。
在实际应用中,我们可以根据具体需求选择合适的容器和镜像,合理配置资源,利用卷和网络功能来构建和管理容器化应用。同时,要注意镜像和容器的管理,及时处理常见问题,以确保应用的稳定运行。
总之,容器和Docker为我们提供了一种高效、灵活的应用部署和管理方式,能够帮助我们更好地应对现代应用开发和运维的挑战。希望通过本文的介绍,你能对容器和Docker有更深入的理解,并在实际工作中熟练运用这些技术。
更多推荐


所有评论(0)