返回

在 Ubuntu 上安装和使用 Docker:详细指南

开发配置

如何在 Ubuntu 上安装和使用 Docker

Docker 是一个流行的开源容器化平台,它可以让你轻松地构建,测试和部署应用程序,无论是在本地还是在云端。Docker 使用轻量级的容器来隔离应用程序的运行环境和依赖,从而提高了可移植性,安全性和效率。在本文中,我们将介绍如何在 Ubuntu 上安装和使用 Docker,以及一些常见的 Docker 命令和操作。

安装 Docker

要在 Ubuntu 上安装 Docker,你有几种不同的方法可以选择。我们将介绍两种最常用的方法:使用官方的 apt 软件源和使用方便的脚本。

使用官方的 apt 软件源

这种方法可以让你从 Docker 的官方软件源中安装最新版本的 Docker 软件包。这样,你可以保证你的 Docker 总是最新和最稳定的。要使用这种方法,你需要执行以下步骤:

  • 更新你的软件包索引,并安装一些必要的依赖软件,以便你可以使用 HTTPS 协议来添加一个新的软件源:
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  • 使用 curl 命令导入 Docker 的官方 GPG key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 添加 Docker 的 apt 软件源到你的系统:
sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu $ (lsb_release -cs) stable\"

注意:这里我们使用了 $ (lsb_release -cs) 命令来自动获取你的 Ubuntu 版本代号,例如 focal 或 bionic。如果你的系统没有安装 lsb-release 软件包,或者你的 shell 不支持 $ ( ) 语法,你可以手动输入你的版本代号,或者使用反引号代替 $ ( ) 。

  • 再次更新你的软件包索引,并安装 Docker Engine,containerd 和 Docker Compose:
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 验证 Docker 是否已经成功安装,你可以执行 docker 命令,前面不需要加 sudo, 我们将运行一个测试容器:
docker container run hello-world

如果本地没有 hello-world 镜像,这个命令将会从 Docker Hub 上下载它,在容器中运行它,打印出 “Hello from Docker”,并退出。

使用方便的脚本

这种方法可以让你快速地安装 Docker,而不需要手动添加软件源和 GPG key。但是,这种方法只推荐用于测试和开发环境,因为它可能不会检查系统兼容性和依赖关系。要使用这种方法,你只需要执行以下步骤:

  • 下载并运行脚本:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
  • 验证 Docker 是否已经成功安装,你可以执行 docker 命令,前面不需要加 sudo, 我们将运行一个测试容器:
docker container run hello-world

如果本地没有 hello-world 镜像,这个命令将会从 Docker Hub 上下载它,在容器中运行它,打印出 “Hello from Docker”,并退出。

使用非 root 用户执行 Docker 命令

默认情况下,只有 root 用户或者有 sudo 权限的用户才能执行 Docker 命令。如果你想让一个普通用户也能执行 Docker 命令,你需要把这个用户添加到 docker 用户组中。这个用户组在安装 Docker 的过程中会自动创建。要做到这一点,你需要执行以下步骤:

  • 把你想要授权的用户添加到 docker 用户组中:
sudo usermod -aG docker $USER

注意:$USER 是一个环境变量,表示当前登录的用户名。如果你想授权其他用户,请用实际的用户名替换 $USER 。

  • 登出并重新登录,以便用户组信息刷新。

常见的 Docker 命令和操作

Docker 提供了一系列的命令来管理容器,镜像,网络和卷等对象。下面我们列举一些常见的命令和操作,并给出一些示例。

管理容器

容器是 Docker 的核心概念之一。它是一个独立运行的应用程序实例,拥有自己的文件系统,网络接口和进程空间。Docker 使用镜像来创建容器。镜像是一个静态的模板,包含了应用程序所需的所有文件和配置。Docker 可以从本地或者远程仓库(例如 Docker Hub)拉取镜像,并根据镜像创建一个或多个容器。

