Dockerfileの作成
FROM python:3.11-slim
ENV DEBIAN_FRONTEND=noninteractive
# Install system dependencies and Node.js
RUN apt-get update && apt-get install -y \
curl \
git \
vim \
build-essential \
&& curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
&& apt-get install -y nodejs \
&& rm -rf /var/lib/apt/lists/*
# Create user
RUN useradd -m -s /bin/bash anaconda_user
# Install Python packages
RUN pip install --no-cache-dir \
jupyter \
jupyterlab \
pandas \
numpy \
matplotlib \
seaborn \
scikit-learn \
anthropic \
openai \
requests \
ipykernel
# Install Claude CLI
RUN npm install -g @anthropic-ai/claude-code \
&& ln -sf /usr/local/bin/claude-code /usr/local/bin/claude
# Copy Claude CLI script and make it executable
COPY claude_cli.py /usr/local/bin/claude_py
RUN chmod +x /usr/local/bin/claude_py \
&& chown anaconda_user:anaconda_user /usr/local/bin/claude_py
# Set up Jupyter kernel
RUN python -m ipykernel install --name=python3 --display-name="Python 3"
# Configure Jupyter Lab with dark theme
RUN mkdir -p /home/anaconda_user/.jupyter/lab/user-settings/@jupyterlab/apputils-extension
RUN echo '{"theme": "JupyterLab Dark"}' > /home/anaconda_user/.jupyter/lab/user-settings/@jupyterlab/apputils-extension/themes.jupyterlab-settings
WORKDIR /home/anaconda_user
USER anaconda_user
# Expose Jupyter port
EXPOSE 8888
CMD ["/bin/bash"]
docker-compose.ymlの作成
services:
anaconda:
build: .
platform: linux/amd64
container_name: ubuntu-anaconda
volumes:
- ./workspace:/home/anaconda_user/workspace
ports:
- "8888:8888" # Jupyter Notebook用
environment:
- JUPYTER_ENABLE_LAB=yes
- JUPYTER_TOKEN={YOUR_TOKEN}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
command: >
bash -c "
source ~/.bashrc &&
jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --notebook-dir=/home/anaconda_user/workspace --LabApp.token=$${JUPYTER_TOKEN} --LabApp.theme='JupyterLab Dark'
"
コンテナの起動とシャットダウン
docker-compose down //シャットダウン
docker-compose up -d // 起動
すべてのコンテナを停止
docker stop $(docker ps -aq)
コンテナの一括削除(コンテナを停止してから)
docker rm $(docker ps -aq)
1行で実行
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
Processを切ってコンテナから出る
exit
exitしたらコンテナを削除する
docker run -it -rm containerID TAG
Processを残したままコンテナから出る
docker detach
コンテナの再起動
docker restart
実行中のコンテナ内でコマンドを実行する
docker exec containerID command
commitして更新する
docker commit containerID IMAGE:update
Imageを別名で保存する
docker tag IMAGE:update userName/repoName
Docker Hubにpushする
docker push userName/repoName
docker インストラクション
FROM -> OSを指定する
RUN -> RUN毎にレイヤーが追加される
最小限のレイヤーにするためにコマンドは&&で繋ぎ、\で改行する
インタラクティブなインストールにはオプションの-yを指定する。
USING CACHE
docker fileはCACHEを使って作成し、
コマンドが通るのを確認してからRUNにまとめて書く。
COPY -> ファイルのコピー
COPY文は&&繋げない
COPY fileName PATH
ADD
tarファイルをコピーして解凍する
CMD -> ファイルの最後に記述する
# CMDと[]の間にはスペースが必要
CMD ["COMMAND","PARAM1","PARAM2"]
WORKDIR
実行ディレクトリを変更する
WORKDIR 絶対PATH
ENV -> 環境変数の設定
ENV key value
ホストとコンテナの関係
ホストのファイルシステムをコンテナにマウントする
# DIR=任意の名前、newDir/にホストにあるファイルが見える(コンテナにファイルがあるわけではない)
# ホストのファイルを更新するとプロンプトにupdatedと表示される
# dirの作成はdockerが行ってくれる(:/newDir)
docker run -v ~Desktop/DIR:/newDir IMAGE TAG
ユーザIDとグループIDを指定してコンテナをRUNする
docker run -it -u $(id -u):$(id -g) -v ~Desktop/DIR:/newDir IMAGE TAG
# コンテナではユーザIDを認識しない(I have no name)
ホストとコンテナをポートを指定して繋げる
docker run -p 8888:8888 IMAGE TAG
Memo
コンテナは実行環境として使用し、ホストのファイルシステムをコンテナにマウントする
DockerHubで命名するリポジトリ名は - で繋ぐ
my-repo123
docker build -t でimage名を指定しないとダンクリングイメージが生成される
# ダングリングイメージは<none>と表示される
<none>
# そのため、docker build -t でimage名を指定してimageを作成する
ファイルサイズを考慮して作成する
build context(docker_dir)について
-
buildに使わないファイルはbuild contextに格納しない。
-
大きいファイルはtarで圧縮してADDで解凍する
-
オプション -f(dockerfileが複数ある場合)
docker build -f PATH/fileName .
パーミッション(アクセス権限)
# Iから始まるのはシムリンク、dから始まるのはディレクトリ、-から始まるのはファイル
# r:読み取り、w:書き込み、x:実行
# 所有者、所有グループ、その他の順に表示される
コンテナがアクセスできる上限のCPUを設定
# 重要度の高いコンテナ: 2-4コア
# 中程度の重要度のコンテナ: 1-2コア
# 軽量なコンテナ: 0.5-1コア
docker run --cpus=2 your-image
コンテナがアクセスできる上限のメモリを設定
# 大規模なアプリケーション: 32-64GB
# 中規模のアプリケーション: 8-16GB
# 軽量なアプリケーション: 1-4GB
docker run --memory=16g your-image