【Docker 从入门到实战全攻略(二):核心概念 + 命令详解 + 部署案例】

news2025/6/6 19:13:28

5. Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 YAML 文件来配置应用服务,然后使用一个命令即可创建并启动所有服务。

  • 基本命令
    docker-compose up # 创建并启动所有服务
    docker-compose down # 停止并移除容器、网络等
    docker-compose ps # 查看运行状态
    docker-compose logs # 查看服务日志
  • 示例配置文件
version: '3'
services:
  web:
    build: .  # 使用当前目录的Dockerfile构建镜像
    ports:
      - "5000:5000"  # 映射端口
    volumes:
      - .:/code  # 挂载当前目录到容器内/code目录
    depends_on:
      - redis  # 依赖redis服务
  redis:
    image: redis:alpine  # 使用官方redis镜像
    volumes:
      - redis-data:/data  # 挂载数据卷

volumes:
  redis-data:  # 定义数据卷

6. Dockerfile

6.1 Dockerfile

Dockerfile 是一个文本文件,用于定义 Docker 镜像的构建过程。通过编写 Dockerfile,可以自动化创建自定义镜像,确保镜像内容的一致性和可重复性。

  • Dockerfile 的基本结构:
--------------创建镜像运行----------------------
# 基础镜像
FROM ubuntu:20.04

# 维护者信息
LABEL maintainer="your@email.com"

# 安装依赖
RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip

# 复制应用代码
COPY . /app
WORKDIR /app

# 安装应用依赖
RUN pip3 install -r requirements.txt

# 暴露端口
EXPOSE 8080
-------------执行容器运行-----------------------
# 定义启动命令
CMD ["python3", "app.py"]

6.2 指令

Dockerfile是一堆指令,在docker build的时候,按照该指令进行操作,最终生成我们期望的镜像

  • FROM 指定基础镜像,必须为第一个命令
    格式:
    FROM <image>:<tag>
    示例:
    FROM mysql:5.7
    注意:
    tag是可选的,如果不使用tag时,会使用latest版本的基础镜像
  • MAINTAINER 镜像维护者的信息
    格式:
    MAINTAINER <name>
    示例:
    MAINTAINER wupeiqi
    MAINTAINER wupeiqi@live.com
    MAINTAINER wupeiqi <wupeiqi@live.com>
  • ENV 设置环境变量
    格式:
    ENV <key> <value>
    ENV <key>=<value>
    示例:
    ENV myName John
    ENV myCat=fluffy
  • COPY|ADD 添加本地文件到镜像中 app.py /data/www/info/app.py
    格式:
    COPY <src>... <dest>
    示例:
    ADD hom* /mydir/ # 添加所有以"hom"开头的文件
    ADD test relativeDir/ # 添加 “test” 到 $WORKDIR/relativeDir/
    ADD test /absoluteDir/ # 添加 “test” 到 /absoluteDir/

注意:针对压缩包使用ADD的话,会自动解压。

  • WORKDIR 工作目录
    格式:
    WORKDIR /path/to/workdir
    示例:
    WORKDIR /a (这时工作目录为/a)
    注意:
    通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行
  • RUN 构建镜像过程中执行命令
    格式:
    RUN <command>
    示例:
    RUN yum install nginx
    RUN pip install django
    RUN mkdir test && rm -rf /var/lib/unusedfiles
    注意:
    RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache
  • CMD 构建容器后调用,也就是在容器启动时才进行调用
    格式:
    CMD ["executable","param1","param2"](执行可执行文件,优先)
    CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
    CMD command param1 param2 (执行shell内部命令)
    示例:
    CMD ["/usr/bin/wc","--help"]
    CMD ping www.baidu.com
    注意:
    CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
  • ENTRYPOINT 设置容器初始化命令,使其可执行化
    格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
    ENTRYPOINT command param1 param2 (shell内部命令)
    示例:
    ENTRYPOINT ["/usr/bin/wc","--help"]
    注意:
    ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
    而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。
    Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令

CMD 与 ENTRYPOINT 区别

  • 使用以下dockerfile构建镜像后执行docker run 镜像id -l会发生报错,因为 docker run 执行的 -l 会覆盖 CMD ,而 -l 不是命令所以报错
    在这里插入图片描述
  • 使用以下dockerfile构建镜像后执行docker run 镜像id -l会正常运行,因为 docker run 执行的 -l 会作为参数传给 ENTRYPOINT
    在这里插入图片描述
  • EXPOSE 暴漏端口
    格式:
    EXPOSE <port> [<port>...]
    示例:
    EXPOSE 80 443
    EXPOSE 8080
    EXPOSE 11211/tcp 11211/udp
    注意:
    就是一个端口的标识,实际开发时,没什么意义。因为端口的映射会在run命令时进行指定。

