当前位置: 首页 > news >正文

容器技术技术入门与Docker环境部署

目录

docker概述

什么是docker

docker优势

docker的应用场景

docker核心概念

镜像

容器

仓库

docker安装

本安装方式使用阿里的软件仓库

关闭系统防火墙

下载Docker的repo文件

替换仓库地址

更新索引文件并安装Docker

添加国内镜像站

开启Docker服务

优化内核参数

Docker镜像操作

获取镜像

查看镜像信息

查看镜像的详细信息

修改镜像标签(老名字+新名字)

删除镜像

存出镜像和载入镜像

docker容器操作

容器创建与启动

容器的运行

利用容器执行命令(命令执行完毕后容器会退出)

在启动容器时持续在后台运行

容器的终止

进入容器

容器导出

容器导入生成镜像

容器删除


docker概述

什么是docker

Docker 是一种开源的容器化平台,它能够让开发者打包他们的应用以及应用的依赖环境到一个可移植的容器中,然后发布到任何流行的 Linux 或 Windows 操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

从本质上讲,Docker 利用 Linux 内核的特性,如命名空间(Namespaces)和控制组(Cgroups),来创建独立的、隔离的运行环境。命名空间用于隔离进程、网络、挂载点等系统资源,使得每个容器都有自己独立的视图;控制组则用于限制和监控容器对系统资源(如 CPU、内存、磁盘 I/O 等)的使用,保证容器之间的资源隔离和公平使用

docker优势

 环境一致性

在传统的软件开发和部署流程中,经常会遇到 “在我的机器上可以运行,到你的机器上却不行” 的问题。Docker 通过容器化技术,将应用及其依赖的操作系统库、运行时环境等全部打包到容器中。无论在开发、测试还是生产环境,只要运行 Docker 容器,应用就会在相同的环境中执行,消除了环境差异带来的困扰。

比如,一个 Java 应用可能依赖特定版本的 JDK、特定的系统库以及一些配置文件。使用 Docker 后,这些都被封装在容器内,开发人员在本地开发完成后,直接将容器部署到测试环境和生产环境,无需担心不同环境中 JDK 版本不一致、系统库缺失等问题

轻量级与高效性

与传统的虚拟机(VM)相比,Docker 容器更加轻量级。虚拟机需要模拟整个操作系统,包括内核、硬件驱动等,每个虚拟机都有自己独立的操作系统实例,这会带来较大的资源开销。而 Docker 容器共享宿主机的内核,不需要模拟完整的操作系统,只是在进程级别进行隔离。

举个例子,在一台物理服务器上,运行多个虚拟机可能会因为每个虚拟机的操作系统占用大量内存和 CPU 资源,导致可同时运行的应用数量有限。而使用 Docker 容器,由于其轻量级的特性,可以在同一台服务器上运行数百个容器,大大提高了硬件资源的利用率

快速部署与扩展

Docker 容器的启动速度非常快,通常可以在几秒钟内完成启动。这使得应用的部署和扩展变得更加高效。对于互联网应用来说,业务高峰时期可能需要快速扩展服务实例来应对高并发,Docker 可以快速地创建新的容器实例,满足业务需求。

例如,一个电商网站在促销活动期间,访问量大幅增加。通过 Docker 结合容器编排工具(如 Kubernetes),可以自动检测到流量变化,并快速创建新的 Web 服务容器实例,将请求分流到这些新实例上,保证网站的正常运行。当促销活动结束后,又可以方便地关闭多余的容器,节省资源

持续集成与持续交付(CI/CD)友好

在现代软件开发的 CI/CD 流程中,Docker 扮演着重要的角色。开发人员可以在代码提交后,通过自动化的构建流程生成 Docker 镜像,然后在测试环境中快速部署该镜像进行测试。测试通过后,又可以轻松地将镜像推广到生产环境。

比如,在一个基于 Git 的软件开发项目中,每当开发人员向代码仓库提交新的代码变更时,持续集成服务器会自动拉取代码,构建 Docker 镜像,并运行一系列的自动化测试(如单元测试、集成测试等)。如果测试通过,持续交付流程可以将该镜像部署到预生产环境进行进一步验证,最终实现快速、可靠的软件交付

