大家好,我是升仔
Docker镜像和容器的主要区别在于它们的角色和功能:
1、静态与动态: Docker镜像是一个静态的文件,它包含了运行容器所需的代码、库、环境变量和配置文件。而容器是镜像的运行实例,是一个动态的概念。
2、不可变性与可变性: 镜像是不可变的,一旦创建,内容不会改变。容器则在镜像的基础上创建,它在运行时可以改变状态,可以在其上进行读写操作。
3、构建与执行: 镜像是通过Dockerfile构建的,它定义了环境和应用的构建步骤。而容器是通过运行镜像来创建的,提供一个隔离的环境来运行应用。
4、存储与层级: 镜像使用分层存储,每一层只读,共享相同的层。容器在镜像的最上层添加一个可写层。
5、重用性与独立性: 同一镜像可以创建多个容器,实现高效的重用。每个容器都是独立的,拥有自己的运行环境和资源。
创建Docker镜像的过程通常遵循以下步骤:
1、编写Dockerfile: Dockerfile是一个文本文件,包含了创建镜像所需的所有指令。例如:
# 使用官方Python运行时作为父镜像
FROM python:3.7
# 设置工作目录
WORKDIR /app
# 复制当前目录内容到容器中的/app
COPY . /app
# 安装requirements.txt中指定的所有依赖
RUN pip install --no-cache-dir -r requirements.txt
# 让端口80可供此容器外的环境使用
EXPOSE 80
# 定义环境变量
ENV NAME World
# 在容器启动时运行app.py
CMD ["python", "app.py"]
2、构建镜像: 使用docker build
命令来构建镜像。例如:
docker build -t my-python-app .
这个命令会根据Dockerfile中的指令创建一个新的镜像,并使用-t
标签给它命名。
3、验证镜像: 使用docker images
查看本地镜像列表,确保新建的镜像存在。
Docker容器和虚拟机在多个方面有显著的不同:
1、资源消耗: Docker容器比虚拟机更加轻量,因为它们共享主机的核心操作系统,而不需要额外的操作系统实例。这减少了资源的消耗。
2、启动速度: 容器可以在几秒钟内启动,而虚拟机通常需要几分钟。
3、性能: Docker容器接近原生性能,因为它们直接运行在主机的操作系统上。虚拟机则有额外的性能开销,因为它们需要通过Hypervisor与主机操作系统通信。
4、隔离性: 虚拟机提供了更强的隔离性,因为每个虚拟机都有自己的完整操作系统。容器之间的隔离性较弱,但隔离性不断改进。
5、系统支持: Docker容器通常只能运行与宿主机相同的操作系统类型,而虚拟机可以运行不同的操作系统。
管理Docker容器的资源限制通常涉及以下几个方面:
1、内存限制: 可以在运行容器时使用-m
或--memory
标志来限制其使用的最大内存。例如:
docker run -m 512m my-image
这将限制容器最多使用512MB的内存。
2、CPU限制: 使用--cpus
标志来限制容器使用的CPU资源。例如:
docker run --cpus=1.5 my-image
这将限制容器最多使用1.5个CPU核心。
3、磁盘I/O限制: 可以使用--device-read-bps
和--device-write-bps
来限制容器的磁盘读写速率。
4、网络带宽限制: 尽管Docker默认不提供网络带宽限制,但可以通过第三方工具或自定义脚本来实现。
在Docker中实现服务自动恢复主要依赖于容器的重启策略:
1、设置重启策略: 使用--restart
标志来设置容器的重启策略。常用的策略有:
no
:不自动重启。on-failure
:仅在容器非正常退出时重启。always
:无论退出码是什么,总是尝试重启容器。unless-stopped
:除非容器被手动停止,否则总是尝试重启。例如:
docker run --restart=always my
优化Docker镜像大小的方法包括:
1、选择合适的基础镜像: 使用小型的基础镜像,如Alpine Linux,它比标准的Ubuntu或CentOS镜像小得多。
2、最小化层的数量: 在Dockerfile中尽可能合并RUN命令,减少镜像层的数量。
3、清理不必要的文件: 在构建镜像的过程中,移除不必要的文件和依赖,例如缓存和临时文件。
4、使用多阶段构建: 在Dockerfile中使用多阶段构建,只将必要的文件复制到最终镜像中。
5、避免安装不必要的软件包: 只安装运行应用所必需的软件包,避免冗余。
Docker支持多种网络模式,包括:
1、bridge模式: 默认的网络模式。容器将被连接到一个内部网络,通过网络桥接与主机通信。
2、host模式: 容器共享主机的网络命名空间,直接使用主机的网络。
3、none模式: 容器有自己的网络命名空间,但不会配置任何网络接口。
4、overlay模式: 用于Docker Swarm集群,支持不同Docker守护进程之间的容器通信。
5、macvlan模式: 允许容器具有独立的MAC地址,好像它们是物理网络上的单独的设备。
Docker容器与宿主机之间共享文件通常使用卷(volume)或绑定挂载:
1、使用卷(Volume): Docker管理的卷可以安全地存储数据,即使容器不再存在,数据也会保留。
2、使用绑定挂载: 将宿主机上的文件或目录直接映射到容器中。这对于开发环境特别有用。
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具:
1、定义服务: 在docker-compose.yml
文件中定义应用的服务,包括容器、网络和卷。
2、一键部署: 使用docker-compose up
命令来一次性启动所有定义的服务。
3、方便管理: 可以使用Docker Compose来启动、停止和重建服务,查看服务的状态和日志。
Docker Swarm是Docker的原生集群管理工具:
1、集群管理: 它允许多个Docker主机形成一个集群,统一管理。
2、服务调度: Swarm会自动分配容器到集群中的不同主机上。
3、负载均衡: 它可以自动对外部负载进行均衡,分发到集群内的多个容器实例。
4、高可用性: Swarm提供了容器的高可用性,如果某个容器实例失败,它会自动在另一个节点上重启该实例。
最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。
这是大佬写的,7701页的BAT大佬写的刷题笔记,让我offer拿到手软
本文已收录于我的技术网站,next-java.com, 有大厂完整面经,工作技术等经验分享
点赞对我真的非常重要!在线求赞,加个关注非常感激