# Docker 基础知识
Docker 是一种容器化技术,允许开发人员将应用程序及其所有依赖项打包到一个标准化的单元中,称为容器。这些容器可以在任何环境中可靠地运行,从而消除了 "在我的机器上运行" 的问题。
容器与虚拟机的主要区别在于,容器共享主机操作系统内核,而虚拟机则需要完整的操作系统。这使得容器更加轻量级和高效。
# 安装 Docker
根据您的操作系统,请按照以下步骤安装 Docker:
- Windows
访问 Docker 官网并下载 Docker Desktop for Windows。
运行安装程序并按照提示进行安装。
安装完成后,打开命令提示符并运行 docker version 命令,确认 Docker 已成功安装。 - macOS
访问 Docker 官网并下载 Docker Desktop for Mac。
运行安装程序并按照提示进行安装。
安装完成后,打开终端并运行 docker version 命令,确认 Docker 已成功安装。
# 基本 Docker 命令
以下是一些常用的 Docker 命令:
# 镜像管理
- 使用 docker pull 命令从 Docker Hub 或其他镜像仓库拉取镜像:
docker pull <image-name>:<tag> |
- 例如,拉取 Ubuntu 18.04 镜像:
docker pull ubuntu:18.04 |
如果不指定标签 (tag), 将默认拉取 latest 标签的镜像。
- 列出本地镜像
使用 docker images 命令列出本地已有的镜像:
docker images |
输出示例:
REPOSITORY TAG IMAGE ID CREATED SIZE | |
ubuntu 18.04 1234567890ab 5 days ago 64.2MB | |
nginx latest 0987654321cd 2 weeks ago 133MB |
这将列出所有本地镜像的仓库名称、标签、镜像 ID 和创建时间等信息。
- 删除镜像
- 使用 docker rmi 命令删除指定的镜像:
docker rmi <image-id> |
例如,删除 ID 为 1234567890ab 的 Ubuntu 18.04 镜像:
docker rmi 1234567890ab |
如果镜像正在被使用,例如有一个容器基于该镜像运行,那么需要先停止和删除相关的容器,然后才能删除镜像。
常用的选项包括:
-f: 强制删除镜像,即使它有关联的容器
--no-prune: 不删除未打 tag 的父镜像
- 使用 docker rmi 命令可以删除一个或多个本地镜像:
docker rmi [options] <image1> [<image2> ...]
docker rmi image1 image2 image3 |
- 删除悬空镜像
所谓 "悬空镜像" 是指那些没有被任何容器使用的镜像。可以使用以下命令删除所有悬空镜像:
docker image prune |
这个命令会删除所有没有被任何容器使用的镜像。
- 删除所有本地镜像
如果想一次性删除所有本地镜像,可以使用以下命令:
docker rmi $(docker images -q) | |
这个命令会删除本地所有的镜像。 |
删除镜像时要小心谨慎,因为这可能会影响正在运行的容器。如果不确定,可以先使用 docker images 命令查看当前有哪些镜像,再决定是否要删除。
- 构建自定义镜像
使用 docker build 命令根据 Dockerfile 构建自定义镜像:
docker build -t <image-name>:<tag> . |
其中 -t 参数指定镜像的名称和标签,. 表示 Dockerfile 所在的当前目录。
例如,构建一个名为 my-app 的镜像:
docker build -t my-app:v1 . |
构建完成后,可以使用 docker images 命令查看新构建的镜像。
- 推送镜像到仓库
如果您有访问权限,可以使用 docker push 命令将构建好的镜像推送到 Docker Hub 或其他镜像仓库:
docker push <image-name>:<tag> |
例如,将 my-app:v1 镜像推送到 Docker Hub:
docker push my-app:v1 |
# 容器管理
- 创建并运行容器
使用 docker run 命令可以创建并运行一个新的容器:
如果您有访问权限,可以使用 docker push 命令将构建好的镜像推送到 Docker Hub 或其他镜像仓库:
docker run [options] <image> [command] [args] |
常用的选项包括:
-i: 保持标准输入打开
- t: 分配一个伪终端
- d: 以后台 (detached) 模式运行容器
- p: 将容器端口映射到宿主机端口
--name: 为容器指定一个名称
例如,运行一个 Ubuntu 容器并进入交互式命令行:
docker run -it ubuntu /bin/bash |
这将创建一个基于 Ubuntu 镜像的容器,并进入容器的 Bash shell。
- 列出正在运行的容器
使用 docker ps 命令可以列出所有正在运行的容器:
docker ps |
这个命令会显示所有容器的以下信息:
CONTAINER ID:容器的唯一标识符
IMAGE:创建容器时使用的镜像
COMMAND:容器启动时执行的命令
CREATED:容器的创建时间
STATUS:容器的当前状态 (运行中、已停止等)
PORTS:容器暴露的网络端口
NAMES:容器的名称
如果要列出所有容器 (包括已停止的), 可以使用 docker ps -a 命令。
docker ps -a |
输出示例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES | |
e12345678ab ubuntu:18.04 "/bin/bash" 5 minutes ago Exited (0) 2 minutes ago my-ubuntu | |
9876543210cd nginx:latest "nginx -g..." 1 hour ago Up 59 minutes 80/tcp web-server |
- 停止容器
docker stop <container-id|container-name> |
例如,停止 ID 为 e12345678ab 的容器:
docker stop e12345678ab |
- 启动容器
docker start <container-id|container-name> |
- 容器交互
- 进入正在运行的容器
使用 docker exec 命令可以进入正在运行的容器:
docker exec -it <container-id|container-name> <command> |
例如,进入 ID 为 e12345678ab 的 Ubuntu 容器并执行 Bash 命令:
docker exec -it e12345678ab /bin/bash |
- 查看容器日志
docker logs <container-id>: 查看容器日志 |
- 删除容器
使用 docker rm 命令可以删除一个或多个容器:
docker rm <container-id|container-name> |
例如,删除 ID 为 e12345678ab 的容器:
docker rm e12345678ab |
如果容器正在运行,需要先使用 docker stop 命令停止容器,然后再删除
- 数据管理
在 Docker 中,有两种主要的数据管理方式:Volume 和 Bind Mount。
- Volume
Volume 是 Docker 管理数据的首选方式。Volume 是一个独立于容器之外的数据存储区域,可以被多个容器共享使用。Volume 的生命周期独立于容器,即使容器被删除,Volume 中的数据也不会丢失。
创建并使用 Volume:
# 创建 Volume | |
docker volume create my-volume | |
# 运行容器并挂载 Volume | |
docker run -d -v my-volume:/data nginx |
这样就创建了一个名为 my-volume 的 Volume, 并将其挂载到容器的 /data 目录下。
例子:
假设我们有一个 Web 应用程序,它需要保存用户上传的图片。在 Docker 容器中运行这个应用程序的话,如果把图片数据直接存储在容器内部,当容器被删除或重新创建时,这些图片数据就会丢失。
这时我们就可以使用 Docker Volume 来保存这些图片数据。具体步骤如下:
创建一个 Docker Volume:
docker volume create my-app-volume |
在运行 Web 应用容器时,将该 Volume 挂载到容器内的图片存储目录:
docker run -d \ | |
-v my-app-volume:/app/uploads \ | |
-p 80:8080 \ | |
my-app |
这样,容器内的 /app/uploads 目录就会保存到名为 my-web-app-volume 的 Docker Volume 中。
即使我们后续删除或重新创建容器,只要 Volume 还存在,图片数据就不会丢失。我们可以继续使用这个 Volume 挂载到新的容器中。
如果需要备份或迁移数据,也可以对 Volume 进行操作,而不需要管理容器内部的文件系统。
# Dockerfile 构建自定义镜像
Dockerfile 是一个文本文件,用于定义如何构建 Docker 镜像。以下是一个示例 Dockerfile:
配置 dockerfile
# 使用 Nginx 作为基础镜像 | |
FROM nginx:latest | |
# 将 Hexo 生成的 public/ 目录复制到 Nginx 默认的 Web 根目录 | |
COPY public/ /usr/share/nginx/html/ | |
# 暴露 Nginx 默认的 HTTP 端口 80 | |
EXPOSE 80 | |
# 将自定义的 Nginx 配置文件复制到容器中 | |
COPY nginx.conf /etc/nginx/conf.d/default.conf | |
# 设置容器启动时运行的命令 | |
CMD ["nginx", "-g", "daemon off;"] |
使用以下命令构建镜像:
docker build -t my-app . |