Docker是什么?Docker和Docker Compose的教程~一直到VSCode的远程开发

源代码

    https://github.com/tf63/docker_images/tree/python

目录结构

    .
    ├── .devcontainer
    │   └── devcontainer.json
    ├── docker
    │   └── python
    │       ├── Dockerfile
    │       └── requirements.txt
    ├── docker-compose.yml
    └── src
        └── python
            └── demo.py

话题的发展

    • なぜ Docker を使いたい?

 

    • Docker はどんなもの?

 

    • Docker コンテナが作成される仕組み

 

    • Docker コンテナからホスト OS のファイルを参照するには?

 

    • Docker のチュートリアル

 

    • Docker Compose のチュートリアル

 

    VSCode の Remote Development を使う

Docker是什么东西?

为什么想要使用 Docker?

    • 環境を容易に共有できる

 

    • 環境を容易に作り直せる

 

    • 複数バージョンの環境を共存できる

 

    • 再利用性が高い

 

    • ホストの環境を汚さない

 

    開発環境と本番環境の差を吸収してくれる

等等

Docker 是什么东西?

Docker引擎在操作系统(主机)上创建容器(类似于小型操作系统)。

在容器中运行程序 -> 不会影响主机操作系统的环境

image.png

Docker 容器的创建机制。

Dockerfile から Docker イメージを作成
Docker イメージから Docker コンテナを作成

image.png

Dockerfile 是源代码,可以通过 Git 进行管理。

再利用性が高く,配布も楽

環境の内容を後から確認できる

Docker 镜像会在类似 Docker Hub 的注册表中进行分发。

Dockerfile を作る際のベースイメージにして利用したりする

要从Docker容器中引用主机操作系统的文件,应该怎么做?

基本上有三种方法

绑定 挂载

    • ホスト OS のディレクトリをコンテナにマウントする

 

    ホスト側でもファイルを参照したい場合に使う.ホストとコンテナ内でファイルの変更は同期されている

音量调节

Docker Engine が 暗黙的に volume という領域を作成し,コンテナにマウントする
DB のデータなど,ホスト側で参照する必要のないファイルをマウントする事が多い

使用Dockerfile将主机目录复制到容器内部。

    詳しくないがコンテナごとデプロイする場合とかに使う?

今回は bind マウントをする

试用一下 Docker

使用Docker来创建Python 3.9的环境。

requirements.txtからpipで以下のパッケージをインストールしてみる

    # requirements.txt
    flake8
    black

Dockerfile の例

    FROM python:3.9 # ベースイメージの選択

    WORKDIR /app # コンテナ内のワークディレクトリの宣言
    COPY docker/python/requirements.txt /app # ホストのファイルをコンテナ内にコピー

    # コマンドの実行 (pip)
    RUN pip install --no-cache-dir --upgrade pip && \
        pip install --no-cache-dir -r requirements.txt # コピーしたrequirements.txtからインストール

基本形象

使用 Dockerfile 构建的 Docker 镜像的源

FROM python:3.9としているが,これは Docker hub に登録されているイメージを指す

イメージには名前 python とタグ 3.9 を指定することができる

名前 python の部分はここ に対応

タグ 3.9 の部分はここ に対応

基本的にフレームワークやプログラミング言語は公式がイメージを配布しているため,それをベースイメージとして Dockerfile を作ることになる

你也可以从Alpine或Ubuntu的官方映像构建Dockerfile。

请把文件复制一份。

您可以使用COPY命令将主机文件复制到容器内部。

执行命令

可以通过RUN语句来执行命令。

環境変数の宣言,コンテナのポートの開放,エントリポイントの設定など,色々できるが今回はここまで

构建 Dockerfile

实际上,使用Docker Compose来构建更方便,所以不需要记住。

使用 Dockerfile 构建并创建 Docker 镜像

    docker build . -f docker/python/Dockerfile -t python_demo:1.0

現在ローカルにベースイメージ python:3.9 は存在しないが,docker build をすると勝手に Docker hub から探してきてくれる (docker pull してくれる)