要管理容器,我们可以使用 docker container 命令或者简写为 docker 。下面是一些常见的子命令和参数:

  • docker container ls 或者 docker ps :列出所有正在运行的容器。
  • docker container ls -a 或者 docker ps -a :列出所有容器(包括已停止的)。
  • docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] 或者 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] :从指定镜像创建并运行一个新容器,并可选地指定一些选项(例如 --name , --rm , -d , -p , -v 等)和运行时命令或参数。
  • docker container start CONTAINER 或者 docker start CONTAINER :启动一个已存在但已停止的容器。
  • docker container stop CONTAINER 或者 docker stop CONTAINER :停止一个正在运行的容器。
  • docker container restart CONTAINER 或者 docker restart CONTAINER :重启一个正在运行或已停止的容器。
  • docker container rm CONTAINER 或者 docker rm CONTAINER :删除一个已停止或已移除的容器。
  • docker container exec [OPTIONS] CONTAINER COMMAND [ARG...] 或者 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] :在一个正在运行的容器中执行一个命令,并可选地指定一些选项(例如 -it , --user , --env 等)。
  • docker container logs [OPTIONS] CONTAINER 或者 docker logs [OPTIONS] CONTAINER :查看一个正在运行或已停止的容器的日志,并可选地指定一些选项(例如 --tail , --follow , --timestamps 等)。
  • docker container inspect [OPTIONS] CONTAINER 或者 docker inspect [OPTIONS] CONTAINER :查看一个正在运行或已停止的容器的详细信息,并可选地指定一些选项(例如 --format , --size 等)。

下面是一些示例:

  • 从 ubuntu:20.04 镜像创建并运行一个名为 myubuntu 的容器,并在其中执行 bash 命令:
docker container run -it --name myubuntu ubuntu:20.04 bash

注意:如果本地没有 ubuntu:20.04 镜像,则会自动从远程仓库下载。

  • 在后台模式下从 nginx:latest 镜像创建并运行一个名为 mynginx 的容器,并映射主机端口 8080 到容器端口 80 :
docker container run -d --name mynginx -p 8080:80 nginx:latest

注意:如果本地没有 nginx:latest 镜像,则会自动从远程仓库下载。

  • 启动名为 myubuntu 的容器:
docker container start myubuntu
  • 停止名为 mynginx 的容器:
docker container stop mynginx
  • 重启名为 mynginx 的容器:
docker container restart mynginx
  • 删除名为 myubuntu 和 mynginx 的容器:
docker container rm myubuntu mynginx
  • 在名为 mynginx 的容器中执行 curl 命令,访问 localhost :
docker container exec mynginx curl localhost
  • 查看名为 mynginx 的容器的最近 10 条日志:
docker container logs --tail 10 mynginx
  • 查看名为 mynginx 的容器的 IP 地址:
docker container inspect --format '{{ .NetworkSettings.IPAddress }}' mynginx

管理镜像

镜像是 Docker 的另一个核心概念之一。它是一个静态的模板,包含了应用程序所需的所有文件和配置。Docker 可以从本地或者远程仓库(例如 Docker Hub)拉取镜像,并根据镜像创建一个或多个容器。Docker 也可以根据 Dockerfile 文件或者已存在的容器来构建新的镜像,并推送到本地或者远程仓库。

要管理镜像,我们可以使用 docker image 命令或者简写为 docker 。下面是一些常见的子命令和参数:

  • docker image ls 或者 docker images :列出所有本地镜像。
  • docker image pull [OPTIONS] NAME[:TAG|@DIGEST] 或者 docker pull [OPTIONS] NAME[:TAG|@DIGEST] :从远程仓库拉取一个或多个镜像,并可选地指定一些选项(例如 --all-tags , --quiet 等)和标签或摘要。
  • docker image push [OPTIONS] NAME[:TAG] 或者 docker push [OPTIONS] NAME[:TAG] :将一个或多个本地镜像推送到远程仓库,并可选地指定一些选项(例如 --disable-content-trust , --quiet 等)和标签。
  • docker image build [OPTIONS] PATH | URL | - 或者 docker build [OPTIONS] PATH | URL | - :根据指定的路径,URL 或标准输入中的 Dockerfile 文件构建一个新的镜像,并可选地指定一些选项(例如 --tag , --file , --no-cache 等)。
  • docker image rm [OPTIONS] IMAGE [IMAGE...] 或者 docker rmi [OPTIONS] IMAGE [IMAGE...] :删除一个或多个本地镜像,并可选地指定一些选项(例如 --force , --no-prune 等)。
  • docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 或者 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] :给一个本地镜像添加一个新的标签,或者给一个远程镜像添加一个本地标签。
  • docker image inspect [OPTIONS] IMAGE [IMAGE...] 或者 docker inspect [OPTIONS] IMAGE [IMAGE...] :查看一个或多个本地镜像的详细信息,并可选地指定一些选项(例如 --format , --size 等)。

