Docker入門:インストールと基本操作
【概要】Dockerは,アプリケーションの実行環境をパッケージとして扱うコンテナ化技術である。イメージを基にコンテナを作成し,各コンテナは独立して動作する。データの永続化にはボリュームを使用し,コンテナ間の通信にはネットワークを使用する。Dockerfileに手順を記述してイメージをビルドでき,レイヤー構造により効率的な管理が可能である。
【この記事で学べること】Dockerの基本概念(コンテナ,イメージ,ボリューム,ネットワーク),Docker Desktopのインストール方法(Windows,Ubuntu),コンテナの作成・実行・停止・削除の基本操作,Dockerfileを使用したイメージの作成方法を習得できる。
【目次】
- コンテナ化
- Dockerエンジン
- Dockerイメージ
- イメージのレイヤー構造
- Dockerfile
- Dockerコンテナ
- Dockerボリューム
- Dockerネットワーク
- Docker Desktopのインストール,Dockerエンジンの起動(Windows上)
- Docker Desktopのインストール,Dockerエンジンの起動(Ubuntu上)
- Dockerの基本操作
【サイト内の関連ページ】
1. コンテナ化
コンテナ化(Containerization)は,アプリケーションとその実行環境(ライブラリ,設定ファイルなど)を単一のパッケージとして統合し,異なる環境でも一貫した動作を実現する技術である。Dockerによるコンテナ化には,以下の利点がある。
- 実行環境の一貫性:異なる環境間での動作の差異を解消する
- アプリケーションの分離:各コンテナで異なるバージョンのライブラリやフレームワークを独立して使用でき,バージョン依存の問題を解決する
- 環境間の移植性:OS,クラウド環境など,多様な実行環境において同一の動作を実現する
- システムリソースの効率性:仮想マシン(Virtual Machine:VM)と比較して,メモリ使用量とディスク使用量を削減する
2. Dockerエンジン
Dockerエンジン(Docker Engine)は,Dockerコンテナの作成と実行を管理するソフトウェア基盤である。Dockerエンジンは,以下の2つの要素で構成される。
- Dockerデーモン(dockerd):コンテナのライフサイクル全体を管理するサーバープロセス
- Dockerクライアント(docker CLI):ユーザーのコマンドをDockerデーモンに伝達するコマンドラインインターフェース
3. Dockerイメージ
Dockerイメージとは,アプリケーションの実行環境を定義したパッケージであり,実行に必要なすべてのコンポーネント(ファイル,ライブラリ,依存関係)を含む。Dockerイメージは,Dockerコンテナを生成するためのテンプレートとして機能する。
Dockerイメージのプル(取得)
docker pullコマンドは,Docker Hub(Dockerの公式イメージレジストリ)などから指定したイメージをダウンロードする。イメージを取得することで,そのイメージを基にコンテナを作成できる。
次は,Ubuntu 24.04 LTS(Long Term Support:長期サポート版)のイメージを取得する例である。docker imagesコマンドにより,ローカル(手元のコンピュータ)に保存されているDockerイメージの一覧を表示する。
docker pull ubuntu:24.04
docker images
Dockerイメージのビルド(Dockerfileからのイメージ作成)
docker buildコマンドは,カレントディレクトリ(現在の作業ディレクトリ)のDockerfileを基にイメージを生成する。生成したイメージには,識別用の名前(例:myubuntu2404)とバージョン管理用のタグ(例:1.0)を設定できる。
docker build -t myubuntu2404:1.0 .
docker images
Dockerイメージの一覧表示
docker imagesコマンドにより,ローカルに保存されているDockerイメージの一覧を表示する。表示される情報には,各イメージのリポジトリ名,タグ,イメージID,作成日時,サイズが含まれる。イメージの詳細な構成情報を確認するには,docker image inspectコマンドにイメージIDを指定して実行する。
docker images
4. イメージのレイヤー構造
Dockerイメージは,複数のレイヤー(層)によって階層的に構成される。各レイヤーは,Dockerfileの個々のコマンド(FROM,RUN,COPYなど)の実行結果として生成される。
以下に,レイヤーが段階的に生成される例を示す。
FROM ubuntu:24.04 # ベースイメージのレイヤー
COPY ./app /app # アプリケーションファイルのレイヤー
# システムパッケージのインストールのレイヤー
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y python3 python3-pip python3-dev wget curl git cmake gnupg software-properties-common build-essential
# Miniconda3のインストールのレイヤー
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
rm Miniconda3-latest-Linux-x86_64.sh
# condaの初期設定のレイヤー
RUN /opt/conda/bin/conda init bash && \
echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc
# コンテナ起動時のコマンド
CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \
/opt/conda/envs/dev/bin/jupyter notebook --allow-root --ip=* --port=8888 --no-browser"]
レイヤー構造には,以下の利点がある。
- ビルド時間の短縮:各レイヤーはビルド時にキャッシュされ,変更がないレイヤーは再利用される
- ストレージの効率化:各レイヤーは前のレイヤーからの差分情報のみを保存するため,ディスク使用量を削減できる
5. Dockerfile
Dockerfileは,Dockerイメージを作成するための手順を定義したテキストファイルである。ベースイメージの選択,実行コマンドの設定,ファイルのコピー指示,その他の構築手順を記述する。Dockerfileを使用することで,イメージの作成手順を再現可能な形で管理できる。
次のDockerfileは,Ubuntu 24.04 LTSのイメージを基にPython環境を構築する。Miniconda3を用いてPython 3.12環境(環境名:dev)を作成し,NumPy,Pandas等の科学技術計算ライブラリを導入する。Jupyter Notebookをポート8888で起動するよう設定し,開発用ツールとしてcmake,git等も導入する。
FROM ubuntu:24.04
# 環境変数の設定
ENV PATH=/opt/conda/bin:$PATH \
SHELL=/bin/bash \
DEBIAN_FRONTEND=noninteractive \
TZ=Asia/Tokyo
# システムパッケージのインストール
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y python3 python3-pip python3-dev wget curl git cmake gnupg software-properties-common build-essential
# Miniconda3のインストール
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \
bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \
rm Miniconda3-latest-Linux-x86_64.sh
# condaの初期設定とdev環境の作成
RUN /opt/conda/bin/conda init bash && \
echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc
RUN /opt/conda/bin/conda create -n dev python=3.12 -y && \
/opt/conda/bin/conda install -n dev -y numpy pandas matplotlib scikit-learn jupyter pylint pytest black && \
echo "conda activate dev" >> /root/.bashrc
# Jupyterの設定
RUN mkdir -p /root/.jupyter && \
/opt/conda/envs/dev/bin/jupyter notebook --generate-config && \
echo "c.ServerApp.ip = '*'" >> /root/.jupyter/jupyter_notebook_config.py && \
echo "c.ServerApp.port = 8888" >> /root/.jupyter/jupyter_notebook_config.py && \
echo "c.ServerApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py
# 作業ディレクトリの設定
WORKDIR /workspace
# Jupyterのポートを公開
EXPOSE 8888
# コンテナ起動時のコマンド
CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \
/opt/conda/envs/dev/bin/jupyter notebook --allow-root --ip=* --port=8888 --no-browser"]
6. Dockerコンテナ
Dockerコンテナは,Dockerイメージから生成される独立した実行環境である。各コンテナは,他のコンテナやホストシステムから分離され,独自のプロセス空間,ネットワーク環境,ファイルシステムを持つ。
コンテナの作成と実行
次のコマンドは,Ubuntu 24.04 LTSイメージを基に新しいコンテナを作成し,cat /etc/os-releaseコマンドを実行した後,自動的にコンテナを削除する。--rmオプションを指定することで,作業用コンテナが残らず,ディスク容量を節約できる。
docker run --rm ubuntu:24.04 cat /etc/os-release
次のコマンドは,Ubuntu 24.04 LTSのイメージを基に新しいコンテナを作成して実行する。-itオプションにより対話的な操作が可能になり,--nameオプションでコンテナに識別名を付与する。exitコマンドで接続を終了すると,コンテナは停止する。--rmオプションが指定されていないため,コンテナは停止後も保持される。
docker run --name ubuntu -it ubuntu:24.04 /bin/bash
exit
停止中のコンテナへの接続
docker startコマンドにより,停止中のコンテナを実行状態にする。docker execコマンドにより,実行中のコンテナに新しいプロセスとして接続する。exitコマンドで接続を終了しても,コンテナは停止せずに実行を継続する。
docker start ubuntu && docker exec -it ubuntu /bin/bash
exit
コンテナの一覧表示
docker psコマンドにより,コンテナの状態を確認できる。-aオプションを指定すると,停止中のコンテナも含めて表示する。
docker ps -a
7. Dockerボリューム
Dockerボリュームは,コンテナのライフサイクル(作成から削除まで)から独立してデータを永続的に保持する機能である。コンテナを削除してもボリューム内のデータは保持されるため,データベースファイルや設定ファイルなどの永続化に適している。また,複数のコンテナ間でボリュームを共有することで,コンテナ間でのデータ共有を実現する。
ボリュームの操作
# データ永続化用のボリュームを作成
docker volume create app-data
# 作成したボリュームをマウントしてコンテナを起動
docker run --rm -v app-data:/data ubuntu:24.04 ls -al /data
8. Dockerネットワーク
Dockerネットワークは,コンテナ間の通信を管理する機能である。複数のコンテナ間の通信や,コンテナとホストシステム間の通信を実現する。
ネットワークの種類
- bridgeネットワーク:標準のネットワークドライバであり,同一ホスト上のコンテナ間通信を実現する
- hostネットワーク:ホストシステムのネットワークスタックを直接使用する
- noneネットワーク:ネットワーク機能を無効化する
- overlayネットワーク:複数のDockerホスト間でのコンテナ通信を実現する
9. Docker Desktopのインストール,Dockerエンジンの起動(Windows上)
Docker Desktopにより,GUIを用いてDockerコンテナ,Dockerイメージ,Dockerボリュームの一覧表示,状態確認,基本的な操作を行うことができる。
Docker Desktopは,Windowsのスタートメニューから起動できる。Docker Desktopを起動すると,Dockerエンジンが起動する。
9.1 インストール
Dockerデーモンとクライアントを含むDocker Desktopのインストール手順を示す。インストールは,以下の2つの方法から選択できる。
A)winget(Windowsパッケージマネージャー)を使用したインストール
- Windowsで,管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。 - wingetが利用可能か確認する。
winget --version
- Docker Desktopをインストールする。
winget install --scope machine Docker.DockerDesktop
B)手動でのインストール
- Docker Desktopのダウンロード
- 公式サイト(https://docs.docker.com/desktop/features/wsl/#download)にアクセスする
- インストーラをダウンロードする
- インストールの実行
- ダウンロードしたインストーラを実行する
- 画面の指示に従ってインストールを完了する
- 自動起動の設定(任意)
Windows起動時にDocker Desktopを自動的に起動する場合は,以下の設定を行う。
管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー >
cmdと入力 > 右クリック > 「管理者として実行」)。次のコマンドを実行する。
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "Docker Desktop" /t REG_SZ /d "\"C:\Program Files\Docker\Docker\Docker Desktop.exe\"" /f
10. Docker Desktopのインストール,Dockerエンジンの起動(Ubuntu上)
10.1 事前準備:既存のDockerの削除(必要な場合)
既存のdocker-ceやdocker.ioがインストールされている場合は削除する。
sudo apt remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli
rm -r $HOME/.docker
sudo rm -f /usr/local/bin/com.docker.cli
sudo apt purge -y docker-desktop
10.2 HTTPSリポジトリ利用の設定
aptがHTTPSでリポジトリにアクセスできるようにするため,必要なパッケージをインストールする。
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
10.3 Docker公式リポジトリの追加
Dockerの公式GPGキー(パッケージの署名を検証するための暗号鍵)を追加し,Docker公式リポジトリを登録する。
参考ページ:https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
10.4 Docker Engineのインストール
sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
10.5 Docker Engineの動作確認
以下のコマンドを実行し,エラーメッセージが表示されないことを確認する。
sudo docker run hello-world
10.6 権限の設定と動作確認
現在のユーザーをdockerグループに追加することで,sudoなしでDockerコマンドを実行できる。グループへの追加後は,一度ログアウトして再ログインする必要がある。
sudo usermod -aG docker $USER
docker run hello-world
docker --version
docker version
docker compose version
10.7 Docker Desktopのインストール
参考ページ:https://docs.docker.com/desktop/setup/install/linux/ubuntu/
curl -LO https://desktop.docker.com/linux/main/amd64/docker-desktop-amd64.deb
sudo apt install -y ./docker-desktop-amd64.deb
10.8 Docker Desktopの起動と動作確認
以下のコマンドでDocker Desktopを起動する。
docker desktop version
docker desktop start
10.9 Docker Engineの自動起動設定
システム起動時にDocker Engineを自動的に起動するよう設定する。
sudo systemctl unmask docker.service
sudo systemctl enable docker
sudo systemctl is-enabled docker
10.10 トラブルシューティング
docker.service not foundエラーDockerが正しくインストールされていない可能性がある。
docker versionコマンドを実行してインストール状態を確認する。permission deniedエラーsudo usermod -aG docker $USERを実行後,ログアウトして再ログインする。グループの変更は再ログイン後に有効になる。
11. Dockerの基本操作
イメージとコンテナに対するコマンド一覧
イメージ
- Dockerfileからイメージを構築:build <Dockerfileについての指定>
- コンテナからイメージを作成(コミット):commit <コンテナ> <リポジトリ:タグ>
- 一覧表示:images
- 情報取得:inspect <イメージ>
- 読み込み:load
- 保存:save <イメージ>
- イメージの削除:rmi
コンテナ
- 実行開始:run <イメージ>[<コマンド>]
- 停止中のコンテナを実行状態に:start <コンテナ>
- 実行中のコンテナを停止:stop <コンテナ>
- 実行中のコンテナでコマンドを起動:exec <コンテナ>
- 実行中のコンテナを強制終了:kill <コンテナ>
- 一覧表示:ps -a
- ポートマッピングの表示:port <コンテナ>
- コンテナの削除:rm <コンテナ>
イメージからのコンテナの作成,コンテナの開始・停止・削除,ローカルのイメージの確認
- イメージからのコンテナの作成と開始
Ubuntu 24.04 LTSのイメージからコンテナを作成して開始する。
docker run --name myubuntu -p 8888:8888 -it ubuntu:24.04 /bin/bash次の実行画面では,Linuxコマンドのpwd,lsを実行した後,
exitで切断している。
各オプションの説明:
--name myubuntu:コンテナに識別用の名前を付与する-i:標準入力を開いたままにし,対話的な操作を可能にする-t:疑似TTY(仮想端末)を割り当て,コマンドラインでの操作を可能にする-p 8888:8888:ホストのポート8888をコンテナのポート8888にマッピングする(Jupyter Notebook等で使用)ubuntu:24.04:使用するベースイメージ/bin/bash:コンテナ起動時に実行するコマンド
- 停止中のコンテナへの接続
docker startコマンドにより,停止中のコンテナを実行状態にする。docker execコマンドにより,実行中のコンテナに新しいプロセスとして接続する。exitコマンドで接続を終了しても,コンテナは停止せずに実行を継続する。docker start myubuntu && docker exec -it myubuntu /bin/bash exit
- 実行中のmyubuntuコンテナを停止する
docker stop myubuntu
- 停止中のmyubuntuコンテナを実行状態にする
docker start myubuntu
- コンテナの一覧表示(実行中および停止中)
docker ps -a
- 単一コンテナの停止と削除
docker rm -f <コンテナID> - すべてのコンテナの停止と削除(コマンドプロンプト用)
for /f "tokens=*" %i in ('docker ps -a -q') do docker rm -f %i - すべてのコンテナの停止と削除(バッチファイル用)
for /f "tokens=*" %%i in ('docker ps -a -q') do docker rm -f %%i - イメージの一覧表示
docker images
コンテナからイメージを作成
docker commitコマンドを使用すると,現在のコンテナの状態をイメージとして保存できる。手動でインストールや設定を行ったコンテナを,再利用可能なイメージとして保存する場合に用いる。ただし,再現性の観点からは,Dockerfileを使用したイメージ作成が推奨される。
docker commitコマンドにより,コンテナからイメージを作成するコンテナIDは,
docker ps -aで確認する。以下の実行例では,イメージ名としてmyubuntu2404:1.0を指定している。docker ps -a docker commit <コンテナID> myubuntu2404:1.0
- イメージが追加されたことを確認する
docker images
- 作成したイメージを使用してコンテナを作成し,起動する
docker run -it myubuntu2404:1.0 /bin/bash exit
Dockerfileを使用したイメージの生成
Dockerfileを使用することで,イメージの作成手順をコードとして管理でき,同じ環境を再現できる。チーム開発やCI/CD環境での利用に適している。
- 空のディレクトリを作成する
- そのディレクトリ内に,以下の内容でDockerfileを作成して保存する
次のDockerfileは,Ubuntu 24.04 LTSのイメージを基にPython環境を構築する。Miniconda3を用いてPython 3.12環境(環境名:dev)を作成し,NumPy,Pandas等の科学技術計算ライブラリを導入する。Jupyter Notebookをポート8888で起動するよう設定し,開発用ツールとしてcmake,git等も導入する。
FROM ubuntu:24.04 # 環境変数の設定 ENV PATH=/opt/conda/bin:$PATH \ SHELL=/bin/bash \ DEBIAN_FRONTEND=noninteractive \ TZ=Asia/Tokyo # システムパッケージのインストール RUN apt-get update && apt-get upgrade -y && \ apt-get install -y python3 python3-pip python3-dev wget curl git cmake gnupg software-properties-common build-essential && \ rm -rf /var/lib/apt/lists/* # Miniconda3のインストール RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda && \ rm Miniconda3-latest-Linux-x86_64.sh # condaの初期設定とdev環境の作成 RUN /opt/conda/bin/conda init bash && \ echo ". /opt/conda/etc/profile.d/conda.sh" >> /root/.bashrc RUN /opt/conda/bin/conda create -n dev python=3.12 -y && \ /opt/conda/bin/conda install -n dev -y numpy pandas matplotlib scikit-learn jupyter pylint pytest black && \ echo "conda activate dev" >> /root/.bashrc # Jupyterの設定 RUN mkdir -p /root/.jupyter && \ /opt/conda/envs/dev/bin/jupyter notebook --generate-config && \ echo "c.ServerApp.ip = '*'" >> /root/.jupyter/jupyter_notebook_config.py && \ echo "c.ServerApp.port = 8888" >> /root/.jupyter/jupyter_notebook_config.py && \ echo "c.ServerApp.allow_root = True" >> /root/.jupyter/jupyter_notebook_config.py # 作業ディレクトリの設定 WORKDIR /workspace # Jupyterのポートを公開 EXPOSE 8888 # コンテナ起動時のコマンド CMD ["bash", "-c", ". /opt/conda/etc/profile.d/conda.sh && conda activate dev && \ /opt/conda/envs/dev/bin/jupyter notebook --allow-root --ip=* --port=8888 --no-browser"] - Dockerfileを基にイメージを作成する
docker buildコマンドは,カレントディレクトリのDockerfileを基にイメージを生成する。作成したイメージには,識別用の名前(例:myubuntu2404)とバージョン管理用のタグ(例:1.0)を設定できる。docker imagesコマンドにより,ローカルに保存されたすべてのイメージを一覧形式で確認できる。docker build -t myubuntu2404:1.0 . docker images - 作成したイメージからコンテナを作成して実行する
docker run --name myubuntu -p 8888:8888 -it myubuntu2404:1.0 /bin/bash
未使用リソースの削除
Dockerを使用していると,未使用のイメージやコンテナがディスク容量を消費する。定期的に未使用リソースを削除することで,ディスク容量を確保できる。
- 未使用リソースの一括削除
注意:このコマンドは,停止中のコンテナ,未使用のネットワーク,未使用のイメージをすべて削除する。必要なリソースが削除されないよう,実行前に確認すること。
docker system prune -a - 未使用コンテナの削除
docker container prune - 未使用イメージの削除
docker image prune
リソース管理(Docker Desktopを使用)
Docker Desktopの設定で,WSL 2(Windows Subsystem for Linux 2:Windows上でLinuxを実行するための機能)に割り当てるリソースを管理できる。
メモリ使用量,ディスク容量の設定:Docker Desktop > Settings > Resources > WSL Integration
ローカルフォルダのマウント
ホストのフォルダをコンテナ内にマウントすることで,ホストとコンテナ間でファイルを共有できる。
docker run --rm -v %cd%/windows-file:/app ubuntu:24.04 ls /app
Docker上でサーバを起動し,ポートマッピングを行う(ホストはUbuntu)
- 前準備
sudo apt update - サーバの起動
公式の「はじめよう」のページ(https://docs.docker.com/get-started/)に従い,サーバを起動する。
次の操作では,ホストのポート3000をコンテナのポート80にマッピングしている。ローカルホストからのみアクセス可能にする場合は「127.0.0.1:3000:80」のように指定する。
docker run -d -p 3000:80 docker/getting-started - SSHでリモート接続する
次の操作では,ホストのポート8022をコンテナのポート22にマッピングしている。
docker run -p 8022:22 -it myubuntu2404:1.0 /bin/bash sudo adduser --uid 1234 --ingroup sudo --home /home/ai ai
Docker Composeの「はじめよう」を実行(ホストはUbuntu)
Docker Composeは,複数のコンテナで構成されるアプリケーションを定義・実行するためのツールである。Docker Composeの「はじめよう」のページ(https://docs.docker.com/compose/gettingstarted/)の手順に従って実行する。
- 前準備
Docker Composeがインストールされていること。ここでは,Docker Desktopに同梱されているDocker Composeを使用する。
- プロジェクトディレクトリの作成
mkdir composetest cd composetest - プロジェクトディレクトリにapp.pyを作成する
https://docs.docker.com/compose/gettingstarted/のapp.pyを使用する。
- プロジェクトディレクトリにrequirements.txtを作成する
https://docs.docker.com/compose/gettingstarted/のrequirements.txtを使用する。
- プロジェクトディレクトリにDockerfileを作成する
Dockerイメージの生成に使用する。app.pyが使用するソフトウェア(Python処理系など)が設定されている。
https://docs.docker.com/compose/gettingstarted/のDockerfileを使用する。
- プロジェクトディレクトリにdocker-compose.ymlを作成する
サービスの設定を記述する。
https://docs.docker.com/compose/gettingstarted/のdocker-compose.ymlを使用する。
docker compose upを実行してアプリケーションのビルドと実行を行うエラーメッセージが表示されないことを確認する。
docker compose up- ポート番号8000でWebサーバにアクセスし,結果を確認する
curl http://localhost:8000