Docker官方文档阅读笔记

article/2025/3/10 15:26:06

文章目录

  • Dockerfile的书写
    • Dockerfile常见问题
    • RUN 和CMD的区别
  • 通过Dockerfile构建应用
  • 启动应用
  • 利用Volume持久化Container数据到宿主机上(named volume)
    • 创建volume
    • 启动容器时候使用-v参数
    • volume所同步的容器数据在宿主机哪里?
  • 利用bind mounts将宿主机的数据同步至Container
  • 如何区分named volume和bind mounts?
  • Compose将多个容器整合成一个完整的应用
    • 利用docker-compose.yml将多个应用整合在一起
    • 启动
  • Docker各个命令快速查阅
  • 使用Docker Desktop可视化操作
  • 示例代码
  • 其他建议

Docker文档写的相当好,不但示例全,而且是思路很连贯下来的。基本是你顺着他的思路下来,对Docker就有了很整体的认识

本篇博文是记录Docker文档中Get started笔记

Dockerfile的书写

# From后面跟镜像image名字
From node:12-alpine
# RUN 是构建镜像其中的一个步骤,这里代表拉取镜像后,在镜像中安装以下几个软件
RUN apk add --no-cache python2 g++ make
# 后续的命令的工作目录
WORKDIR /app
# 将宿主机的当前文件夹下的app文件夹拷贝至容纳的/app下
COPY ./app .
# 在当前镜像中使用yarn
RUN yarn install --production
# CMD是镜像已经构建完毕之后,启动容器之后,容器里默认执行的命令,CMD只能有一个,如果出现多个,则以最后一个生效
CMD ["node", "src/index.js"]
# 暴露的端口,只是暴露端口,但是没有和宿主机端口进行映射,要映射的话还是要通过-p参数
EXPOSE 3000

Dockerfile常见问题

RUN 和CMD的区别

stackonverflow上的回答

其实有这个问题其实是更深层次的原因,可能是自己没搞懂Docker中Image和Container的概念

在这里插入图片描述

  • Container可以简单理解为我们最终跑的应用,那最终的应用在机器上是什么呢?是一个进程
  • 那Image是什么呢,是为了能让我们应用跑起来的前置配置,也可以叫应用需要的环境

所以搞懂这两个,再回过头来看,就懂了。

  • RUN是针对Image配置的,简单理解为,我为了搭建好程序运行的环境,我需要的步骤都用RUN来定义

  • CMD是针对Container-进程的,CMD是进程启动之后,默认的执行的命令
    在这里插入图片描述

通过Dockerfile构建应用

docker build -t getting-started .

最后的这个点代表的是 build context,在docker build文档中搜索即可找到,还不理解就Google这个两个单词

构建过程会实时在Termial上看到,如下图
在这里插入图片描述

我们上述的那几步都可以看到

启动应用

docker run -dp 3000:3000 getting-started

利用Volume持久化Container数据到宿主机上(named volume)

Docker中各个Container是隔离(isolation)的,即使两个Container来自于同一个Image,那么其各自的数据无法共享。同时对Container的中文件的改变,随着容器的删除会消失,也就是无法持久化

With the previous experiment, we saw that each container starts from the image definition each time it starts. While containers can create, update, and delete files, those changes are lost when the container is removed and all changes are isolated to that container. With volumes, we can change all of this.

Volumes provide the ability to connect specific filesystem paths of the container back to the host machine. If a directory in the container is mounted, changes in that directory are also seen on the host machine. If we mount that same directory across container restarts, we’d see the same files

根据上述文档所述,Volume是可以将容器内的改变存储在宿主机上的,这样一来,就解决了上面的疑问

创建volume

docker volume create todo-db

启动容器时候使用-v参数

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

上面的(/etc/todos)是容器里的路径,也就是volume监控容器内/etc/todos下的文件,当产生变化时,会自动将这些变化同步到宿主机的磁盘上,从而解决容器无法持久化数据的问题