下面是一些示例:

  • 列出所有本地镜像:
docker image ls
  • 从 Docker Hub 上拉取 ubuntu:20.04 镜像:
docker image pull ubuntu:20.04
  • 将本地的 ubuntu:20.04 镜像推送到自己的 Docker Hub 账户下,假设账户名为 username :
docker image tag ubuntu:20.04 username/ubuntu:20.04
docker image push username/ubuntu:20.04

注意:在推送之前,你需要先登录到你的 Docker Hub 账户,使用命令: docker login 。

  • 根据当前目录下的 Dockerfile 文件构建一个名为 myapp:latest 的镜像:
docker image build -t myapp:latest .

注意:这里我们使用了 . 来表示当前目录,你也可以使用其他路径或 URL 来指定 Dockerfile 文件的位置。

  • 删除名为 ubuntu:20.04 和 username/ubuntu:20.04 的本地镜像:
docker image rm ubuntu:20.04 username/ubuntu:20.04
  • 给名为 myapp:latest 的本地镜像添加一个新的标签 myapp:v1 :
docker image tag myapp:latest myapp:v1
  • 查看名为 myapp:v1 的本地镜像的大小:
docker image inspect --format '{{ .Size }}' myapp:v1

管理网络

网络是 Docker 的又一个核心概念之一。它是一种连接容器和主机的机制,使得容器之间和容器与外部世界之间可以进行通信。Docker 提供了几种内置的网络驱动,例如 bridge , host , overlay 等,来满足不同的场景和需求。Docker 也允许用户创建自定义的网络,并指定网络的名称,驱动,子网等参数。

要管理网络,我们可以使用 docker network 命令。下面是一些常见的子命令和参数:

  • docker network ls :列出所有本地网络。
  • docker network create [OPTIONS] NETWORK 或者 docker network create [OPTIONS] :创建一个新的网络,并可选地指定一些选项(例如 --driver , --subnet , --ip-range 等)和网络名称。
  • docker network rm NETWORK [NETWORK...] :删除一个或多个本地网络。
  • docker network connect [OPTIONS] NETWORK CONTAINER :将一个容器连接到一个网络,并可选地指定一些选项(例如 --alias , --ip , --link 等)。
  • docker network disconnect [OPTIONS] NETWORK CONTAINER :将一个容器从一个网络断开,并可选地指定一些选项(例如 --force )。
  • docker network inspect [OPTIONS] NETWORK [NETWORK...] :查看一个或多个本地网络的详细信息,并可选地指定一些选项(例如 --format , --verbose 等)。

下面是一些示例:

  • 列出所有本地网络:
docker network ls
  • 创建一个名为 mynet 的自定义网络,使用 bridge 驱动,指定子网为 192.168.0.0/24 ,IP 范围为 192.168.0.100-192.168.0.200 :
docker network create --driver bridge --subnet 192.168.0.0/24 --ip-range 192.168.0.100-192.168.0.200 mynet
  • 删除名为 mynet 的本地网络:
docker network rm mynet
  • 将名为 myapp 的容器连接到名为 mynet 的网络,并给它一个别名 myapp1 :
docker network connect --alias myapp1 mynet myapp
  • 将名为 myapp 的容器从名为 mynet 的网络断开:
docker network disconnect mynet myapp
  • 查看名为 mynet 的本地网络的详细信息:
docker network inspect mynet

管理卷

卷是 Docker 的最后一个核心概念之一。它是一种在主机和容器之间持久化数据的机制,使得容器可以访问主机上的文件和目录,而不影响容器自身的文件系统。Docker 提供了几种内置的卷驱动,例如 local , nfs , tmpfs 等,来满足不同的场景和需求。Docker 也允许用户创建自定义的卷,并指定卷的名称,驱动,标签等参数。

