Docker 简介
Docker 是一种容器化技术,它允许你在一个独立的环境中打包和运行应用程序及其依赖项。每个容器都是独立的,轻量级,且具备可移植性,这使得开发、测试和部署变得更加简单和一致。
Docker 是一种强大的容器化技术,它简化了应用程序的开发、测试和部署过程。通过理解 Docker 的核心概念和基本用法,你可以更好地利用它来提高你的开发和部署效率。
Docker 核心概念
- 镜像(Image): 镜像是一个只读的文件,它包含了运行应用程序所需的一切,包括代码、运行时、系统工具和系统库。
- 容器(Container): 容器是一个基于镜像创建的可运行实体,它运行在隔离的环境中,具有自己的文件系统、网络和进程空间。
- 仓库(Registry): 仓库是用于存储和分享镜像的地方。Docker Hub 是一个常见的公共仓库,你也可以创建私有仓库来存储自己的镜像。
- Dockerfile: Dockerfile 是一个文本文件,其中包含了用于构建镜像的指令。通过编写 Dockerfile,你可以自定义镜像的构建过程。
镜像(Images)
特点:
- 不可变:一旦创建,镜像内容不可更变。如果需要更改,你想要构建一个新的镜像。
- 层叠结构:镜像由多个层叠组成,每个层叠包含了文件系统不同部分。这使得镜像的构建和分发更加高效。
- 标签:镜像可以使用标签(tags)进行版本控制,允许你轻松管理不同版本的镜像。
常用命令:
- 拉取镜像:要拉取一个 Docker 镜像,使用
docker pull
命令。
bash
docker pull nginx
- 查看本地镜像:你可以使用
docker images
或docker image ls
命令来查看本地已下载的镜像列表。
bash
docker images ls
- 搜索镜像:使用
docker search
命令来搜索 Docker Hub 上的镜像。
bash
docker search centos
- 删除镜像:要删除不需要的本地镜像,使用
docker rmi
命令,指定要删除的镜像名称或标签。
bash
# 删除一个镜像 docker rmi <镜像名称或ID>
docker rmi my-image
# 删除所有镜像
docker rmi $(docker images -aq)
- 构建自定义镜像:创建自定义 Docker 镜像需要编写 Dockerfile,并使用
docker build
命令。
bash
# 如果指定构建文件
docer build -f <文件路径和文件名> -t my-custom-image .
# 不指定构建文件,则寻找当前路径的Dockerfile文件
docker build -t my-custom-image .
- 推送镜像:要将自定义镜像上传到 Docker Hub 或其他镜像仓库,使用
docker push
命令。
bash
# docker push <镜像名称>
docker push username/my-custom-image
- 查看镜像历史:使用
docker history
命令可以查看镜像的构建历史,包括每个层叠的详细信息。
bash
docker history <镜像名称>
容器(Container)
Docker容器是Docker镜像运行的实例,它们提供了一个独立的运行环境,包括文件系统、进程空间和网络。容器是可执行的、轻量级的,可以在不同环境中运行相同的应用程序。
特点:
- 隔离性:每个容器都有自己的文件系统和进程空间,与其他容器隔离开。这确保了容器之间互不干扰。
- 可移植性:容器可以在不同的Docker主机上运行,无论是开发、测试还是生产环境,保持一致性。
- 轻量级:与传统虚拟机相比,容器更加轻量级,因为它们共享主机操作系统的内核。
常用命令:
- 运行容器使用
docker run
命令来启动容器。
bash
# -d 后台运行
# --name 给这个容器起个名字
# -p 80:8080 端口映射,容器的8080端口映射到主机的80
# -P 给主机随机分配端口
docker run -d --name my-container ubuntu
- 查看容器
bash
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
- 停止容器:使用
docker stop
命令来停止一个运行中的容器。
bash
docker stop my-container
- 启动已挺停止的容器:使用
docker start
命令来启动一个已停止的容器。
bash
docker start my-container
- 重启容器:使用
docker restart
命令来重启一个正在运行的容器。
bash
docker restart my-container
- 删除容器:要删除不再需要的容器,使用
docker rm
命令。
bash
# 删除容器
docker rm my-container
# 强制删除容器
docker rm -f my-container
# 删除所有容器
docker rm $(docker ps -aq)
- 查看容器日志:使用
docker logs
命令可以查看容器的日志输出。
bash
docker logs my-container
- 进入容器:时需要进入正在运行的容器来执行命令或进行调试。
bash
# 进入交互
docker exec -it my-container /bash/shell
# 进入容器
docker attach my-container
Dockerfile
Dockerfile是一个文本文件,它包含了一系列指令,用于构建Docker镜像。通过编写Dockerfile,你可以定义镜像的构造过程,包括镜像的基础操作系统、应用程序代码、依赖项安装等。Dockerfile是自动化构建和标准化镜像的关键组成部分。
FROM
: 指定基础镜像,用作构建的起点。
bash
FORM ubuntu:20.04
MAINTAINER
(已不建议使用,推荐使用LABEL
): 设置维护者信息。
bash
MAINTAINER [email protected]
LABEL
: 设置镜像的元数据,如作者、描述、版本等。
bash
LABEL maintainer="[email protected]" \
description="My custom image" \
version="1.0"
RUN
: 在镜像中执行命令,通常用于安装软件包、配置环境等。
bash
RUN apt-get update && apt-get install -y python
COPY
: 复制文件或目录到镜像中。
bash
COPY app.py /app/
ADD
: 类似于COPY
,但可以处理 URL 和解压缩文件。
bash
ADD http://example.com/myapp.tar.gz /app/
WORKDIR
: 设置工作目录,后续命令将在该目录中执行。
bash
WORKDIR /app
EXPOSE
: 声明容器运行时监听的端口。
bash
EXPOSE 80
CMD
: 定义容器启动时要执行的默认命令,只有一个 CMD 命令可以存在。
bash
CMD ["python", "app.py"]
ENTRYPOINT
: 类似于CMD
,但允许用户在运行容器时覆盖命令。
bash
ENTRYPOINT ["python", "app.py"]
ENV
: 设置环境变量。
bash
ENV MY_VAR="my value"
USER
: 设置容器中运行命令的用户名或 UID。
bash
USER appuser
VOLUME
: 声明一个持久化数据卷。
bash
VOLUME /data
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 网络模型包括以下几个关键组件:
- Bridge(桥接网络):这是Docker默认的网络模式,它允许容器在同一主机上相互通信。每个容器分配一个独立的IP地址,但它们可以使用容器名相互访问。这种模式使用与大多数应用程序。
- Host (主机网络):容器与主机共享网络栈,不进行额外的网络隔离。这可以提高网络性能,但也会降低容器的隔离性。
- Overlay (覆盖网络):用于连接多个Docker宿主机,允许容器在不同主机之间通信。这对于分布式应用程序或容器编排系统(如 Docker Swarm 或 Kubernetes)非常有用。
- None(无网络):容器没有网络连接,通常用于特殊用途容器,如批处理作业或数据处理。
命令:
- 创建自定义网络:使用**
docker network create
** 命令可以创建自定义网络。
bash
docker network create my-network
- 查看网络列表:使用
docker network ls
命令可以列出所有可用的 Docker 网络。
bash
docker network ls
- 查看网络详细信息:使用
docker network inspect
命令可以查看特定网络的详细信息。
bash
docker network inspect my-network
- 将容器连接到网络:在容器创建时,使用**
--network
** 参数可以将容器连接到指定的网络。
bash
docker run -d --network my-network my-container
- 断开容器与网络的连接:使用
docker network disconnect
命令可以断开容器与网络的连接。
bash
docker network disconnect my-network my-container
- 连接容器到先有网络:如果容器已经运行,可以使用
docker network connect
命令将其连接到现有网络。
bash
docker network connect my-network my-container
- 容器之间的通信:使用容器名称或 IP 地址,容器可以相互通信。例如,一个容器可以使用另一个容器的名称或 IP 地址来访问其服务。
Docker 的优势
- 轻量级: Docker 容器共享主机系统的内核,因此它们比传统虚拟机更轻量级。
- 可移植性: Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发、测试还是生产。
- 版本控制: 通过使用版本标签,你可以轻松管理和维护应用程序的不同版本。
- 自动化部署: Docker 可以与持续集成工具集成,实现自动化部署,缩短交付时间。
- 隔离性: 每个容器都是相互隔离的,这确保了应用程序之间的互不干扰。
