# Docker 入门

阅读约需 7 分钟
目录

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 的方法:

  • 前置步骤

    Terminal window
    # 删除已有的 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 upyml 启动多容器应用docker compose up -d
docker compose down停止多容器应用docker compose down
docker login登录到容器仓库docker login registry.example.com
docker logout退出容器仓库docker logout registry.example.com

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"]

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 可以停止这两个容器。


参考:Docker Manual

写下此篇时暂时不是懒狗的星语

这是开发的责任感和前瞻性的问题。不兼容的改变不应该轻易被加入到有许多依赖代码的软件中。升级所付出的代价可能是巨大的。
—— 《语义化版本》


更多文章