Skip to content

Latest commit

 

History

History
482 lines (336 loc) · 18.8 KB

Docker.md

File metadata and controls

482 lines (336 loc) · 18.8 KB

概述

本篇为教学如何在 CentOS 7.9 中安装 docker-ce,及介绍 docker 基本的使用方法。

版本环境

  • VMware Workstation 16 Pro(16.2.3 build-19376536)
  • CentOS 7.9(CentOS-7-x86_64-DVD-2009)
  • Docker CE 26.0.0

权限问题

安装配置的过程中几乎都需要使用到管理员权限,这里建议切换为 root 用户来执行以下操作。普通用户在 CentOS 7 中想要获取管理员权限会稍微有点麻烦,因为 CentOS 7 默认并不允许普通用户使用 sudo 命令。

要解决这个问题,需要管理员手动将指定普通用户添加到 sudoers 文件中。假设 mike 为普通用户,这里要将其添加到 sudoers 文件中。以管理员身份登录到系统,或者使用拥有 sudo 权限的用户登录,接着编辑 sudoers 文件:

sudo visudo

在打开的文件中找到以下行:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

在该行的下方添加以下行,以允许用户 mike 使用 sudo 命令:

mike    ALL=(ALL)       ALL

保存并退出编辑器。现在,用户 mike 应该可以使用 sudo 命令并输入自己的密码来获取管理员权限了。

主要原因

在 CentOS 7 不再接收官方更新和维护后,会影响到系统中的软件包,包括 docker。这可能导致 CentOS 7 的默认软件源中提供的 docker 版本变得过时,因为它们不再接收新的更新和功能改进。

此外,CentOS 7 的官方 yum 源通常只提供与 CentOS 7 兼容的软件包,而不是最新版本的软件包。因此,即使在 CentOS 7 还在维护更新阶段时,yum 源提供的 docker 版本也可能相对较旧,这可能导致 docker 版本不足以支持某些新功能或软件。

就目前的情况而言,CentOS 7.9 中的 yum 源所提供的 docker 已经停留在了 1.13.1 版本:

~]# docker --version
docker version 1.13.1, build 7d71120/1.13.1

类似于 Nginx、MySQL 这些软件的最新版本已不再支持低版本的 docker 了。

因此,将 docker 更新到 Docker CE 是一个解决方案,因为 Docker CE 是由 Docker 社区提供的、针对最新特性和功能的版本,而不仅仅是 CentOS 7 默认软件源中提供的版本。这样做可以确保获得最新的 docker 功能、安全性和性能改进,并且与最新的容器化应用程序兼容。

添加新源

Docker CE 是 Docker 社区版的简称,是由 Docker 社区维护和支持的免费、开源的 Docker 版本。要安装 Docker CE,您需要添加适当的 YUM 软件源到您的系统中,然后使用 yum 命令来安装 Docker CE。

# step 1: 安装 yum-utils 系统工具
sudo yum install -y yum-utils

# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

上述软件源可能会遇到网络连通性问题,那么可以为 yum 命令提供代理:

echo "proxy=http://192.168.1.188:13766" >> /etc/yum.conf

注意 VMWare 桥接模式下不使用 TUN 提供的虚拟网卡,因此需要上述配置让 yum 的流量能够导向代理服务,但是否能顺利连接取决于实际的分流规则。

简单来说,就是需要在将 https://download.docker.com 交给代理服务。

但如果遇到类似于源下架等生命周期结束行为,那么网络连通性将无法解决。为了避免麻烦,建议使用阿里源:

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

其中 yum-utils 是一个 CentOS 或 Red Hat Enterprise Linux (RHEL) 等系统上的一个工具集合,用于增强和扩展 YUM 包管理器的功能。它包含了一系列的命令行工具,可以帮助用户更有效地管理软件包。

这里只使用了 yum-utils 工具集中 yum-config-manager 工具来添加新的 yum 软件源,这里添加的是 docker-ce 源。

安装 docker-ce

# step 1: 刷新 yum 软件包管理器缓存
sudo yum makecache fast

# step 2: 安装 docker-ce
sudo yum install -y docker-ce

替换 docker 源

如果已经将 docker 更新至 docker-ce,那么使用 docker-ce 从 Docker Hub 拉取镜像时,一般不会出现从前的连接困难的情况。

但如果不可避免出现了网络故障:

~]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
missing signature key

那么可以选择为 Docker Hub 配置镜像加速器。推荐使用阿里云镜像加速器,需要注意使用阿里镜像加速需要注册并登录阿里云账号。

