docker如何工作:Docker 就像是一个神奇的“打包盒”。你可以把你的程序和它需要的所有东西(比如运行环境、库等)都装进这个盒子(镜像)里。然后,用这个盒子创建一个“小房间”(容器),在“小房间”里,程序就能安全地运行,不会受到外面电脑环境的影响。这样,你就可以很方便地把程序从一台电脑搬到另一台电脑上,只要那台电脑安装了 Docker。

想要使用docker去构建自己的软件包,需要熟练使用docker build xxx命令。

想要分享你的应用,第一需要熟练使用 docker push xxx把你的应用推送到docker的应用市场,第二需要熟练使用docker pull redis可以从应用市场来下载这个镜像。

想要运行你的应用,需要掌握docker run redis。

理论基础:

容器化部署:容器类似轻量级的VM;可以共享操作系统的内核;容器拥有自己的文件系统、CPU、内存、进程空间;容器之间互相隔离,一个应用炸了相当于只炸了自己的容器内部不会影响其他应用。优点:轻量,快速,隔离,跨平台,高密度部署等。

命令:

一、镜像操作:

1、下载镜像

https://hub.docker.com/           在里面找到自己想要的镜像按说明下载即可

2、镜像的相关操作:

检索:docker  search

下载:docker  pull

列表:docker  images

删除:docker  rmi

镜像名:标签(版本)

也可以以唯一ID进行删除

 

 

二、容器操作

1、启动容器

运行:docker  run

查看运行中的容器:docker  ps

停止:docker  stop

启动:docker  start

重启:docker  restart

状态:docker  stats

日志:docker  logs

进入:docker  exec

删除:docker  rm

2、run细节

端口映射        -p  88:80表示访问主机外部的88就等于访问我这个容器内部的80

80端口可以重复但88端口不能重复。可以把每一个容器认为是一个独立的Linux服务器。

 - d   后台启动

# 一个功能相对完整的例子
docker run -d \           # 后台运行
  --name my_app \         # 容器命名为 my_app
  -p 8080:80 \            # 端口映射
  -v /host/path:/app/data \  # 数据卷挂载
  -e MODE=production \    # 设置环境变量
  --rm \                  # 停止后自动删除
  my-web-app:latest       # 使用的镜像名

三、保存镜像

1、相关命令

提交:docker  commit

保存:docker  save

加载:docker  load

四、分享镜像

登录:docker  login

命令:docker  tag

推送:docker  push

四、存储

 

1、目标挂载

Docker 的目录挂载,通俗讲就是:把宿主机(你真实电脑)上的一个目录或文件,与容器内部的一个目录或文件“关联”起来,形成双向同步。

容器内修改文件,宿主机上能看到变化。

宿主机上修改文件,容器内也能看到变化。

1️⃣数据卷方式

由 Docker 自己管理的一块存储区域,你不需要关心它在宿主机上的具体路径。你可以把它看作一个由 Docker 创建的“U盘”,然后把这个U盘挂载给容器用。

命令:使用 -v 或 --mount,但宿主机路径部分改用卷名。

语法:
# 使用 -v
docker run -v 卷名:/容器内路径 ...

# 使用 --mount
docker run --mount type=volume,source=卷名,target=/容器内路径 ...

‼️注意:

卷名就是你自己给 Docker 数据卷起的一个“别名”或者“昵称”。

# 创建一个名为 "my_app_data" 的数据卷(如果不存在),并挂载到容器的 /app/data 目录
docker run -v my_app_data:/app/data nginx

如果没有卷名Docker 会自动创建一个新的、空的、以此名字命名的数据卷。这是数据卷一个非常方便的特性!

 

2️⃣绑定挂载

直接将宿主机上任何一个你指定的目录,挂载到容器里。

命令:使用 -v 或 --mount 标志。

语法:
# 使用 -v (更简洁)
docker run -v /宿主机/绝对路径:/容器内路径 ...

# 使用 --mount (更明确,语法类似)
docker run --mount type=bind,source=/宿主机/绝对路径,target=/容器内路径 ...
例子:
# 把宿主机的 /home/user/data 目录挂载到容器的 /app/data 目录
docker run -v /home/user/data:/app/data nginx
‼️注意:

宿主机路径必须使用绝对路径。

如果宿主机目录不存在,Docker 会自动创建它(但 --mount 不会,需要预先存在)。

功能强大,但依赖宿主机目录结构,移植性稍差。

 

2、卷映射

“卷映射”这个词其实是上面我们讨论的 “绑定挂载” 和 “数据卷挂载” 的统称。它的核心思想就是:将宿主机上的一个目录或文件,与容器内部的一个目录或文件关联起来,使它们内容同步。

 