6.3 构建镜像与运行容器

  1. 编写 Dockerfile:创建一个名为 Dockerfile 的文件,定义镜像构建步骤。
  2. 构建镜像:使用 docker build 命令构建镜像:docker build -t myapp:1.0 -f Dockerfile --no-cache .
    其中,-t 指定镜像标签,. 表示使用当前目录的 Dockerfile。–no-cache表示无缓存
  3. docker image ls 或者 docker images 查看所创建的镜像
  4. 运行容器:使用 docker run 命令基于镜像创建并运行容器:docker run -d -p 8080:8080 myapp:1.0
    其中,-d 表示后台运行,-p 8080:8080 表示将容器的 8080 端口映射到主机的 8080 端口。

实操:

  1. 创建一个 Dockerfile1 , 并修改文件内容,定义一个简单镜像构建步骤:
    在这里插入图片描述
  2. docker build 构建镜像 docker build -f /data1/lsr/dockerfile_test/dockerfile1 -t test/centos:1.0 . # . 表示当前目录作为构建上下文,注意不要忘记
    在这里插入图片描述
  3. 启动容器,可以看到生成容器时挂载的两个数据卷目录 volume01 和 volume02
    在这里插入图片描述
    在这里插入图片描述
  4. 查看该容器的详细信息,可以看到挂载的两个匿名挂载的数据卷(生成在随机目录里)
    在这里插入图片描述
  5. 重新进入该容器的其中一个数据卷文件夹中,创建一个新文件
    在这里插入图片描述
  6. 退出容器并转到第4步中查询到的数据卷挂载目录下,发现数据被同步
    在这里插入图片描述

6.3.1 练习:构建自己的 ubantu

  1. 编写 dockerfile 的文件
    在这里插入图片描述

  2. 通过该文件构建镜像
    docker build -f /data1/lsr/dockerfile_test/dockerfile1 -t myubuntu:0.1 .
    docker build -f dockerfile文件路径 -t 镜像名:版本号 .
    在这里插入图片描述
    构建成功

  3. 启动容器并验证 vim 是否安装成功,发现 vim 可正常使用,且工作目录更改为 /usr/local
    在这里插入图片描述

6.3.2 Docker history 查看镜像构建历史信息

[图片]

6.4 拉取镜像与运行容器

  1. docker pull [用户名/DockerHub镜像名称]
  2. docker run [镜像名]

7. 容器数据卷(Volume)

容器数据卷(Container Data Volume)是容器技术(如 Docker)中用于实现数据持久化存储、跨容器共享数据的核心机制。它允许将容器内的数据独立存储在宿主机或外部存储中,避免因容器重启、删除导致数据丢失,同时支持多个容器之间的数据同步。

docker volume COMMAND
Commands:
create 创建一个卷
inspect 展示卷的细节
ls 卷列表
prune 移除当地未使用的卷
rm 移除卷

7.1 命名卷 / 命名挂载

  • 特点:
    • 由 Docker 自动管理宿主机存储路径(默认位于 /var/lib/docker/volumes/),无需手动指定宿主机路径。
    • 支持卷驱动(Volume Driver),可扩展至云存储(如 AWS EBS、阿里云 OSS)或分布式存储(如 NFS)。
    • 数据隔离性好,适合生产环境,便于统一备份和迁移。
  • 操作示例
# 创建命名卷
docker volume create my-vol

# 运行容器并挂载命名卷(容器内路径:/app/data)
docker run -d -v my-vol:/app/data nginx

# 查看命名卷详情(宿主机实际存储路径)
docker volume inspect my-vol

7.2 匿名卷 / 匿名挂载

  • 特点:由 Docker 自动生成随机名称,通常用于临时存储或一次性数据。
    docker run -v /container/path ... # 匿名卷(省略名称)

命名挂载
[图片]

匿名挂载
[图片]

7.3 命名卷 VS 匿名卷

7.4 绑定挂载(Bind Mount)

  • 特点:
    • 直接挂载宿主机本地路径或文件到容器中,灵活性高但依赖宿主机文件系统。
    • 适合开发场景(如本地代码实时同步到容器),但不支持跨主机共享,且需手动管理宿主机路径权限。
  • 操作示例:
  1. #挂载宿主机路径 /data1/lsr/test 到容器的 /home 路径
    docker run -it -v /data1/lsr/test:/home nginx # -v 参数绑定挂载
  2. 查看容器进程
    [图片]
  3. docker inspect 02ba2d57f12e # 查看该容器源数据,发现已经完成容器与主机的绑定挂载
    [图片]
  4. 测试,在容器中添加新文件,发现同一时间主机中也会增加该新增的文件
    [图片]
    [图片]
    同样的,在主机中添加或修改文件,也可同步到容器中去,不管容器是否在运行
    [图片]
    [图片]
  • 设置容器权限
    容器内只读,只能通过宿主机修改:docker run -it -v /data1/lsr/test:/home:ro nginx
    容器可读也可写:docker run -it -v /data1/lsr/test:/home:rw nginx

