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

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-.tgz

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

  1. 解压缩并安装:
tar -xzf docker-.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://你的阿里云加速器.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- 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

  1. 创建或编辑 Docker 的 daemon.json 配置文件:
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
  1. 将以下内容粘贴到文件中,并将 替换为你在阿里云镜像加速器页面获得的 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"
  ]
}
  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 卷的详细信息。

你可能感兴趣的:(docker,容器,运维)