您现在的位置是:网站首页> 边看边学
docker 技术收集
- 边看边学
- 2025-08-08
- 1403人已阅读
docker 技术收集
Docker原理
1. Docker 的核心原理
(1) 命名空间(Namespaces)
- PID Namespace:隔离进程 ID,容器中的进程只能看到自己命名空间内的 PID。
- Network Namespace:隔离网络栈,容器可以有自己的 IP 地址、端口和网络接口。
- Mount Namespace:隔离文件系统挂载点,容器可以有自己的挂载点。
- UTS Namespace:隔离主机名和域名,容器可以有自己的主机名。
- IPC Namespace:隔离进程间通信资源,容器内的进程无法与宿主机或其他容器通信。
- User Namespace:隔离用户 ID 和组 ID,容器内的用户和组与宿主机无关。
(2) 控制组(Cgroups)
(3) 联合文件系统(Union File System)
2. Nginx 镜像的运行原理
(1) 镜像的结构
(2) 容器的启动
- 加载镜像:Docker 从镜像仓库(如 Docker Hub)拉取 Nginx 镜像。
- 创建容器:Docker 为容器分配一个独立的命名空间和 Cgroups,隔离进程、网络、文件系统等资源。
- 挂载文件系统:Docker 将镜像的只读层和一个可写的容器层联合挂载,形成容器的根文件系统。
- 启动进程:Docker 在容器中启动 Nginx 进程,该进程运行在容器的命名空间中。
(3) 容器的运行环境
- 操作系统:容器运行在宿主机的 Linux 内核上,但容器的文件系统是独立的,基于镜像中的文件系统。例如,如果 Nginx 镜像是基于 Alpine Linux,容器的文件系统会包含 Alpine 的库和工具,但容器的内核是宿主机的内核。
- 隔离性:容器内的进程无法直接访问宿主机或其他容器的资源,因为它们被隔离在独立的命名空间中。
- 资源限制:Docker 使用 Cgroups 限制容器的资源使用,例如 CPU 和内存。
3. 总结:Nginx 容器运行在哪个操作系统上?
- 文件系统:容器的文件系统是镜像中的文件系统,例如 Alpine Linux 的文件系统。
- 内核:容器使用宿主机的内核。
- 进程隔离:容器内的进程运行在独立的命名空间中,无法直接访问宿主机或其他容器的资源。
4. 示例:运行 Nginx 容器
docker run -d -p 8080:80 nginx
- 容器的文件系统基于 Nginx 镜像(通常基于 Alpine Linux)。
- 容器的内核是宿主机的 Ubuntu 内核。
- 容器的 Nginx 进程运行在独立的命名空间中,监听容器内的 80 端口,而宿主机的 8080 端口被映射到容器的 80 端口。
5. Docker 的优势
- 轻量化:容器共享宿主机的内核,启动速度快,资源占用少。
- 隔离性:容器之间完全隔离,互不干扰。
- 可移植性:容器可以在任何支持 Docker 的环境中运行,无需关心底层操作系统。
Docker 1小时快速上手教程,无废话纯干货
Docker 不是独立的虚拟机,两者的核心区别在于虚拟化层次和资源隔离级别
Docker 容器的本质
共享内核:容器内的进程直接运行在宿主机内核上(例如在 Linux 宿主机上运行 Ubuntu 容器时,实际使用的是宿主机 Linux 内核)。
用户空间隔离:通过 Namespace 隔离进程的视图(如文件系统、网络、PID 等),通过 Cgroups 限制资源使用(如 CPU、内存)。
轻量级:容器仅是进程及其依赖的打包,无需虚拟化硬件或运行完整操作系统。
为什么容器不是虚拟机?
无法运行不同内核的系统:例如,Linux 宿主机上的 Docker 容器无法直接运行 Windows 程序(需借助特殊工具),而虚拟机可以运行任何操作系统。
进程级隔离:容器内的进程在宿主机上可见(但被隔离),虚拟机内的进程完全独立。
依赖宿主机的内核:容器镜像仅包含用户空间的程序和依赖库,不含内核,因此容器无法脱离宿主机内核独立运行。
Docker 容器和镜像之间有什么关系?
Docker 容器和镜像之间的关系可以理解为蓝图和实例的关系:
1、定义: Docker 镜像是容器的只读模板,包含了运行容器所需的代码、库、环境变量和配置文件。
2、实例化: 当 Docker 镜像运行时,它会成为一个容器,即镜像的实时、可写版本。
3、层叠构建: Docker 镜像是通过一系列的层叠构建而成,每个层代表镜像构建过程中的一个步骤。
默认的源地址:
"registry-mirrors": [
"https://hub.docker.com"
]
最新可用地址可以直接问AI:
如:https://docker-0.unsee.tech/
国内可用的源:
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://noohub.ru",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://docker.rainbond.cc",
"https://dockerhub.icu",
"https://docker.chenby.cn",
"https://docker.1panel.live",
"https://docker.awsl9527.cn",
"https://docker.anyhub.us.kg",
"https://dhub.kubesre.xyz",
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
Docker 容器内部如何访问本机的服务
要让Docker容器访问宿主机上的服务,可以使用特殊的网络地址host.docker.internal。这个地址在Docker 18.03及以上版本的Windows和Mac上可用。
在容器内部,使用host.docker.internal代替localhost或127.0.0.1。
本机如何访问docker内服务
要从本机访问Docker容器内的服务,您可以使用以下方法:
1.端口映射:使用 -p 参数将容器端口映射到本机端口。
例如,如果您有一个运行在容器内部端口80的Web服务,并且您想通过本机的端口8080访问它,您可以这样运行容器:
docker run -p 8080:80 your-image
然后您可以通过访问 http://localhost:8080 或者 http://127.0.0.1:8080 从本机访问该服务。
2.连接到Docker网络:如果您想要从本机访问容器,而不是通过端口映射,可以将您的容器连接到Docker默认网络。
首先,创建一个网络(如果还没有的话):
docker network create my-network
然后,运行您的容器并将其连接到该网络:
docker run --network=my-network --name=my-container your-image
现在,您可以通过容器名称来从任何其他连接到同一网络的容器或本机访问它。
例如,使用 docker exec 命令从本机ping容器:
docker exec my-container ping $(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container)
或者,如果您的容器暴露了一个内部端口,您可以直接通过容器的内部IP地址来访问服务:
curl $(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-container):80
请根据您的具体需求和服务配置选择适当的方法。
典型命令例子
docker pull nginx:latest 下载镜像
docker images 显示下载的镜像
docker run -d -p 81:80 nginx 运行镜像 -d是后台运行 -p是映射端口 外部端口81 内部端口80
docker ps 显示正在运行的镜像
进入运行的镜像
docker exec -it 92[这个是运行的id] bash
提示
root@92[这个是运行的id]
退出镜像容器
exit
这时候按正常的usr目录之类的操作了
cd /usr/share/nginx/html/
cat index.html
修改index.html
echo hello >index.html
再次访问chrome ctrl+F5强制刷新
退出运行的镜像 exit
强制删除运行的镜像
docker rm -f 92[这个是运行的id]
当前镜像保存
docker commit 92[这个是运行的id] m1[保存为m1]
docker commit 命令用于从一个已经运行的容器中创建一个新的镜像。这个命令并不会将镜像保存到特定的位置,而是会保存在 Docker 的本地镜像库中。
如果你想要保存镜像到一个文件,你可以使用 docker save 命令。
例如,如果你想要保存一个名为 myimage:mytag 的镜像到一个名为 myimage.tar 的文件中,你可以使用以下命令:
docker save myimage:mytag -o myimage.tar
这将会创建一个名为 myimage.tar 的文件,里面包含了 myimage:mytag 镜像的所有层及相关的元数据。
要从这个文件加载镜像,你可以使用 docker load 命令:
docker load -i myimage.tar
这将会把 myimage.tar 文件中的镜像加载到本地的 Docker 镜像库中。
查帮助 docker commit --help
提交自己的镜像
(以nginx镜像为例)
(这里提交的是到系统本地仓库)
docker pull nginx #以nginx镜像为例
docker run -itd --name mynginx nginx /bin/bash #创建一个名为mynginx的容器
docker exec -it mynginx /bin/bash #进入容器,增加一些自己的内容,比如装一个vim等
#注意:下面在mynginx:v1.0前面加的guianjun是对应到Docker Hub自己账号的公网仓库名一致,否则后面将无法推送到公网Docker Hub自己的仓库下面,如果只是推送到本地系统仓库,则可以不用加
docker commit -m "安装了vim" mynginx guianjun/mynginx:v1.0 #提交容器
docker images #查看镜像是否提交成功
docker image history guianjun/mynginx:v1.0 #查看镜像提交记
‘’
docker run -itd --name mynginx_test mynginx:v1.0
#进入容器发现已经装好vim
docker exec -it mynginx_test /bin/bash
上传自己制作的镜像到远程仓库
docker push --help
上传镜像到公网仓库
首先现在Docker Hub注册自己的账号
docker login
docker image push guianjun/mynginx:v1.0
推送成功
dockerfile编写(想当于批处理) 文件内容如下
FROM nginx #基于nginx镜像构建新镜像
ADD ~/ /usr/share/nginx/html #将当前文件copy到容器的指定html目录
运行dockerfile
docker build -t m2 . #当前dockerfile构建一个镜像
可以运行新构建的m2
docker run -d -p 100:80 m2
将镜像保存为文件
docker save m2 > 1.tar
删除镜像
docker rmi m2
加载tar文件
docker load <1.tar
这时候镜像m2再次出来
docker images 查看
运行还可以指定名字
docker run -d -p 999:80 --name mynginx m2
文件映射
docker run -d -p 999:80 -v /usr/123 :/usr/share/nginx/html -v 'pwd' :/usr/123 m2
搜索docker的镜像
docker search nginx
复制文件
sudo docker cp /Users/front/Downloads/beifen.bak MSSQL_1433:/var/opt/mssql/backup
docker compose 部署和docker部署区别
Docker 部署
指直接使用 docker run 命令或 Dockerfile 构建镜像后,手动管理单个容器的生命周期(启动、停止、删除等)。适用于仅需部署单个容器的简单应用(如单独运行一个 Nginx 或 MySQL 容器)。
Docker Compose 部署
是 Docker 官方提供的工具,通过一个 YAML 配置文件(docker-compose.yml)定义多个关联的容器(如前端、后端、数据库、缓存等组成的完整应用),并使用 docker-compose 命令一键管理这些容器的启动、停止、重启等操作。
部署单个 Nginx 容器
Docker 部署:
需要手动输入命令,指定端口、挂载目录等参数:
bash
docker run -d --name nginx -p 80:80 -v /app/html:/usr/share/nginx/html nginx:latest
Docker Compose 部署:
先编写 docker-compose.yml:
yaml
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- /app/html:/usr/share/nginx/html
再执行启动命令:
bash
docker-compose up -d
部署多服务应用(如 Web + MySQL)
Docker 部署:
需分步骤创建网络、启动 MySQL、启动 Web 容器,并手动关联网络:
bash
# 创建网络
docker network create mynet
# 启动 MySQL
docker run -d --name mysql --network mynet -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
# 启动 Web 容器(假设依赖 MySQL)
docker run -d --name web --network mynet -p 8080:8080 my-web-app:latest
Docker Compose 部署:
配置文件自动处理网络和依赖:
yaml
version: '3'
services:
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=123
web:
image: my-web-app:latest
ports:
- "8080:8080"
depends_on: # 声明依赖关系(启动顺序)
- mysql
一键启动:
bash
docker-compose up -d # 自动创建网络,按依赖顺序启动容器
总结
Docker 部署适合简单场景,灵活但繁琐,需手动管理容器间的依赖和网络。
Docker Compose 部署通过配置文件简化了多服务应用的部署流程,自动处理网络、依赖和协作,更适合开发环境和中小型多服务应用。
如何进入docker容器编辑容器内文件
1. 进入 Docker 容器
首先需要找到容器的 ID 或名称,然后进入容器的交互式终端:
bash
# 查看正在运行的容器
docker ps
# 进入容器(替换CONTAINER_ID或容器名称)
docker exec -it CONTAINER_ID /bin/bash
# 如果容器内没有bash,可以尝试sh
docker exec -it CONTAINER_ID /bin/sh
-it 参数表示交互式终端,允许你在容器内输入命令。
2. 编辑容器内的文件
进入容器后,可以使用容器内已安装的文本编辑器编辑文件:
如果容器内有 vim:
bash
vim 文件名
如果容器内有 nano:
bash
nano 文件名
如果容器内没有任何编辑器,可以先安装(需要容器内有包管理工具且有网络):
bash
# Debian/Ubuntu系统
apt-get update && apt-get install vim
# CentOS/RHEL系统
yum install vim
3. 其他编辑方式(不进入容器)
如果不想进入容器,也可以通过以下方式编辑文件:
方法 1:直接在宿主机编辑容器文件
容器的文件系统实际上存储在宿主机的特定位置,可以通过以下命令找到文件路径并在宿主机编辑:
bash
# 查找容器文件在宿主机的路径(替换CONTAINER_ID和容器内文件路径)
docker inspect -f '{{ .GraphDriver.Data.MergedDir }}' CONTAINER_ID
# 然后在宿主机中使用该路径直接编辑文件(需要root权限)
方法 2:将容器文件复制到宿主机编辑后再复制回去
bash
# 复制容器内文件到宿主机
docker cp CONTAINER_ID:容器内文件路径 宿主机目标路径
# 在宿主机编辑文件后,再复制回容器
docker cp 宿主机文件路径 CONTAINER_ID:容器内目标路径
选择哪种方法取决于你的具体需求和容器的配置情况。进入容器直接编辑是最常用和直观的方式。