获取到加速地址后,需配置 Docker Hub 的镜像源,添加或编辑 daemon.json 文件:

# 编辑 daemon.json
vim /etc/docker/daemon.json

添加以下配置并保存 daemon.json 文件。

{
  "registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}

重新载入 daemon.json 文件,并重启 docker 服务:

# step 1: 重新载入 daemon.json 文件
systemctl daemon-reload
# step 2: 重启 docker 服务
systemctl restart docker

关于 docker desktop 中 mirror 设置:

Snipaste_2024-10-31_12-23-56

docker 代理服务

如果在拉取镜像时,由于不可控原因导致镜像加速器无法使用,或不可避免地出现了网络故障,则推荐使用代理服务来解决 docker 拉取镜像的问题。

CentOS 中可以使用环境变量来配置代理(不仅仅只支持以下类型的代理):

export HTTP_PROXY="http://192.168.1.188:13766"
export HTTPS_PROXY="http://192.168.1.188:13766"
export NO_PROXY="localhost,127.0.0.1"

其中:

  • HTTP_PROXY:HTTP 代理的地址和端口;
  • HTTPS_PROXY:HTTPS 代理的地址和端口;
  • NO_PROXY:不使用代理的地址。

注意,上述代理配置为临时配置,系统重启后配置会失效,且只有 HTTP 和 HTTPS 请求才会使用该代理

以下代码用于测试代理可用性:

curl -I https://www.google.com

但实际上 docker 并无法直接使用环境变量中配置的代理。因为镜像的拉取和管理都是 docker daemon 的职责,而 docker daemon 是由 systemd 管理的,因此为 docker 配置代理要从 systemd 配置入手。具体步骤如下:

  1. 创建 dockerd 相关的 systemd 目录,该目录下的配置将覆盖 dockerd 的默认配置:
mkdir -p /etc/systemd/system/docker.service.d
  1. 新建配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf,在文件中配置环境变量:
[Service]
Environment="HTTP_PROXY=http://192.168.1.188:13766"
Environment="HTTPS_PROXY=http://192.168.1.188:13766"
  1. 代理一旦配置,则所有的请求都会优先使用代理服务。如果有需要绕过代理,则需添加 NO_PROXY 变量,例如私有的镜像仓库:
[Service]
Environment="HTTP_PROXY=http://192.168.1.188:13766"
Environment="HTTPS_PROXY=http://192.168.1.188:13766"
Environment="NO_PROXY=localhost,127.0.0.1"
  1. 重新加载配置并重启 docker:
systemctl daemon-reload
systemctl restart docker
  1. 检查及确认环境变量是否已经正确配置:
systemctl show --property=Environment docker
  1. 在 docker info 的结果中同样可以查看代理配置项:
 ~]# docker info
...
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http://192.168.1.188:13766
 HTTPS Proxy: http://192.168.1.188:13766
 No Proxy: localhost,127.0.0.1
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
...

完成以上配置后,同时确认代理服务可用(可以使用系统环境变量结合 CURL 命令来测试代理可用性),即可以通过代理正常拉取 docker 镜像。

上述代理服务也可以是由 Clash Verge 等代理工具提供的局域网代理服务,这意味着如果将 docker 部署在虚拟机中,则推荐使用的虚拟网络模式为桥接模式(BRIDGE)。

除此之外,如果虚拟机的宿主机上存在 TUN 代理服务,那么还可以通过 NAT 模式将 TUN 代理共享给虚拟机中的 docker 使用,这样可以避免配置 docker 环境变量,对于临时使用代理来说更加便捷。

docker 服务自启

默认情况下 docker 不会跟随系统一起启动。

如果需要 docker 服务自启,则需手动将 docker 服务添加到系统的自启动服务列表中:

systemctl enable docker.service

如果希望取消自启动,则使用以下命令:

systemctl disable docker.service

启用/停用 docker

# 启用/停用 docker
systemctl start docker
systemctl stop docker

# 重启 docker
systemctl restart docker

# 查看 docker 运行状态
systemctl status docker

# 查看 docker 版本
docker version

卸载 docker

初期接触 docker 很容易出现“玩脱”的情况:

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

这种情况下,重启 docker 亦或是重启 Linux 系统都是无法解决问题的。目前的唯一的解决方法,是重新安装 docker。

查询本机上关于 docker-ce 的所有服务:

~]# yum list installed | grep docker
containerd.io.x86_64             1.6.28-3.1.el7                @docker-ce-stable
docker-buildx-plugin.x86_64      0.12.1-1.el7                  @docker-ce-stable
docker-ce.x86_64                 3:25.0.3-1.el7                @docker-ce-stable
docker-ce-cli.x86_64             1:25.0.3-1.el7                @docker-ce-stable
docker-ce-rootless-extras.x86_64 25.0.3-1.el7                  @docker-ce-stable
docker-compose-plugin.x86_64     2.24.6-1.el7                  @docker-ce-stable

卸载 docker-ce 命令:

# 卸载 docker-ce 所有服务
yum remove -y docker* containerd.io

docker 可视化管理工具

portainer-ce 是一个轻量级的管理 UI,可让你轻松管理不同的 Docker 环境(Docker 主机或 Swarm 集群)。它由可在任意 Docker 引擎上运行的单个容器组成,旨在使部署变得更简单 。

官方推荐的安装方式如下:

# step 1: 在 /var/lib/docker/volume 下创建 portainer_data 目录
docker volume create portainer_data

# step 2: 不需要事先拉取 portianer-ce 的镜像,容器创建过程中会自动拉取镜像
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

查看关于 portainer_data 的信息:

docker volume inspect portainer_data

默认情况下,Portainer 生成并使用自签名 SSL 证书来保护 9443 端口。如果因为某些遗留问题,需要使用 HTTP 协议,可以添加 9000 端口的映射:

# step 1: 杀掉正在运行的 portainer 容器
docker kill portainer

# step 2: 移除停止运行的 portainer 容器
docker rm portainer

# step 3: 创建并运行新的 portainer 容器
docker run -d -p 8000:8000 -p 9443:9443 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce

这样,既可通过 http://localhost:9000 访问,亦可通过 https://localhost:9443 访问。

首次访问需要设置密码,进入后即可访问 docker 的可视化界面:

image-20201102151754192

点击 Environments 中的卡片,即可查看 docker 中关于镜像、容器和卷的占用状态等,在 docker 程序莫名占满磁盘空间的时候,可以轻松地清除掉一些不常用的镜像、容器或卷:

image-20201102152033145

docker 基本命令

docker 可以理解为虚拟机,images 可以理解为虚拟机上的软件,container 可以理解为正在运行的软件。

以下是一些 docker 中的常用命令 Commands,每个命令后面都可以使用参数 --help 来查看该命令的详细帮助文档:

# 在 dockerhub 中寻找目标 images 镜像
docker search {IMAGE NAME}
# 从 dockerhub/registry 中获取目标 image 镜像
docker pull {IMAGE NAME}
# 列出所有的 images 镜像
docker images
# 开启一个新容器
docker run [OPTION] [...] [IMAGE NAME | ID]
# 让停止的 container 容器重新运行
docker start {CONTAINER NAME | ID}
# 让运行的 container 容器停止运行
docker stop {CONTAINER NAME | ID}
# 重启 container 容器
docker restart {CONTAINER NAME | ID}
# 列出所有运行中的 containers 容器,一般加上 -a 显示包括已停止容器
docker ps [-a]
# 杀死正在运行中的 container 容器
docker kill {CONTAINER NAME | ID}
# 移除某个 container 容器
docker rm {CONTAINER NAME | ID}
# 移除某个 image 镜像
docker rmi {IMAGE NAME | ID}

其中详细说明一下 docker run 中的部分参数,通过命令 docker run --help 可以查看详细的帮助文档:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 让容器在后台运行,即 background 运行
-d

# 在容器结束的时候移除该容器,与 -d 参数一起使用无意义,它只能移除 foreground 的容器
# 但如果你有挂载的目录,使用这个命令,当容器被 rm 移除的时候,宿主机上的目录也会被
--rm

# 给你的容器命个名
--name {alias container name}

# 指定端口映射关系,冒号前是宿主机(也就是你的 linux 主机)的端口,冒号后是 docker 的端口
-p {host port}:{container port}

# 建立目录映射关系前,一般需要将目标镜像需要进行配置的文件夹 container directory 先拷贝到宿主机上
# 之后再使用以下选项,将拷贝下来并配置完毕的 host directory 挂载到目标容器中 container directory 中
# 此后每次需要对 container 进行配置,只需要修改 host 中的目录,修改完毕重启目标容器,配置即可同步并生效
-v {host directory}:{container directory}

使用以下命令可以进入 container 的 bash 模式中,浏览 container 中的文件:

