sudo yum update -y
yum-utils
:提供了 yum-config-manager 工具,可以用来管理 yum 的配置文件,如添加、删除、启用和禁用存储库。device-mapper-persistent-data
:提供了一个持久化的数据存储层,允许 Docker 使用高级存储特性,如镜像的分层和快照。lvm2
:逻辑卷管理器(LVM)是一个用于管理磁盘空间的工具,可以通过 LVM 管理卷、卷组和物理卷。在安装 Docker 之前,必须先安装这些依赖包。通过运行
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
命令,可以一次性安装所有依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
前往 Docker 官方 GitHub 仓库下载最新的 Docker 二进制文件。你可以使用 wget
命令下载对应的文件:
- 打开 Docker 官方 GitHub 仓库: https://github.com/docker/docker-ce
- 点击 “releases” 选项卡。这将显示所有可用的 Docker CE(社区版)版本。地址为:https://github.com/docker/docker-ce/releases
在这个页面上,你将看到各种版本的 Docker CE。通常,你应该选择最新的稳定版本(stable)进行安装。每个版本都有一个版本号,例如
19.03.13
。在选择版本后,可以在发布说明中找到适用于不同操作系统的二进制文件下载链接。对于 CentOS 7.x,你需要下载适用于
x86_64
架构的 Linux 二进制文件。例如:wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.13.tgz
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
echo "====================卸载已有Docker===================="
wget https://download.docker.com/linux/static/stable/x86_64/docker-.tgz
将
替换为你想要安装的 Docker 版本号。
tar -xzf docker-.tgz
sudo cp docker/* /usr/bin/
sudo useradd -r -s /sbin/nologin docker
sudo nano /etc/systemd/system/docker.service
将以下内容粘贴到文件中,并保存:
[Unit]
Description=Docker Daemon
Documentation=https://docs.docker.com
After=network.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H unix:// -H tcp://0.0.0.0:2375 --exec-opt native.cgroupdriver=systemd
ExecReload=/bin/kill -s HUP $MAINPID
User=docker
Group=docker
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TasksMax=infinity
Restart=on-failure
StartLimitInterval=60s
StartLimitBurst=3
TimeoutSec=0
[Install]
WantedBy=multi-user.target
这里我们设置 Docker 的配置文件允许通过 UNIX socket 和 TCP 连接,并为 Kubernetes 设置了 native.cgroupdriver=systemd
。
sudo mkdir /etc/docker
sudo nano /etc/docker/daemon.json
将以下内容粘贴到文件中,并保存:
{
"registry-mirrors": ["https://你的阿里云加速器.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"insecure-registries": [
"registry.example.com:5000"
]
}
这个配置文件指定了日志驱动程序、日志文件的最大大小和数量,以及满足 Kubernetes 使用需求的 native.cgroupdriver=systemd
和 overlay2
存储驱动程序。
"registry-mirrors": ["https://z4xi9wmy.mirror.aliyuncs.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com"]
:这里配置了镜像加速器,使得Docker从这些镜像源下载镜像更加快速。当你执行docker pull
等命令时,Docker将首先尝试从这些镜像源获取镜像。"log-driver": "json-file"
:这里配置了Docker日志的驱动程序,指定了使用json-file
作为日志驱动。这意味着Docker容器的日志将以JSON格式存储在文件中。"log-opts": { "max-size": "10m", "max-file": "3" }
:这里设置了日志的选项。max-size
指定单个日志文件的最大大小,这里设置为10MB。max-file
指定要保留的最大日志文件数,这里设置为3。"exec-opts": ["native.cgroupdriver=systemd"]
:这里指定了容器执行选项,其中设置了Cgroup驱动程序为systemd
,用于管理容器的资源隔离和限制。"storage-driver": "overlay2"
:这里指定了容器镜像和容器文件系统的存储驱动程序为overlay2
,它用于管理容器镜像和容器的存储。"storage-opts": ["overlay2.override_kernel_check=true"]
:这里设置了存储驱动程序的选项,用于覆盖内核检查。具体来说,overlay2.override_kernel_check=true
可以允许在不同内核版本之间使用相同的镜像。"insecure-registries": ["registry.example.com:5000"]
:这里配置了不安全的镜像仓库,允许Docker从指定的仓库地址下载不使用TLS的镜像。这在一些特定场景下可能会用到。
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker
要验证 Docker 是否已设置为开机自启动,你可以使用以下命令:
sudo systemctl is-enabled docker
如果已设置为开机自启动,输出结果应为 enabled
。
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
echo "====================卸载已有Docker===================="
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
从列表中选择你想要安装的版本,例如:docker-ce-19.03.13-3.el7
。
20.10.9-3.el7
sudo yum install -y docker-ce- docker-ce-cli- containerd.io
sudo yum install -y docker-ce-20.10.9-3.el7 docker-ce-cli-20.10.9-3.el7 containerd.io
将
替换为你选择的版本号,例如:docker-ce-19.03.13-3.el7
。
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
替换为你在阿里云镜像加速器页面获得的 URL。保存并关闭文件。Kubernetes 推荐使用 systemd 来代替 cgroupfs。
因为 docker 容器默认 cgroup 驱动为 cgroupfs,而 kubelet 默认为 systemd,所以为了使系统更为稳定,容器和 kubelet 应该都使用 systemd 作为 cgroup 驱动。
{
"registry-mirrors": ["https://你的阿里云加速器.mirror.aliyuncs.com","https://hub-mirror.c.163.com","https://mirror.baidubce.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"insecure-registries": [
"registry.example.com:5000"
]
}
"registry-mirrors": ["https://z4xi9wmy.mirror.aliyuncs.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com"]
:这里配置了镜像加速器,使得Docker从这些镜像源下载镜像更加快速。当你执行docker pull
等命令时,Docker将首先尝试从这些镜像源获取镜像。"log-driver": "json-file"
:这里配置了Docker日志的驱动程序,指定了使用json-file
作为日志驱动。这意味着Docker容器的日志将以JSON格式存储在文件中。"log-opts": { "max-size": "10m", "max-file": "3" }
:这里设置了日志的选项。max-size
指定单个日志文件的最大大小,这里设置为10MB。max-file
指定要保留的最大日志文件数,这里设置为3。"exec-opts": ["native.cgroupdriver=systemd"]
:这里指定了容器执行选项,其中设置了Cgroup驱动程序为systemd
,用于管理容器的资源隔离和限制。"storage-driver": "overlay2"
:这里指定了容器镜像和容器文件系统的存储驱动程序为overlay2
,它用于管理容器镜像和容器的存储。"storage-opts": ["overlay2.override_kernel_check=true"]
:这里设置了存储驱动程序的选项,用于覆盖内核检查。具体来说,overlay2.override_kernel_check=true
可以允许在不同内核版本之间使用相同的镜像。"insecure-registries": ["registry.example.com:5000"]
:这里配置了不安全的镜像仓库,允许Docker从指定的仓库地址下载不使用TLS的镜像。这在一些特定场景下可能会用到。
在这个配置文件中,我们设置了阿里云镜像加速器、日志驱动程序、日志文件的最大大小和数量,以及满足 Kubernetes 使用需求的 native.cgroupdriver=systemd
和 overlay2
存储驱动程序。
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl start docker
sudo systemctl enable docker
docker --version
现在,Docker 已安装并配置完毕,你已成功配置了阿里云镜像加速器,设置了日志设置,设置 Docker 开机自启动,并确保支持 Kubernetes 集群。
Docker 使用镜像(images)作为应用程序的基础。你可以从 Docker Hub (https://hub.docker.com/) 获取预先构建的镜像。例如,要拉取官方的 CentOS 镜像,请运行:
docker pull centos
这个命令会从 Docker Hub 下载 CentOS 镜像到本地。
使用拉取的镜像运行一个新的容器。例如,要使用 CentOS 镜像启动一个新的容器并在其中运行 bash,执行:
docker run -it centos bash
这将启动一个新的 CentOS 容器,并在其中打开一个交互式终端。
要查看正在运行的容器,请执行:
docker ps
若要查看所有容器(包括已停止的容器),请执行:
docker ps -a
要停止正在运行的容器,请执行:
docker stop CONTAINER_ID
将 CONTAINER_ID 替换为 docker ps
输出中列出的容器 ID。
要删除一个容器,请执行:
docker rm CONTAINER_ID
若要查看本地可用的镜像,请执行:
docker images
要删除本地存储的镜像,请执行:
docker rmi IMAGE_ID
将 IMAGE_ID 替换为 docker images
输出中列出的镜像 ID。
创建一个名为 Dockerfile
的文件,其中包含用于构建自定义镜像的说明。例如,创建一个基于 CentOS 的镜像,包含 Python 3.8,可以使用以下内容:
FROM centos:latest
RUN yum install -y python38
接着之前的内容,我们继续介绍 Docker 的更多使用方法。
在 Dockerfile
所在目录执行以下命令,以根据 Dockerfile
中的说明构建镜像:
docker build -t your_image_name .
将 your_image_name
替换为你想要为新镜像指定的名称。.
表示使用当前目录下的 Dockerfile
。
使用刚刚构建的自定义镜像运行一个新的容器:
docker run -it your_image_name bash
将 your_image_name
替换为你为新镜像指定的名称。这将启动一个新容器并在其中打开交互式终端。
首先,使用你的 Docker Hub 凭据登录:
docker login
然后,为你的镜像添加一个标签,以便将其推送到你的 Docker Hub 账户:
docker tag your_image_name your_dockerhub_username/your_image_name:your_tag
将 your_image_name
、your_dockerhub_username
和 your_tag
替换为相应的值。
最后,将镜像推送到 Docker Hub:
docker push your_dockerhub_username/your_image_name:your_tag
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。首先,安装 Docker Compose:
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
创建一个名为 docker-compose.yml
的文件,其中包含用于定义多容器应用程序的说明。例如,要创建一个包含 web 服务器和数据库的简单应用程序,请使用以下内容:
version: '3'
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: mypassword
在 docker-compose.yml
所在目录执行以下命令,启动应用程序:
docker-compose up -d
若要停止并删除应用程序,请执行:
docker-compose down
在 Docker 中,有时你可能需要对镜像和容器执行批量操作或进行清理。以下是一些实用的命令:
docker stop $(docker ps -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -q -f "dangling=true")
docker system prune
若要在不进行提示的情况下执行清理操作,请添加 -f
或 --force
选项
docker system prune -f
docker image prune
docker container prune
docker network prune
docker volume prune
这些命令可以帮助你管理 Docker 环境,释放磁盘空间,并确保你的系统保持整洁。在执行删除和清理操作时,请务必谨慎,以避免意外删除重要数据。
docker save -o my_image.tar IMAGE_NAME
将 my_image.tar
替换为要保存的文件名,将 IMAGE_NAME
替换为要导出的镜像名称。
docker load -i my_image.tar
将 my_image.tar
替换为要加载的文件名。加载操作会将镜像导入到本地 Docker 环境中,使其可以像其他镜像一样使用。
docker export -o my_container.tar CONTAINER_ID
将 my_container.tar
替换为要保存的文件名,将 CONTAINER_ID
替换为要导出的容器 ID。
cat my_container.tar | docker import - NEW_IMAGE_NAME
将 my_container.tar
替换为要加载的文件名,将 NEW_IMAGE_NAME
替换为要为新镜像指定的名称。导入操作会创建一个新的镜像,其中包含导出容器的文件系统。然后,你可以使用此新镜像创建新容器。
需要注意的是,使用 docker export
和 docker import
命令导出和导入容器时,容器的元数据(例如环境变量和端口映射)不会保留。因此,当你需要保留这些信息时,建议使用镜像导出和导入功能。
docker network ls
docker network create NETWORK_NAME
将 NETWORK_NAME
替换为新网络的名称。
docker network rm NETWORK_NAME
将 NETWORK_NAME
替换为要删除的网络名称。
docker network connect NETWORK_NAME CONTAINER_ID
将 NETWORK_NAME
替换为要连接的网络名称,将 CONTAINER_ID
替换为要连接的容器 ID。
docker network disconnect NETWORK_NAME CONTAINER_ID
将 NETWORK_NAME
替换为要断开连接的网络名称,将 CONTAINER_ID
替换为要断开连接的容器 ID。
docker network inspect NETWORK_NAME
将 NETWORK_NAME
替换为要查看详细信息的网络名称。
docker volume ls
docker volume create VOLUME_NAME
将 VOLUME_NAME
替换为新卷的名称。
docker volume rm VOLUME_NAME
将 VOLUME_NAME
替换为要删除的卷名称。
docker volume inspect VOLUME_NAME
将 VOLUME_NAME
替换为要查看详细信息的卷名称。
docker run --name CONTAINER_NAME --network NETWORK_NAME -d IMAGE_NAME
将 CONTAINER_NAME
替换为要为新容器指定的名称,将 NETWORK_NAME
替换为要连接的网络名称,将 IMAGE_NAME
替换为要运行的镜像名称。
docker run --name CONTAINER_NAME -v VOLUME_NAME:/path/in/container -d IMAGE_NAME
将 CONTAINER_NAME
替换为要为新容器指定的名称,将 VOLUME_NAME
替换为要挂载的卷名称,将 /path/in/container
替换为容器内的挂载点路径,将 IMAGE_NAME
替换为要运行的镜像名称。
docker network create --driver overlay --subnet SUBNET --gateway GATEWAY NETWORK_NAME
将 SUBNET
替换为子网(例如 192.168.0.0/24),将 GATEWAY
替换为网关(例如 192.168.0.1),
下面是一个示例,说明如何使用 Docker 网络和卷。我们将创建一个简单的应用程序,其中包括一个 web 服务器(Nginx)和一个数据库服务器(MySQL)。这两个容器将连接到一个自定义网络,并使用 Docker 卷存储数据库数据。
创建一个自定义网络:
docker network create my_app_network
这将创建一个名为 my_app_network
的自定义网络。
创建一个 Docker 卷用于存储 MySQL 数据:
docker volume create mysql_data
这将创建一个名为 mysql_data
的 Docker 卷。
运行 MySQL 容器,并将其连接到自定义网络,挂载 Docker 卷:
docker run --name my_mysql_container --network my_app_network -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my_root_password -e MYSQL_DATABASE=my_database -e MYSQL_USER=my_user -e MYSQL_PASSWORD=my_password -d mysql:5.7
这将运行一个名为 my_mysql_container
的 MySQL 容器,连接到 my_app_network
网络,并将 mysql_data
卷挂载到 /var/lib/mysql
目录。此外,我们还设置了一些环境变量以配置 MySQL 数据库。
运行 Nginx 容器,并将其连接到自定义网络:
docker run --name my_nginx_container --network my_app_network -p 80:80 -d nginx:latest
这将运行一个名为 my_nginx_container
的 Nginx 容器,连接到 my_app_network
网络,并将主机的 80 端口映射到容器的 80 端口。
此时,Nginx 和 MySQL 容器都已连接到 my_app_network
网络,它们可以通过容器名称(例如,my_mysql_container
)互相通信。在实际应用中,你可以将 web 应用程序与数据库连接,使其通过容器名称进行通信。
若要查看网络和卷的详细信息,请执行以下命令:
docker network inspect my_app_network
docker volume inspect mysql_data
这将显示有关 my_app_network
网络和 mysql_data
卷的详细信息。