docker的应用场景

应用程序打包与分发

对于软件开发商和开源项目来说,Docker 提供了一种标准化的应用打包和分发方式。开发人员可以将应用及其所有依赖打包成一个 Docker 镜像,然后将该镜像上传到 Docker 镜像仓库(如 Docker Hub 或私有仓库)。用户只需要在目标环境中拉取该镜像并运行容器,就可以轻松使用应用,无需关心应用的具体依赖和安装配置过程。

例如,一个开源的数据库管理工具项目,开发团队可以构建一个包含该工具以及其依赖的 Python 环境、相关库的 Docker 镜像。用户在任何安装了 Docker 的机器上,只需执行 docker run 命令,就可以快速启动该工具,而不需要手动安装 Python、配置环境变量等繁琐操作

微服务架构部署

在微服务架构中,一个大型应用被拆分成多个独立的微服务,每个微服务负责一个特定的业务功能。Docker 非常适合微服务的部署,因为每个微服务可以封装在一个独立的 Docker 容器中。这样,每个微服务的开发、测试、部署都可以独立进行,便于团队协作和维护。

以一个电商平台的微服务架构为例,可能包含用户服务、商品服务、订单服务、支付服务等多个微服务。每个微服务都有自己的 Docker 容器,运行在不同的主机或容器编排平台上。当需要更新某个微服务(如订单服务)时,只需要构建新的订单服务 Docker 镜像,然后滚动更新相关容器即可,不会影响到其他微服务的正常运行。同时,容器编排工具可以根据每个微服务的资源需求和负载情况,自动调度和扩展容器实例

开发环境搭建与测试环境隔离

开发人员在开始一个新项目时,往往需要搭建复杂的开发环境,安装各种编程语言的编译器、运行时环境、数据库管理系统等。使用 Docker 可以快速创建标准化的开发环境。团队可以创建一个包含项目所有开发依赖的 Docker 镜像,每个开发人员只需拉取该镜像并运行容器,就可以获得一致的开发环境,避免了因个人开发环境差异导致的问题。

在测试环节,Docker 可以帮助实现测试环境的隔离。例如,在进行自动化测试时,可以为每个测试用例或测试套件创建独立的 Docker 容器,运行特定版本的应用和依赖服务(如数据库、消息队列等)。测试完成后,容器可以被销毁,不会影响其他测试环境。这样可以保证测试的准确性和可重复性,提高测试效率

多租户环境

在一些云计算服务提供商或企业内部的私有云环境中,需要为多个租户提供隔离的应用运行环境。Docker 可以通过容器的隔离特性,为每个租户创建独立的容器实例,每个租户的应用运行在自己的容器中,相互之间不会干扰。同时,通过控制组(Cgroups)可以对每个租户的容器资源使用进行限制,保证公平分配资源。

比如,一家提供 SaaS(软件即服务)服务的公司,为不同的客户(租户)提供相同的应用程序。使用 Docker 可以为每个客户创建一个独立的容器,运行该应用程序的实例。每个租户的容器有自己独立的文件系统、网络空间等,确保数据安全和隔离。同时,根据租户的订阅套餐,可以限制每个容器的 CPU、内存等资源使用量

docker核心概念

镜像

Docker 镜像是一个只读的模板,包含了运行应用程序所需的所有文件系统、代码、运行时环境、库以及配置等。它类似于虚拟机的镜像,但更加轻量级。镜像可以用来创建 Docker 容器。

镜像采用分层存储的方式,这是 Docker 镜像的一个重要特性。每一层都是只读的,并且可以被多个镜像共享。例如,一个基础的操作系统镜像(如 Ubuntu 镜像)可能作为底层,然后在其上添加一层安装了 Python 环境的镜像层,再在 Python 层上添加一层安装了特定 Python 库的层,最终形成一个完整的应用镜像。这种分层结构使得镜像的构建、存储和分发更加高效。当多个镜像共享某些底层层时,只需要存储一份这些共享层的数据,减少了磁盘空间的占用,同时也加快了镜像的下载速度(因为共享层不需要重复下载 )。