你可以把容器想象成一个带硬盘的电脑,卷映射就是给它接上一个“外接硬盘”。这个“外接硬盘”有两种形式:

1️⃣. 绑定挂载 - “接上一个指定的外置硬盘”
大白话:你直接把宿主机上一个你非常熟悉的、具体的文件夹(比如 D:\我的项目 或 /home/user/docs)接给容器用。

命令:-v /宿主机/绝对路径:/容器内路径

特点:

路径你定:你完全控制宿主机上用的是哪个目录。

依赖宿主机:这个目录结构是和你的宿主机强相关的。如果把命令拿到另一台电脑上,这个路径可能就不存在了。

灵活:适合挂载配置文件、源代码等。

示例:挂载一个配置文件

bash
# 将宿主机当前目录下的 nginx.conf 文件,挂载到容器的默认配置位置
docker run -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx
这里,你在宿主机上修改 nginx.conf,容器内的 Nginx 配置会立刻更新(如果支持热重载的话)。

2️⃣. 数据卷挂载 - “接上一个Docker管理的、有名字的共享硬盘”
大白话:你告诉 Docker:“给我一个叫 项目数据 的硬盘用”。你不需要关心这个硬盘在宿主机上的具体物理位置,Docker 会帮你管理。

命令:-v 数据卷名称:/容器内路径

特点:

Docker 管理:数据卷由 Docker 创建和管理,位置通常在 /var/lib/docker/volumes/...,你不需要关心。

通过名称引用:你只需要记住你给卷起的名字(如 mysql_data)。

移植性强:命令 -v mysql_data:/var/lib/mysql 在任何机器上都能运行。

安全规范:数据都放在 Docker 的标准区域,不易被误删。

示例:为数据库挂载数据卷

bash
# 使用一个名为 `website_db` 的数据卷来持久化MySQL的数据
docker run -d \
  --name my-mysql \
  -v website_db:/var/lib/mysql \  # 核心在这里!
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:latest   
即使这个容器被删除,只要 website_db 卷还在,下次再创建一个新容器并挂载这个卷,你的所有数据就都恢复了。

 

3、自定义网络

Docker 自定义网络就像是你为了一个项目(比如一个微服务系统)专门搭建的一个内部局域网。在这个局域网里,设备之间通信更高效、更安全,而且可以通过主机名直接呼叫对方,非常方便。

⚠️docker为每个容器分配唯一IP,使用容器ip+容器端口可以互相访问;IP由于各种原因可能变化,docker0默认不支持主机域名;创建自定义网络,容器名就是稳定域名。

 

如何使用自定义网络(三步走)
第1步:创建网络
使用 docker network create 命令。

bash
# 创建一个名为 "my_app_net" 的自定义桥接网络
docker network create my_app_net

# 创建时可以指定网段(可选)
docker network create --subnet=172.20.0.0/16 --gateway=172.20.0.1 my_app_net
第2步:将容器连接到自定义网络
在 docker run 时使用 --network 参数。

bash
# 启动一个 MySQL 容器,并连接到自定义网络
docker run -d --name mysql-db \
  --network my_app_net \  # 关键参数!
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:latest

# 启动一个 Web 应用容器,也连接到同一个自定义网络
docker run -d --name web-app \
  --network my_app_net \  # 关键参数!
  -p 8080:80 \
  my-web-app:latest          #名为 my-shop-app 的镜像中,标签为 latest(即最新版)的那个版本。你可以把它理解成一个软件的 “产品名 + 版本标签”。

‼️注意:my-shop-app:latest 写在命令的最后,不是因为格式要求,而是因为它在语法上是 docker run 命令的 IMAGE 参数,这个参数必须放在所有选项的后面。
第3步:在容器内通过容器名通信
现在,在 web-app 这个容器里,你的应用程序可以直接使用 mysql-db 这个主机名来访问数据库,而无需知道它的IP地址。

应用配置示例:
你的 Web 应用的数据库连接字符串,不再需要写难以记忆的IP,而是写成:

python
# 在 web-app 容器的代码配置中
DATABASE_URL = "mysql://user:123456@mysql-db:3306/my_database"
# 注意这里的主机名就是 `mysql-db`,也就是另一个容器的 --name

 

总结一句话:docker可以允许我们自己创建一个网络,以后所有的容器加入这个网络(mynet),以后每个容器的容器名就是它网络访问的稳定域名。最后整个机器里面用docker启动的所有容器,他们的网络都是互通的,容器之间可以任意互相访问,只需要使用容器IP或者容器名➕容器内的应用端口就可以了,而不用使用外部暴露的端口也不能使用外部暴露的端口。

 

一个容器可以同时属于多个网络!

bash
# 将一个已运行的容器连接到另一个网络
docker network connect another_network web-app

