你知道 Docker 吗?#1 Docker 的基础

首先

Dockerって知ってますか?僕はあまり知りません。

でも、会社のチーム内でみんなが使うコンテナ基盤を構築する事になりました。
いや、本当は一年前に引き受けて寝かしてました。すみません。

于是,我决定匆忙重新学习Docker。

“学习重新”或者以一副自以为是的口吻大言不惭,但其实我之前只是稍微读过一些书,然后试着去实践了一下,对于这种情况只是有了一点点了解而已,所以不过是个小菜鸟。

让我们能够自如地摆出一副装作知道的样子。

环境

    • MacBook Pro

 

    • Catalina

 

    Docker for Mac

Docker是什么?

Docker是一个用Go语言编写的软件,可以轻松构建容器化虚拟环境。

集装箱是什么?

通过基于Docker镜像启动容器,可以构建各种应用程序的执行环境。容器是一种技术,可以在MacOS、Linux等主机操作系统上创建一个隔离的执行空间供进程使用。

Docker镜像是什么?

Docker容器是创建的基础。
Docker镜像是包含应用程序、库、配置文件等的集合。

嗯。那么,Docker是什么?

在我的笨重的企业服务器和我手边的MacBook上,可以轻松地创建喜欢的环境。

比如说,PHP程序员的个人电脑上安装了任意版本的PHP。
通过将这样的个别环境以镜像的形式整合到专用服务器上,就能很方便地共享这些环境。

在那个专用服务器上,Docker公司还准备了一个叫做Docker Hub的东西。

Dockerを使うユーザは、そのイメージをダウンロードして、コンテナとして利用することが出来ます。
つまり、PCに直接PHPをインストールする必要がないので、PCはDockerさえあればもう無敵です。

RubyとかPythonとか他の言語の実行環境はもちろん、ApacheやNginxといったWebサーバも構築できます。
コンテナは作るのも消すのもコマンド1つでとてもかんたんです。

此外,您可以自定义下载的Docker镜像并上传。所以,您不仅可以迅速在自己的电脑中重新复制与您感兴趣的人或让您生气的人相同的环境,还可以使用Docker Machine快速在GCP、AWS或さくら云上构建容器。

高再现性意味着在验证环境中运行的应用程序在生产环境中不容易出现无法运行的问题!

虚拟化类型(主机型、超级管理器型、容器型)

主机型

只需在主机操作系统上安装虚拟化软件,即可实现硬件的仿真并构建虚拟服务器。虽然易于搭建,但需要主机操作系统处理才能使虚拟服务器运行,导致虚拟化的开销较大。

主机虚拟化的代表性软件包括Oracle的VirtualBox等。

超级虚拟机型

不同于主机操作系统,我们使用了一种称为超级监控器的专用虚拟化操作系统,用于运行虚拟机操作系统。
由于超级监控器直接控制硬件,因此与在主机操作系统上运行的主机型虚拟化相比,它的开销更低,是服务器虚拟化的主流方式。
与其他虚拟化软件相比,它具有更高的虚拟机隔离级别,同时也具有更高的操作系统选择自由度。

实现基于虚拟化的典型软件包括VMware ESXi、MS的Hyper-V和Citrix的XenServer。

容器式

在容器中,没有客户机操作系统,而是共享使用主机操作系统的内核。
共享内核意味着在Windows上无法直接运行Linux容器。
这意味着在Windows操作系统中只能运行Windows容器。

Docker提供了CentOS和Ubuntu等操作系统的映像,但并不是完整的操作系统在运行。
它仅由最基本所需的库和二进制文件组成。

除了Docker之外,还有代表性的Linux容器(LXC)。

为什么可以在Windows和Mac上运行Linux?

    • Docker Desktop(Docker for Mac or Windows)

 

    Docker Tool Box

通过安装上述软件,可以利用预先装备在每个操作系统中的虚拟化软件来启动Linux操作系统,并在其上启动和运行Linux容器。

在虚拟化软件上运行的Linux是一种轻量级的操作系统,被称为Tiny Core Linux。

虚拟化软件在Mac的情况下使用Hypervisor Kit,在Windows的情况下使用Hyper-V。
如果使用Docker工具箱,则会使用VirtualBox作为虚拟化软件。

安装Docker for Mac

我们先安装Docker。
只需要按照安装向导的指示一路点击下一步就可以了。

image.png

Docker的初始设置

安装完成后立即启动应用程序,并确认Docker的设置界面。
基本上没有什么需要调整的地方,但我会选择一些进行解释。

点击齿轮图标进行设置。

将以下内容用中文进行翻译:
将军

在启动主机操作系统(本例为MacOS)时可以配置Docker的自动启动和自动更新等设置。
由于Docker的特性,它会占用相当一部分内存资源。因此,在不使用时,应点击鲸鱼图标并选择退出。

