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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 基础镜像,一切从这里开始构建
FROM node:14
# 镜像是谁写的:姓名+邮箱
MAINTAINER Name <your.email@example.com>
# 将本地文件添加到镜像中
ADD src/ /app/src/
# 镜像的工作目录
WORKDIR /app
# 挂载的目录
VOLUME ["/app/logs"]
# 镜像构建的时候需要运行的命令
RUN npm install
# 暴露端口配置
EXPOSE 3000
# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
CMD ["node", "app.js"]
# 指定这个容器启动的时候要运行的命令,可以追加命令
ENTRYPOINT ["node"]
# 继承父镜像的Dockerfile,子镜像构建时触发执行
ONBUILD RUN echo "This will run on the child image build"
# 类似ADD,将文件拷贝到镜像中
COPY . .
# 构建的时候设置环境变量
ENV NODE_ENV=production

Dockerfile详解:

容器

是从镜像启动的一个独立运行的实例,包括应用程序和所有的依赖库、配置文件以及运行时环境

通过docker run从镜像启动容器,确保应用程序在任何环境中都能够一致地运行

仓库

仓库相当于github代码仓库,用来存储和管理镜像,本地项目目录内生成的镜像通过docker push提交到docker hub,然后可以在其他主机上通过docker pull拉取该镜像,然后重新创建容器,启动后即可快速部署该项目

1
2
docker push my_username/my_image:latest
docker pull my_username/my_image:latest

网络

用来管理容器之间的通信,通过网络可以将多个容器连接,互相通信

网络类型
  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_image
  2. host(主机网络)

    容器直接使用主机网络,适用于有一定网络要求的场景

    1
    docker run -d --network host my_image
  3. overlay(覆盖)

    容器跨主机通信,需要相关集群配置

  4. none(无网络)

    容器无网络配置,适用于不需要网络的场景

    1
    docker run -d --network none my_image

存储卷

用来管理容器的数据持久化,允许在容器之间共享数据,或者在容器重启或删除后保留数据

存储卷类型
  1. volumes

    docker管理,存储在docker文件系统内

    1
    2
    3
    4
    # 创建卷
    docker volume create my_volume
    # 挂载卷
    docker run -d -v my_volume:/app/data my_image
  2. Bind Mounts(绑定挂载)

    将主机上的目录或文件绑定到容器内的路径

    1
    2
    # 运行容器绑定挂载
    docker run -d -v /host/path:/container/path my_image
  3. tmpfs Mounts(临时文件系统挂载)

    在容器内创建临时文件系统,数据存储在内存中,不会持久化到磁盘,适用于存储敏感数据或需要高速读写的数据

    1
    2
    # 运行容器临时文件系统挂载
    docker run -d --tmpfs /container/path my_image

四、Docker命令

镜像

1
docker build -t <image_name>:<tag> .
  • **-t**:指定镜像的名称和标签
  • **.**:指定 Dockerfile 所在的路径,通常是当前目录
1
docker images
  • 列出本地存储的所有 Docker 镜像
1
docker rmi <image_name>:<tag>
  • 删除指定的镜像
  • 可以使用镜像的 ID 或名称:标签格式
1
docker pull <image_name>:<tag>
  • 从 Docker Hub 或其他 Docker 注册表拉取镜像
1
2
docker save -o <output_file>.tar <image_name>:<tag>
docker load -i <input_file>.tar
  • 导出和导入镜像
1
2
docker tag <image_name>:<tag> <docker_username>/<image_name>:<tag>
docker push <docker_username>/<image_name>:<tag>
  • 重新给镜像打标签,将本地镜像关联到 Docker Hub 上的仓库(不会生成新的镜像,只是对原有镜像新增了一个引用名,镜像ID不变)
  • 推送镜像,将本地镜像上传到 Docker Hub,使其可以被其他用户或系统拉取和使用

容器

1
docker run -d -p <host_port>:<container_port> --name <container_name> <image_name>:<tag>
  • **-d**:以分离模式运行容器
  • **-p**:将主机端口映射到容器端口
  • **--name**:为容器指定一个名称
1
docker ps -a
  • 列出所有容器,包括停止的容器
1
2
docker stop/start/restart/rm/logs  <container_name>||<container_id>
docker logs -f <container_name>||<container_id>
  • 停止、启动、重启、删除容器、查看日志
  • 查看容器实时日志
1
docker exec -it <container_name> /bin/bash
  • 在运行中的容器中启动一个交互式的终端会话
  • **-it**:将终端设置为交互模式,并分配一个伪终端
1
docker commit <container_name> <new_image_name>:<tag>
  • 将容器的当前状态保存为新的镜像

网络

1
2
3
4
5
6
# 列出所有网络
docker network
# 创建、删除自定义网络
docker network create/rm my_network
# 连接、断开容器到网络
docker network connect/disconnect my_network my_container

存储卷

1
2
3
docker volume ls
# 创建/删除卷
docker volume create/rm my_volume

其他

1
docker system prune
  • 清理未使用的容器、网络、镜像和挂载卷
  • 使用 -a 选项可以删除所有未使用的资源,包括没有标签的镜像

五、总结

持续更新中~~~


docker快速入门,看了不会你捶我
http://47.95.158.220/2024/05/28/docker/
作者
akkwei
发布于
2024年5月28日
许可协议