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 命令。
bash 复制代码
docker pull nginx
  1. 查看本地镜像:你可以使用 docker imagesdocker image ls 命令来查看本地已下载的镜像列表。
bash 复制代码
docker images ls
  1. 搜索镜像:使用 docker search 命令来搜索 Docker Hub 上的镜像。
bash 复制代码
docker search centos
  1. 删除镜像:要删除不需要的本地镜像,使用 docker rmi 命令,指定要删除的镜像名称或标签。
bash 复制代码
# 删除一个镜像 docker rmi <镜像名称或ID>
docker rmi my-image

# 删除所有镜像
docker rmi $(docker images -aq)
  1. 构建自定义镜像:创建自定义 Docker 镜像需要编写 Dockerfile,并使用 docker build 命令。
bash 复制代码
# 如果指定构建文件
docer build -f <文件路径和文件名> -t my-custom-image .

# 不指定构建文件,则寻找当前路径的Dockerfile文件
docker build -t my-custom-image .
  1. 推送镜像:要将自定义镜像上传到 Docker Hub 或其他镜像仓库,使用 docker push 命令。
bash 复制代码
# docker push <镜像名称>
docker push username/my-custom-image
  1. 查看镜像历史:使用 docker history 命令可以查看镜像的构建历史,包括每个层叠的详细信息。
bash 复制代码
docker history <镜像名称>

容器(Container

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

特点:

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

常用命令:

  1. 运行容器使用 docker run 命令来启动容器。
bash 复制代码
# -d 后台运行
# --name 给这个容器起个名字
# -p 80:8080 端口映射,容器的8080端口映射到主机的80
# -P 给主机随机分配端口
docker run -d --name my-container ubuntu
  1. 查看容器
bash 复制代码
# 查看正在运行的容器
docker ps

# 查看所有容器
docker ps -a
  1. 停止容器:使用 docker stop 命令来停止一个运行中的容器。
bash 复制代码
docker stop my-container
  1. 启动已挺停止的容器:使用 docker start 命令来启动一个已停止的容器。
bash 复制代码
docker start my-container
  1. 重启容器:使用 docker restart 命令来重启一个正在运行的容器。
bash 复制代码
docker restart my-container
  1. 删除容器:要删除不再需要的容器,使用 docker rm 命令。
bash 复制代码
# 删除容器
docker rm my-container

# 强制删除容器
docker rm -f my-container

# 删除所有容器
docker rm $(docker ps -aq)
  1. 查看容器日志:使用 docker logs 命令可以查看容器的日志输出。
bash 复制代码
docker logs my-container
  1. 进入容器:时需要进入正在运行的容器来执行命令或进行调试。
bash 复制代码
# 进入交互
docker exec -it my-container /bash/shell

# 进入容器
docker attach my-container

Dockerfile

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

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

示例:node项目

bash 复制代码
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index"]
EXPOSE 3000

Docker网络

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

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

命令:

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

Docker 的优势

  • 轻量级: Docker 容器共享主机系统的内核,因此它们比传统虚拟机更轻量级。
  • 可移植性: Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发、测试还是生产。
  • 版本控制: 通过使用版本标签,你可以轻松管理和维护应用程序的不同版本。
  • 自动化部署: Docker 可以与持续集成工具集成,实现自动化部署,缩短交付时间。
  • 隔离性: 每个容器都是相互隔离的,这确保了应用程序之间的互不干扰。
相关推荐
囚生CY4 小时前
【学习笔记】Langchain基础(二)
笔记·学习·langchain
早起鸟儿6 小时前
docker-Dockerfile 配置
java·linux·运维·docker
虚妄狼6 小时前
【Docker Desktop】Windows11安装 Docker Desktop
运维·docker·容器
IT成长日记7 小时前
【Docker基础】Docker核心概念:命名空间(Namespace)与资源隔离联系
运维·docker·namespace·资源隔离·命令空间
西西小飞龙7 小时前
Docker 基础使用
docker·容器·eureka
忘川w8 小时前
《网络安全与防护》知识点复习
笔记·安全·web安全·网络安全
再ZzZ8 小时前
Docker安装PaddleOCR并提供接口服务(CPU)
运维·docker·容器
FJSAY8 小时前
我自己动手写了一个MySQL自动化备份脚本,基于docker
mysql·docker·自动化
zkinglin8 小时前
AORSA编译指南
笔记·其他·能源
Cosmoshhhyyy8 小时前
腾讯云配置了国内镜像依然docker search失败
docker·云计算·腾讯云