Docker容器实践------docker的安装与加速器配置
https://blog.csdn.net/xiaochenXIHUA/article/details/160057920
一、docker中的镜像、容器与仓库

1.1、docker镜像
容器取代虚拟机真正的原因是Docker发明的镜像(所谓 Docker 镜像,其实就是一个压缩包,它由一个完整操作系统的所有文件和目录构成,也就是说,这个压缩包里的内容跟你本地开发和测试环境用的操作系统是完全一样的)。
①镜像是一层一层构建的(分层架构,一般建议层级不超过10层,因此层级太多运行起来就需要索引很多数据,影响效率);
②镜像内容不可修改(只读【一旦创建完成后,内容是没法更改的】);
bash
#docker镜像制作的dockerfile示例:
#1-创建三层镜像示例(一个RUN表示一层【层级越少越好】):
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
#可将如上的三层简化为一层(只使用一个RUN)
FROM centos
RUN yum -y install wget && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" && tar -xvf redis.tar.gz

1.2、docker容器
镜像(Image)和容器(Container)有紧密的关系,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
Docker镜像都是只读的。容器是在原来的镜像上新建了一个可读写层 到原本镜像的顶部,这一层我们叫作容器层,容器层之下的叫作镜像层。
容器层的生存周期和容器一样,容器消亡时,容器层也随之消亡。
【容器可以理解为一个或一组相互依赖的服务】。
bash
#运行容器的命令(【-d】表示后台运行;【--name】表示指定容器名称;【-p 宿主机端口:容器内的端口】表示指定容器端口)
docker run -d --name nginx -p 8080:80 nginx:1.28.3

