Docker のコマンド自体はそれほど多くないのですが、ややこしいのはすぐに混同してしまうことです。新しいイメージをプルしたのに、Webサイトが古いバージョンのまま動いていたり、コンテナを削除して再作成したらデータベースも一緒に消えてしまったり、サーバーのディスクがいきなりいっぱいになって調べてみたら Docker のログファイルが原因だったり。これらの問題は複雑ではありませんが、しばらくすると必ず一度は遭遇します。いざ問題が発生してからドキュメントを調べ直すと、またパラメータを確認するのに時間がかかってしまいます。そこで、日頃サーバーのデプロイやメンテナンスでよく使う Docker コマンドをまとめておきました。これは完全な Docker マニュアルではありません。一年に一度も使わないようなパラメータまでは収録していません。日常的に最もよく使う操作と、データ消失につながる可能性のあるコマンドだけをまとめています。TipDockerfile 用来构建镜像,镜像用来创建容器。容器负责运行程序,但容器本身不适合保存重要数据,需要长期保留的内容应该放在数据卷或宿主机目录中。多个容器之间,则通过 Docker 网络互相通信。はじめに:Docker の構成要素を把握しておくDocker のコマンドが混同しやすいのは、イメージ、コンテナ、ボリューム、ネットワークが同時に出てくるからです。それぞれの関係はおおよそ次のとおりです。一、まずは Docker の現在の状態を確認するDocker で問題が発生したとき、私はすぐにサービスを再起動せず、まずはコンテナの状態を確認します。docker psこのコマンドは実行中のコンテナだけを表示します。停止中のコンテナも見たい場合は、-a を追加します。docker ps -a出力で特に重要なのは以下の項目です。NAMES:コンテナ名IMAGE:使用しているイメージSTATUS:現在の状態PORTS:ポートマッピングコンテナによっては、起動後すぐに終了してしまうものもあります。その場合、docker ps だけでは確認できないため、以下を使う必要があります。docker ps -aDocker が現在使用しているディスク容量を確認するには、以下を実行します。docker system dfイメージ、コンテナ、ボリュームごとのより詳細な使用量を確認するには、以下を実行します。docker system df -vサーバーのディスクが突然いっぱいになったとき、この 2 つのコマンドがとても役立ちます。不要一看到 /var/lib/docker 很大,就直接进去删除文件。这个目录由 Docker 自己管理,手动删除里面的内容,很容易把整个 Docker 环境弄坏。二、コンテナのログを確認するコンテナの起動に失敗したら、最初にやるべきことはコンテナの中に入ることではなく、ログを確認することです。docker logs 容器名称例:docker logs nginxログが多すぎる場合は、最後の 100 行だけ見ることができます。docker logs --tail 100 nginx新しいログを継続的に表示する:docker logs -f nginx私が普段よく使うのは、次の組み合わせです。docker logs -f --tail 200 nginx最初に最後の 200 行のログを表示し、その後は新しく出力されるログを継続的に表示します。直近 30 分のログを確認する:docker logs --since 30m nginxコンテナが再起動を繰り返す場合は、2 つのターミナルを同時に開きます。1 つ目のターミナルで状態を確認:docker ps2 つ目のターミナルでログを継続的に確認:docker logs -f --tail 200 容器名称一般的に、環境変数の欠落、設定ファイルの誤り、ディレクトリの権限不足、データベースへの接続失敗などは、すべてログの中に手がかりがあります。三、コンテナの起動・停止・再起動既存のコンテナを起動する:docker start 容器名称コンテナを停止する:docker stop 容器名称コンテナを再起動する:docker restart 容器名称例:docker restart nginxdocker stop は先にコンテナ内のプログラムに正常終了するよう通知します。PostgreSQL、MySQL、Redis のようにデータを書き込むサービスの場合は、docker stop を優先して使い、プログラムにデータ保存とファイルクローズの時間を与えるべきです。コンテナが完全に応答しなくなった場合にのみ、以下を検討します。docker kill 容器名称docker kill はコンテナプロセスを直接強制終了するため、docker stop よりも強力です。コンテナのフリーズを解決できますが、日常的な再起動手段として使うべきではありません。四、コンテナの中に入るコンテナに入るには通常、以下を使います。docker exec -it 容器名称 bash例:docker exec -it nginx bashただし、すべてのイメージに Bash がインストールされているわけではありません。Alpine などの軽量イメージには通常、sh しかありません。docker exec -it nginx shroot ユーザーで入る必要がある場合:docker exec -it -u root 容器名称 shインタラクティブなターミナルに入らずに、コマンドを 1 つだけ実行することもできます。docker exec nginx ls -lah /etc/nginxコマンドの中にcd、パイプ、複数の操作が含まれる場合は、sh -c を使う必要があります。docker exec nginx sh -c 'cd /etc/nginx && ls -lah'以下のような書き方は通常、動作しません。docker exec nginx "cd /etc/nginx && ls"なぜなら、cd は独立した実行可能プログラムではなく、シェルの内部コマンドだからです。コンテナの中に入るのは問題の切り分けには適していますが、長期的な設定変更には向きません。例えば、コンテナ内で/etc/nginx/nginx.conf を修正しても、次にコンテナが再作成されると、それらの変更はほぼ確実に消えてしまいます。本当に長期間保持すべき設定は、Dockerfile に書くか、ホスト側からマウントする必要があります。五、イメージの基本操作ローカルにあるイメージを確認する:docker images次のようにも書けます:docker image lsイメージをプルする:docker pull nginxバージョンを指定する:docker pull nginx:1.29-alpine本番環境では、明確なバージョンを指定すべきであり、常にnginx:latestlatest を使うのは避けるべきです。今日プルしたlatest と数か月後にプルしたlatest は、中身がまったく異なる可能性があります。これにより更新は簡単になりますが、問題が発生したときのロールバックが難しくなります。イメージを削除する:docker rmi 镜像名称例:docker rmi nginx:1.29-alpineイメージがまだ何らかのコンテナに使用されている場合、Docker は削除を拒否します。そのコンテナが停止していても、イメージを参照している可能性があります。まず以下のコマンドで確認しましょう。docker ps -a六、新しいイメージをプルしたのに、なぜプログラムは古いままなのかこれは Docker を使う上で非常に誤解されやすいポイントです。実行する:docker pull nginx:latestこれは単に新しいイメージをサーバーにダウンロードしただけです。すでに実行中のコンテナは自動的には新しいイメージに置き換わりません。コンテナ作成時に使用されたイメージがすでに決まっているからです。Docker Compose プロジェクトでは、通常以下を実行する必要があります。docker compose pulldocker compose up -d1 つ目のコマンドでイメージをプルし、2 つ目のコマンドで新しいイメージに基づいてコンテナを再作成します。だけを実行しても、docker compose restart通常は効果がありません。restart は元のコンテナを再起動するだけで、イメージを置き換えたり、新しく変更したポートやディレクトリのマウント、環境変数を適用したりしません。そのため、compose.yaml を変更した後は、以下を実行すべきです。docker compose up -dコンテナが正しく再作成されなかった疑いがある場合は、以下を使います。docker compose up -d --force-recreateただし、ほとんどの場合は通常のdocker compose up -d で十分です。七、Docker Compose のよく使うコマンド現在の新しいバージョンの Docker では、通常以下を使います。docker compose古いバージョンではなく:docker-composeプロジェクトを起動する:docker compose up -d-d はバックグラウンド実行を意味します。プロジェクトの状態を確認する:docker compose psログを確認する:docker compose logsログを継続的に確認する:docker compose logs -f特定のサービスのみを確認する:docker compose logs -f webプロジェクト内のコンテナを停止するが、削除はしない:docker compose stop再起動する:docker compose startプロジェクトのコンテナを停止して削除する:docker compose downイメージを再構築して起動する:docker compose up -d --buildリモートのイメージをプルする:docker compose pullCompose ファイルにフォーマットエラーがないか確認する:docker compose config確認だけして、完全な設定を出力したくない場合:docker compose config -qプロジェクトを更新する前に、私はまず以下を実行します。docker compose config -q何も出力がなければ、通常は設定の構文に問題はありません。八、より確実なアップデート手順プロジェクトが以下にあるとします。/opt/myappまずプロジェクトディレクトリに移動します。cd /opt/myapp設定を確認する:docker compose config -q現在の実行状態を確認する:docker compose ps新しいイメージをプルする:docker compose pullコンテナを再作成する:docker compose up -d --remove-orphans更新後の状態を確認する:docker compose ps最後にログを確認する:docker compose logs --tail 200プログラムが正常に動作していれば、その後に古いイメージのクリーンアップを検討します。docker image pruneクリーンアップ処理を更新手順の最初に置かないでください。新しいバージョンが正常に動作していることを先に確認してから、古いイメージを削除します。そうすれば、問題が発生したときに少なくとも古いバージョンを再び使う機会が残ります。九、データはどこに保存されるのかDocker コンテナ自体は重要なデータを保存するのに適していません。コンテナを削除すると、その書き込み可能層も削除されます。長期間保存する必要があるデータは、通常次の 2 つの場所に置きます。Docker ボリュームホストのディレクトリボリュームを確認する:docker volume ls特定のボリュームの情報を確認する:docker volume inspect 数据卷名称例:docker volume inspect postgres-dataCompose でのよくあるボリュームの書き方:services: database: image: postgres:18 volumes: - postgres-data:/var/lib/postgresql/datavolumes: postgres-data:こうすれば、コンテナを削除しても、postgres-data ボリュームは通常そのまま残ります。ホストのディレクトリを使う場合は、次のように書きます。services: app: image: myapp:1.0.0 volumes: - /opt/myapp/data:/app/data左側がホスト側のディレクトリ:/opt/myapp/data右側がコンテナ内部のディレクトリ:/app/dataここで最も問題になりやすいのは、パスの書き間違いです。コンテナにもともと/app/config 内に設定ファイルが含まれているのに、空のディレクトリをマウントしたとします。volumes: - /opt/myapp/config:/app/configすると、コンテナ本来の/app/config がホストの空ディレクトリで上書きされます。プログラムを起動すると、設定ファイルが突然消えたように振る舞います。そのため、マウントする前にホスト側のディレクトリが存在するか、中に正しいファイルがあるかを確認しておくのが賢明です。ls -lah /opt/myapp/config十、コンテナ同士の接続方法同じ Compose プロジェクト内のサービスは、サービス名を使って直接接続できます。例:services: app: image: myapp:1.0.0 database: image: postgres:18アプリケーションがデータベースに接続するとき、アドレスは次のように書くべきです。database:5432コンテナの IP をハードコードしてはいけません。172.20.0.3:5432コンテナを再作成すると IP アドレスは変わることがありますが、サービス名は通常変わりません。Docker ネットワークを確認する:docker network lsネットワークの詳細情報を確認する:docker network inspect 网络名称カスタムネットワークを作成する:docker network create my-network既存のコンテナをネットワークに追加する:docker network connect my-network 容器名称2 つのコンテナが互いにアクセスできない場合は、まず同じ Docker ネットワーク内にいるかどうかを確認してください。十一、ポートをすべてパブリックネットワークに公開しない以下の設定:ports: - "8080:80"これは通常、ホストの 8080 ポートをコンテナの 80 ポートにマッピングすることを意味します。デフォルトでは、すべてのネットワークインターフェースで待ち受ける可能性があります。0.0.0.0:8080つまり、サーバーのファイアウォールが許可していれば、外部デバイスがこのポートにアクセスできる可能性があります。サービスがホスト上の Nginx や OpenResty にのみ提供すればよい場合は、ローカルホストにバインドできます。ports: - "127.0.0.1:8080:80"こうすれば、外部ネットワークからは直接アクセスできず、ホストのローカル接続のみが可能になります。データベースや Redis も、通常はパブリックネットワークに直接公開する必要はありません。同じ Compose ネットワーク内のアプリケーションは、直接アクセスできます。database:5432redis:6379すべての内部サービスにports を設定する必要はありません。十二、リソース使用量の確認全コンテナの CPU とメモリ使用量をリアルタイムで確認する:docker stats1 回だけ出力する:docker stats --no-stream特定のコンテナを指定する:docker stats nginxコンテナ内のプロセスを確認する:docker top nginxコンテナが突然終了した場合、メモリ不足でシステムによって強制終了されていないか確認できます。docker inspect --format '{{.State.OOMKilled}}' 容器名称次のように返ってきた場合:trueこのコンテナで OOM Kill(メモリ不足によるカーネルによる強制終了)が発生したことを示しています。終了コードも確認できます:docker inspect --format '{{.State.ExitCode}}' 容器名称再起動回数を確認する:docker inspect --format '{{.RestartCount}}' 容器名称これらの情報は、コンテナが再起動を繰り返す問題の調査に非常に役立ちます。十三、Docker のログがディスクを圧迫する理由Docker はデフォルトでjson-file を使用してコンテナのログを保存することがあります。ログローテーションを設定していないと、ログファイルが際限なく増え続けます。変更する:/etc/docker/daemon.json以下を追加します。{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }}これは次のことを意味します。各ログファイルの最大サイズは 10MB最大 3 つのログファイルを保持変更が完了したら Docker を再起動します。sudo systemctl restart dockerただし、新しいログ設定は通常、以後作成されるコンテナにのみ適用されることに注意してください。すでに存在するコンテナは再作成が必要な場合があります。Compose でもサービスごとに個別に設定できます。services: app: image: myapp:1.0.0 logging: driver: json-file options: max-size: "10m" max-file: "3"サーバーのディスク容量がなぜか減り続ける場合、データベースやアップロードファイルだけでなく、Docker のログも確認すべきです。十四、Docker のスペースをクリーンアップする停止済みのコンテナを削除する:docker container prune未使用のイメージ( dangling イメージ)を削除する:docker image prune使われていないネットワークを削除する:docker network prune使われていないボリュームを削除する:docker volume prune総合的にクリーンアップする:docker system pruneこれらのコマンドはすべて確認を求められます。しかし、「未使用」という言葉を見ただけで、その中のデータに価値がないと判断してはいけません。例えば、データベースコンテナが削除された後、対応するボリュームは一時的にどのコンテナからも使われていない状態になることがあります。Docker はそれを未使用ボリュームと判断しますが、データベースファイルはまだその中にあります。以下のコマンドを実行する前は、細心の注意が必要です。docker volume prune -adocker system prune -a --volumesdocker compose down -v特に以下:docker compose down -v通常の:docker compose downはコンテナとネットワークのみ削除します。加上 -v 以后,还会删除项目使用的数据卷。如果 PostgreSQL、MySQL 或上传文件保存在这些数据卷中,数据也会一起消失。クリーンアップの前に、少なくとも以下を確認しましょう。docker ps -adocker imagesdocker volume lsdocker system df -v不要把 docker system prune -a --volumes 当成日常清理命令。これはむしろ「これらのものはすべて不要だと確認した」という意思を示すコマンドです。十五、ディレクトリのパーミッションエラーへの対処コンテナがホストのディレクトリをマウントした後、プログラムが次のようなエラーを出すことがあります。Permission deniedまずホスト側のディレクトリのパーミッションを確認します。ls -ld /opt/myapp/dataファイルに対応する UID と GID を確認する:ls -ln /opt/myapp/data次にコンテナ内のプログラムが使用するユーザーを確認します。docker exec 容器名称 idコンテナが UID 1000、GID 1000 を使用している場合、実情に応じてホスト側のディレクトリの所有者を変更します。sudo chown -R 1000:1000 /opt/myapp/data権限の問題に遭遇したとき、多くの人はすぐに以下を実行します。chmod -R 777 /opt/myapp/dataこれで一時的に問題が解決することもありますが、通常は正しい対処法ではありません。777 はすべてのユーザーに読み取り・書き込み・実行権限を与えるため、本当の UID、GID、ディレクトリの所有権の問題を隠してしまいます。まずコンテナがどのユーザーで動作しているかを確認し、それから対応する権限を調整する方が、通常はより確実です。十六、混同しやすいポイントdocker pull は実行中のコンテナを更新しないこれは単にイメージをダウンロードするだけです。Compose プロジェクトを更新するには、さらに以下が必要です。docker compose up -ddocker restart は新しい設定を適用しないこれは元のコンテナを再起動するだけです。Compose ファイルを変更した後は、以下を使用すべきです。docker compose up -dコンテナを削除してもボリュームは削除されないとは限らない通常の:docker rm 容器名称は名前付きボリュームを削除しません。しかし:docker rm -v 容器名称はコンテナが使用している匿名ボリュームを削除する可能性があります。コンテナ内で手動で変更したファイルは信頼できないコンテナを再作成すると、変更内容が消える可能性があります。長期間保持すべき設定は、Dockerfile、Compose ファイル、またはホストのマウントディレクトリに記述すべきです。コンテナの IP に依存しないコンテナ名または Compose のサービス名を使ってアクセスします。すべてのポートをパブリックネットワークにマッピングしない内部サービスはできるだけ Docker ネットワーク内に閉じ込めます。十七、私が日常的に最もよく使うコマンド群コンテナを確認する:docker ps -aログを確認する:docker logs -f --tail 200 容器名称コンテナに入る:docker exec -it 容器名称 shリソースを確認する:docker statsディスク使用量を確認する:docker system df -vCompose の設定を確認する:docker compose config -qCompose プロジェクトを更新する:docker compose pulldocker compose up -d --remove-orphans更新後の状態を確認する:docker compose psdocker compose logs --tail 200これらのコマンドで、日常的なデプロイ、更新、トラブルシューティングのほとんどをカバーできます。おわりにDocker で最も誤解されやすいのは、コンテナが小型のサーバーのように見えることです。しかし、コンテナは仮想マシンではありません。コンテナは、いつでも削除され、再作成され、置き換えられる実行環境のようなものです。本当に重要なものは、コンテナの中だけに置くべきではありません。プログラムはイメージの中に、設定は Compose またはマウントディレクトリに、データはボリュームまたは独立したストレージに。コンテナに問題が起きたら、再作成すればよいのです。これを理解すれば、多くの Docker コマンドを無理に暗記する必要はなくなります。最後に、もう一度注意します。以下のようなパラメータを見かけたら、実行する前に一度止まって考えてください。-v--volumesprunerm -f--privilegedこれらは必ずしも危険というわけではありませんが、データの削除、強制操作、コンテナ権限の拡大を意味することが多いです。特にこのコマンド:docker compose down -vデータのバックアップを確認するまでは、むやみに実行しないでください。
Docker のコマンド自体はそれほど多くないのですが、ややこしいのはすぐに混同してしまうことです。
新しいイメージをプルしたのに、Webサイトが古いバージョンのまま動いていたり、コンテナを削除して再作成したらデータベースも一緒に消えてしまったり、サーバーのディスクがいきなりいっぱいになって調べてみたら Docker のログファイルが原因だったり。
これらの問題は複雑ではありませんが、しばらくすると必ず一度は遭遇します。いざ問題が発生してからドキュメントを調べ直すと、またパラメータを確認するのに時間がかかってしまいます。
そこで、日頃サーバーのデプロイやメンテナンスでよく使う Docker コマンドをまとめておきました。
これは完全な Docker マニュアルではありません。一年に一度も使わないようなパラメータまでは収録していません。日常的に最もよく使う操作と、データ消失につながる可能性のあるコマンドだけをまとめています。
Dockerfile 用来构建镜像,镜像用来创建容器。容器负责运行程序,但容器本身不适合保存重要数据,需要长期保留的内容应该放在数据卷或宿主机目录中。多个容器之间,则通过 Docker 网络互相通信。
はじめに:Docker の構成要素を把握しておく
Docker のコマンドが混同しやすいのは、イメージ、コンテナ、ボリューム、ネットワークが同時に出てくるからです。
それぞれの関係はおおよそ次のとおりです。
一、まずは Docker の現在の状態を確認する
Docker で問題が発生したとき、私はすぐにサービスを再起動せず、まずはコンテナの状態を確認します。
このコマンドは実行中のコンテナだけを表示します。
停止中のコンテナも見たい場合は、-a を追加します。
出力で特に重要なのは以下の項目です。
コンテナによっては、起動後すぐに終了してしまうものもあります。その場合、docker ps だけでは確認できないため、以下を使う必要があります。
Docker が現在使用しているディスク容量を確認するには、以下を実行します。
イメージ、コンテナ、ボリュームごとのより詳細な使用量を確認するには、以下を実行します。
サーバーのディスクが突然いっぱいになったとき、この 2 つのコマンドがとても役立ちます。
不要一看到 /var/lib/docker 很大,就直接进去删除文件。这个目录由 Docker 自己管理,手动删除里面的内容,很容易把整个 Docker 环境弄坏。
二、コンテナのログを確認する
コンテナの起動に失敗したら、最初にやるべきことはコンテナの中に入ることではなく、ログを確認することです。
例:
ログが多すぎる場合は、最後の 100 行だけ見ることができます。
新しいログを継続的に表示する:
私が普段よく使うのは、次の組み合わせです。
最初に最後の 200 行のログを表示し、その後は新しく出力されるログを継続的に表示します。
直近 30 分のログを確認する:
コンテナが再起動を繰り返す場合は、2 つのターミナルを同時に開きます。
1 つ目のターミナルで状態を確認:
2 つ目のターミナルでログを継続的に確認:
一般的に、環境変数の欠落、設定ファイルの誤り、ディレクトリの権限不足、データベースへの接続失敗などは、すべてログの中に手がかりがあります。
三、コンテナの起動・停止・再起動
既存のコンテナを起動する:
コンテナを停止する:
コンテナを再起動する:
例:
docker stop は先にコンテナ内のプログラムに正常終了するよう通知します。
PostgreSQL、MySQL、Redis のようにデータを書き込むサービスの場合は、docker stop を優先して使い、プログラムにデータ保存とファイルクローズの時間を与えるべきです。
コンテナが完全に応答しなくなった場合にのみ、以下を検討します。
docker kill はコンテナプロセスを直接強制終了するため、docker stop よりも強力です。
コンテナのフリーズを解決できますが、日常的な再起動手段として使うべきではありません。
四、コンテナの中に入る
コンテナに入るには通常、以下を使います。
例:
ただし、すべてのイメージに Bash がインストールされているわけではありません。
Alpine などの軽量イメージには通常、sh しかありません。
root ユーザーで入る必要がある場合:
インタラクティブなターミナルに入らずに、コマンドを 1 つだけ実行することもできます。
コマンドの中にcd、パイプ、複数の操作が含まれる場合は、sh -c を使う必要があります。
以下のような書き方は通常、動作しません。
なぜなら、cd は独立した実行可能プログラムではなく、シェルの内部コマンドだからです。
コンテナの中に入るのは問題の切り分けには適していますが、長期的な設定変更には向きません。
例えば、コンテナ内で/etc/nginx/nginx.conf を修正しても、次にコンテナが再作成されると、それらの変更はほぼ確実に消えてしまいます。
本当に長期間保持すべき設定は、Dockerfile に書くか、ホスト側からマウントする必要があります。
五、イメージの基本操作
ローカルにあるイメージを確認する:
次のようにも書けます:
イメージをプルする:
バージョンを指定する:
本番環境では、明確なバージョンを指定すべきであり、常に
latest を使うのは避けるべきです。
今日プルしたlatest と数か月後にプルしたlatest は、中身がまったく異なる可能性があります。これにより更新は簡単になりますが、問題が発生したときのロールバックが難しくなります。
イメージを削除する:
例:
イメージがまだ何らかのコンテナに使用されている場合、Docker は削除を拒否します。
そのコンテナが停止していても、イメージを参照している可能性があります。まず以下のコマンドで確認しましょう。
六、新しいイメージをプルしたのに、なぜプログラムは古いままなのか
これは Docker を使う上で非常に誤解されやすいポイントです。
実行する:
これは単に新しいイメージをサーバーにダウンロードしただけです。
すでに実行中のコンテナは自動的には新しいイメージに置き換わりません。コンテナ作成時に使用されたイメージがすでに決まっているからです。
Docker Compose プロジェクトでは、通常以下を実行する必要があります。
1 つ目のコマンドでイメージをプルし、2 つ目のコマンドで新しいイメージに基づいてコンテナを再作成します。
だけを実行しても、
通常は効果がありません。
restart は元のコンテナを再起動するだけで、イメージを置き換えたり、新しく変更したポートやディレクトリのマウント、環境変数を適用したりしません。
そのため、compose.yaml を変更した後は、以下を実行すべきです。
コンテナが正しく再作成されなかった疑いがある場合は、以下を使います。
ただし、ほとんどの場合は通常のdocker compose up -d で十分です。
七、Docker Compose のよく使うコマンド
現在の新しいバージョンの Docker では、通常以下を使います。
古いバージョンではなく:
プロジェクトを起動する:
-d はバックグラウンド実行を意味します。
プロジェクトの状態を確認する:
ログを確認する:
ログを継続的に確認する:
特定のサービスのみを確認する:
プロジェクト内のコンテナを停止するが、削除はしない:
再起動する:
プロジェクトのコンテナを停止して削除する:
イメージを再構築して起動する:
リモートのイメージをプルする:
Compose ファイルにフォーマットエラーがないか確認する:
確認だけして、完全な設定を出力したくない場合:
プロジェクトを更新する前に、私はまず以下を実行します。
何も出力がなければ、通常は設定の構文に問題はありません。
八、より確実なアップデート手順
プロジェクトが以下にあるとします。
まずプロジェクトディレクトリに移動します。
設定を確認する:
現在の実行状態を確認する:
新しいイメージをプルする:
コンテナを再作成する:
更新後の状態を確認する:
最後にログを確認する:
プログラムが正常に動作していれば、その後に古いイメージのクリーンアップを検討します。
クリーンアップ処理を更新手順の最初に置かないでください。
新しいバージョンが正常に動作していることを先に確認してから、古いイメージを削除します。そうすれば、問題が発生したときに少なくとも古いバージョンを再び使う機会が残ります。
九、データはどこに保存されるのか
Docker コンテナ自体は重要なデータを保存するのに適していません。
コンテナを削除すると、その書き込み可能層も削除されます。
長期間保存する必要があるデータは、通常次の 2 つの場所に置きます。
ボリュームを確認する:
特定のボリュームの情報を確認する:
例:
Compose でのよくあるボリュームの書き方:
こうすれば、コンテナを削除しても、postgres-data ボリュームは通常そのまま残ります。
ホストのディレクトリを使う場合は、次のように書きます。
左側がホスト側のディレクトリ:
右側がコンテナ内部のディレクトリ:
ここで最も問題になりやすいのは、パスの書き間違いです。
コンテナにもともと/app/config 内に設定ファイルが含まれているのに、空のディレクトリをマウントしたとします。
すると、コンテナ本来の/app/config がホストの空ディレクトリで上書きされます。
プログラムを起動すると、設定ファイルが突然消えたように振る舞います。
そのため、マウントする前にホスト側のディレクトリが存在するか、中に正しいファイルがあるかを確認しておくのが賢明です。
十、コンテナ同士の接続方法
同じ Compose プロジェクト内のサービスは、サービス名を使って直接接続できます。
例:
アプリケーションがデータベースに接続するとき、アドレスは次のように書くべきです。
コンテナの IP をハードコードしてはいけません。
コンテナを再作成すると IP アドレスは変わることがありますが、サービス名は通常変わりません。
Docker ネットワークを確認する:
ネットワークの詳細情報を確認する:
カスタムネットワークを作成する:
既存のコンテナをネットワークに追加する:
2 つのコンテナが互いにアクセスできない場合は、まず同じ Docker ネットワーク内にいるかどうかを確認してください。
十一、ポートをすべてパブリックネットワークに公開しない
以下の設定:
これは通常、ホストの 8080 ポートをコンテナの 80 ポートにマッピングすることを意味します。
デフォルトでは、すべてのネットワークインターフェースで待ち受ける可能性があります。
つまり、サーバーのファイアウォールが許可していれば、外部デバイスがこのポートにアクセスできる可能性があります。
サービスがホスト上の Nginx や OpenResty にのみ提供すればよい場合は、ローカルホストにバインドできます。
こうすれば、外部ネットワークからは直接アクセスできず、ホストのローカル接続のみが可能になります。
データベースや Redis も、通常はパブリックネットワークに直接公開する必要はありません。
同じ Compose ネットワーク内のアプリケーションは、直接アクセスできます。
すべての内部サービスにports を設定する必要はありません。
十二、リソース使用量の確認
全コンテナの CPU とメモリ使用量をリアルタイムで確認する:
1 回だけ出力する:
特定のコンテナを指定する:
コンテナ内のプロセスを確認する:
コンテナが突然終了した場合、メモリ不足でシステムによって強制終了されていないか確認できます。
次のように返ってきた場合:
このコンテナで OOM Kill(メモリ不足によるカーネルによる強制終了)が発生したことを示しています。
終了コードも確認できます:
再起動回数を確認する:
これらの情報は、コンテナが再起動を繰り返す問題の調査に非常に役立ちます。
十三、Docker のログがディスクを圧迫する理由
Docker はデフォルトでjson-file を使用してコンテナのログを保存することがあります。
ログローテーションを設定していないと、ログファイルが際限なく増え続けます。
変更する:
以下を追加します。
これは次のことを意味します。
変更が完了したら Docker を再起動します。
ただし、新しいログ設定は通常、以後作成されるコンテナにのみ適用されることに注意してください。
すでに存在するコンテナは再作成が必要な場合があります。
Compose でもサービスごとに個別に設定できます。
サーバーのディスク容量がなぜか減り続ける場合、データベースやアップロードファイルだけでなく、Docker のログも確認すべきです。
十四、Docker のスペースをクリーンアップする
停止済みのコンテナを削除する:
未使用のイメージ( dangling イメージ)を削除する:
使われていないネットワークを削除する:
使われていないボリュームを削除する:
総合的にクリーンアップする:
これらのコマンドはすべて確認を求められます。
しかし、「未使用」という言葉を見ただけで、その中のデータに価値がないと判断してはいけません。
例えば、データベースコンテナが削除された後、対応するボリュームは一時的にどのコンテナからも使われていない状態になることがあります。Docker はそれを未使用ボリュームと判断しますが、データベースファイルはまだその中にあります。
以下のコマンドを実行する前は、細心の注意が必要です。
特に以下:
通常の:
はコンテナとネットワークのみ削除します。
加上 -v 以后,还会删除项目使用的数据卷。如果 PostgreSQL、MySQL 或上传文件保存在这些数据卷中,数据也会一起消失。
クリーンアップの前に、少なくとも以下を確認しましょう。
不要把 docker system prune -a --volumes 当成日常清理命令。
これはむしろ「これらのものはすべて不要だと確認した」という意思を示すコマンドです。
十五、ディレクトリのパーミッションエラーへの対処
コンテナがホストのディレクトリをマウントした後、プログラムが次のようなエラーを出すことがあります。
まずホスト側のディレクトリのパーミッションを確認します。
ファイルに対応する UID と GID を確認する:
次にコンテナ内のプログラムが使用するユーザーを確認します。
コンテナが UID 1000、GID 1000 を使用している場合、実情に応じてホスト側のディレクトリの所有者を変更します。
権限の問題に遭遇したとき、多くの人はすぐに以下を実行します。
これで一時的に問題が解決することもありますが、通常は正しい対処法ではありません。
777 はすべてのユーザーに読み取り・書き込み・実行権限を与えるため、本当の UID、GID、ディレクトリの所有権の問題を隠してしまいます。
まずコンテナがどのユーザーで動作しているかを確認し、それから対応する権限を調整する方が、通常はより確実です。
十六、混同しやすいポイント
docker pull は実行中のコンテナを更新しない
これは単にイメージをダウンロードするだけです。
Compose プロジェクトを更新するには、さらに以下が必要です。
docker restart は新しい設定を適用しない
これは元のコンテナを再起動するだけです。
Compose ファイルを変更した後は、以下を使用すべきです。
コンテナを削除してもボリュームは削除されないとは限らない
通常の:
は名前付きボリュームを削除しません。
しかし:
はコンテナが使用している匿名ボリュームを削除する可能性があります。
コンテナ内で手動で変更したファイルは信頼できない
コンテナを再作成すると、変更内容が消える可能性があります。
長期間保持すべき設定は、Dockerfile、Compose ファイル、またはホストのマウントディレクトリに記述すべきです。
コンテナの IP に依存しない
コンテナ名または Compose のサービス名を使ってアクセスします。
すべてのポートをパブリックネットワークにマッピングしない
内部サービスはできるだけ Docker ネットワーク内に閉じ込めます。
十七、私が日常的に最もよく使うコマンド群
コンテナを確認する:
ログを確認する:
コンテナに入る:
リソースを確認する:
ディスク使用量を確認する:
Compose の設定を確認する:
Compose プロジェクトを更新する:
更新後の状態を確認する:
これらのコマンドで、日常的なデプロイ、更新、トラブルシューティングのほとんどをカバーできます。
おわりに
Docker で最も誤解されやすいのは、コンテナが小型のサーバーのように見えることです。
しかし、コンテナは仮想マシンではありません。
コンテナは、いつでも削除され、再作成され、置き換えられる実行環境のようなものです。本当に重要なものは、コンテナの中だけに置くべきではありません。
プログラムはイメージの中に、設定は Compose またはマウントディレクトリに、データはボリュームまたは独立したストレージに。コンテナに問題が起きたら、再作成すればよいのです。
これを理解すれば、多くの Docker コマンドを無理に暗記する必要はなくなります。
最後に、もう一度注意します。以下のようなパラメータを見かけたら、実行する前に一度止まって考えてください。
これらは必ずしも危険というわけではありませんが、データの削除、強制操作、コンテナ権限の拡大を意味することが多いです。
特にこのコマンド:
データのバックアップを確認するまでは、むやみに実行しないでください。