Docker 笔记
Docker 笔记
原创 已于 2025-03-28 12:07:49 修改 · 粉丝可见 · 863 阅读 · 25 · 9 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/142525696
目录
[TOC]
初始入门
例子:docker 安装Mysql
1 | |
docker run : 创建并运行一个容器
-d : 是让容器在后台运行
--name ___ : 给容器起别名,必须唯一,方便区分不同容器
-p (外部系统端口):(容器暴露端口) : 设置外部系统与容器端口之间的映射
-e KEY=VALUE: 是设置环境变量
最后结尾非关键字字符串 mysql : 指定运行的镜像名字
镜像命名规范
镜像名称一般分两部分组成 : [repository] : [tag]。例如:mysql:5.7
其中repository就是镜像名
tag是镜像的版本
在没有指定tag时,默认是latest,代表最新版本的镜像。
常用dockers命令
docker ps : 查看当前运行的 docker 容器
docker ps - a: 查看所有的 docker 容器
docker ps -q:查看所有正在运行的 docker 容器ID
docker stop [容器名称或者容器ID]:停止对应的容器
docker stop $(docker ps -q):停止所有正在运行的容器 ID
docker start [容器名称或者容器ID]:启动对应的容器
docker logs [容器名称或者容器ID]:查看当前容器的运行日志
docker logs [容器名称或者容器ID] - f :查看并跟踪当前容器的运行日志
docker exec -it [容器名称或者容器ID] bash:进入对应的docker容器
-it 表示 交互的意思
bash 表示 使用 bash 命令进行交互
docker exec -it [容器名称或者容器ID] [进入容器后执行的命令]:进入对应的docker容器并执行相应的命令
- 例如:docker exec -it mysql mysql -uroot -p:进入mysql命名的容器,并执行mysql -uroot -p命令
docker rm [容器名称或者容器ID]:删除对应的容器
docker rm [容器名称或者容器ID] -f:强制删除容器
docker inspect [容器名称或者容器ID]:查看容器详情
Linux系统自定义运行命令
在Linux系统中,自定义运行命令可以通过多种方式实现。
在这里我简单的介绍一个简易的自定义命令。
进入并编写自定义命令配置
1 | |
成功进入自定义命令配置,我们可以发现平时曾用到的常用命令 ls,实际上也是内部系统自定义的一个命令。

使用 别名 alias 自定义命令
在底部加上 自己的自定义的命令

保存并退出 :wq
注意重载我们的配置,使其生效
执行重载我们配置的命令
1 | |
测试我们自定义命令是否成功
1 | |

结果执行命令成功,说明我们自定义的命令生效了。
数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
数据卷命令语法:docker volume [数据卷相关命令]
create:创建数据卷
ls: 查看所有数据卷
rm:删除指定数据卷
inspect [挂载数据卷的别名] :查看某个数据卷的详情
prune:清除数据卷
--help:docker volume 命令的帮助文档
提示
在执行docker run命令时,使用参数-v [数据卷]:[容器内目录]可以完成数据卷挂载
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
注意!!!数据挂载只能在创建容器时进行挂载,如果容器已经创建了,无法再进行挂载
入门应用例子
使用nginx挂载,修改 nginx中的 index.html,并添加一些文件,映射到docker容器中。
通过官方文档可以得知 nginx容器中 index.html的路径在
1 | |
创建 nginx 容器 并挂载 index_html
1 | |
通过 数据卷命令 ls 查看是否成功挂载我们的 index_html
1 | |
最后显示结果:

出现了我们的挂载卷的别名说明挂载成功。
通过 数据卷命令 inspect 查看我们挂载的数据卷详细情况
1 | |
最后运行结果
1 | |
CreatedAt:这个字段表示卷被创建的时间。Driver:这个字段表示用于创建和管理这个卷的驱动程序。在这个例子中,驱动程序是 “local”,这是 Docker 默认的卷驱动程序,用于本地文件系统。Labels:这个字段包含了与卷关联的键值对标签。在这个例子中,Labels是null,表示没有设置任何标签。Mountpoint:这个字段提供了卷在宿主机上的挂载点路径。 在这个例子中,卷被挂载在/var/lib/docker/volumes/index_html/_data。Name:这个字段表示卷的名称。在这个例子中,卷的名称是 “index_html”。Options:这个字段包含了创建卷时指定的额外选项。在这个例子中,Options是null,表示没有指定任何额外选项。Scope:这个字段表示卷的作用域。”local” 表示这个卷仅在创建它的 Docker 守护进程上可用。
运行成功,查看到我们挂载卷的详细结果,通过 Mountpoint 我们可以得知在宿主机中映射到docker容器中的文件路径。
我们运行以下命令去查看我们映射文件是否存在
1 | |
运行结果:

说明我们映射成功,通过查看index.html发现文件内容与我们的nginx默认的index文件内容是一致的。
通过修改index文件,我们可以发现

通过映射发生了变化。
同时我们添加的文件也可以成功映射添加上去访问成功。

匿名卷
在Docker中,匿名卷是一种特殊类型的卷,它在运行容器时自动创建,并且没有与之关联的命名卷。
正如我们初始入门中使用 docker run 中并没有指定挂载卷,我们创建的容器会根据容器内容所需要指定挂载卷时,自动创建并分配映射指定容器需求的卷。
我们可以通过 docker inspect [容器名称或者容器ID] 进行查看详细的信息
例如,我们运行以下命令查看mysql容器详情
1 | |
- NetworkSettings:关于网络设置,我们可以看到宿主机之前的端口映射

- Mounts:关于挂载卷的设置,我们可以看到映射的卷名特别长,这就是创建容器时自动生成匿名映射卷