可以通过 Dockerfile 来构建镜像。Dockerfile 是一个文本文件,包含了一系列的指令,用于描述如何构建一个 Docker 镜像。例如,以下是一个简单的 Dockerfile 示例,用于构建一个基于 Ubuntu 并安装 Nginx 服务器的镜像

# 使用 Ubuntu 作为基础镜像
FROM ubuntu:latest# 维护者信息
MAINTAINER your_name@example.com# 更新软件包索引并安装 Nginx
RUN apt-get update && apt-get install -y nginx# 暴露 80 端口(Nginx 默认监听端口)
EXPOSE 80# 启动 Nginx 服务的命令
CMD ["nginx", "-g", "daemon off;"]

 通过 docker build 命令可以根据这个 Dockerfile 构建出对应的镜像

容器

容器是从镜像创建的可运行实例。它可以被启动、停止、删除等操作。容器是 Docker 技术的核心,它提供了一个隔离的运行环境,包含了应用运行所需的所有资源。

容器与镜像的关系类似于面向对象编程中的对象与类的关系。镜像就是 “类”,定义了容器的属性和行为;容器则是 “对象”,是镜像的具体实例。每个容器都是相互隔离的,它们有自己独立的进程空间、网络空间、文件系统等。这使得在一个容器中运行的应用不会影响到其他容器或宿主机的系统环境。

例如,基于上面构建的 Nginx 镜像,可以创建一个容器来运行 Nginx 服务。使用 docker run -d -p 8080:80 nginx_image 命令(其中 nginx_image 是构建好的镜像名称),可以在后台启动一个 Nginx 容器,并将宿主机的 8080 端口映射到容器的 80 端口。这样,用户就可以通过访问宿主机的 8080 端口来访问 Nginx 服务,而该容器的运行不会影响到宿主机上其他服务或其他容器的运行

仓库

Docker 仓库是用于存储和分发 Docker 镜像的地方。它类似于代码仓库(如 Git 仓库),但存储的是 Docker 镜像。Docker 仓库分为公开仓库和私有仓库。

最著名的公开仓库是 Docker Hub,它提供了大量的官方镜像和社区贡献的镜像,涵盖了各种流行的软件和应用场景,如操作系统镜像(Ubuntu、CentOS 等)、数据库镜像(MySQL、PostgreSQL 等)、编程语言运行时镜像(Python、Java 等)以及各种应用服务器镜像(Nginx、Tomcat 等)。开发人员可以从 Docker Hub 上拉取所需的镜像,也可以将自己构建的镜像推送到 Docker Hub 上进行共享(如果选择公开的话)或私有存储(通过创建私有仓库账号 )。

除了 Docker Hub,企业或组织也可以搭建自己的私有 Docker 仓库,用于存储内部开发的镜像,保证镜像的安全性和可控性。例如,在企业内部的软件开发环境中,开发团队构建的应用镜像可以推送到私有仓库,测试团队和运维团队可以从私有仓库拉取镜像进行测试和部署。搭建私有 Docker 仓库可以使用 Docker 官方提供的 Docker Registry 镜像,或者使用一些第三方的私有仓库解决方案,如 Harbor(由 VMware 开源的企业级 Docker registry 管理项目,提供了更多的功能,如镜像安全扫描、访问控制、镜像复制等 )

docker安装

本安装方式使用阿里的软件仓库

关闭系统防火墙

# 停止 firewalld 服务
sudo systemctl stop firewalld
# 禁止 firewalld 服务开机启动
sudo systemctl disable firewalld

 如果系统使用的是 iptables 防火墙,关闭方式可能有所不同,不过在现代 CentOS 系统中,一般默认使用 firewalld 

下载Docker的repo文件

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

 yum-utils 是一个辅助工具包,提供了 yum-config-manager 等工具,用于管理 yum 仓库配置。yum-config-manager --add-repo 命令用于添加一个新的 yum 仓库配置,这里添加的是阿里 Docker CE(社区版)的仓库

