完全理解了Docker的基本原理
首先
最近我开始学习Docker,现在完全成为了Docker的粉丝。
我希望能够向那些对“Docker是什么?”、“想在VPS上创建应用服务器和数据库服务器并连接起来,但觉得门槛太高”的人传达Docker的大致内容和魅力。
这篇文章是在看到工程师社区「Easy Easy」的「完全理解的Talk Advent Calendar 2021」参与呼吁后写的。这是我第一次在Qiita上发表投稿。
我对Docker的惊叹之处
这些都是 Docker 的基本功能。
- 在机器中,可以运行多个拥有不同操作系统和独立文件系统的虚拟机。可以通过网络连接这些机器。可以通过卷的机制对数据进行持久化。在Docker Hub网站上,有各种预装有操作系统和软件的机器可供分发。
这些功能使用了Linux的功能来实现。(包括内核的容器功能、命名空间以及chgroups命令,用于更改文件的所有者和组)
简单来说,虚拟机是一种相当抽象的概念。
-
- プロセスに、そのプロセス専用のファイルシステムをくっつけたもの
- ホストマシンのリソース(ネットワークやストレージ)をそのプロセスに適宜くっつけられる
这是我的想法。
对于那些原本就存在于Linux中的功能,
我对那些开发者们也向他们真心致敬,
他们考虑到“让用户能够方便地通过命令来创建和操作虚拟机”。
这个想法真是太棒了,技术力也是非常厉害!
不享受这个好处真是太可惜了!
1. 可以在主机(自己的电脑可以)上同时运行多个虚拟机。
首先,让我们对Docker的术语进行总结。
-
- コンテナ:実行可能なインスタンス。コンテナの内部で動いているソフトウェアから、ホストマシンを守ってくれる。
-
- イメージ:コンテナを作るためのテンプレート(ファイルやコンテナ作成指示の集まり)。イメージは読み出し専用。
- Dockerfile:イメージを作るためのスクリプト。テキストベース。
“Host machine” refers to the machine running Docker. It was quite unclear whether this refers to the functionality of the operating system or something else.
「ホストマシン」とは、Dockerを実行しているマシンを指します。これが具体的にはOSの機能なのか他の何かを指しているのか、なかなか分かりませんでした。
我会提供一些示例代码。
# wordpress:5.0.0-php7.2-apache というイメージからコンテナを作成
# (↑ローカルにこのイメージがなければ、Dockerが自動的にダウンロードしてくれる)
# コンテナに wp_test という名前をつける
# デタッチモードで起動する(バックグラウンドで動作)
$ docker run -d --name wp_test \
wordpress:5.0.0-php7.2-apache
# Dockerfileの例
# Ubuntuにgitをインストールして、コンテナ起動時にgitを起動する
# LABELにメタ情報をkey=valueの形式で記載
FROM ubuntu:latest
LABEL maintainer="chicken_nanban@qiiita.com"
RUN apt-get update && apt-get install -y git
ENTRYPOINT ["git"]
2. 网络
将容器连接到网络后,容器之间可以进行通信。
如果想要运行使用数据库的应用程序,需要将安装了数据库的容器与安装了应用程序的容器通过网络连接起来。
通常情况下,每个容器只分配一个角色(参考官方文档《入门-多容器应用程序》)。
安装Docker后,将自动创建三种类型的网络:bridge、host和none。
-
- bridge:デフォルトのネットワーク。コンテナ同士は独立した状態で、それらをネットワークでつなぎコンテナ間コミュニケーションができるようにする。
-
- bridgeよりも、user-defined bridgeを使うのがおすすめとのこと(Dockerドキュメント日本語化プロジェクト Dockerコンテナ・ネットワークの理解より)
-
- host:コンテナとホストの分離をなくすらしいです。
- none:ネットワークを無効にする時に使用
# todo-appという名前のネットワークを作成
$ docker network create todo-app
# ネットワークtodo-appにmysqlという別名(alias)をつける
# mysql:5.7というイメージからコンテナを作る
# できたコンテナをネットワークtodo-appにつなぐ
# -vオプションは次の項で説明します
# -eオプションはコンテナの環境変数の設定
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
除了这三种网络配置之外,还可以使用第三方驱动程序进行设置。
3. 可以通过卷光写入机制来实现数据的持久化。
你可以将数据保存在主机上的目录中。即使退出Docker容器,下次启动容器时,仍然可以使用保存的数据。
-
- bind mount
-
- データの保存場所のパスを指定できます。
-
- named volume
-
- どこに保存するかDockerに任せます。volumeに名前をつけて、次回からその名前でvolumeを参照できます。Dockerがどこに保存したかは、「Docker inspect コンテナ名」で調べることができます。
-
- tmpfs mount
-
- ホストのハードディスクに保管する必要のないデータが、アプリ動作中に発生する場合に作成します。
-
- まだ曖昧な理解なのですが、、named volumeとbind mountのいずれも行わない状態で、アプリがデータ保存を行うと、コンテナのファイルシステムにデータが保管されるっぽいです。
-
- ↑
- 「コンテナのサイズが大きくなってしまうので、コンテナサイズをコンパクトに保つためにtmpfs mountを使おう」という意味のことが、公式か参考文献「Docker in Action」に書かれていた記憶があります。
顺便提一下,即使使用rm命令删除容器文件系统中的文件,这些文件本身仍然存在于容器中,并且删除的数据将被添加到新的层中。因此,执行文件删除操作会导致容器的大小变大。
# 前掲のサンプルコマンドを再掲
# -vオプションでボリュームを指定
# -v ホスト側の場所(この場合はnamed volume):コンテナ側のパス
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:5.7
如果按上述方式指定,Docker会自动帮您创建named volume,无需使用”docker volume create”命令(引用自官方文档Get started – Multi container apps)。
## tmpfs 使用例
## 空っぽのtmpfsボリュームを作成して、コンテナの/tmpにアタッチ
## --mount でファイルシステムをコンテナにマウント
## alpineというイメージの最新版からコンテナを作る
## (alpineとは、Linux以外にほとんど何も入ってないシンプルなコンテナイメージ)
## -v オプションはbind mount
$docker run \
--mount type=tmpfs,dst=/tmp \
--entrypoint mount \
alpine:latest -v
在Docker Hub上,有各种各样的机器(镜像)可供分发。
Docker Hub是一个存储Docker镜像的仓库,个人开发者、开源项目和软件供应商都可以在这里获取分发的镜像。
我对数据库很感兴趣,但是即使我觉得有些东西似乎很有趣,由于环境设置的问题,我一直没能到达实际使用的阶段。
如果使用在Docker Hub上分发的官方镜像,可以立即尝试访问各种数据库!Docker太棒了(*T_T*)
顺便说一下,我将从我目前感兴趣的数据库中介绍两个。
-
- グラフデータベース Neo4j :グラフデータベースは関係性を表すのに向いているDBです。
-
- RDBの表形式のようなデータ構造ではなく、ノード(節:例えば人物)とエッジ(線:例えば友人)からデータが構成されます。Neo4jは一番人気があるグラフデータベースです。
-
- NoSQLデータベース Cassandra :CassandraはSQLが使えるNoSQLデータベースです。
-
- データはkeyとvalueの組み合わせで構成されシンプルな構造になっています。
-
- それなのにSQLでデータ問い合わせができます!
- 大規模データに使われる分散型のDBで、自作アプリに使う場面はまずなさそうなんですけどね…
我希望未来能轻松愉快地享受Docker和数据库的生活(^^)
您是否對Docker有了一些了解和好感?
如果能對您開始使用Docker起到推動作用,那將非常幸運!
请注意:有关安全的事项。
Docker可以在与宿主机隔离的沙盒环境中运行软件,并保护宿主机的环境,但从安全角度来看,并不一定安全。
之所以如此,是因为容器中包含具有对计算机资源具有完全访问权限的应用程序。因此,随意执行下载的容器是不合适的。
这来自于在线书籍《Docker实战》的引用。
最重要的事情要记住的是,有时候容器并不适用。容器对于需要以完全访问机器的权限运行的程序的安全性并没有太大帮助。
(中略)
记住,你不应该使用来自不受信任来源的软件。尤其是如果该软件需要管理员权限的话尤为如此。这意味着在共同运行环境中盲目运行客户提供的容器是个坏主意。
大意:需要记住的最重要的一点是,有时候容器并不合适。就容器在以完全访问权限运行的程序的安全性而言,并不能提供帮助。
(省略)
请记住,不能使用来自不可信来源的软件。特别是当软件要求管理员权限时,这一点尤为重要。换句话说,盲目地在共享场所运行所提供的容器是一个不好的想法。
填补不足
-
- 利用料
- Personalアカウントは無料です。Proアカウントは$5/monthですが、Personalアカウントで十分使いでがあります。
推荐教程和在线书籍
-
- 公式サイト が大変分かりやすいです。特に Get started は素晴らしいです!
-
- 日本語の翻訳サイトは有志の方々が作られた Dockerドキュメント日本語化プロジェクト があります。
-
- 『Docker in Action』Manning Publication(←オンラインの出版社)
- コンテナがどういうしくみで動いているのかから説明されているので、楽しく腹落ちしてDockerが使えるようになると思います。公式を読んでからこの本を読むほうが分かりやすいと思います。難しいところがちょこちょこあるので、とばしながら読んでいます。Manning Publicationは時々45% Off Saleをしているので、待てるようならSaleを待つとお得に買えます。