Start the todo app container, but add the -v flag to specify a volume mount. We will use the named volume and mount it to /etc/todos, which will capture all files created at the path

volume所同步的容器数据在宿主机哪里?

docker volume inspect todo-db

文档

利用bind mounts将宿主机的数据同步至Container

场景之一是本地开发时,源码发生改动时可以不重新构建Container的情况下,更新Conntainer

  • named volume是将Container里的数据同步至Host中
  • bind mounts是将Host里的数据同步至Container中

In the previous chapter, we talked about and used a named volume to persist the data in our database. Named volumes are great if we simply want to store data, as we don’t have to worry about where the data is stored.

With bind mounts, we control the exact mountpoint on the host. We can use this to persist data, but it’s often used to provide additional data into containers. When working on an application, we can use a bind mount to mount our source code into the container to let it see code changes, respond, and let us see the changes right away.

文档地址以及二者的差别

如何区分named volume和bind mounts?

named volume和bind mounts都定义在volume下,如何区分呢?

  • 前面是看着像名字的是named volume,是将container数据持久化至host中。例如

todo-db:/etc/todos

  • 前面明显能看着是路径的,是bind mounts,是将host的改动同步至container中。例如

/usr/local:/usr/local

docker 也提供了mount参数,通过type区分是volume还是bind mounts,并且docker官方建议使用mount参数而不是使用-v参数。

有关docker容器中如何管理数据,以及bind mounts 和 volume 的特别详细的使用场景,见官方文档-Manage data in Docker部分

Compose将多个容器整合成一个完整的应用

In general, each container should do one thing and do it well

一个完整的企业级应用可能由前端+后端+数据库+Redis+MQ组成

那么在docker的世界里,上述的每一部分都应该放在不同的container中,并通过统一的网络来沟通

但是即使这样,还是有些复杂,即部署一个系统的时候,还是要分别部署各个container,验证、然后配置网络,有没有类似于一键部署的方式。于是docker-compose出现了

The big advantage of using Compose is you can define your application stack in a file, keep it at the root of your project repo (it’s now version controlled), and easily enable someone else to contribute to your project. Someone would only need to clone your repo and start the compose app. In fact, you might see quite a few projects on GitHub/GitLab doing exactly this now.

利用docker-compose.yml将多个应用整合在一起

# compose 的schema的版本,类似于XML文件的version
version: "3.7"services:app:image: node:12-alpine# 意思是We’re starting a shell using sh (alpine doesn’t have bash) and running yarn install to install all dependencies and then running yarn run dev. If we look in the package.json, we’ll see tha#t the dev script is starting nodemoncommand: sh -c "yarn install && yarn run dev"# 端口映射ports:- 3000:3000# 容器内的工作目录working_dir: /app# 这里使用的是bind mounts,即将host的内容同步到container中volumes:- ./app:/appenvironment:MYSQL_HOST: mysqlMYSQL_USER: rootMYSQL_PASSWORD: secretMYSQL_DB: todosmysql:image: mysql:5.7# 这里是使用的是named volume,即将container中的数据持久化至host中volumes:- todo-mysql-data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: secretMYSQL_DATABASE: todos
# 在docker-compose中不会自动根据volume创建named volume,所以这里要声明
volumes:todo-mysql-data:

启动

docker-compose up -d

在这里插入图片描述
在这里插入图片描述

可以看到,根据上面的配置,docke-compose创建了两个container

  • mysql_1
  • app_1

根据配置创建了volume,还自动创建了统一的网络

Docker各个命令快速查阅

文档地址
在这里插入图片描述

使用Docker Desktop可视化操作

使用Docker Desktop能够很方便的让我们在本地查看docker的一些信息
在这里插入图片描述
同时也可以直接在Docker Desktop中进入相应容器中,而无需在命令行中再去敲命令

  • 点击某个container,这里点击的是get-started_app_1
  • 点击右上角的CLI就会自动打开Terminal,填充命令进入container中,非常方便
    在这里插入图片描述