# 显示正在运行的 container 容器
docker ps
# 显示所有的 container 容器
docker ps -a
# 显示容器内进程信息
docker top {container id | container name}
# 进入指定容器的 bash 交互模式中,CONTAINER ID 可以简写
docker exec -it {container id | container name} bash
# 如果只想浏览某个容器中的某些文件夹中的文件,可以直接在 container id 之后写 bash 命令
# 例如,列出容器 ID 简写为 16fc 的容器中 /etc/conf.d 目录下的所有文件
docker exec -it {container id | container name} {bash command}
docker exec -it 16fc ls /etc/conf.d

显示容器的网络状态,可以使用 inspect 选项,该选项在查看目标容器的容器内 IP 时很有用:

docker inspect [OPTIONS] CONTAINER NAME|ID [CONTAINER NAME|ID...]

# 准确获取容器内的 IP 地址
docker inspect --format='{{.NetworkSettings.Networks.root_default.IPAddress}}' {CONTAINER_NAME | CONTAINER_ID}

如过不使用 inspect 选项查看容器内 IP,需要首先进入容器 bash,更新 apt 并安装 net-tools,使用 ifconfig -a 命令查看容器内网络状况:

# 如果容器内未安装 net-tools,需要先安装 net-tools
docker exec -it CONTAINER NAME|ID bash
# 进入容器内 bash
apt update
apt install -y net-tools
ifconfig -a
# 退出容器内 bash
exit

# 如果容器内以安装 net-tools,可以直接使用以下命令在宿主机 bash 上查询目标容器的网络状态
docker exec -it CONTAINER NAME|ID ifconfig -a

docker 网络

同一个 docker 内的所有容器都相当于处在同一个局域网下,可以通过容器内 IP 地址及对应的容器内端口进行访问;

同一个 docker 内的容器,无法通过同一个 docker 下的其他容器的宿主机 IP 地址及对应的宿主机映射端口访问到其中提供的服务,是一个 bug,可以通过开放宿主机映射端口的防火墙权限解决:

# 查看防火墙所有(永久/临时)开放的端口
firewall-cmd --zone=public --list-ports
# 永久开放xxxx端口
firewall-cmd --zone=public --add-port=xxxx/tcp --permanent
# 使开放/关闭端口操作立即生效
firewall-cmd --reload

来自于宿主机局域网中的其他 docker 容器的连接,可以直接通过宿主机 IP 地址及其对应的宿主机映射端口访问到容器中提供的服务,毋需开启宿主机映射端口的防火墙权限。

docker desktop

docker desktop 是 docker 提供的一款本地开发环境工具,适用于 Windows、Linux 和 macOS 系统,旨在帮助开发者在本地机器上运行、测试和管理容器化应用。

简单来说,它就是一款可视化的管理工具,不过以应用的形式出现在 Windows、Linux 和 macOS 系统上,下面主要说一下 Windows 系统下的一些细节。

Windows 系统下推荐使用 WSL2 作为 docker 容器的虚拟化技术,性能较好。使用 WSL2 不需要在 Windows 功能中启用 Hyper-V 功能,尽管 WSL2 有依赖部分的 Hyper-V 技术。

docker desktop 安装完毕后,会自动创建一个名为“docker-desktop”的 WSL2 系统:

> wsl --list --verbose
  NAME              STATE           VERSION
* docker-desktop    Running         2
  Ubuntu-22.04      Stopped         2

这里推荐使用以下命令将其设置为默认的 Linux 发行版:

wsl --set-default 'docker-desktop'

如果 docker desktop 存在的同时不将其对应的 WSL 系统设置为默认的 Linux 发行版,那么 docker desktop 运行时,默认的 Linux 发行版会一并启动,切换完毕后推荐重启系统再进行容器的配置。

上述情况已经将 docker-desktop 设置为默认的 Linux 发行版,因此 Ubuntu-22.04 不会被启动。

另外,使用 docker desktop 时,还是推荐直接使用命令行来执行 docker 运行容器的命令。虽然具有 GUI 界面,但大多数参数只有命令行支持配置,例如运行 MySQL 容器的命令:

docker create --name=my_database --restart=always --privileged=true -e MYSQL_ROOT_PASSWORD=0217 -e TZ=Asia/Shanghai -v ~/mysql/conf.d:/etc/mysql/conf.d -p 3306:3306 mysql:latest

图形化界面不支持配置 --restart=always 和 --privileged=true 等参数,并且只有 --restart=always 支持使用 docker update 来后补参数配置:

docker update --restart=always 08eaaa72ca81

因此,为了避免不必要的麻烦,推荐使用 docker terminal 来执行 docker 运行容器的命令,其余命令可根据个人喜好自行决定是否使用命令行。另外容器删除后如需再创建则推荐重启,以免出现端口被占用或其他未知问题。