Docker学习笔记

知识分子没文化
2023-06-19 / 0 评论 / 3,510 阅读 / 2,654 字数 / 正在检测是否收录...

目录:

环境:ubuntu 24.04

一、Docker

1.1、什么是 Docker

Docker是一个开源平台,用于将应用程序及其所有依赖项打包成标准的容器,从而实现“一次构建,到处运行”

Docker 与传统虚拟机(Virtual Machine,VM)都是实现环境隔离应用封装的技术,但它们在架构、性能、资源利用和使用场景上有本质区别。

Docker 容器除了运行其中的应用外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减少系统开销。

传统虚拟机方式运行 N 个不同的应用就要起 N 个不同的虚拟机(每个虚拟机都要单独分配独占的内存、磁盘等资源),而 Docker 只需要启动 N 个隔离的“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。

对比维度 Docker(容器) 虚拟机(VM)
操作系统 共享宿主机内核 每个 VM 一个完整 OS
启动速度 秒级(0.1~2s) 分钟级
镜像大小 MB ~ 几百 MB GB 级
资源开销 极低
性能 接近裸机 有一定损耗
隔离性 进程级隔离 硬件级隔离
安全性 较弱(共享内核) 更强
可移植性 非常强 一般
运维成本
密度 单机可跑数百容器 单机只能跑少量 VM

虚拟机 = 在硬件上虚拟出一整台“电脑”,解决的是“硬件虚拟化”问题
Docker = 在操作系统上隔离出一个“进程运行环境”,解决的是“应用交付与环境一致性”问题

可以粗略类比为:

  • 虚拟机:每个租户 独立一套房子(含水电)
  • Docker:每个租户 独立一个房间,共用整栋楼的水电

Docker 官网:Docker: Accelerated Container Application Development

Docker 官方文档:Manuals | Docker Docs

国内中文翻译文档:Docker中文文档(Docker官方文档,Docker官方教程)

1.2、安装 Docker

使用官方安装脚本:

# 下载并执行Docker官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

或者通过添加 Docker 软件源安装:

sudo apt-get update
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \ 
 $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

用上面任何一种方法安装完成 Docker 之后启动:

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

执行以下命令,检查安装结果:

sudo docker info

输出版本信息则说明安装成功。

1.3、更改镜像源

需要说明的是,以往在国内使用很普遍的腾讯云、阿里云和各个大学的 Docker 镜像站点自从 2024 年之后都陆续不可用,现在可使用的镜像源已经很少,也不确定能用多久,

而在国内买了云服务商的服务器的话,可以使用其提供的内网 Docker 镜像,不过只能在其服务器上使用而无法在外网机器上使用。

腾讯云:腾讯云 - 安装 Docker 并配置镜像加速源,阿里云:阿里云 - 容器镜像服务,文档中明确写 https://mirror.ccs.tencentyun.com 只支持内网访问,不再支持外网域名访问加速。

找到配置镜像源的文件(如果文件不存在请新建) /etc/docker/daemon.json ,写入如下内容:

{ 
  "registry-mirrors" : 
    [ 
      "https://docker.m.daocloud.io",
      "https://docker.xuanyuan.me", 
      "https://docker.1ms.run"
    ] 
}

之后重新启动服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

执行 docker info 命令检查配置是否成功,如果输出内容中 Registry Mirrors 一项变成了配置的镜像源,则说明更改镜像源成功。

二、基本概念

2.1、镜像(Image)

镜像是一个用于创建容器(Container)只读模板,可以粗略理解为面向对象编程中的“类”(Class),其包含了运行一个软件所需的代码、运行环境、库、环境变量和配置文件等。

镜像具有如下特点:

  • 不可变:镜像一旦构建完成,内容便默认不可修改
  • 分层结构:镜像采用联合文件系统(UnionFS),以分层方式组织文件,使得多个镜像可以共享相同的基础层,从而节省空间
  • 可分发:镜像可以被推送到远程注册中心(如 Docker Hub)或从注册中心拉取,实现跨平台使用

2.2、容器(Container)

容器时镜像的运行实例,类似于“对象”,是镜像这个“类”的一个具体实例。当启动一个镜像时,Docker 会基于该镜像创建一个容器,并在其中运行应用程序(例如Nginx、MySQL等)。

容器的特点:

  • 可读写:虽然镜像不可修改,但容器在镜像的基础上增加了一个可写层,所有对系统的修改都发生在这个层中。
  • 具有生命周期:可以启动、停止、暂停、删除。
  • 资源隔离:容器之间默认隔离无法交互的,通过 Linux 的 Namespace 和 Cgroups 技术实现进程、网络、文件系统的资源的隔离与限制。

2.3、标签(Tag)

标签用于标识镜像的特定版本或变体。一个镜像可以有多个标签,但它们可能指向同一个镜像 ID(即内容相同)。

如果不指定标签,默认使用 latest

注意:latest 并不一定代表“最新稳定版”,它只是一个约定俗成的标签,实际含义由镜像维护者决定。

