【Docker】基于Docker的实用基础知识

在这里,我们总结了使用Docker时需要了解的基本知识。

Docker镜像

Docker镜像就像是一个包含了执行环境和源代码的文件系统软件。容器则是运行这个镜像的进程。

比如说,有一段使用 node 和 JavaScript 编写的代码与图像相关,当建立容器时,该 JavaScript 程序会被执行。

可以通过在计算机上安装和启动软件,从容器注册表中拉取Docker镜像并在自己的计算机(或Docker环境)上启动它。

数据持久化

我正在使用以下的教程作为参考。
(因为要点总结得很简洁,如果想要了解Docker的话,我认为可以试着做一下这个教程。)

 

为了持久化数据,需使用卷。

通过创建一个卷,并将其附加(也称为“挂载”)到存储数据的目录中,可以持久化数据。

请将有名称的卷看作是简单的数据存储桶。为了维护Docker在磁盘上的物理位置,只需要记住卷的名称。

docker volume create todo-db
#「todo-db」というボリュームをホスト上(Docker上)に作る

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
#作成したボリュームとコンテナ内の/etc/todosをマウントして繋げる
#これでコンテナを削除してもデータを永続化できる

很多人经常问:“当我使用命名卷时,Docker实际上将我的数据存储在哪里?”如果你想知道,你可以使用docker volume inspect命令。

要确认Docker实际上将数据保存在哪里,可以使用docker volume inspect命令进行确认。

docker volume inspect todo-db

[
    {
        "CreatedAt": "2019-09-26T02:18:36Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

Mountpoint是实际存储位置。

将源代码挂载

如果在应用程序中进行工作,可以使用绑定挂载将源代码挂载到容器中,这样容器就可以检测并响应代码的更改,以便能够立即确认更改。

绑定挂载和命名卷是Docker引擎中附带的两种主要卷类型。但是,为了支持其他用例(如SFTP、Ceph、NetApp、S3等),可以使用额外的卷驱动。

docker run -dp 3000:3000 -w /app -v "$(pwd):/app" 

# -vでマウントを設定できる。
# カレントディレクトリをコンテナ内の/appにマウントしている。

网络化

我们如何让容器彼此通信? ?)

答案是建立网络联系。现在,你不必成为一名网络工程师(太棒了!)。只需记住这个规则…

如果两个容器在同一个网络上,它们可以互相通信。如果它们不在同一个网络上,它们就无法互相通信。

如果想要在容器之间进行通信,需要设置网络。

只需要记住以下规则:如果两个容器位于相同的网络上,则它们可以相互通信。否则,无法通信。

# 「todo-app」というネットワークを作成
docker network create todo-app


# MySQLを「todo-app」ネットワークに所属させて起動
# 「mysql」というネットワークエイリアスをつけている。
# -v todo-mysql-data:/var/lib/mysqlで自動的に「todo-mysql-data」ボリュームを作成してマウントしてくれる。最初にマウントを作成してからrunコマンドを打つ必要はなかったらしい。

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:8.0

既经确认MySQL正在运行,我们可以尝试使用它。但问题是…如何使用呢?如果在同一网络上运行着另一个容器,我们该如何找到它(请注意每个容器都有自己独立的IP地址)?

在这种情况下,通过使用名为“mysql”的网络别名,它似乎可以为我们进行名称解析。(无需指定IP地址,只需在连接时指定主机名为“mysql”即可。)

# Nodeアプリケーションを「todo-app」ネットワークに所属させて起動
# 同じネットワーク上にあるので互いに通信できる

docker run -dp 3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:18-alpine \
  sh -c "yarn install && yarn run dev"

Docker compose – Docker合成

但是,很有可能你开始感到一切对于启动这个应用程序而言都有些不知所措。我们需要创建一个网络,启动容器,指定所有环境变量,暴露端口等等!要记住这么多事情,对于传给别人来说无疑使情况变得更加困难。

因此,我们将使用Docker Compose。

使用Compose的最大优势是你可以在一个文件中定义应用程序堆栈,将其保留在项目仓库的根目录中(现在已受版本控制),并且可以轻松地让其他人为你的项目做出贡献。

docker-compose的优点是可以用一个命令启动多个容器。此外,通过共享docker-compose.yml文件,可以轻松共享多个容器环境。

services:
  # サービスの名前を自由につけることができる。この名前は自動的にネットワークエイリアスになる。
  service_name:
    # dockerhubで確認して指定する
    image: node:18-alpine
    ports:
      - 5000:5000
    command: sh -c "yarn install && yarn run dev"
    # コンテナ内のワーキングディレクトリ(以下の場合、自動でappというディレクトリを作り、これがカレントディレクトリになる)
    working_dir: /app
    #このファイルが置かれているディレクトリとコンテナ内の/appをマウント
    volumes:
      - ./:/app
    # 環境変数の設定
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: password
      MYSQL_DB: app_name
  mysql:
    image: mysql:8.0
    # ホスト(Docker)内のapp_name_dataとコンテナ内の/var/lib/mysqlをマウント
    volumes:
      - app_name_data:/var/lib/mysql
    # MySQLの環境変数を設定する
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: app_name

# ホスト(Docker)内に「app_name_data」というボリュームを作る
# ボリュームはホストの/var/lib/docker/volumes以下に作られる
volumes:
  app_name_data:

使用docker-compose创建容器时,默认会创建一个网络(名为[docker-compose.yml]所在目录名_default的网络)。如果想要实现多个由不同docker-compose创建的容器之间的通信,可以在其中一个docker-compose.yml文件中有意地创建一个网络,然后在另一个docker-compose.yml文件中指定该网络。

 

当容器启动时

docker-compose up -d

当要删除容器时

docker-compose down

# ボリュームも削除したい場合は --volumes をつける

简而言之,Docker Compose是一个可以通过一个命令同时启动多个容器,并进行网络、环境变量、端口等设置的工具。

以上就是。

bannerAds