-v 容器数据卷挂载
在运行Docker容器时,可以使用 -v 参数 来挂载一个卷。
语法:docker run -d -v [宿主机目录]:[容器内目录] [容器名称或者容器ID]
在执行docker run命令时,使用-v 本地目录:容器内目录 可以完成本地目录挂载
本地目录必须以“/”或”./“开头,如果直接以名称开头,会被识别为数据卷而非本地目录,作为匿名卷
-v mysql:/var/lib/mysql 会被识别为一个数据卷叫mysql
-v ./mysql:/var/lib/mysql 会被识别为当前目录下的mysql目录
应用例子
根据官方镜像文档说明,总结并按照一下要求完成下面任务
挂载/home/angindem/mysql/data到容器内的/var/lib/mysql目录
挂载/home/angindem/mysql/init到容器内的/docker-entrypoint-initdb.d目录
挂载/home/angindem/mysql/conf到容器内的/etc/mysql/conf.d目录
在这里我们根据内容要求对应 -v 操作就可以了,下面是该任务的答案
第一步:创建对应的本地挂载目录
1 | |
第二步:将配置文件以及初始化sql脚本放到我们对应的挂载目录中
配置 angindem.cnf 文件命令:
1 | |
初始化的 sql 脚本,根据自己的具体情况来放置到 init 目录中,这里我放置我自己的。

第三步:创建并运行指定挂载docker命令
1 | |
运行创建成功后,我们查看data目录可以发现,docker容器成功映射,并且初始化脚本blog也存在
1 | |

自定义镜像
Docker 自定义镜像是容器化应用的关键。通过本文,你应该大概的了解了如何创建、构建、运行和分享 Docker 镜像。
在这里自定义镜像不仅可以帮助你在不同环境之间轻松迁移应用,还可以确保应用的一致性和可重复性。
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

根据构建 Java 镜像,我们可以了解到 关于 docker 的三种结构。
docker的三种结构:
入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
层(Layer):添加安装包、依赖、配置等,每次操作都形成新的一层。
基础镜像(Baselmage):应用依赖的系统函数库、环境、配置、文件等
创建 Dockerfile
创建自定义镜像的第一步是编写 Dockerfile。Dockerfile 是一个包含用于构建镜像的指令的文本文件。其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM ubuntu:20.04 |
| ENV | 设置环境变量,可在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jre11.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar-zxvf /tmp/jre11.tar.gz && EXPORTS path=/tmp/jre11:$path |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java-jar xx.jar |
更新详细语法说明,参考官网文档: Dockerfile reference | Docker Docs
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构
1 | |
也可以直接基于JDK为基础镜像,省略前面的步骤:
1 | |
构建镜像
当编写好了Dockerfile,可以利用下面命令来构建镜像:
1 | |
-t:是给镜像起名
格式依然是 repository:tag 的格式,不指定tag时,默认为 latest
( . ) :是指定Dockerfile所在目录,如果就在当前目录则指定为 “./“
例子
这里引用我们之前 Java文件上传删除相关模块(上传到物理存储)-CSDN博客 文件上传模块案例。
Dockerfile文件
1 | |
构建命令
1 | |
效果:

无报错情况。查看镜像发现自定义镜像构建成功。

运行容器。
1 | |
测试访问。


部署成功!!!!
docker网络
我们创建docker容器的时候,未指定docker网络设置,默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上,这个虚拟网络名为 docker0 ,使用虚拟网桥分配的IP,当我们重新创建的时候,IP发生变动,我们负责服务docker容器互联相关指定IP的容器就会有可能产生故障。

所以这里我们引用到了 docker自定义网络。
自定义docker网络
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
| 命令 | 说明 |
|---|---|
| docker network create [自定义网络名] | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm [自定义网络名] | 删除指定网络 |
| docker network prune | 清楚未使用的网络 |
| docker network connect [自定义网络名] [容器名] | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
使用示例:
创建一个自定义网络 angindemNet
1 | |

创建容器同时指定自定义 docker 网络
1 | |
查看创建的容器网桥
1 | |

当我们创建容器同时指定自定义网络,创建的容器不会连接默认的网桥网络。
应用实例:
尝试前后端分离部署,还是引用我们之前 Java文件上传删除相关模块 文件上传模块案例。
后端部署:
1 | |

后端服务启动成功。
前端部署:
这里通过官网 https://hub.docker.com/_/nginx ,查看nginx容器部署说明可以知道。
1 | |
1 | |
nginx.conf 和 前端html 的挂载目录位置在哪里。
运行一下命令部署我们的前端:
1 | |

访问部署成功!!!
测试项目运行

前后端分别部署成功!!!
DockerCompose
Docker Compose通过一个单独的 docker-compose.yml 模板文件 (YAML格式) 来定义一组相关联的应用容器,帮助我们实现 多个相互关联的Docker容器的快速部署 。

docker-compose编写语法
通过对比我们创建的容器以及 docker-compose.yml 的语法部署容器可以查找对应的规律。
创建mysql容器语法
1 | |
docker-compose.yml 相对应的语法
1 | |
按照这样的规律相对应即可根据我们的需求进行设置快速部署项目
1 | |
docker-compose 命令
格式:
1 | |
| 类型 | 参数或指令 | 说明 |
|---|---|---|
| options | -f | 指定compose文件的路径和名称 |
| -p | 指定project名称 | |
| Commands | up | 创建并启动所有service容器 |
| down | 停止并移除所有容器、网络 | |
| ps | 列出所有启动的容器 | |
| logs | 查看指定容器的日志 | |
| stop | 停止容器 | |
| start | 启动容器 | |
| restart | 重启容器 | |
| top | 查看运行的进程 | |
| exec | 在指定的运行中容器中执行命令 |
觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭
wechat pay
ali pay