什么?我被 Docker 一条龙服务了!

安装

二进制安装

  1. 确保 CentOS 7.x 系统已更新:
sudo yum update -y
  1. 安装必要的依赖包:
  1. yum-utils:提供了 yum-config-manager 工具,可以用来管理 yum 的配置文件,如添加、删除、启用和禁用存储库。
  2. device-mapper-persistent-data:提供了一个持久化的数据存储层,允许 Docker 使用高级存储特性,如镜像的分层和快照。
  3. 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
  1. 下载 Docker 二进制文件

前往 Docker 官方 GitHub 仓库下载最新的 Docker 二进制文件。你可以使用 wget 命令下载对应的文件:

  1. 打开 Docker 官方 GitHub 仓库: https://github.com/docker/docker-ce
  2. 点击 "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-<VERSION>.tgz

<VERSION> 替换为你想要安装的 Docker 版本号。

  1. 解压缩并安装:
tar -xzf docker-<VERSION>.tgz
sudo cp docker/* /usr/bin/
  1. 创建 Docker 系统用户:
sudo useradd -r -s /sbin/nologin docker
  1. 创建 systemd 服务文件:
    使用编辑器(例如 vim、nano 等)创建一个新的 systemd 服务文件:
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

  1. 配置 Docker 守护进程
    创建 Docker 守护进程的配置文件:
sudo mkdir /etc/docker
sudo nano /etc/docker/daemon.json

将以下内容粘贴到文件中,并保存:

{
  "registry-mirrors": ["https://z4xi9wmy.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=systemdoverlay2 存储驱动程序。

  1. "registry-mirrors": ["https://z4xi9wmy.mirror.aliyuncs.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com"]:这里配置了镜像加速器,使得Docker从这些镜像源下载镜像更加快速。当你执行docker pull等命令时,Docker将首先尝试从这些镜像源获取镜像。
  2. "log-driver": "json-file":这里配置了Docker日志的驱动程序,指定了使用json-file作为日志驱动。这意味着Docker容器的日志将以JSON格式存储在文件中。
  3. "log-opts": { "max-size": "10m", "max-file": "3" }:这里设置了日志的选项。max-size指定单个日志文件的最大大小,这里设置为10MB。max-file指定要保留的最大日志文件数,这里设置为3。
  4. "exec-opts": ["native.cgroupdriver=systemd"]:这里指定了容器执行选项,其中设置了Cgroup驱动程序为systemd,用于管理容器的资源隔离和限制。
  5. "storage-driver": "overlay2":这里指定了容器镜像和容器文件系统的存储驱动程序为overlay2,它用于管理容器镜像和容器的存储。
  6. "storage-opts": ["overlay2.override_kernel_check=true"]:这里设置了存储驱动程序的选项,用于覆盖内核检查。具体来说,overlay2.override_kernel_check=true可以允许在不同内核版本之间使用相同的镜像。
  7. "insecure-registries": ["registry.example.com:5000"]:这里配置了不安全的镜像仓库,允许Docker从指定的仓库地址下载不使用TLS的镜像。这在一些特定场景下可能会用到。
  1. 启动并启用 Docker 服务
sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

要验证 Docker 是否已设置为开机自启动,你可以使用以下命令:

sudo systemctl is-enabled docker

如果已设置为开机自启动,输出结果应为 enabled

yum安装

sudo yum remove docker \
               docker-client \
               docker-client-latest \
               docker-common \
               docker-latest \
               docker-latest-logrotate \
               docker-logrotate \
               docker-engine

echo "====================卸载已有Docker===================="
  1. 安装必要的依赖包:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 添加阿里云 Docker CE 镜像仓库:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 查看可用的 Docker CE 版本:
yum list docker-ce --showduplicates | sort -r

从列表中选择你想要安装的版本,例如:docker-ce-19.03.13-3.el7

  1. 安装指定版本的 Docker CE 及相关组件:

20.10.9-3.el7

sudo yum install -y docker-ce-<VERSION> docker-ce-cli-<VERSION> containerd.io
sudo yum install -y docker-ce-20.10.9-3.el7 docker-ce-cli-20.10.9-3.el7 containerd.io

<VERSION> 替换为你选择的版本号,例如:docker-ce-19.03.13-3.el7

  1. 创建或编辑 Docker 的 daemon.json 配置文件:
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
  1. 将以下内容粘贴到文件中,并将 <your_accelerator_url> 替换为你在阿里云镜像加速器页面获得的 URL。保存并关闭文件。

Kubernetes 推荐使用 systemd 来代替 cgroupfs。

因为 docker 容器默认 cgroup 驱动为 cgroupfs,而 kubelet 默认为 systemd,所以为了使系统更为稳定,容器和 kubelet 应该都使用 systemd 作为 cgroup 驱动。

{
  "registry-mirrors": ["https://weor96qj.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"
  ]
}
  1. "registry-mirrors": ["https://z4xi9wmy.mirror.aliyuncs.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com"]:这里配置了镜像加速器,使得Docker从这些镜像源下载镜像更加快速。当你执行docker pull等命令时,Docker将首先尝试从这些镜像源获取镜像。
  2. "log-driver": "json-file":这里配置了Docker日志的驱动程序,指定了使用json-file作为日志驱动。这意味着Docker容器的日志将以JSON格式存储在文件中。
  3. "log-opts": { "max-size": "10m", "max-file": "3" }:这里设置了日志的选项。max-size指定单个日志文件的最大大小,这里设置为10MB。max-file指定要保留的最大日志文件数,这里设置为3。
  4. "exec-opts": ["native.cgroupdriver=systemd"]:这里指定了容器执行选项,其中设置了Cgroup驱动程序为systemd,用于管理容器的资源隔离和限制。
  5. "storage-driver": "overlay2":这里指定了容器镜像和容器文件系统的存储驱动程序为overlay2,它用于管理容器镜像和容器的存储。
  6. "storage-opts": ["overlay2.override_kernel_check=true"]:这里设置了存储驱动程序的选项,用于覆盖内核检查。具体来说,overlay2.override_kernel_check=true可以允许在不同内核版本之间使用相同的镜像。
  7. "insecure-registries": ["registry.example.com:5000"]:这里配置了不安全的镜像仓库,允许Docker从指定的仓库地址下载不使用TLS的镜像。这在一些特定场景下可能会用到。

在这个配置文件中,我们设置了阿里云镜像加速器、日志驱动程序、日志文件的最大大小和数量,以及满足 Kubernetes 使用需求的 native.cgroupdriver=systemdoverlay2 存储驱动程序。

  1. 启动并设置 Docker 服务为开机自启动:
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl start docker
sudo systemctl enable docker
  1. 验证 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 Hub 凭据登录:

docker login

然后,为你的镜像添加一个标签,以便将其推送到你的 Docker Hub 账户:

docker tag your_image_name your_dockerhub_username/your_image_name:your_tag

your_image_nameyour_dockerhub_usernameyour_tag 替换为相应的值。

最后,将镜像推送到 Docker Hub:

docker push your_dockerhub_username/your_image_name:your_tag

使用 Docker Compose

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 exportdocker 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 替换为要运行的镜像名称。

创建一个 overlay 网络,并指定子网和网关

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 卷存储数据库数据。

  1. 创建一个自定义网络:

    docker network create my_app_network
    

    这将创建一个名为 my_app_network 的自定义网络。

  2. 创建一个 Docker 卷用于存储 MySQL 数据:

    docker volume create mysql_data
    

    这将创建一个名为 mysql_data 的 Docker 卷。

  3. 运行 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 数据库。

  4. 运行 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 端口。

  5. 此时,Nginx 和 MySQL 容器都已连接到 my_app_network 网络,它们可以通过容器名称(例如,my_mysql_container)互相通信。在实际应用中,你可以将 web 应用程序与数据库连接,使其通过容器名称进行通信。

  6. 若要查看网络和卷的详细信息,请执行以下命令:

    docker network inspect my_app_network
    docker volume inspect mysql_data
    

    这将显示有关 my_app_network 网络和 mysql_data 卷的详细信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,490评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,581评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,830评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,957评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,974评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,754评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,464评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,847评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,995评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,137评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,819评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,482评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,023评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,149评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,409评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,086评论 2 355

推荐阅读更多精彩内容