docker快速入门,看了不会你捶我
一、Docker概述
Docker 是一种开源的容器化技术,能够让开发者将应用及其依赖打包成一个轻量级、可移植的容器。Docker 的出现改变了传统的开发和部署方式,使得应用可以在任何环境下运行,从而大大提升了开发效率和运维可靠性。
Docker 的核心概念包括镜像(Image)、容器(Container)、仓库(Registry)、网络(Networking)和存储卷(Volumes)。
- 镜像是一个只读模板,包含了运行应用程序所需的所有依赖。可以把镜像想象成一个快照,记录了应用程序在特定时间点的状态。
- 容器是镜像的一个运行实例。它包含了应用程序及其所有依赖,运行在一个独立的环境中。容器是轻量级的,启动和停止都非常快。
- 仓库用于存储和分发镜像。Docker Hub 是一个公共的仓库,用户可以从中拉取和推送镜像,类似于 github 等代码仓库。也可以搭建私有仓库来存储企业内部的镜像。
- 网络用于管理容器之间的通信。默认情况下,Docker 创建一个桥接网络,所有容器都连接到这个网络上。也可以创建自定义网络来实现更复杂的网络拓扑。
- 存储卷用于在容器之间共享数据或在容器重启后持久化数据。卷是 Docker 管理的数据存储位置,通常位于 Docker 主机的文件系统上。
安装过程这里不提了,网上教程很丰富,命令行输入docker --version
输出版本号就是安装好了
二、与虚拟机比较
共同点:都是用来实现资源隔离和应用程序部署的技术
虚拟机:
- 每个虚拟机都有自己的完整操作系统,包括内核和系统库,这意味着多个 VM 会有多个操作系统实例运行在同一个物理主机上
- 每个虚拟机都运行一个完整的操作系统,资源开销较大,尤其是内存和存储
- VM 提供了强隔离性,每个 VM 都有自己的操作系统,出问题时不会影响其他 VM
- 启动一个 VM 需要加载整个操作系统,这可能需要几分钟的时间
- VM 使用虚拟磁盘(如 VMDK、VHD 等)来管理存储,存储管理复杂,每个 VM 有独立的网络接口,网络管理复杂
- 虚拟机镜像文件(如 VMDK、VHD)较大,迁移和复制成本高
docker:
- 依赖于 Docker 引擎来管理和运行容器
- 所有 Docker 容器共享主机的操作系统内核,只包含必要的应用程序和库,这减少了资源开销
- 容器通过命名空间(namespace)和控制组(cgroup)实现隔离,隔离性不如 VM
- 启动一个容器只需启动应用程序和所需的进程,通常在几秒钟内即可完成
- Docker 提供了多种网络模式(桥接、主机、覆盖、无网络)来管理容器间的通信,网络管理相对简单
- 容器化应用可以在任何支持 Docker 的平台上运行,环境一致性高
总结:
- Docker 适合需要高资源利用率、快速启动和高可移植性的场景,尤其是微服务和 CI/CD 流程。
- 虚拟机 适合需要运行不同操作系统、需要强隔离性和高安全性的场景。
三、Docker概念
镜像
镜像由多层组成,每一层代表一次文件系统的变更(如安装软件包、复制文件等)
用户通过在项目目录内编写 Dockerfile
自定义应用程序的环境和依赖,然后通过docker build
生成自定义镜像,以下为示例:
1 |
|
Dockerfile
详解:
容器
是从镜像启动的一个独立运行的实例,包括应用程序和所有的依赖库、配置文件以及运行时环境
通过docker run
从镜像启动容器,确保应用程序在任何环境中都能够一致地运行
仓库
仓库相当于github
代码仓库,用来存储和管理镜像,本地项目目录内生成的镜像通过docker push
提交到docker hub
,然后可以在其他主机上通过docker pull
拉取该镜像,然后重新创建容器,启动后即可快速部署该项目
1 |
|
网络
用来管理容器之间的通信,通过网络可以将多个容器连接,互相通信
网络类型
bridge(桥接)
默认类型、容器在同一主机上互相通信、适用于简单的单主机、多容器应用
1
2
3
4
5# 创建网络
docker network create my_bridge_network
# 运行容器
docker run -d --name container1 --network my_bridge_network my_image
docker run -d --name container2 --network my_bridge_network my_imagehost(主机网络)
容器直接使用主机网络,适用于有一定网络要求的场景
1
docker run -d --network host my_image
overlay(覆盖)
容器跨主机通信,需要相关集群配置
none(无网络)
容器无网络配置,适用于不需要网络的场景
1
docker run -d --network none my_image
存储卷
用来管理容器的数据持久化,允许在容器之间共享数据,或者在容器重启或删除后保留数据
存储卷类型
volumes
docker管理,存储在docker文件系统内
1
2
3
4# 创建卷
docker volume create my_volume
# 挂载卷
docker run -d -v my_volume:/app/data my_imageBind Mounts(绑定挂载)
将主机上的目录或文件绑定到容器内的路径
1
2# 运行容器绑定挂载
docker run -d -v /host/path:/container/path my_imagetmpfs Mounts(临时文件系统挂载)
在容器内创建临时文件系统,数据存储在内存中,不会持久化到磁盘,适用于存储敏感数据或需要高速读写的数据
1
2# 运行容器临时文件系统挂载
docker run -d --tmpfs /container/path my_image
四、Docker命令
镜像
1 |
|
- **
-t
**:指定镜像的名称和标签 - **
.
**:指定 Dockerfile 所在的路径,通常是当前目录
1 |
|
- 列出本地存储的所有 Docker 镜像
1 |
|
- 删除指定的镜像
- 可以使用镜像的 ID 或名称:标签格式
1 |
|
- 从 Docker Hub 或其他 Docker 注册表拉取镜像
1 |
|
- 导出和导入镜像
1 |
|
- 重新给镜像打标签,将本地镜像关联到 Docker Hub 上的仓库(不会生成新的镜像,只是对原有镜像新增了一个引用名,镜像ID不变)
- 推送镜像,将本地镜像上传到 Docker Hub,使其可以被其他用户或系统拉取和使用
容器
1 |
|
- **
-d
**:以分离模式运行容器 - **
-p
**:将主机端口映射到容器端口 - **
--name
**:为容器指定一个名称
1 |
|
- 列出所有容器,包括停止的容器
1 |
|
- 停止、启动、重启、删除容器、查看日志
- 查看容器实时日志
1 |
|
- 在运行中的容器中启动一个交互式的终端会话
- **
-it
**:将终端设置为交互模式,并分配一个伪终端
1 |
|
- 将容器的当前状态保存为新的镜像
网络
1 |
|
存储卷
1 |
|
其他
1 |
|
- 清理未使用的容器、网络、镜像和挂载卷
- 使用
-a
选项可以删除所有未使用的资源,包括没有标签的镜像
五、总结
持续更新中~~~