Docker 入门
本篇文章会从零开始介绍 Docker 的基本概念和使用方法,但语言较为精简,适合有一定基础的读者阅读。
Docker 基本概念
Docker
是容器化技术的一个十分流行的实现,它基于 Go 语言开发,遵循 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。就像一些高级编程语言的“类”和“对象”的关系一样,根据一个模板创建很多个一样的对象,这些对象就是容器。
常用基本概念
架构上
Docker Client
:客户端,用来输入命令的工具。docker run
docker build
docker pull
- 等等
Docker Host (Server)
:服务器端,用来接收客户端的命令并执行。Docker Daemon
:守护进程,接收来自客户端的指令,管理镜像、容器、网络、数据卷等。Image
:镜像,类似于模板,用来创建容器。Container
:容器,类似于对象,是镜像的一个实例,可以被创建、启动、停止、删除、暂停等。
Docker Registry
:镜像仓库,用来保存各种镜像的地方。Docker Hub
:官方镜像仓库,包含了很多官方和非官方的镜像。- 私有仓库:自己搭建的镜像仓库。
实际开发生产上
Image
:镜像,类似于模板,用来创建容器。Container
:容器,类似于对象,是镜像的一个实例,可以被创建、启动、停止、删除、暂停等。Dockerfile
:用来构建镜像的文件,包含了一条条构建镜像的指令。Docker 通过读取 Dockerfile 中的指令来构建镜像。Docker Compose
:一个用来定义和运行多容器 Docker 应用的工具。可以通过一个预先定义的docker-compose.yml
文件来配置多个容器,组合为一个完整的应用服务,便于部署、运维。Docker Registry
:镜像仓库,用来保存各种镜像的地方。Docker Volume
:数据卷,可以在容器间共享数据,也可以用来持久化存储数据。Docker 容器在重启后,数据卷不会丢失,而容器内的数据不会保存。Docker Network
:网络,允许容器间通信,也可以让容器连接到外部网络。
Docker 安装
对于有图形界面的操作系统(Windows、MacOS),可以直接下载 Docker Desktop 安装包进行安装。Docker Desktop 是一个包含了 Docker Engine、Docker CLI、Docker Compose、Kubernetes可选的 Minikube 等工具的桌面应用。
对于没有图形界面的操作系统(Linux),可以通过命令行安装 Docker Engine。
在此简要略过在 Ubuntu 上使用 apt
安装 Docker Engine 的方法:
前置步骤
# 删除已有的 Docker 组件(操作系统自带等可能不兼容的组件) for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done # 增加 Docker 官方 GPG Key sudo apt-get update ## 安装信任 Key 所需软件包 sudo apt-get install ca-certificates curl ## 下载和安装 Docker 官方 GPG Key sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # 将软件源增加到 apt 源列表并更新源信息 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
安装 Docker Engine
最新版本sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
特定版本# 列出版本列表 apt-cache madison docker-ce | awk '{ print $3 }' # 安装特定版本,例如 5:27.5.0-1~ubuntu.24.04~noble VERSION_STRING=5:27.5.0-1~ubuntu.24.04~noble sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
Docker 使用
基本命令
命令 | 作用 | 示例 |
---|---|---|
docker run | 运行一个容器 | docker run -d ubuntu |
docker ps | 查看容器列表 | docker ps -a |
docker stop | 停止一个或多个容器 | docker stop 123456 |
docker start | 启动已停止的容器 | docker start 123456 |
docker restart | 重启一个容器 | docker restart 123456 |
docker rm | 删除一个或多个容器 | docker rm 123456 |
docker images | 查看镜像列表 | docker images |
docker build | 构建一个镜像 | docker build -t myimage . |
docker rmi | 删除一个或多个镜像 | docker rmi ubuntu |
docker pull | 拉取一个镜像 | docker pull ubuntu |
docker push | 推送一个镜像 | docker push myimage |
docker exec | 在容器中执行命令 | docker exec -it 123456 /bin/bash |
docker logs | 查看容器日志 | docker logs 123456 |
docker compose up | 从 yml 启动多容器应用 | docker-compose up -d |
docker compose down | 停止多容器应用 | docker-compose down |
docker login | 登录到容器仓库 | docker login registry.example.com |
docker logout | 退出容器仓库 | docker logout registry.example.com |
提示
docker run -d ubuntu
-d
:后台运行ubuntu
:镜像名称
docker ps -a
-a
:显示所有容器(包括已停止的容器)
docker stop 123456
123456
:容器 ID
docker build -t myimage .
-t myimage
:指定镜像 Tag.
:Dockerfile 所在目录(构建目录)- 也可以使用
buildx
并且指定架构:docker buildx build --platform linux/amd64,linux/arm64 -t myimage .
docker exec -it 123456 /bin/bash
-it
:交互式终端123456
:容器 ID/bin/bash
:进入容器后执行的命令
Dockerfile
Dockerfile 是一个用来构建镜像的文件,包含了一条条构建镜像的指令。Docker 根据 Dockerfile 中的指令来构建镜像。以一个 Spring Boot 应用的 Dockerfile 为例:
# 使用 OpenJDK 11 作为基础镜像
FROM openjdk:11-jdk
WORKDIR /app
# 将本地文件复制到镜像中
COPY app-0.0.1-SNAPSHOT.jar.tar /app/app.tar
# 解压并删除文件
RUN tar -xvf app.tar && \
rm -f app.tar
# 设置自定义环境变量
ENV APP_HOME=/app
# 暴露 8080 端口
EXPOSE 8080
# 启动 Spring Boot 应用
CMD ["java", "-jar", "app.jar"]
提示
Dockerfile 的每个指令都会在镜像中创建一个新的层,因此应该尽量将一些相同的操作放在一起,以减少层的数量,避免镜像过大。例如上述演示的 RUN
指令中通过 &&
将两个操作合并在一起。
Docker Compose
Docker Compose 是一个用来定义和运行多容器 Docker 应用的工具。可以通过一个预先定义的 docker-compose.yml
文件来配置多个容器,组合为一个完整的应用服务,便于部署、运维。以一个简单的前后端分离应用为例,我们已经有了一个前端应用镜像 myfrontend
和一个后端应用镜像 mybackend
,我们可以通过 Docker Compose 来定义并运行这两个容器:
version: '3.8'
services:
frontend:
image: myfrontend
ports:
- "80:80"
backend:
image: mybackend
ports:
- "8080:8080"
将这个文件保存为 docker-compose.yml
,然后在同一目录下运行 docker-compose up -d
即可启动这两个容器。使用 docker-compose down
可以停止这两个容器。