# 从某个网络中断开一个容器
docker network disconnect my_app_net web-app
这个功能非常有用,比如你的 web-app 可以同时连接到一个前端网络和一个后端数据库网络。

 

实战示例:搭建一个简单的 Web 应用 + Redis 服务
bash
# 1. 创建网络
docker network create my_shop_net

# 2. 启动 Redis 服务到该网络
docker run -d --name redis-cache --network my_shop_net redis:alpine

# 3. 启动 Web 应用(假设你的应用配置中已经写了连接主机名为 `redis-cache` 的Redis)
docker run -d --name shop-app \
  --network my_shop_net \
  -p 8000:5000 \
  my-shop-app:latest  #你可以把它理解成一个软件的 “产品名 + 版本标签”。
在这个例子中,shop-app 容器内的代码可以直接通过 redis-cache:6379 来访问 Redis 服务。无论这两个容器如何重启、IP如何变化,只要它们的名字和网络不变,连接就始终有效。

五、docker compose

1、Docker Compose 是一个用来定义和运行多容器 Docker 应用的工具。如果 Docker 是“集装箱”技术,那么 Docker Compose 就是“集装箱船队的调度员”。
 

没有 Compose 时,你需要手动执行三条复杂的 docker run 命令,还要确保它们在同一网络、正确连接。非常繁琐,容易出错。

有了 Compose 时,你只需要在一个 YAML 配置文件(docker-compose.yml)里,用清晰的语法描述清楚这三个容器长什么样、怎么连。然后执行一条命令:
docker compose up

 

实验测试:

 

先创建一个自定义网络,让他们(Wordpress和mysql)都加入到自定义网络中 ,然后使用docker run命令启动mysql,可以把mysql的关键数据配置等都挂载一下,restart让mysql开机自启,接着再使用docker命令安装Wordpress博客系统。

 

运行效果:

选择简体中文后点击继续,因为配置了数据库的账号密码所以Wordpress会自动连接刚才指定的数据库。

 

 填写相应的数据,安装。

 安装成功后可以登录进入后台

当然也可以不登录后台而是在外部直接访问 IP地址➕8080就会来到你的博客

2、compose语法

 

 

 

要使用它(.yaml文件)批量启动应用,ctrl a+ctrl  c

在命令行里面输入vim compose.yaml     i进入插入模式,将yaml文件粘贴上去然后exc退出:we退出并保存

结果:

 

相应的格式在 https://docs.docker.com/compose/compose-file

里面查找然后按标准格式填写。

3、comprise其他

核心概念:一文件,一命令
1. 编排文件 (docker-compose.yml)
这是一个声明式的配置文件,你用 YAML 语法告诉 Docker:“我的应用需要哪些服务,每个服务怎么配置,它们之间如何协作”。

2. 核心命令
docker compose up:启动整个应用(后台运行加 -d 参数)

docker compose down:停止并清理整个应用(删除容器、网络等)

docker compose ps:查看应用内各个容器的状态

docker compose logs:查看所有容器的日志

六、dockerfile

Dockerfile 是一个纯文本文件,里面包含了一条条的指令。 每一条指令都会在镜像上创建一个新的“层”。当你执行 docker build 命令时,Docker 引擎会读取这个文件,并按照指令一步步地执行,最终“烹饪”出一个可以直接运行的、包含了你的应用及其所有依赖的 Docker 镜像。

没有 Dockerfile:你只能使用别人预制好的镜像(比如 ubuntu, nginx),很难定制自己的应用环境。

有了 Dockerfile:你可以精确地描述你的应用需要什么环境、依赖什么库、代码放在哪里、如何启动。任何人都可以用这个文件构建出一模一样的镜像。

1、制作镜像

想要编写dockerfile就需要编写一堆的指令。

 

 

2、镜像分层机制

 

Docker 使用一种叫做 联合文件系统 的技术来实现分层。它就像一个“魔法投影仪”,能把多个只读的层(透明胶片)叠加在一起,最终呈现出一个统一的文件系统视图。

每一层都是只读的:一旦创建,就无法修改,这保证了镜像的不可变性。

容器层是可写的:当容器启动时,Docker 会在所有镜像层之上,再添加一个薄薄的可写层(容器层)。所有在容器内进行的修改(写文件、删文件)都发生在这个可写层。

镜像结构:

应用A镜像: [ubuntu层] -> [Python层] -> [App A代码层]
应用B镜像: [ubuntu层] -> [Node.js层] -> [App B代码层]
在你的机器上,ubuntu:20.04 这个基础层只会被存储一次。两个镜像都共享这一层。当你拉取应用B的镜像时,如果本地已经有了 ubuntu:20.04 层,就只需要下载 Node.js 层和 App B代码层。

七、docker compose一键启动开发环境(安装常见的中间件)

包含如下图片组件

更新中…… 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