替换仓库地址

虽然上面已经添加了阿里的 repo 文件,但有时候可能需要替换其中的仓库地址为更合适的阿里镜像地址,以确保下载速度和稳定性。

编辑 /etc/yum.repos.d/docker-ce.repo 文件,将其中的 https://download.docker.com 替换为 https://mirrors.aliyun.com/docker-ce 。可以使用 sed 命令进行批量替换

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新索引文件并安装Docker

更新 yum 仓库的索引文件,这样系统才能获取到最新的 Docker 软件包信息

sudo yum makecache fast

 然后安装 Docker CE(社区版)

sudo yum install -y docker-ce docker-ce-cli containerd.io

 docker-ce 是 Docker 社区版的主要软件包,docker-ce-cli 是 Docker 命令行客户端,containerd.io 是容器运行时,负责管理容器的生命周期等功能

添加国内镜像站

为了加快 Docker 镜像的拉取速度(因为默认的 Docker Hub 服务器在国外,拉取镜像可能较慢 ),可以配置国内的 Docker 镜像加速器,比如阿里的镜像加速器。

首先,登录阿里容器镜像服务控制台(阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 ),在 “镜像加速器” 页面可以获取到专属的加速地址(需要注册阿里云账号并开通相关服务 )。一般格式类似于 https://xxxx.mirror.aliyuncs.com 。

然后,创建或编辑 Docker 的 daemon 配置文件 /etc/docker/daemon.json ,添加镜像加速器配置

sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://你的阿里加速地址.mirror.aliyuncs.com"]
}
EOF

 替换其中的 https://你的阿里加速地址.mirror.aliyuncs.com 为实际获取到的加速地址

开启Docker服务

安装完成后,需要启动 Docker 服务,并设置开机自动启动

# 启动 Docker 服务
sudo systemctl start docker
# 设置 Docker 服务开机启动
sudo systemctl enable docker

 可以通过 sudo systemctl status docker 命令查看 Docker 服务的运行状态,如果显示 active (running) 则表示服务正常运行

优化内核参数

为了让 Docker 更好地运行,特别是在网络和存储等方面,可以优化一些 Linux 内核参数。

编辑 /etc/sysctl.conf 文件,添加或修改以下参数

sudo tee -a /etc/sysctl.conf <<-'EOF'
net.ipv4.ip_forward = 1
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF

net.ipv4.ip_forward = 1 用于开启 IPv4 转发功能,这对于 Docker 容器的网络通信(特别是跨主机网络或容器之间的网络访问 )非常重要。net.core.default_qdisc = fq 和 net.ipv4.tcp_congestion_control = bbr 是针对网络性能优化的参数,bbr 是一种 TCP 拥塞控制算法,可以提高网络吞吐量和降低延迟。

添加完参数后,执行以下命令使参数生效

sudo sysctl -p

Docker镜像操作

获取镜像

获取 Docker 镜像主要通过 docker pull 命令,从 Docker 镜像仓库(如 Docker Hub 或配置的私有仓库 )拉取镜像到本地。

语法格式:docker pull [选项] [仓库地址/]镜像名称[:标签]

例如,从 Docker Hub 拉取官方的 Ubuntu 20.04 镜像

docker pull ubuntu:20.04

 这里,ubuntu 是镜像名称,20.04 是标签(通常用于表示版本 )。如果不指定标签,默认会拉取 latest 标签的镜像,但 latest 标签的含义在不同镜像中可能有所不同,建议明确指定版本标签以保证一致性

查看镜像信息

查看镜像的基本信息是日常使用 Docker 时的常见操作,可帮助用户快速了解镜像的相关属性。主要通过以下两种方式实现

使用 docker images 命令可查看本地已下载的所有镜像列表,包括镜像名称、标签、ID、创建时间和大小等基本信息

docker images

 输出示例

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        20.04     f63181f19b2f   2 weeks ago    72.9MB
nginx         latest    526a8a3abe9a   3 weeks ago    142MB

