有关Docker的内容
为什么要使用?
为了保持环境的清洁。
如果没有Docker,在本地环境中安装Python 3.7和Python 3.8可能会混乱不清,一团糟。混乱不堪。
此外,能够统一开发环境和生产环境也是很重要的。由于每次部署环境不同,经常会出现错误,但使用Docker可以避免这种情况。
与Virtual Box相比,Docker启动速度要快得多,所以Docker很好。自从开始使用Docker以来,我的开发状态明显好转。就像在整理过的桌子上学习一样让人舒心的感觉。
基础的 Docker 编辑
只要在沙盒中玩弄,不需要考虑实际环境,这就足够了。一开始我认为只需要这个。当逐渐熟悉后,我想进入应用篇。
# ベースとなるイメージを引っ張ってくる.大本の環境を構築する感じ.この上にパッケージなどを乗せていく.
$ docker pull イメージ名
# anaconda -> pandasなど大体機械学習に必要なパッケージがインストール済みだが重い.本番環境では軽さが大事だが,ローカル開発ではこれでいいと思う.
$ docker pull continuumio/anaconda3
# -itコマンドでDockerを起動し続ける.ないと一度起動するだけで切れてしまい,その中で作業できない.また末尾に/bin/bashを付けることで,バッシュの中で作業できる.コマンドラインを使えるイメージ.ないとpythonの対話モードになる.
$ docker run -it continuumio/anaconda3 /bin/bash
# コンテナ内でパッケージをインストールするなどの変更を行ったら,コンテナを抜けた後,その変更を保存しておく.しないと,初期の環境のままになる.
# 起動したコンテナの履歴
$ docker ps -a
# コンテナをイメージとして保存する
$ docker commit container_id container_name
# 保存したイメージの一覧を確認する
$ docker images
# 保存したコンテナを起動する
$ docker run -it container_name /bin/bash
# ローカルディレクトリをマウント(Dockerと共有)する. -vの後に「ローカルディレクトリ:Dockerディレクトリ」を記述.
docker run -it -v /c/Users/user/Python:/home container_name /bin/bash
Docker 应用编程
可能有一些困难,但是一旦适应了,就能更舒适、更高效地进行开发。我记得在这里花费了不少时间。
基本的使用流程如下。
-
- 创建Dockerfile和requirements.txt文件
-
- 在VSCode中安装扩展功能Remote-Containers
-
- 在VSCode左下角的代码按钮中执行重新打开容器和执行Dockerfile操作
-
- 在Docker环境中安装的软件包写入requirements.txt文件中
- 下次再次构建。
在这里,我想要分成三个部分来讨论:单独的Dockerfile,使用docker-compose的开发环境,以及用于生产环境的Dockerfile。
最终,希望能够熟悉使用docker-compose进行开发。而且,如果能够编写适用于生产环境的Dockerfile就更好了。
1. 单独使用Dockerfile
# 上部に記述したものほどキャッシュを利用しやすくなっているので,よく変更を加えるものは下の方に記述しよう.
# python-buster -> pythonを動かすための最小限のパッケージ.OSはdebian. 自分はこれで開発している.
FROM python:3.8-buster
# パスは絶対パスを使用する.ローカルとコンテナでディレクトリ構造が異なるから.
WORKDIR /app
# パッケージマネージャの更新とパッケージの取得はまとめる. aptの方がapt-getよりも良い.
RUN apt update -y && apt upgrade -y && \
apt install -y ffmpeg
# ADDよりCOPYの方が良い.appディレクトリにファイルをコピー.ローカルからコンテナへとファイルをコピーしている.
COPY requirements.txt /app
# requirements.txtを参照してpip install. python3ではpip3を利用したい.
RUN pip3 install --upgrade pip && \
pip3 install -r requirements.txt
# 指定したディレクトリを各環境で共有できる.
# VOLUME /data
# コピーするディレクトリは明示的に指定.変更部のみ反映させるため.自分は面倒なので「.」で済ませてしまっている.
# COPY src /app/src
# COPY data /app/data
COPY . /app
# CMD ["/bin/bash"]
2. Docker-Compose的使用
通过使用Docker-compose,可以同时使用多台服务器。例如,不仅可以用于执行Python,还可以用于数据库(例如postgres)和Jupyter等。共享资源也是一个很好的特点。
以下是示例代码:
docker-compose.yml:
version: ‘3’
services:
notebook:
# image: jupyter/datascience-notebook -> 不需要,因为在Dockerfile中已指定基本映像。
# 如果不指定container_name,将自动生成一个难以确认的名称。
container_name: vad-sandbox
ports:
– “8888:8888”
# 在当前目录下以“.”运行Dockerfile。
build: .
# 指定要挂载的目录。
volumes:
– .:/app
working_dir: /app
# 自动执行命令。我自己打的命令更容易理解,所以我自己打。
# command: jupyter lab –ip=0.0.0.0 –allow-root
接下来是使用docker-compose时的Dockerfile。
FROM python:3.8-buster
WORKDIR /app
RUN apt update -y && apt upgrade -y && \
apt install -y ffmpeg
COPY requirements.txt /app
RUN pip3 install --upgrade pip && \
pip3 install -r requirements.txt
# ipywidgetsを利用. jupyterをインタラクティブに使える.
RUN jupyter nbextension enable --py widgetsnbextension --sys-prefix
COPY . /app
# CMD ["/bin/bash"]
Docker用于生产环境。
在真实环境中,至关重要的是尽量减少容量。为此,采用多阶段构建(即在构建和执行之间分离环境)。
# pythonではalpineよりbusterの方が良い.slimではc拡張が使えない
# マルチステージビルドでビルドと実行でイメージを分け,極力容量を小さくする
# キャッシュを利用したいものほど上部に記述.変更があるとそれ以降破棄されるため.
# ビルド用.busterはgccが利用できる.webrtcvadのインストールに必要.
FROM python:3.8-buster as builder
# パスは絶対パスを使用する
WORKDIR /app
# pytorchはインストールに時間がかかるため,キャッシュを再利用しやすく.
RUN pip3 install --upgrade pip && \
pip3 install torch
# ADDよりCOPYの方が良い.appディレクトリにファイルをコピー.
COPY requirements.txt /app
RUN pip3 install --upgrade pip && \
pip3 install -r requirements.txt
#実行用コンテナ
FROM python:3.8-slim-buster as runner
# インストールしたpythonパッケージを実行用へとコピー. 1GBほど削減できた.
COPY --from=builder /usr/local/lib/python3.8/site-packages /usr/local/lib/python3.8/site-packages
# パッケージマネージャの更新とパッケージの取得はまとめる. aptの方がapt-getよりも良い.
RUN apt update -y && apt upgrade -y && \
apt install -y ffmpeg
COPY . /app
最后一步
由于抽象度较高,初次见到时肯定会感到困惑,但习惯后就变成了简单的工作。起初可能会感到压力,但我们要努力。这也是在找工作时可以突出的优势。