1.3、docker仓库
仓库可分为【公共仓库】和【私有仓库】,公共仓库提供公开服务允许用户免费上传、下载公开的镜像。官方的Docker Hub(https://hub.docker.com) ,提供公共仓库服务。此仓库拥有大量的高质量的官方镜像。
除了使用公共仓库外,用户还可以在本地搭建私有仓库(比如:VMWare Harbor这些第三方私钥仓库软件)。

1.4、docker镜像、容器和仓库间的关系

二、docker基础操作命令
2.1、获取镜像
Docker运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker会自动从镜像仓库下载该镜像。
bash
#获取镜像命令语法
docker pull [选项] [Docker Registry地址[:端口号]/]仓库名[:标签]
#获取镜像的示例1(没有给出Docker镜像仓库地址,因此将会从Docker Hub获取镜像。而镜像名称是nginx:1.28.3,因此将会获取官方镜像library/nginx仓库中标签为1.20.2的镜像)
docker pull nginx:1.28.3
#获取镜像的示例2(指定国内镜像加速器)
docker pull docker.1ms.run/nginx:1.28.3
|--------------|------------------------------------------------------------------------|
| Docker镜像仓库地址 | 地址的格式一般是 <域名/IP>[:端口号]。默认地址是Docker Hub(docker.io) |
| 仓库名 | 仓库名是两段式名称(即 <用户名>/<软件名>)。对于Docker Hub,若不给出用户名,则默认为library,也就是官方镜像。 |
从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的ID的前12位。并且下载结束后,给出该镜像完整的sha256的摘要,以确保下载一致性。

2.2、运行镜像
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。这里以centos:7.6.1810为例,如果我们打算启动里面的bash并且进行交互式操作的话,可以执行下面的命令。
bash
#运行镜像示例
docker run -it --rm centos:7.6.1810 bash
| 参数 | 说明 |
|---|---|
| -it | 是两个参数,一个是-i,一个是-t: 【-i】 表示以交互模式运行容器,通常与-t同时使用; 【-t】为容器重新分配一个伪输入终端,通常与-i同时使用; 我们这里打算进入bash执行一些命令并查看返回结果,因此我们需要交互式终端。 |
| --rm | 容器退出后随之将其删除(默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm。这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm直接删除容器,可以避免浪费空间) |
| centos:7.6.1810 | 指用centos:7.6.1810镜像为基础来启动容器。 |
| bash | 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。 进入容器后,我们可以在 Shell下操作,执行任何所需的命令。 #查看系统版本命令 cat /etc/redhat-release #退出容器命令 exit |

2.3、列出镜像
bash
#列出所有dokcer镜像命令
docker image ls
docker images
#查看指定的镜像(如:查看alpine)
docker images alpine
#查看所有的镜像ID
docker images -q
列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间【镜像ID是镜像的唯一标识,一个镜像可以对应多个标签】。


2.4、删除镜像
bash
#删除镜像命令语法
docker image rm [选项] <镜像1> [<镜像2> ...]
#删除镜像示例
docker image rm 25109184c71b
docker image rm alpine:latest

2.5、启动容器
容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
启动容器有两种方式:【一种是基于镜像新建一个容器并启动】;【另外一个是将在终止状态(stopped)的容器重新启动】。因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
| Docker在后台运行的标准操作包括: |
|---|
| 检查本地是否存在指定的镜像,不存在就从公有仓库下载 |
| 利用镜像创建并启动一个容器 |
| 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层 |
| 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去 |
| 从地址池配置一个 ip 地址给容器 |
| 执行用户指定的应用程序 |
| 执行完毕后容器被终止 |
bash
#新建并启动容器命令
#基础后台启动
docker run -d --name nginx nginx
#端口映射(主机8080→容器80)
docker run -d -p 8080:80 --name nginx nginx:1.28.3
#端口+数据卷挂载
docker run -d -p 3306:3306 -v /data/docker/mysql:/var/lib/mysql mysql
bash
#启动已停止的容器
#用容器名/ID启动
docker start 容器名或容器ID
# 启动所有停止的容器
docker start $(docker ps -aq)
2.6、终止容器
当Docker容器中指定的应用终结时,容器也自动终止。如果只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止。
bash
#终止容器命令
#正常停止容器命令语法
docker stop 容器ID或容器名
#强制终止容器(类似 kill -9,停不掉时用【慎用】)
docker kill 容器ID或容器名
#批量停止所有运行中的容器
docker stop $(docker ps -q)
2.7、进入容器
容器启动后一般都在后台运行,但某些时候需要进入容器进行操作,此时需要使用【docker attach】命令或【docker exec】命令,**推荐使用【docker exec】命令。**不推荐【docker attach】命令进入容器是因为在使用【exit】命令退出虚拟终端后整个容器就停止了。
bash
#进入容器命令语法
docker exec -it 容器ID或容器名 /bin/bash
2.8、导出导入容器
| 命令 | 操作对象 | 保留内容 | 文件大小 | 用途 |
|---|---|---|---|---|
docker export |
容器 | 仅当前文件系统 | 小 | 容器快照、迁移 |
docker import |
导入为镜像 | 丢失历史 / 元数据 | ||
docker save |
镜像 | 完整层 + 历史 + 元数据 | 大 | 镜像备份、离线分发 |
docker load |
恢复镜像 | 完整恢复 |
bash
#导出容器命令语法
# 方法1:-o 指定输出文件(推荐)
docker export -o 文件名.tar 容器ID或容器名
# 方法2:重定向
docker export 容器ID或容器名 > 文件名.tar
#导入容器示例(如将ID为a1b2c3d4的容器导出为my_container.tar)
docker export -o my_container.tar a1b2c3d4
docker export a1b2c3d4 > my_container.tar
docker save -o my_container.tar a1b2c3d4
2.9、查看与删除容器
bash
#查看正在运行的所有容器
docker ps
#查看所有的容器(运行中的、停止的)
docker ps -a
#只看容器的Id
docker ps -q
docker ps -aq
bash
#删除docker容器语法
#1-删除单个容器(最常用)
docker rm 容器ID或容器名
#2-删除正在运行的容器(必须加 -f;添加 -f 参数Docker会发送SIGKILL信号给容器)
docker rm -f 容器ID或容器名
#3一次性删除所有停止的容器
docker container prune
#4-强制删除所有容器(不管是否运行【慎用】)
docker rm -f $(docker ps -aq)
3.0、查看容器日志
bash
#查看Docker容器日志语法
#1-基础查看日志
docker logs 容器ID或容器名
#2-实时滚动查看(像 tail -f)
docker logs -f 容器ID
#3-只看最近N行日志
docker logs --tail N 容器ID
#4-查看带时间戳的日志
docker logs -t 容器ID
#5-查看最近200条的实时滚动日志
docker logs -f --tail 200 容器ID
#6-查看指定时间段的日志
#只看12:00 ~ 12:30 这半小时的日志
docker logs --since "2026-04-13 12:00:00" --until "2025-04-13 12:30:00" 容器ID
#只看 2025-04-13 12:00 之后 的日志
docker logs --since "2025-04-13 12:00:00" 容器ID
#只看 2025-04-13 12:00 之前 的日志
docker logs --until "2025-04-13 12:00:00" 容器ID
#查看最近10分钟的日志
docker logs --since 10m 容器ID
#查看最近1小时的日志
docker logs --since 1h 容器ID