• Docker笔记


    Docker 简介

    Docker 是一种容器化技术,它允许你在一个独立的环境中打包和运行应用程序及其依赖项。每个容器都是独立的,轻量级,且具备可移植性,这使得开发、测试和部署变得更加简单和一致。

    Docker 是一种强大的容器化技术,它简化了应用程序的开发、测试和部署过程。通过理解 Docker 的核心概念和基本用法,你可以更好地利用它来提高你的开发和部署效率。

    Docker 核心概念

    1. 镜像(Image): 镜像是一个只读的文件,它包含了运行应用程序所需的一切,包括代码、运行时、系统工具和系统库。
    2. 容器(Container): 容器是一个基于镜像创建的可运行实体,它运行在隔离的环境中,具有自己的文件系统、网络和进程空间。
    3. 仓库(Registry): 仓库是用于存储和分享镜像的地方。Docker Hub 是一个常见的公共仓库,你也可以创建私有仓库来存储自己的镜像。
    4. Dockerfile: Dockerfile 是一个文本文件,其中包含了用于构建镜像的指令。通过编写 Dockerfile,你可以自定义镜像的构建过程。

    镜像(Images)

    特点:

    1. 不可变:一旦创建,镜像内容不可更变。如果需要更改,你想要构建一个新的镜像。
    2. 层叠结构:镜像由多个层叠组成,每个层叠包含了文件系统不同部分。这使得镜像的构建和分发更加高效。
    3. 标签:镜像可以使用标签(tags)进行版本控制,允许你轻松管理不同版本的镜像。

    常用命令:

    1. 拉取镜像:要拉取一个 Docker 镜像,使用 docker pull 命令。
    docker pull nginx
    
    • 1
    1. 查看本地镜像:你可以使用 docker imagesdocker image ls 命令来查看本地已下载的镜像列表。
    docker images ls
    
    • 1
    1. 搜索镜像:使用 docker search 命令来搜索 Docker Hub 上的镜像。
    docker search centos
    
    • 1
    1. 删除镜像:要删除不需要的本地镜像,使用 docker rmi 命令,指定要删除的镜像名称或标签。
    # 删除一个镜像 docker rmi <镜像名称或ID>
    docker rmi my-image
    
    # 删除所有镜像
    docker rmi $(docker images -aq)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 构建自定义镜像:创建自定义 Docker 镜像需要编写 Dockerfile,并使用 docker build 命令。
    # 如果指定构建文件
    docer build -f <文件路径和文件名> -t my-custom-image .
    
    # 不指定构建文件,则寻找当前路径的Dockerfile文件
    docker build -t my-custom-image .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 推送镜像:要将自定义镜像上传到 Docker Hub 或其他镜像仓库,使用 docker push 命令。
    # docker push <镜像名称>
    docker push username/my-custom-image
    
    • 1
    • 2
    1. 查看镜像历史:使用 docker history 命令可以查看镜像的构建历史,包括每个层叠的详细信息。
    docker history <镜像名称>
    
    • 1

    容器(Container

    Docker容器是Docker镜像运行的实例,它们提供了一个独立的运行环境,包括文件系统、进程空间和网络。容器是可执行的、轻量级的,可以在不同环境中运行相同的应用程序。

    特点:

    1. 隔离性:每个容器都有自己的文件系统和进程空间,与其他容器隔离开。这确保了容器之间互不干扰。
    2. 可移植性:容器可以在不同的Docker主机上运行,无论是开发、测试还是生产环境,保持一致性。
    3. 轻量级:与传统虚拟机相比,容器更加轻量级,因为它们共享主机操作系统的内核。

    常用命令:

    1. 运行容器使用 docker run 命令来启动容器。
    # -d 后台运行
    # --name 给这个容器起个名字
    # -p 80:8080 端口映射,容器的8080端口映射到主机的80
    # -P 给主机随机分配端口
    docker run -d --name my-container ubuntu
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 查看容器
    # 查看正在运行的容器
    docker ps
    
    # 查看所有容器
    docker ps -a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 停止容器:使用 docker stop 命令来停止一个运行中的容器。
    docker stop my-container
    
    • 1
    1. 启动已挺停止的容器:使用 docker start 命令来启动一个已停止的容器。
    docker start my-container
    
    • 1
    1. 重启容器:使用 docker restart 命令来重启一个正在运行的容器。
    docker restart my-container
    
    • 1
    1. 删除容器:要删除不再需要的容器,使用 docker rm 命令。
    # 删除容器
    docker rm my-container
    
    # 强制删除容器
    docker rm -f my-container
    
    # 删除所有容器
    docker rm $(docker ps -aq)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 查看容器日志:使用 docker logs 命令可以查看容器的日志输出。
    docker logs my-container
    
    • 1
    1. 进入容器:时需要进入正在运行的容器来执行命令或进行调试。
    # 进入交互
    docker exec -it my-container /bash/shell
    
    # 进入容器
    docker attach my-container
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Dockerfile

    Dockerfile是一个文本文件,它包含了一系列指令,用于构建Docker镜像。通过编写Dockerfile,你可以定义镜像的构造过程,包括镜像的基础操作系统、应用程序代码、依赖项安装等。Dockerfile是自动化构建和标准化镜像的关键组成部分。

    1. FROM: 指定基础镜像,用作构建的起点。
    FORM ubuntu:20.04
    
    • 1
    1. MAINTAINER(已不建议使用,推荐使用 LABEL): 设置维护者信息。
    MAINTAINER yourname@example.com
    
    • 1
    1. LABEL: 设置镜像的元数据,如作者、描述、版本等。
    LABEL maintainer="yourname@example.com" \
          description="My custom image" \
          version="1.0"
    
    • 1
    • 2
    • 3
    1. RUN: 在镜像中执行命令,通常用于安装软件包、配置环境等。
    RUN apt-get update && apt-get install -y python
    
    • 1
    1. COPY: 复制文件或目录到镜像中。
    COPY app.py /app/
    
    • 1
    1. ADD: 类似于 COPY,但可以处理 URL 和解压缩文件。
    ADD http://example.com/myapp.tar.gz /app/
    
    • 1
    1. WORKDIR: 设置工作目录,后续命令将在该目录中执行。
    WORKDIR /app
    
    • 1
    1. EXPOSE: 声明容器运行时监听的端口。
    EXPOSE 80
    
    • 1
    1. CMD: 定义容器启动时要执行的默认命令,只有一个 CMD 命令可以存在。
    CMD ["python", "app.py"]
    
    • 1
    1. ENTRYPOINT: 类似于 CMD,但允许用户在运行容器时覆盖命令。
    ENTRYPOINT ["python", "app.py"]
    
    • 1
    1. ENV: 设置环境变量。
    ENV MY_VAR="my value"
    
    • 1
    1. USER: 设置容器中运行命令的用户名或 UID。
    USER appuser
    
    • 1
    1. VOLUME: 声明一个持久化数据卷。
    VOLUME /data
    
    • 1
    1. ARG: 定义构建时的参数,可以用于在构建时动态设置一些值。
    ARG MY_ARG=default_value
    
    • 1

    示例:node项目

    FROM node:18-alpine
    WORKDIR /app
    COPY . .
    RUN yarn install --production
    CMD ["node", "src/index"]
    EXPOSE 3000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Docker网络

    Docker 网络模型包括以下几个关键组件:

    1. Bridge(桥接网络):这是Docker默认的网络模式,它允许容器在同一主机上相互通信。每个容器分配一个独立的IP地址,但它们可以使用容器名相互访问。这种模式使用与大多数应用程序。
    2. Host (主机网络):容器与主机共享网络栈,不进行额外的网络隔离。这可以提高网络性能,但也会降低容器的隔离性。
    3. Overlay (覆盖网络):用于连接多个Docker宿主机,允许容器在不同主机之间通信。这对于分布式应用程序或容器编排系统(如 Docker Swarm 或 Kubernetes)非常有用。
    4. None(无网络):容器没有网络连接,通常用于特殊用途容器,如批处理作业或数据处理。

    命令:

    1. 创建自定义网络:使用**docker network create** 命令可以创建自定义网络。
    docker network create my-network
    
    • 1
    1. 查看网络列表:使用 docker network ls 命令可以列出所有可用的 Docker 网络。
    docker network ls
    
    • 1
    1. 查看网络详细信息:使用 docker network inspect 命令可以查看特定网络的详细信息。
    docker network inspect my-network
    
    • 1
    1. 将容器连接到网络:在容器创建时,使用**--network** 参数可以将容器连接到指定的网络。
    docker run -d --network my-network my-container
    
    • 1
    1. 断开容器与网络的连接:使用 docker network disconnect 命令可以断开容器与网络的连接。
    docker network disconnect my-network my-container
    
    • 1
    1. 连接容器到先有网络:如果容器已经运行,可以使用 docker network connect 命令将其连接到现有网络。
    docker network connect my-network my-container
    
    • 1
    1. 容器之间的通信:使用容器名称或 IP 地址,容器可以相互通信。例如,一个容器可以使用另一个容器的名称或 IP 地址来访问其服务。

    Docker 的优势

    • 轻量级: Docker 容器共享主机系统的内核,因此它们比传统虚拟机更轻量级。
    • 可移植性: Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发、测试还是生产。
    • 版本控制: 通过使用版本标签,你可以轻松管理和维护应用程序的不同版本。
    • 自动化部署: Docker 可以与持续集成工具集成,实现自动化部署,缩短交付时间。
    • 隔离性: 每个容器都是相互隔离的,这确保了应用程序之间的互不干扰。

    在这里插入图片描述

  • 相关阅读:
    【操作系统】内存管理概述
    Java变量和数据类型
    王道数据结构课后代码题p150 15.设有一棵满二叉树(所有结点值均不同),已知其先序序列为 pre,设计一个算法求其后序序列post。(c语言代码实现)
    数据结构(c语言版) 顺序表
    面向对象编程原则(04)——开闭原则
    Redis分布式锁相关总结
    论文解读(DWL)《Dynamic Weighted Learning for Unsupervised Domain Adaptation》
    Java中通过反射获取自定义注解中标识的对象属性信息(若依@Excel注解示例)
    就地初始化与列表初始化
    Python统计学10——时间序列分析自回归模型(ARIMA)
  • 原文地址:https://blog.csdn.net/weixin_48165407/article/details/133771992