7.5 练习 Mysql 数据持久化

  • docker run -d -p 3310:3306 -v /data1/lsr/mysql/conf:/etc/mysql/conf.d -v /data1/lsr/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=2020 --name mysql01 mysql
    #-d 后台运行、-p 暴露端口将3310和容器内3306映射、-v 绑定挂载数据卷,可挂载多个 、-e 配置环境,设置数据库密码

  • 去数据库中检验连接成功,
    [图片]

  • 新建一个数据库ronghaha,可分别从容器中以及主机中查看到相关数据
    [图片]
    [图片]
    [图片]

8. 数据卷容器

多个容器间如何同步数据

实战

  1. 创建一个新容器 docker01,创建后 ctrl + P + Q 容器不停止退回到主机
    [图片]
  2. 再创建一个 新容器 docker02 并于 docker01 进行挂载
    [图片]
  3. 在 docker01 的 volume1 目录中添加一个新文件 docker01,发现 docker02 的 volume1 的数据也会同步,反之在 修改 docker02 的 volume2 2,发现 docker01 的 volume2 的数据也会同步
    docker02 中新增 docker02 文件
    [图片]
    docker01 同步更新数据
    [图片]
  4. 删掉容器 docker01,发现 docker02 中的数据不变

多个 mysql 实现数据共享(两种方法)

  • docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=2020 --name mysql01 mysql
  • docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=2020 --name mysql02 --volumes-from mysql01 mysql