2.4、仓库(Repository)与注册中心(Registry)

  • 仓库(Repository):存储同一软件不同标签(版本)镜像的集合。例如 library/nginx 是 Docker Hub 上 nginx 的官方仓库。

  • 注册中心(Registry):存放多个仓库的服务。最常见的是 Docker Hub,也可以搭建私有 Registry(如 Harbor、GitLab Container Registry)。

  • 示例完整镜像名:

    docker.io/library/nginx:1.25

    其中:

    • docker.io:Registry 地址(默认可省略)
    • library:命名空间(官方镜像通常省略为 nginx
    • nginx:仓库名
    • 1.25:标签

二、命令

2.1、镜像管理

Dockerhub 地址:Docker Hub Container Image Library | App Containerization

国内镜像:

从 Dockerfile 构建镜像:

参数:

  • -t 指定镜像标签
  • --file 指定 Dockerfile 路径,不存在此参数时默认从当前路径下构建
docker build -t <tag> ./
从远程仓库拉取某个镜像:

镜像标签 <tag> 可省略,默认使用 latest

docker pull <image><:tag>

如果没有配置镜像源只是想要临时通过某个(docker.xuanyuan.me)镜像源拉去镜像:

docker pull docker.xuanyuan.me/<image><:tag>
将本地镜像推送到远程仓库
docker push <image>
列出本地所有镜像

参数:

  • -a 查看所有镜像
  • -q 只显示镜像 ID
docker image list
# 等价于:
docker image ls
# 等价于:
docker images
列出与关键词匹配的本地镜像
docker image list <关键词>
# 等价于:
docker image ls <关键词>
# 等价于:
docker images <关键词>
查看镜像的详细信息(以 JSON 格式输出)
docker image inspect <image>
查看镜像的分层历史(各层的创建指令和大小)
docker image history <image>
删除本地镜像文件

参数:

  • -f 强制删除
  • -a 删除所有未使用镜像
  • <image> 可以是文件名,也可以是镜像 ID
docker image rm <image>
# 简写:
docker rmi <image>

注意:当存在依赖于该镜像创建的容器时,镜像文件默认是无法被删除的。尽管可以使用 -f 参数来强制删除一个存在容器依赖的镜像,但并不推荐。正确的做法是,先删除依赖该镜像的所有容器之后再删除镜像

删除所有悬空镜像

悬空镜像:Dangling Images,即没有标签且未被容器引用的镜像,通常出现在重新构建同名镜像后,旧镜像失去标签但仍存在)

docker image prune
删除所有未被任何容器使用的镜像
docker image prune -a
将镜像保存为 tar 文件(一般用于离线迁移)
docker save -o <file.tar> <image>
从 tar 文件加载镜像到本地
docker load -i <file.tar>
给镜像打标签:
docker tag <image> <tag>qq

2.2、容器启停

Docker 运行容器前需要本地存在对应的镜像(Image), 如果本地不存在该镜像,Docker 会尝试从配置文件(/etc/docker/daemon.json)的注册中心中下载。

创建并启动容器

参数:

  • -d 后台运行
  • -it 交互式终端
  • --name 指定容器名
  • -p host:container,端口映射
  • -v /host:/container,卷挂载
  • --restart 重启策略
docker run [OPTIONS] <image>

例如:

docker run -d --name nginx-app-test -p 8080:80 nginx
只创建容器,不启动

参数:

  • --name 容器名
  • -v 卷挂载
docker create -i <container> --name <name>
启动已经创建的容器:

参数:-i 交互式启动

docker start -i <container>
在运行的容器中执行命令

参数: -it 交互式终端

docker exec -it <container> <command>
停止运行中的容器:

优雅停止容器,会向容器发送 SIGTERM,等待退出

参数:-t 停止等待时间(单位为秒)

docker stop -t <time>
强制停止容器:

会向容器发送 SIGKILL。同Linux的kill -9

docker kill <container>
重启容器:

参数:-t 停止等待时间(单位为秒)

docker restart <container>

2.3、容器管理

查看运行中的容器

参数:

  • -a 查看所有容器
  • -q 只显示容器ID
docker ps
# 等价于:
docker container ls
删除已停止的容器
docker rm <container>

若要删除的容器仍在运行,需加上参数 -f

docker rm -f <container>
删除所有已停止容器
docker container prune
查看容器的标准输出和错误日志:

参数:

  • -f 跟踪日志
  • --tail <n> 显示最后 n 行
docker logs <container>
查看容器内运行的进程
docker top <container>
试试监控容器的 CPU、内存、网络等资源使用情况
docker stats <container>
在主机与容器之间复制文件
docker cp ...
  • 从主机复制文件到容器:

    docker cp <主机路径> <容器名或ID>:<容器内路径>
    
    # 例如:
    docker cp ./app.conf myapp:/etc/app.conf
  • 从容器复制文件到主机:

    docker cp <容器名或ID>:<容器内路径> <主机路径>
    
    # 例如:
    docker cp myapp:/var/log/app.log ./
导出容器为 tar 文件:

参数:-o 指定输出文件名

docker export <container> -o <file.tar>
从 tar 文件导入为镜像:
docker import <file.tar>

2.4、标签管理

给镜像打标签:

docker tag <image> <tag>

删除特定标签:

docker rmi <image>:<tag>

参考文档:

Docker - 马燕龙个人博客

云服务器 搭建 Docker_腾讯云

Docker 教程 | 菜鸟教程

2

评论

博主关闭了所有页面的评论