docker build の引数 (今回は.) には Dockerfile へのパスではなくビルド時のコンテキストというものを渡している

Dockerfile 内でCOPY docker/python/requirements.txt /appとかしている

docker/python/requrements.txtはコンテキストからみた相対パスのこと

現在は. (カレントディレクトリ) をコンテキストとしているので,カレントディレクトリにあるdocker/python/requirements.txtが参照される

-fオプションで, Dockerfile へのパスを指定する

-tオプションで,イメージ名を指定する (タグ 1.0 は無くても良い)

检查Docker镜像

    docker image ls

应该可以看到创建的 Docker 镜像 python_demo。

    REPOSITORY                        TAG             IMAGE ID       CREATED        SIZE
    (略)
    python_demo                       1.0             028d76d80330   2 hours ago    1.02GB

启动Docker容器。

尝试从创建的 Docker 镜像 python_demo:1.0 中启动 Docker 容器。

    docker run -dit --name python_demo_container --volume "PWD":/app python_demo:1.0

–name オプションで,コンテナ名を指定

–volume オプションで,カレントディレクトリを/appに bind マウント

-dit オプションはひとまず無視

在容器中执行命令。

使用 docker exec 命令可以在容器内执行命令。

在Python演示容器中尝试执行pip list命令

    docker exec python_demo_container pip list

已安装了requirements.txt文件中列出的black和flake8.

        Package           Version
    ----------------- -------
    black             23.7.0
    (略)
    flake8            6.1.0
    (略)

尝试使用 Docker Compose

为什么想要使用Docker Compose?

docker build や docker run コマンドが長い

コンテナの立ち上げもファイル (docker-compose.yml) から立ち上げるようにしたい

複数のコンテナを一括で立ち上げたい

例えば,Django アプリケーションコンテナ,Postgres データベースコンテナ,Nginx サーバーコンテナを同時に立ち上げて通信するような場合

使用Docker Compose

Docker Compose 可以通过 docker-compose.yml 文件声明容器的配置,通过 docker compose up 启动容器。

docker-compose.yml的示例

    version: '3.3'

    services:
        python:
            build:
                context: . # ビルド時のコンテキスト
                dockerfile: docker/python/Dockerfile # Dockerfileへのパス
            container_name: 'python' # コンテナ名
            stdin_open: true # ditのどれか
            tty: true # ditのどれか
            volumes: # bindマウント
                - ./:/app

        # 例なのでコメントアウトしておく
        # postgres:
        #     image: postgres:15.2 # ベースイメージを直接指定 (Dockerfileからビルドしない)
        #     volumes: # volumeマウント
        #         - postgres_data:/var/lib/postgresql/data
        #     ports: # ホストのポートとコンテナのポートをフォワーディング
        #         - 5432:5432
        #     env_file: # 環境変数を.envというファイルから設定する
        #         - .env

    # volumeの宣言,Docker EngineがホストOSのどこかに領域を作成する
    # volumes:
        # postgres_data:

启动容器

    # -d はバックグラウンドでコンテナを起動するという意味
    docker compose up -d

尝试使用 Remote Development

通过使用VSCode的Remote Development扩展和Docker,可以进入容器并在VSCode上进行操作(可以附加到VSCode)。

undefined
undefined

使用远程开发,通过在VSCode的工作目录中创建.devcontainer/devcontainer.json文件,将容器附加到VSCode上。

devcontainer.json的示例

指定Docker服务名称,路径为docker-compose.yml。

    {
        "name": "Python",
        "dockerComposeFile": "../docker-compose.yml",
        "service": "python",
        "workspaceFolder": "/app"
    }

将 VSCode 附加

通过使用 ctrl + shift + P 或者其他方式打开命令面板,执行 Dev Containers: Open Folder in Container…

undefined

打开终端后,可以确认进入容器中。

undefined

コンテナから抜ける場合は左下のDev Container: Pythonをクリックして,Close Remote Connectionを実行

undefined

以上

bannerAds