而且,如果你是那种只在必要时才想启动的人,可以取消下面的复选框。

当你登录时启动Docker桌面版。

image.png

资源

高级的

你可以控制Docker分配的硬件资源,如内存和存储。

文件共享

使用绑定挂载功能。

以下是允许与 Docker 共享 PC 文件夹的设置。
默认情况下,显示的文件夹已被允许共享。

代理人

这是需要进行设置的地方,当电脑没有直接连接到互联网时。

网络

以下是将容器连接到网络所需的设置,但是默认设置通常没有问题。我认为只需要掌握这些就足够了,让我们继续下一步。

image.png

让我们启动容器试试看

暂时还是先试着启动一下吧。
我们来执行下面的命令看看。

docker run hello-world   
例)
% docker run hello-world 
Unable to find image 'hello-world:latest' locally   ←ローカルにハローワールドってイメージなかったよ
latest: Pulling from library/hello-world   ←latestってタグが付いたイメージをpullするよ
b8dfde127a29: Pull complete    ←このイメージIDのやつをpullしたったぜ
Digest: sha256:89b〜   ←ハッシュ値だよ
Status: Downloaded newer image for hello-world:latest   ←hello-world:latestをダウンロードしているよ

Hello from Docker!   ←DockerからのHello!!
This message shows that your installation appears to be working correctly.   ←このメッセージは正常にインストール出来てる事を表してるよ!やったね!

To generate this message, Docker took the following steps:   ←こんな流れで実行されたんだよ!
 1. The Docker client contacted the Docker daemon.   ←DockerクライアントはDockerデーモンに接続したよ!
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.   ←DockerデーモンはDockerHubからハローワールドイメージを引っ張ってきたよ!
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.   ←Dockerデーモンはイメージから新しいコンテナを作成したよ!(略
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.   ←Dockerデーモンは君の端末に結果を出力したよ!

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

我想你應該會看到很長的英文字母,感到很害怕吧。

這個有編號的列表提供了關於所發生的事件的說明。請看一下文中的隨機解釋。關於圖像ID和標籤,我們將在後面提到。

Docker run 命令是什么?

使用docker run命令等同于执行以下命令。

docker pull →DockerイメージをDockerHubから引っ張ってくるコマンド
docker create →Dockerイメージからコンテナを作るコマンド
docker start →作成したコンテナを起動するコマンド

通过分析docker run命令的结果,来理解容器启动的流程。

如果未明确指定,docker start命令将同时启动容器并执行映像创建者设置的命令。
本次启动的容器仅输出上述结果。
通过这个执行结果,我们可以理解从获取映像到启动容器的流程。

在PC上运行着一个名为Docker守护程序的进程,可以通过Docker客户端进行操作。
通过执行结果中的杂注可以理解,首先Docker会检查本地是否存在相同的镜像。
如果找不到,则会通过互联网从DockerHub下载镜像(docker pull)。

如果在本地上存在镜像,则可以启动容器而无需下载镜像。
我认为,如果再次执行以下命令,可以确认结果显示比先前更快。

docker run hello-world

判定是否有图像将根据是否存在相同的图像ID来进行。图像ID是分配给Docker图像的唯一标识符,并可以通过docker images命令进行确认。

此外,Docker映像具有标签功能。
标签用于版本控制等目的,并且如果未指定,将选择带有latest标签的映像。

% docker images
REPOSITORY        TAG       IMAGE ID       CREATED       SIZE
nginx             latest    35c43ace9216   3 weeks ago   133MB
docker/whalesay   latest    6b362a9f73eb   5 years ago   247MB

复制Docker镜像并为其添加自定义标签。

只需按照下述方式指定,即可复制任意图像并进行任意标记。

docker tag ローカルにあるイメージ名 複製後のイメージ名:タグ名

我会实际执行一下。

% docker tag hello-world new-hello-world:original

我们可以通过docker images来查看结果。
可以看到有两个不同的镜像名称,但是有相同的镜像ID和不同的标签名。

% docker images                                  
REPOSITORY        TAG        IMAGE ID       CREATED         SIZE
hello-world       latest     d1165f221234   14 hours ago    13.3kB
new-hello-world   original   d1165f221234   14 hours ago    13.3kB

展示Docker镜像的详细信息

在容器启动时,会显示执行的命令以及镜像的操作系统信息。

docker inspect イメージ名(イメージIDでも可)
例)
% docker inspect hello-world

删除Docker镜像

请用以下命令删除不再需要的图像。

docker rmi イメージ名

使用该镜像创建的容器无法删除。
如果遇到这种情况,可以选择删除容器或者加上”-f”参数进行强制删除。

例)
docker rmi -f hello-world