查看镜像的详细信息

 若需获取镜像更详细的元数据(如创建者、环境变量、历史记录等),可使用 docker inspect 命令,后跟镜像名称或 ID

docker inspect ubuntu:20.04

 输出为 JSON 格式,包含镜像的完整配置信息,例如

[{"Id": "sha256:f63181f19b2f...","RepoTags": ["ubuntu:20.04"],"Created": "2025-05-20T12:00:00.000000000Z","ContainerConfig": {"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"]},"RootFS": {"Type": "layers","Layers": ["sha256:abc123...","sha256:def456..."]}}
]

修改镜像标签(老名字+新名字)

在实际工作中,可能需要为镜像添加新标签(如版本号更新、发布到不同仓库),或调整标签以符合团队命名规范。此时可使用 docker tag 命令

docker tag 原镜像名[:原标签] 新镜像名[:新标签]

 示例

​​​​​​​docker tag ubuntu:20.04 my-ubuntu:20.0

 将镜像标记为准备推送到私有仓库

docker tag my-ubuntu:20.04 192.168.1.10:5000/my-ubuntu:20.04

 修改标签后,原镜像不会被删除,只是同一镜像有了多个别名,可通过 docker images 查看

删除镜像

当本地镜像不再需要时(如版本过时、占用空间过大),可使用 docker rmi 命令删除镜像

语法格式

docker rmi [选项] 镜像名[:标签] 或 镜像ID

 示例

根据标签删除指定镜像

docker rmi ubuntu:20.04

 根据镜像 ID 删除(支持部分 ID,需唯一标识)

docker rmi f63181f19b2f

 

容器依赖:若镜像已被容器使用,需先删除相关容器才能删除镜像。可使用 docker rm -f 容器ID 强制删除容器后再删镜像。

多标签处理:若同一镜像有多个标签,删除时仅移除指定标签,镜像层仍保留,直至所有标签均被删除

存出镜像和载入镜像

在某些场景下(如离线环境部署、镜像迁移),需要将镜像导出为文件,或从文件导入镜像。Docker 提供了 docker save 和 docker load 命令实现这一需求

存出镜像(导出为文件)

docker save -o 导出文件名.tar 镜像名[:标签]

 示例:将 Ubuntu 镜像导出为文件

docker save -o ubuntu_20.04.tar ubuntu:20.04

 载入镜像(从文件导入)

docker load -i 导入文件名.tar

 示例:从文件恢复镜像

docker load -i ubuntu_20.04.tar

导出的镜像文件包含完整的镜像层数据,可能较大,需注意存储位置。

导入镜像时,标签信息会一并恢复,但需确保目标环境未存在同名同标签的镜像,避免冲突

docker容器操作

容器创建与启动

容器是镜像的运行实例,通过 docker run 命令可创建并启动容器。该命令功能强大,支持多种参数配置

基本语法

docker run [选项] 镜像名[:标签] [命令] [参数...]

 

常用选项

  • -i:保持标准输入打开,常用于交互式操作。
  • -t:分配伪终端,通常与 -i 结合使用(-it)以获得交互式 shell。
  • -d:后台运行容器(守护态)。
  • -p:将容器端口映射到宿主机端口(格式:宿主机端口:容器端口)。
  • -v:挂载宿主机目录到容器(格式:宿主机路径:容器路径)。
  • --name:为容器指定自定义名称

示例

启动交互式 shell

docker run -it ubuntu:20.04 /bin/bash

 后台运行 Nginx 并映射端口

docker run -d -p 8080:80 --name my-nginx nginx

容器的运行

容器启动后,可通过多种方式管理其运行状态

查看运行中的容器

docker ps

 输出示例

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
abc123         nginx     "/docker-entrypoint.…"   5 minutes ago    Up 5 minutes    0.0.0.0:8080->80/tcp   my-nginx

 查看所有容器(包括已停止的)

docker ps -a

利用容器执行命令(命令执行完毕后容器会退出)

有时需要在已运行的容器中执行特定命令,例如查看日志、运行脚本等。可使用 docker exec 命令

语法格式

