Docker容器

Docker简单介绍:

Docker是基于Linux的容器化技术,是在Linux内核中运行的一个进程,与其他进程的区别是它制造一个个隔离的独立空间(称为容器)。

开发者将应用程序及其依赖打包到可移植且轻量级的容器中。容器共享主机内核,比虚拟机轻便且节省内存空间。但容器也是相互隔离的,有各自的文件环境、网络、进程等。

Docker的使用过程:

用户在终端输入命令,Docker命令行工具(client)解析命令并格式化为符合Docker API规范的请求,客户端将请求发送给Docker端口,Docker守护进程接收到请求、解析并执行相应的任务。

例如:用户输入:docker run -d 某应用。Docker接收到该命令后,检查本地是否存在相应的镜像、若没有则从Docker仓库(registry)拉取镜像(image)、将镜像存储到本地、创建容器(container)、启动容器。

Docker客户端(Docker CLI):

Docker的主要用户界面,通过它用户在命令行输入各种docker命令,这些命令通过Docker提供的接口(RESTful API)转换为符合RESTful 规范的请求,发送给Docker守护进程。附:API提供http请求的接口,可跨平台。若只下载了Docker客户端,需连接远程Docker守护进程。

Docker守护进程(dockerd):

长期在Docker后台运行的系统服务/进程,进程名通常为dockerd,守护进程的英文为daemon。

在Linux主机启动时由系统管理工具systemd自动运行启动Docker守护进程。

  • Docker守护进程提供RESTful API端口,监听端口,接收客户端的指令,
  • 管理镜像(拉取pull、构建build等),
  • 管理容器生命周期(创建create,启动start,停止stop,重启restart,删除rm),
  • 管理网络(创建网络、连接主机和Docker网络),
  • 管理数据(创建卷、同步主机和Docker数据),
  • 记录日志等。

Docker镜像(image):

镜像是只读的模板,包括代码、运行时环境、配置等。镜像采用分层,即镜像由一系列只读层(layer)组成,每一层代表Dockerfile中的一条指令。附:Dockerfile是一个文本文件,包含一系列用于构建Docker镜像的指令(例如:FROM, COPY, RUN, CMD等)。

镜像被比作面向对象中的类,而容器(container)被比作类的实例,即容器是镜像的实例。一个镜像可以多个实例。

Docker仓库(registry):

Docker仓库负责存储和分发镜像,也可以将自己的镜像上传到仓库,其他人可以下载和使用。

bash 复制代码
# 将自己的镜像上传到仓库
# 在当前目录构建镜像
docker build -t 用户名/镜像名:版本号 . 

# 打开docker hub登录,输入以下命令获得网站和验证码,验证登录
docker login

# 往docker仓库推送镜像:
docker push 用户名/镜像名:版本号

官方仓库是Docker Hub,但几乎打不开,可以使用其他镜像仓库拉取镜像,例如:Docker Hub 镜像搜索Docker Hub国内无法访问的解决方法 (2025-04-28更新) | 遇见时光-1023.org.cn

修改配置文件设置镜像站:

bash 复制代码
# 修改文件
sudo vim /etc/docker/daemon.json

# 文件中修改内容
# {  
#   "registry-mirrors": [  
#     "https://docker.xuanyuan.me"  // 轩辕镜像源,高速节点 
#     "https://docker.m.daocloud.io" 
#   ]  
# }

# 重启docker
# sudo systemctl daemon-reload
sudo systemctl restart docker

Docker容器(container):

镜像的运行实例。容器是一个隔离的、受限的进程。共享Linux主机内核,又有独立的文件系统、网络、进程、IP地址等,可移植、轻便、速度更快、内存占用更少等。

  • 通过namespaces实现隔离,创建独立的空间。
  • 通过cgroups实现资源限制,防止过多消耗资源影响主机。
  • 通过UnionFS(Union File System)实现高效的镜像管理,依靠分层和写时复制机制,使其具有高效性和轻量性,写时复制(CoW,copy on write)即修改文件时 将文件从只读层复制到可写层进行修改 原文件不变。附:读文件从只读层查找。

容器的生命周期主要有:创建、启动/运行、暂停、停止pause、删除。

Docker主要组件:

  • dockerd:Docker守护进程。管理者和协调者。
  • containerd:负责管理容器的完整生命周期(创建、启动、停止、删除等)。
  • runc:创建容器的工具。
  • containerd-shim:runc退出后,接管容器进程,容器继续运行。

注:Docker守护进程dockerd通过gRPC API接口调用containerd,containerd根据OCI标准调用runc,runc根据OCI标准创建和运行容器。

OCI标准:开放容器倡议。定义了容器是什么(镜像规范)和如何运行容器(运行时规范)。

Docker的部分命令:

镜像相关命令:

拉取镜像:docker pull 仓库地址/命名空间(用户名)/镜像名**:**标签名(版本号)

从Docker官方仓库的官方命名空间拉取最新版镜像:docker pull 镜像名

拉取指定CPU架构的镜像:docker pull --platform=linux/amd64 镜像名

注:docker pull可以不使用,docker run命令会在没有对应镜像时自动拉取镜像。

在当前目录构建镜像:docker build -t 镜像名**.**

查看镜像列表:docker images ls

删除镜像:docker rmi 镜像ID

修改镜像别名(tag):docker tag 原镜像名 用户名/新镜像名

容器生命周期相关命令:

创建并运行容器:docker run 镜像名

创建并后台运行容器(并且端口映射):docker run -dp 主机IP地址**:** 主机端口**:**容器端口 镜像名

运行容器并创建文件:docker run --rm 镜像名 touch 文件名

运行容器并检查文件:docker run --rm 镜像名 stat 文件名