示例代码

  • Docker官方配套的教程代码地址
  • 本人copy官方代码的学习仓库

其他建议

随着Docker越来越普及,再学习使用其他软件的时候,我们可以转变思路。无需再在自己的机器上装软件,各种配置环境变量等。直接一个docker镜像拉下来,快速进入学习阶段。等学会了,直接一删镜像。把主要精力放在真正的学习上,而不是被各种软件的安装耗没了学习热情


http://chatgpt.dhexx.cn/article/KIRUHoCp.shtml

相关文章

深入浅出Docker文档,学习Docker神器

前言 随着k8s 作为容器编排解决方案变得越来越流行,有些人开始拿 Docker 和 k8s进行对比,不禁问道:Docker 不香吗? k8s 是kubernets的缩写,’8‘代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手&#x…

windows系统部署docker文档

#windows系统部署docker文档 一. 安装docker对系统版本的不同要求 1.对于win7、8及部分win10版本 win7、win8、win10的专业版或企业版(内部版本15063之前)及win10家庭版(内部版本19018之前)需要利用docker toolbox来安装。查看对…

Docker安装文档

目录 1.什么是Docker? 2.Docker是干嘛的? 3.Docker基本组成 3.1.docker流程 4.Docker安装 4.1.环境准备 4.2.卸载Docker 4.3.需要的安装包 4.4.设置镜像仓库 4.5.更新yum索引 4.6.安装docker (docker-ce 社区版免费 docker-ee 企业版&…

docker学习文档

目录 一、docker安装(环境:Centos)(一)、在线安装1、docker官网2、找到在CentOS中安装docker的文档3、判断安装docker的CentOS环境是否符合要求4、卸载旧版本5、安装gcc相关工具5.1、判断CentOS是否能上外网5.2、安装g…

docker虚拟化技术文档(自己总结最全版本)

目录 1 使用Docker虚拟化出一个Centos7操作系统(140、141机器上执行) 2 1.1 Docker安装 3 1.1.1 支持的操作系统 3 1.1.2 前提条件 3 1.1.3 使用yum安装(CentOS7下) 3 1.1.4 使用脚本安装Docker(Centos7下&#xff09…

Docker 详细文档

Docker 文档 目录 ⒈ 简介... 2 1.1什么是容器?... 2 1.2 什么是Docker?... 3 1.3 Doceker的目标... 3 1.4 Docker 的使用场景... 3 ⒉ Docker 的基本组成... 3 2.1 Docker 客户端/守护进程... 3 2.2 Docker 镜像... 4 2.3 Doceker Co…

我的世界数据包制作(一)

我的世界数据包教程(一) 本人一直是minecraft粉丝,最近学习数据包制作,看网络上的中文教程挺少的,决定在学习的同时自己出一个专栏。OK,让我们直接进入专题! 一、数据包是什么? 数据包是在java版1.13时添加…

饥荒联机版Mod开发——制作简单的物品(三)

饥荒联机版Mod开发——制作简单的物品(三) 前言建立文件夹及mod图标把文件夹添加到VS Codemod代码的入口——modmain探寻官方代码看懂官方代码创建动画、贴图动画修改动画相关代码 物品栏贴图修改贴图相关代码 添加物品名字,检查对话传送门 前…

我的世界mod服务器详细搭建

我的世界服务器搭建以及mod安装 服务器准备(推荐使用Linux系统)阿里云服务器购买xshell、xftp连接服务器1.安装配置java环境,java82.安装虚拟终端screen3.获取mc服务器jar包4.首次启动mc服务器端5.同意最终用户许可协议 EULA6.根据需要修改se…

我的世界在自建的服务器中装mod,《我的世界》中国版服务器MOD添加教程

我的世界中国版怎么加MOD 中国版功能组件怎么安装 《我的世界中国版》加MOD方法详解 1、首先右键你的MC中国版启动器找到打开文件夹位置,(如果右键中没有打开文件夹位置的话可以点击属性-快捷方式-打开文件夹所在位置)。 2、点击进入MCLauncherDownloadGame你需要添…

我的世界javamod怎么装_我的世界MOD安装方法图文教程_我的世界MOD怎么安装_牛游戏网...

【导读】很多玩家不知道我的世界MOD怎么安装,怎么用,今天小编就为你讲解一下我的世界MOD怎么用?一起来了解一下吧! 第一部分-安装JAVA7 下载完成后,打开: 安装(别更改目标文件夹) 安装完成 第二部分-选择游…

我的世界制作服务器rj,我的世界星系mod常用工具制作方法

我的世界星系mod中有许多有用的工具,下面小编为大家带来各种工具的详细介绍。 一、常用工具 全星系mod中**的装备系列,耐久度与戴斯系列装备相同 合成:致密钛板木棒 星系mod中装备等级第二高的系列 合成:致密戴斯板戴斯棒 戴斯稿子…

我的世界1.13 mod制作——Item材质及翻译(四)

1.13 游戏改了好多内容,就拿item来说,没有那么多花里胡哨冗余的代码了。 单单是给item上材质,研究老长时间,看了官方的教程,非官方的教程(国内的教程,国外的墙的太厉害,英语底子差也…

我的世界自制mod{0}

目录 路径如上 games/com.mojang/rescource_packs 创建一个叫做manifest.json的文件 里面创建叫做functions sounds shaders textures等等的一些名称 打开我的世界 面相国际基岩版 网易版不知道可不可以 我用的是手机编写的mod 其实就是懒 我认为手机写更加简便 用的是m…

【MineCraft】-- Mod制作物品与方块

基于上一文章继续, 下面完成以下功能:制作一个方块和物品,物品有描述信息。 快速指南 (第一次看请跳过这步) 如何制作物品与方块 1、/resources/assets/xxx/lang/... 添加物品或方块id 例: item.dem…

我的世界自制mod{1}

上期我们制作了一个什么也没有的mod上期说错了文件夹里没有functions文件 做一个包的图标 首先打开sounds for idol{你们自己包的名字的文件夹就是放manifest.json的文件夹} 然后像我这样在mt管理器找到一张图片 图片途径一般是DCIM/screenshots里面的 然后把他转移到刚刚说…

【MineCraft】-- 学习Mod制作合成配方

下面完成合成配方的制作; 合成分为有序合成和无序合成; 无序合成:无摆放位置要求 有序合成:需要正确的摆放位置 一、在recipes下放置json json名字建议与产物相关,但非必须。 首先找到recipes文件 recipes文件下建…

我的世界mod服务器怎么制作,我的世界国服MOD添加教程 我的世界国服MOD添加方法...

关于MOD: 首先我们要找到游戏的安装文件夹。 路径为: MCLDDownload---Game---你的账号---NetGame---你所要添加mod的服务器---.minecraft---mods(就是这个文件夹)将你需要安装的mod复制到mods文件夹即可。 如果找不到位置,也可以先进入游戏&a…

我的世界1.13 mod制作——简单的方块(五)

(一) 注册一个方块 新建一个类,继承Block(本来可以不用新建,可以直接实例化一个Block,为方便管理还是新建一个) package com.qiao.mymod.block;import net.minecraft.block.Block;public class MyBlock extends Block {public MyBlock(Prop…

java我的世界mod制作_我的世界:MOD的编写有多复杂,估计你也学不会

原标题:我的世界:MOD的编写有多复杂,估计你也学不会 MOD应该有不少人使用,但是你们知道MOD的去做有多困难吗?你们知道该怎么做吗?如何才能做一个简单的游戏模组呢?其实制作模组是非常简单的&…