docker exec [选项] 容器名或ID 命令 [参数...]

 docker exec 执行的命令会在容器内独立运行,命令执行完毕后,除非明确指定后台运行(如 nohup),否则相关进程会终止

在启动容器时持续在后台运行

对于服务类应用(如 Web 服务器、数据库),通常需要容器在后台持续运行。可通过 -d 选项实现这一需求

docker run -d \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD=password \--name my-mysql \mysql:8.0

  • -d:后台运行容器。
  • -e:设置环境变量(此处为 MySQL 根密码)

容器的终止

当容器不再需要运行时,可使用 docker stop 或 docker kill 命令终止容器

停止容器(优雅终止)

docker stop 容器名或ID

 该命令会先发送 SIGTERM 信号,等待容器内进程自行清理资源后退出,若超时未退出(默认 10 秒),则发送 SIGKILL 强制终止

强制终止容器

docker kill 容器名或ID

直接发送 SIGKILL 信号,立即终止容器 

进入容器

在调试或维护容器时,常需进入容器内部进行操作。除了前面提到的 docker exec,还可使用 docker attach 命令

使用 docker attach 进入容器

docker attach 容器名或ID

 注意docker attach 会直接连接到容器的标准输入 / 输出,若容器启动时未指定 -it,可能无法获得交互式 shell。此外,退出时若使用 Ctrl+C,可能会导致容器终止,建议使用 Ctrl+P+Q 以分离模式退出

容器导出

与镜像导出类似,容器也可导出为文件,但导出的是容器的当前状态(包括文件系统变更)

导出容器

docker export -o 导出文件名.tar 容器名或ID

 示例

docker export -o my-container.tar my-nginx

容器导入生成镜像

从导出的容器文件可导入并生成新镜像

导入容器生成镜像

docker import 导入文件名.tar [镜像名[:标签]]

 示例

docker import my-container.tar my-nginx:exported

 注意:与 docker load 不同,docker import 会创建一个全新的镜像,且不保留原镜像的历史记录,适合创建轻量级基础镜像

容器删除

删除不再需要的容器可释放系统资源

删除已停止的容器

docker rm 容器名或ID

 强制删除运行中的容器

docker rm -f 容器名或ID

批量删除所有已停止的容器

docker container prune

删除所有容器(包括运行中的)

docker rm -f $(docker ps -aq)

相关文章:

  • uniapp——轮播图、产品列表轮播、上一页、下一页、一屏三张图
  • 容器技术技术入门与 Docker 环境部署
  • 汽车免拆诊断案例 | 2019款保时捷卡宴插电式混合动力车空调偶尔不制冷
  • 设置vscode使用eslint
  • AS32A601与ASM1042芯片在电力系统自动化监控中的应用效能分析
  • 智绅科技丨如何选择一家好的养老机构?
  • DB面试题
  • [Nginx] 配置中的sendfile参数详解:从传统 IO 到零拷贝的性能优化
  • 服务器获取外网IP,并发送到钉钉
  • React封装框架dvajs(状态管理+异步操作+数据订阅等)
  • 【redis】客户端
  • LVS负载均衡群集:Nginx+Tomcat负载均衡群集
  • 4-STM32F103的串口中断与空闲中断接收数据
  • 装配基本操作与标准配合关系-装配体设计技能(1)
  • 【案例拆解】米客方德 SD NAND 在车联网中(有方模块)的应用:破解传统 TF 卡振动脱落与寿命短板
  • 地标“金”字招牌再升级:赤水金钗石斛携手世酒中菜开启新纪元
  • AI Agent开发与安全
  • 【网络安全】ios逆向一般整理
  • Python 中设置布尔值参数为 True 来启用验证
  • 全球首款5G-A人形机器人亮相,通信与AI融合进入新阶段
  • 做网站的为什么不给域名和密码/做一个电商平台大概需要多少钱
  • wordpress左侧工具隐藏/北京网优化seo公司
  • 建设主流媒体网站/专业关键词优化平台
  • 建站需要注意哪些/网站推广软件免费版下载
  • 太原在线网站制作/新闻实时报道
  • h5都用什么网站/鞍山seo外包