|---------------|------------------------------------------------------------|
| -d(--detach) | 后台运行 |
| -p(--publish) | 端口映射(-p 主机端口**:容器端口) |
| -v | 挂载卷(-v 主机目录
:** 容器目录 或者 卷名**:**容器目录) |
| -e | 容器环境变量(例如:-e MYSQL_ROOT_USERNAME=root) |
| --name | 自定义容器名字(主机中不能重名) |
| -it | 允许主机控制台与容器交互 |
| --rm | 容器停止时就删除容器 |
| --restart | 设置容器停止时的启动策略(例如:--restart always,--restart unless-stopped) |
| --network | 加入子网 |
[docker run 参数]

注:每执行一次docker run就创建并运行一个容器,若希望在原有容器中启停,可使用start/stop。若只创建容器不运行,可使用create替换run,运行容器则使用start。

查看容器列表:docker ps

查看所有容器(包括已经停止的):docker ps -a

查看容器信息:docker inspect 容器ID

停止容器:docker stop 容器ID

重新启动容器:docker start 容器ID

删除容器:docker rm 容器ID

停止并删除容器(强制删除正在运行的容器):docker rm -f 容器ID

数据持久化相关命令:

说明:容器具有独立的文件系统,容器关闭数据删除,若要数据持久化,有两种方法:卷挂载(voumn mount),绑定挂载(bind mount)。

创建卷:docker volume create 卷名

运行容器并挂载卷:docker run -dp 主机IP地址**:** 主机端口**:**容器端口 --mount type=volume src=文件名 target=容器中地址 镜像名

运行容器并挂载卷:docker run -dp 主机IP地址**:** 主机端口**:** 容器端口 -v 卷名**:**容器目录 镜像名

查看卷路径(主机):docker volume inspect 卷名

查看所有卷:docker volume list

删除卷:docker volume rm 卷名

删除没有容器使用的卷:docker volume prune -a

运行容器并绑定挂载:docker run --it --mount type=bind src="$(pwd)" target=容器中地址 镜像名 bash

运行容器并绑定挂载:docker run -dp 主机IP地址**:** 主机端口**:** 容器端口 -v 主机目录**:**容器目录 镜像名

网络相关命令:

容器具有独立网络,容器之间通信或与外部主机通信,使用docker network。

  • docker默认是桥接模式(bridge),创建的子网也是桥接模式,同一子网的容器可以通信,与主机通过端口映射通信。
  • host模式中容器共享主机的网络,通过主机的IP地址和端口就可以访问容器,无需端口映射。使用host模式启动容器:docker run -d --network host 镜像名

创建子网:docker network create 子网名

查看容器中所有网络:docker network list

删除自定义的子网:docker network rm 子网ID

容器编排技术(docker compose)相关命令:

使用YAML文件管理多个容器(包括自定义容器启动顺序),通常是docker-compose**.**yaml,也可以使用 -f 指定YAML文件。适合单机个人使用。大规模的编排需要k8s(Kubernetes)。

启动YAML文件中的所有容器:docker compose up

启动YAML文件中的所有容器在后台运行:docker compose up -d

停止并删除YAML文件中的所有容器:docker compose down

停止但不删除YAML文件中的所有容器:docker compose stop

重新启动YAML文件中停止的所有容器:docker compose start

其他相关命令:

查看日志:docker logs -f 容器ID

查看容器内的进程情况:docker exec 容器ID ps -ef

在容器内获得交互式命令环境:docker exec -it 容器ID /bin/sh

管理多节点Docker集群,使用docker swarm。

Docker官网:Docker: Accelerated Container Application Development

官方文档:Get started | Docker Docs

Docker命令:Docker 命令大全 | 菜鸟教程

附:Docker下载说明:

① 可以下载Docker Destop,提供可视化界面,也包含Docker CLI(命令行工具)。需根据操作系统架构下载。

② 也可以只下载Docker CLI。使用时,需连接远程Docker守护进程。

bash 复制代码
# 网址:https://get.docker.com/,Linux下载Docker CLI
curl -fsSL https://get.docker.com -o install-docker.sh
sudo sh install-docker.sh

注意:若在Windows中使用Docker,实际是先在虚拟机安装Linux,在运行的Linux虚拟机中使用Docker。

安装Docker Destop时需知道Window系统是基于AMD64架构还是基于ARM64架构,查看方法如下:

方法一:

windows键+R --> 输入:cmd --> 输入命令:echo %PROCESSOR_ARCHITECTURE%

方法二:

windows键+R --> 输入:msinfo32 --> 系统摘要中查看系统类型

方法三:

此电脑(或我的电脑)--> 右键点击属性 --> 查看系统类型

相关推荐
_清浅4 小时前
计算机网络【第六章-应用层】
运维·服务器·计算机网络
正在努力的小河5 小时前
Linux 自带的 LED 灯驱动实验
linux·运维·服务器
李子圆圆5 小时前
电力专用多功能微气象监测装置在电网安全运维中的核心价值是什么?
运维·安全
花开富贵贼富贵5 小时前
MySQL 核心高级特性
运维·数据库·mysql
小宁爱Python5 小时前
Windows Docker Desktop占用C盘空间过大解决办法集合
运维·docker·容器
JAVA学习通6 小时前
发布自己的 jar 包到 Maven 中央仓库 ( mvnrepository.com )
人工智能·docker·自然语言处理·容器·rocketmq
恒创科技HK6 小时前
如何选30G、60G、100G的香港高防服务器?
运维·服务器
wanhengidc6 小时前
云手机 手游专用虚拟手机
运维·服务器·安全·游戏·智能手机
檀越剑指大厂6 小时前
【Linux系列】Vim 中删除当前光标到行尾
linux·运维·vim