创作不易,求点赞,求收藏呀|ू・ω・` )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2400784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【conda配置深度学习环境】

好的&#xff01;我们从头开始配置一个基于Conda的虚拟环境&#xff0c;覆盖深度学习&#xff08;如PyTorch&#xff09;和传统机器学习&#xff08;如XGBoost&#xff09;&#xff0c;并适配你的显卡&#xff08;假设为NVIDIA&#xff0c;若为AMD请告知&#xff09;。以下是完…

力扣4.寻找两个正序数组的中位数

文章目录 题目介绍题解 题目介绍 题解 题解链接&#xff1a;题解 核心思路&#xff1a;通过二分查找的确定分割点使左右两部分元素数量相等。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int n1 nums1.length;int n2 nums2.length…

【相机基础知识与物体检测】更新中

参考&#xff1a; 黑马机器人 | 相机标定&物体检测https://robot.czxy.com/docs/camera/ 01-相机基础 相机基础概述 相机是机器视觉的基础&#xff0c;相机直接产生了相机数据。所有视觉算法都是作用在相机数据上的。相机数据的好坏&#xff0c;或者对相机数据的理解方式…

【前端】性能优化和分类

本页知识点参考&#xff1a;https://zhuanlan.zhihu.com/p/514222781 1. 加载性能优化 1.1 网站性能优化 content方法&#xff1a; 1&#xff09;减少HTTP请求&#xff1a;合并文件&#xff0c;CSS精灵&#xff0c;inline Image 2&#xff09;减少DNS查询&#xff1a;DNS缓存&…

PPO和GRPO算法

verl 是现在非常火的 rl 框架&#xff0c;而且已经支持了多个 rl 算法&#xff08;ppo、grpo 等等&#xff09;。 过去对 rl 的理解很粗浅&#xff08;只知道有好多个角色&#xff0c;有的更新权重&#xff0c;有的不更新&#xff09;&#xff0c;也曾硬着头皮看了一些论文和知…

rk3588 上运行smolvlm-realtime-webcam,将视频转为文字描述

smolvlm-realtime-webcam 是一个开源项目&#xff0c;结合了轻量级多模态模型 SmolVLM 和本地推理引擎 llama.cpp&#xff0c;能够在本地实时处理摄像头视频流&#xff0c;生成自然语言描述&#xff0c; 开源项目地址 https://github.com/ngxson/smolvlm-realtime-webcamhttps…

Rust 学习笔记:Box<T>

Rust 学习笔记&#xff1a;Box Rust 学习笔记&#xff1a;Box<T\>Box\<T> 简介使用 Box\<T\> 在堆上存储数据启用带有 box 的递归类型关于 cons 列表的介绍计算非递归类型的大小使用 Box\<T\> 获取大小已知的递归类型 Rust 学习笔记&#xff1a;Box<…

操作系统学习(十三)——Linux

一、Linux Linux 是一种类 Unix 的自由开源操作系统内核&#xff0c;由芬兰人 Linus Torvalds 于 1991 年首次发布。如今它广泛应用于服务器、桌面、嵌入式设备、移动设备&#xff08;如 Android&#xff09;等领域。 设计思想&#xff1a; 原则描述模块化与可移植性Linux 内…

NLP学习路线图(二十二): 循环神经网络(RNN)

在自然语言处理&#xff08;NLP&#xff09;的广阔天地中&#xff0c;序列数据是绝对的核心——无论是流淌的文本、连续的语音还是跳跃的时间序列&#xff0c;都蕴含着前后紧密关联的信息。传统神经网络如同面对一幅打散的拼图&#xff0c;无法理解词语间的顺序关系&#xff0c…

每日一C(1)C语言的内存分布

目录 代码区 常量区 全局/静态区 初始化数据段&#xff08;.data&#xff09; 未初始化数据段&#xff08;.bss&#xff09; 堆区 栈区 总结 今天我们学习的是C语言的内存分布&#xff0c;以及这些分区所存储的内容和其特点。今天的思维导图如下。 C语言作为一款直接处…

Photoshop使用钢笔绘制图形

1、绘制脸部路径 选择钢笔工具&#xff0c;再选择“路径”。 基于两个点绘制一个弯曲的曲线 使用Alt键移动单个点&#xff0c;该点决定了后续的曲线方向 继续绘制第3个点 最后一个点首尾是同一个点&#xff0c;使用钢笔保证是闭合回路。 以同样的方式绘制2个眼睛外框。 使用椭…

应用层协议:HTTP

目录 HTTP&#xff1a;超文本传输协议 1.1 HTTP报文 1.1.1 请求报文 1.1.2 响应报文 1.2 HTTP请求过程和原理 1.2.1 请求过程 1、域名&#xff08;DNS&#xff09;解析 2、建立TCP连接&#xff08;三次握手&#xff09; 3、发送HTTP请求 4、服务器处理请求 5、返回H…

复习——C++

1、scanf和scanf_s区别 2、取地址&#xff0c;输出 char ba; char* p&b; cout<<*p; cout<<p; p(char*)"abc"; cout<<*p; cout<<p; cout<<(void*)p; 取地址&#xff0c;把b的地址给p 输出*p&#xff0c;是输出p的空间内的值…

SPI通信协议(软件SPI读取W25Q64)

SPI通信协议 文章目录 SPI通信协议1.SPI通信2.SPI硬件和软件规定2.1SPI硬件电路2.2移位示意图2.3SPI基本时序单元2.3.1起始和终止条件2.3.2交换一个字节&#xff08;模式1&#xff09; 2.4SPI波形分析&#xff08;辅助理解&#xff09;2.4.1发送指令2.4.2指定地址写2.4.3指定地…

JavaWeb:前后端分离开发-部门管理

今日内容 前后端分离开发 准备工作 页面布局 整体布局-头部布局 Container 布局容器 左侧布局 资料\04. 基础文件\layout/index.vue <script setup lang"ts"></script><template><div class"common-layout"><el-containe…

字节开源FlowGram:AI时代可视化工作流新利器

字节终于开源“扣子”同款引擎了&#xff01;FlowGram&#xff1a;AI 时代的可视化工作流利器 字节FlowGram创新性地融合图神经网络与多模态交互技术&#xff0c;构建了支持动态拓扑重构的可视化流程引擎。该系统通过引入 f ( G ) ( V ′ &#xff0c; E ′ ) f(\mathcal{G})…

(LeetCode 每日一题)3403. 从盒子中找出字典序最大的字符串 I (贪心+枚举)

题目&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 题目&#xff1a;贪心枚举字符串&#xff0c;时间复杂度0(n)。 最优解的长度一定是在[1,n-numFriends]之间。 字符串在前缀都相同的情况下&#xff0c;长度越长越大。 C版本&#xff1a; class Solution { public:st…

GPIO的内部结构与功能解析

一、GPIO总体结构 总体构成 1.APB2(外设总线) APB2总线是微控制器内部连接CPU与外设&#xff08;如GPIO&#xff09;的总线&#xff0c;负责CPU对GPIO寄存器的读写访问&#xff0c;支持低速外设通信 2.寄存器 控制GPIO的配置&#xff08;输入/输出模式、上拉/下拉等&#x…

php7+mysql5.6单用户中医处方管理系统V1.0

php7mysql5.6中医处方管理系统说明文档 一、系统简介 ----------- 本系统是一款专为中医诊所设计的处方管理系统&#xff0c;基于PHPMySQL开发&#xff0c;不依赖第三方框架&#xff0c;采用原生HTML5CSS3AJAX技术&#xff0c;适配手机和电脑访问。 系统支持药品管理、处方开…

智慧物流园区整体解决方案

该智慧物流园区整体解决方案借助云计算、物联网、ICT 等技术,从咨询规划阶段介入,整合供应链上下游资源,实现物流自动化、信息化与智能化。方案涵盖智慧仓储管理(如自动化立体仓储系统、温湿度监控)、智慧物流(运输管理系统 TMS、GPS 监控)、智慧车辆管理(定位、调度、…