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引擎在操作系统(主机)上创建容器(类似于小型操作系统)。
在容器中运行程序 -> 不会影响主机操作系统的环境

Docker 容器的创建机制。
Dockerfile から Docker イメージを作成
Docker イメージから Docker コンテナを作成

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)。


使用远程开发,通过在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…

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

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

以上