要管理卷,我们可以使用 docker volume 命令。下面是一些常见的子命令和参数:

  • docker volume ls :列出所有本地卷。
  • docker volume create [OPTIONS] [VOLUME] :创建一个新的卷,并可选地指定一些选项(例如 --driver , --label , --opt 等)和卷名称。
  • docker volume rm VOLUME [VOLUME...] :删除一个或多个本地卷。
  • docker volume prune :删除所有未使用的本地卷。
  • docker volume inspect [OPTIONS] VOLUME [VOLUME...] :查看一个或多个本地卷的详细信息,并可选地指定一些选项(例如 --format )。

下面是一些示例:

  • 列出所有本地卷:
docker volume ls
  • 创建一个名为 myvol 的自定义卷,使用 local 驱动,给它一个标签 name=myvol :
docker volume create --driver local --label name=myvol myvol
  • 删除名为 myvol 的本地卷:
docker volume rm myvol
  • 删除所有未使用的本地卷:
docker volume prune
  • 查看名为 myvol 的本地卷的详细信息:
docker volume inspect myvol

总结

在本文中,我们介绍了如何在 Ubuntu 上安装和使用 Docker,以及一些常见的 Docker 命令和操作。Docker 是一个强大而灵活的容器化平台,它可以让你轻松地构建,测试和部署应用程序,无论是在本地还是在云端。如果你想学习更多关于 Docker 的知识,请参考 Docker 的官方文档 。希望这篇文章对你有所帮助!

常见问题解答

Q: 我如何在 Ubuntu 上卸载 Docker?

A: 如果你想在 Ubuntu 上卸载 Docker,你需要先停止并删除所有的容器,镜像,网络和卷。然后你可以使用 apt 命令来卸载 Docker 软件包。具体步骤如下:

# 停止并删除所有容器,镜像,网络和卷:
docker container stop $ (docker container ls -aq)
docker system prune -a --volumes

# 卸载 Docker 软件包:
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 删除任何残留的文件:
sudo rm -rf /var/lib/docker

# 删除 Docker 软件源:
sudo rm /etc/apt/sources.list.d/docker.list

# 删除 Docker GPG key:
sudo apt-key del 0EBFCD88

# 删除依赖软件包:
sudo apt autoremove apt-transport-https ca-certificates curl gnupg-agent software-properties-common lsb-release

Q: 我如何更新 Ubuntu 上的 Docker 版本?

A: 如果你想更新 Ubuntu 上的 Docker 版本,你可以使用 apt 命令来执行标准的软件包更新流程。具体步骤如下:

# 更新软件包索引:
sudo apt update

# 更新 Docker 软件包:
sudo apt upgrade docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证 Docker 版本:
docker version

Q: 我如何在 Ubuntu 上安装指定版本的 Docker?

A: 如果你想在 Ubuntu 上安装指定版本的 Docker,你需要先列出软件源中可用的版本,然后选择你想要安装的版本。具体步骤如下:

# 列出软件源中可用的版本:
apt-cache madison docker-ce | awk ' { print $3 }'

# 安装指定版本(以 5:23.0.5-1~ubuntu.focal 为例):
sudo apt install docker-ce=5:23.0.5-1~ubuntu.focal docker-ce-cli=5:23.0.5-1~ubuntu.focal containerd.io=1.4.12-1

# 验证 Docker 版本:
docker version

Q: 我如何在 Ubuntu 上使用 Docker Compose?

A: 如果你想在 Ubuntu 上使用 Docker Compose,你需要先安装 Docker Compose 插件。这个插件可以让你直接使用 docker compose 命令来管理多个容器组成的应用程序。具体步骤如下:

# 安装 Docker Compose 插件:
sudo apt install docker-compose-plugin

# 验证 Docker Compose 版本:
docker compose version

# 使用 Docker Compose 命令来管理应用程序(以 wordpress 为例):
cd wordpress # 进入 wordpress 目录,其中包含一个名为 docker-compose.yml 的文件