Docker的基本概念
为什么要使用Docker?
有了Docker,可以更轻松地进行环境构建,例如安装软件包、库、开发环境和运行环境等。
将诸如Python之类的内容安装在主机上时,卸载它们可能会非常困难,也可能会与其他软件包等产生冲突。
通过在容器而不是主机上进行环境设置,可以在不影响主机的情况下构建,如果出现错误,只需丢弃容器即可。
只要在Dockerfile中编写好环境的构建方法,就可以多次创建或删除这个环境。
此外,只要将Dockerfile或镜像交给其他人,他们就能够构建完全相同的环境。
在与主机完全无关的地方,进行环境搭建,以避免遇到与该人相关的错误。
无需 Docker
1. 下载安装程序
2. 打开安装程序
3. 出现错误
4. 故障排除
2. 打开安装程序…
在一次故障排除中很少能够顺利解决。
有Docker
1. 启动容器
这就结束了。
Docker的特点
容器的独立性 ɡqì de ɡ)
在创建两个容器的前提下,即使这两个容器来自同一个docker image,它们的文件系统依然是相互独立的。
在一个容器内进行操作不会对其他容器或主机产生任何影响。
学习Docker所需的预备知识
外壳
Bash、Zsh、Sh…急萌、仔斯海…
用于运行Shell的应用程序是终端。
Shell是连接到内核的工具。
环境变量
在操作系统上运行的进程使用变量来共享信息。
※进程
(终端、Chrome浏览器……)
查看Shell的环境变量
“执行命令 ‘echo $SHELL’,$ 是类似环境变量的标记”
创建环境变量
命令:”导出年龄=20″。
基本术语
Dockerfile的意思是:(Dockerfile)
・Docker镜像的设计蓝图
・文本文件
详细介绍了如何创建Docker镜像。
通过描述容器类型和最终Docker镜像的内容,使其易于理解。
Docker 镜像
在创建容器时,有一个用于管理版本的功能,该功能称为标签。
「Docker镜像」由多个「镜像层」组成。
当创建Docker容器时,会向「Docker镜像」添加新的「镜像层」。
容器
「开发环境、执行环境等的组合」
可以在个人电脑或服务器上放置多个容器。
在容器中预先安装开发环境、运行环境以及所需的软件包和库。
然后,可以在容器中进行工作,或使用容器运行脚本或者代码。
如果创建一个容器,可以在其他成员、开发环境、测试环境和生产环境中使用。
容器是由”Docker镜像”创建的。
从容器中也可以创建”Docker镜像”。
“Docker镜像”是由名为”Docker文件”的文本文件创建的。
Docker Hub (中文:Docker 仓库)
有一个Docker注册表,
包含多个储存库(容器),每个储存库管理一种Docker镜像。
(其中包含多个标签不同的Docker镜像)
Docker注册表
存放Docker镜像的地方
命令
登录到Docker
能够访问Docker Hub。
拉取[Docker镜像]
从Docker Hub将镜像拉回本地(宿主机,我的电脑)。
使用Docker运行 -it [image] bash
使用 Docker 镜像创建容器。
在Docker中创建一个容器,使用”ubuntu”镜像,并进入容器的bash环境。
※ bash….在容器启动时执行的程序
“it” 是什么?
-i と -t の二つのオプションが連なっている。
我
inputのチャネルを開くオプション。
inputのチャネルとは、stdinというチャネル
stdinというチャネルを開くとキーボードから打った内容がlinuxに届いたりする。
ホストからコンテナのstdinのチャネルを開くというチャネル。
「-i」を省いてdocker run(bashを起動)すると、コンテナに打ったコマンドの情報が伝わらない。
这只需要一个选项
将输出结果调整得漂亮一点。
用于显示漂亮的输出结果的命令。
docker run hello-world
「hello-world」 というイメージからコンテナにする
退出
コンテナから抜ける
列出所有的docker容器(包括已停止的)
确认容器的状态
※ps…进程状态
docker镜像
显示存储在主机中的映像列表
重新启动 docker。
将容器置于上升状态
使用Docker命令在容器中运行终端:docker exec -it [container] bash。
对于容器来说,执行指定的程序(bash)。
将容器 [container] 提交为镜像 [image]。
将容器转换为镜像
(创建一个新的镜像)
docker tag [source] [target]
给图片换上一个新的标签。
保留原有的图片,只给新图片起一个新名字。
【目标】…更新后的图像名称
※docker imageの名前とリポジトリの名前は一致していなければいけない
上传 [image] 至 Docker
将其推送到Docker Hub。
删除Docker镜像[image]
删除图像
创建一个Docker实例
制造集装箱
启动Docker
运行容器
※跑步 = 创造 + 开始
运行一个[docker镜像]并执行[命令]。
在docker运行命令之后,如果添加额外的命令,那么默认命令将被覆盖,并且将执行这个[command]。
删除 Docker 容器
如果容器正在运行,则无法删除。(请使用docker stop将其停止)
清除 Docker 系统垃圾
删除所有已退出的容器。
可以删除未使用的悬空镜像(尚未使用的镜像)和缓存。
用 Docker 运行 –name [容器名称] [镜像]
指定容器名称
可以为容器指定名称并启动。
当希望在后台运行容器或者使用共享服务器让多人创建容器的时候,会需要一个名称。
当需要从其他程序访问容器或者使用容器时,通过指定名称可以方便地进行调用。
运行Docker容器,并以后台模式启动指定的镜像。
在后台持续运行容器的情况下使用”-d”。
在开发环境等需要始终启动容器的情况下,需要使用”-d”命令将其设置为detached模式。
“-d”表示detached模式。
分离模式
启动容器后立即分离并返回主机,容器在后台运行着。
分离模式 ⇆ 前台模式
前景模式
不在容器上附加”-d”进行启动
直接进入容器,或者先创建容器并启动某个程序,然后立即删除容器的情况
docker run –rm [image]
コンテナからexitするとすぐにそのコンテナを削除する。
用docker命令构建。
通常情况下,我们会先从Dockerfile所在的文件夹移动到当前目录,然后指定当前目录来构建Docker镜像。
使用Docker构建 -t [名称] [目录]
可以使用 -t 选项给 Docker 镜像命名。
Dockerfile的简介
・Docker镜像的设计蓝图
・文本文件
这里描述了如何创建Docker镜像。
由于列出了要使用的容器和最终成为的Docker镜像,所以很容易理解。
在构建环境时,首先进入容器内部构建环境,并了解所需的包等。
然后,在Dockerfile中编写并进行docker构建。
这样的流程被采用。
⭐️将Docker镜像的层数最小化。
– 创建Docker层的指令包括RUN、COPY和ADD三个。
写 Dockerfile 的方法
INSTRUCTION arguments
用中文以`的形式写`。参数…引数。
请问,这个餐馆有没有素食选项?
FROM ubuntu:latest
RUN touch test
请给我一个苹果。
– 请给我一个苹果。
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
curl\
cvs\
nginx
CMD ["/bin/bash"]
Docker 指令
从[图片]中
选择基础Docker镜像(如例子中的ubuntu作为基础)。
最好指定一个具备最基本功能的镜像。
通常情况下会在Docker Hub上找到这些镜像。
经常会使用原封不动的操作系统如Ubuntu的Docker镜像。
运行[命令]
为了执行Linux命令,使用Docker指令。
执行必要的Linux命令来构建图像。
执行命令(创建图像层)。
基本上使用RUN的Docker指令来创建Docker图像。
基本的写作方法是参考上述示例,记住会很有好处。
在Ubuntu中,apt-get(或apt)命令用于管理软件包。
通常,常常在安装前更新软件包列表。
apt-get update ・・・ パッケージのリストを最新にして取得
apt-get install [package] ・・・ [package]をインストール
在安装软件包时,用“是”回答。
将所需的软件包按照字母顺序排列。
「\」…被视为换行的内容也视为一行。
为了创建Docker的图像层,我们使用RUN命令。当使用多个RUN命令时,就会创建相应数量的Docker图像层,并且Docker图像会变得很大。
为了避免这个问题,我们可以使用命令“&&”来连接多个命令,并尽量减少使用RUN命令的行数。
CMD[“执行文件”, “参数1”, “参数2”]
Docker imageのデフォルトのコマンドを指定できる。
executable ・・・ 実行可能なコマンド
一般情况下,Dockerfile 最后通常以 CMD 结束。
没有也可以,但最好还是有。
因为当看到Dockerfile时,人们能够明白默认情况下会执行这个命令。
※エントリポイントという別のDocker instructionを使う場合は、CMDの形と意味が変わる。
COPY [src][destination]
build時に、build contextの中にあるファイルをdocker imageに組み込める。
→ホストから何かファイルやフォルダをコンテナに渡せる。
src ・・・ ホストのファイルのpath
destination ・・・ コンテナ内で目的のファイルをおくファイルのpath
「COPY」と「ADD」は似ているが、基本的には「COPY」で問題ない。
添加[src][destination]
在构建时,可以将build context中的文件添加到docker镜像中。
→ 可以将主机上的任何文件或文件夹传递给容器。
当构建docker镜像时,它将接收压缩的tar文件,解压缩并添加到docker镜像中。
在”COPY”指令中,可以选择将整个文件夹转换为Docker镜像,但在将信息传递给Docker守护程序时会花费一些时间。
因此,当存在大型文件时,建议先使用tar文件进行压缩,然后通过”ADD”指令将其发送到Docker镜像中。
入口点
可以指定在运行docker时的默认命令。(与CMD相同)
在「ENTRYPOINT」中,无法在docker run时进行覆盖。
在「CMD」中,可以在docker run时进行覆盖。
如果Dockerfile中有「ENTRYPOINT」,那么CMD的写法会有所不同。
CMD的格式是指定”ENTRYPOINT”命令的参数。
如果没有ENTRYPOINT的情况下的CMD
CMD[“ls”, “–help”, “参数”, “参数”, ・・・]
只需一个选项,在中文中解释如下:
・ 如果有ENTRYPOINT,CMD该怎么写?
ENTRYPOINT[“ls”]
CMD[“–help”, “参数”, “参数”, …]
※可以通过使用 docker run [image] -la 等方式覆盖参数(选项)
环境 [key] [value]
可以在Dockerfile中指定环境变量。
经常在设置路径时使用。
環境变量… 用于操作系统上运行的所有进程共享信息的变量,由键和值组合而成。
环境变量[key]=[value]
在此工作目录下 [绝对路径]
可以更改Dockerfile中所述的docker指令执行的目录。
在Dockerfile中,每个instruction的执行位置都是在根目录下。
在Dockerfile中使用RUN命令进行cd命令移动,下一个命令的执行仍然在根目录下。
然而,由于这样可能不方便,可以使用”WORKDIR”命令指定绝对路径,在指定的路径下执行之后的instruction。
docker build命令的详细信息
为什么在执行Docker build时要指定文件夹而不是Dockerfile?
当执行docker build命令时,将指定的文件夹传递给docker守护进程。
docker守护进程根据文件夹和Dockerfile创建docker镜像。
所以,不仅需要Dockerfile,还需要文件夹。
使用”build context”一词来指代构建文件夹。
使用此上下文,Docker守护程序根据Dockerfile创建Docker镜像。
环境和情境
Docker守护进程是什么?
・我负责管理Docker的对象(实际上,操作容器和Docker镜像)
・与Docker Compose等其他Docker工具进行通信。
Docker对象指的是容器、镜像、网络等。
通过docker CLI命令(如docker build和docker run等),向管理docker对象的docker守护进程发送指令。
在进行docker build时使用缓存。
如果已经存在Docker层,就无需重新构建。
在维护Docker文件的过程中,可以将RUN指令分成多个行。
如果添加了新的软件包,然后在保持RUN语句组合的情况下构建,将会创建一个新的镜像层。
这个房间太小了,我们需要一个大一些的。
FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y \ ←RUNを分ける
curl\
cvs\
git\ ←追加
nginx
CMD ["/bin/bash"]
※ apt-get的更新已经有了docker镜像层。
使用Docker构建容器 -f [Docker文件] [构建上下文]
如果在”build context”中没有Dockerfile,或者创建了其他的Dockerfile并将其分成开发和测试两个部分,那么可以使用”-f”选项来指定特定的Dockerfile进行docker build,并进行构建。
有时候,当开发环境和测试环境拥有不同的dockerfile时,可以使用”-f”参数来指定dockerfile来构建镜像。
在开发环境中,Dockerfile经常以Dockerfile.dev的形式命名,在测试环境中则以Dockerfile.test命名。
主机和容器之间的关系
文件系统共享
容器的文件系统是独立于主机文件系统的,但通过”-v”选项可以访问主机文件系统。
将主机文件系统挂载到容器中。
通过挂载文件系统,就像主机文件系统存在于容器文件系统中一样。
(实际上并不存在于容器内,将其放在容器中会变得很大。)
在开发环境中,代码通常放置在主机上,执行代码时使用容器的方式很常见。
通常情况下,在进行开发时,通常将代码脚本和数据放在主机上,而不放在容器中。
使用Docker运行命令:-v [主机/路径]:[容器/路径]
文件访问权限
使用者ID和群組ID来指定并运行容器。
如果容器可以访问主机文件系统,文件访问权限就会成为一个问题。
通过添加”-u”选项,可以指定用户ID和组ID来创建容器。
这样一来,主机用户的ID和组ID权限也会直接应用于容器。
当建立共享服务器时,是必需的。
docker run -u $(id -u):$(id -g)
(id -u):用户ID
(id -g):组ID
$:命令结果将被指定为”-u”
连接端口
将主机端口连接到容器端口
端口 – 用于进程进行数据通信的设备
IP地址和主机名就像建筑物的地址,端口就像房间号码。
当从外部访问主机的web服务器或web服务时,除了指定主机的名称或IP地址之外,还需要指定端口,以便访问主机的web服务器和web服务。
如果web服务器或web服务在容器上运行,可以通过连接(发布)主机端口和容器端口来从外部访问容器的端口。
使用Docker运行 -p [主机端口]:[容器端口]
使用Docker运行 -p 8888:8888
计算机资源的限制
如果主机中有多个容器,在一个容器中使用了全部的内存,那么整个系统有可能会崩溃。为了避免这种情况,可以为每个容器指定”CPU”和”内存”的上限。
建立共享服务器或进行数据分析时是必需的。
运行指令:docker run –cpus [#ofCPUs] –memory [byte]
设置容器可以访问的最大CPU上限为[#ofCPUs]。
设置容器可以访问的最大内存上限为[byte]。
显示容器的详细信息
显示了Docker容器的信息列表。
查询Docker容器信息并筛选出包含”[something]”的结果。
docker inspect显示的内容很多,不能立即访问所需的信息。
使用grep -i [something]只显示与指定字符串相关的docker inspect信息,例如「CPU」、「内存」、「环境变量(env)」等。
忽略大小写
最后
这篇文章是根据Kame San( https://twitter.com/usdatascientist?s=21 )在Udemy上的Docker课程( https://www.udemy.com/share/103aTRAEMfeVhaTXoB/ )而创建的。
由于这仅作为我个人的记录而发布,因此可能包含与讲座不同的部分。
神奇先生的博客(https://datawokagaku.com/docker_lecture/)。