🐳

【Docker】Dockerコマンド・Docker Composeコマンド一覧(随時更新中)

2024/06/21に公開

基本コマンド

コマンド一覧確認(docker help)

docker help

バージョン確認(docker version)

簡単なバージョン確認
docker --version または docker -v
詳細なバージョン確認
docker version

システム全体の情報(docker info)

docker info

コンテナ管理

実行中のコンテナの一覧を表示(docker ps)

docker ps
出力結果
出力結果
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS      NAMES
7737320eb61a   myapp     "/bin/bash"   27 minutes ago   Up 23 minutes   8000/tcp   mystifying_kepler


1つのコンテナ(ID:7737320eb61a )が実行中であることがわかる。

実行中、停止中も含めた全てのコンテナの一覧を表示(docker ps -a)

docker ps -a

実行中のコンテナを停止(docker stop)

<container>へはCONTAINER IDまたはNAMESが入る
docker stop <container>
出力結果
出力結果
$ docker stop mystifying_kepler


1つのコンテナ(NAME:mystifying_kepler)が停止されたことがわかる。

既存のコンテナを起動(docker start)

<container>へはCONTAINER IDまたはNAMESが入る
docker start <container>
出力結果
出力結果
$ docker start mystifying_kepler


1つのコンテナ(NAME:mystifying_kepler)が開始されたことがわかる。

コンテナ再起動(docker restart)

<container>へはCONTAINER IDまたはNAMESが入る
docker restart <container>

停止中のコンテナを削除(docker rm)

<container>へはCONTAINER IDまたはNAMESが入る
docker rm <container>

コンテナのログを表示(docker logs)

<container>へはCONTAINER IDまたはNAMESが入る
docker logs <container>
-fコマンドをつけることでリアルタイムでログの監視が可能となる
docker logs -f <container>

コンテナの名前を変更(docker rename)

docker rename <OLD_NAME> <NEW_NAME>

イメージから新しいコンテナのを起動し、名前を付ける(docker run --name)

docker run --name <CONTAINER NAME> <IMAGE NAME>

イメージから新しいコンテナを作成し、対話型モードを実行(docker run -it)

<image>へはDockerイメージの名前またはイメージIDが入る
docker run -it <image>
<image>へはDockerイメージの名前またはイメージIDが入る。<shell>はshellを指定できる。
docker run -it <image> <shell>
-itとは?

-iオプションは標準入力(stdin)を開いたままにし、-tオプションは仮想端末(tty)を割り当てるという意味になる。
・標準入力(Standard Input、略してstdin)は、プログラムが外部からデータを受け取るための一般的なチャネルのこと。
・仮想端末(tty)は、標準入出力先のデバイスとのこと。Dockerにおけるttyは、仮想端末を配置するコマンドである。

<shell>に入る内容とは?
様々なshellが指定できる!
/bin/bash
/bin/sh
/bin/ash
/usr/bin/env python
/bin/zsh
任意のシェルやスクリプト

例)

<shell>を指定しない方法 → REPLシェル(デフォルトのシェル)が起動
docker run -it python:latest
<shell>を指定する方法 → Bashシェル(指定したシェル)が起動
docker run -it python:latest /bin/bash

<shell>を指定するかしないかは以下のように分かれる。
BashシェルとREPLシェルは用途が異なる。システム管理や全般的な操作にはBashシェル、プログラミングやデバッグにはREPLシェルがそれぞれ適している。目的に応じて使い分けることが重要である。

コンテナ内でコマンドを実行(シェルを起動せずに)

<container>へはCONTAINER IDまたはNAMESが入る。
docker exec <container> <コマンド>

実行中のコンテナに対して対話型シェルを開く(docker exec -it)

<container>へはCONTAINER IDまたはNAMESが入る。<shell>はshellを指定する。
docker exec -it <container> <shell>

イメージから新しいコンテナをバックグラウンドで実行(docker run -d)

<image>へはDockerイメージの名前またはイメージIDが入る
docker run -d <image>
バックグラウンドでコンテナを実行する必要性

GPTより

非対話的な実行:
バックグラウンドでコンテナを実行することは、対話的な入出力が必要ない場合に適しています。例えば、サービスやデーモンのような長時間実行されるプロセスをバックグラウンドで実行する際に有用です。

スケジュールされたジョブ:
定期的に実行されるジョブやタスクを自動化する場合、バックグラウンドでコンテナを実行しておくと便利です。これにより、タスクが自動的に実行されるようになります。

リソースの効率的な利用:
バックグラウンドで実行されるコンテナは、ホストシステムのリソースを効率的に利用することができます。特に、サービスやアプリケーションが常時起動している場合には、バックグラウンドで実行することで、他のプロセスやサービスとのリソース競合を避けることができます。

ログの管理:
バックグラウンドで実行されるコンテナは、ログをファイルやログサービスにリダイレクトすることができます。これにより、実行ログの効果的な管理が可能になります。

手動操作の回避:
ターミナルやコマンドラインが使用できない状況下で、自動化されたプロセスを実行する場合、バックグラウンドでコンテナを実行することで手動操作を回避できます。

イメージ管理

ローカルにあるDockerイメージの一覧を表示(docker images)

docker images

DockerイメージをDocker Hubから取得する(docker pull)

<image>へはDockerイメージの名前またはイメージIDが入る
docker pull <image>
イメージをダウンロードする手順(例:Pythonイメージ)
  1. 以下のサイトから使用したいimageを選びダウンロードする

https://hub.docker.com/search?image_filter=official

  1. 右上のコマンドをコピーする

  2. ターミナルで実行しダウンロードする

docker pull python
  1. イメージのコンテナを起動する
docker run -it python:latest /bin/bash
  1. 対話型モードで実行可能となる
$ docker run -it python:latest /bin/bash
root@953bba1d8603:/# 

イメージをビルド(docker build)

docker build [ -t <image_name>:<tag_name> <dockerfile_directory> ]

docker buildのみだとイメージに名前とタグが付かない。

イメージの削除(docker rmi)

<image_id>または<repository>
docker rmi <image_id> または docker rmi <repository>:<tag>

未使用のイメージを削除(docker image prune)

docker image prune

Dockerレジストリ関連

Dockerレジストリへログイン(docker login)

コマンド実行後、UsernameとPasswordを入力
docker login

Dockerレジストリへログアウト(docker logout)

docker logout

Dockerイメージをレジストリ(Docker Hub)へアップロードする(docker push)

<local_image
docker push <local_repository_name>/<tagname>

★Docker HubにimageをPushする方法★
https://zenn.dev/code_journey_ys/articles/bc2cf770657e96

docker-compose.ymlファイルに定義されているサービスを起動(docker-compose up)

docker-compose up 

※イメージのビルドは行いません。すでにビルドされたイメージが存在する場合、そのイメージを使用してコンテナを起動します。つまり、最新のイメージでない可能性があります。最新のイメージを用いたい場合は、以下の--buildオプションを用いたコマンドを実行します。

docker-compose up --build
--buildの意味
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db

上記Dockerfilewebの部分のbuildキー部分のディレクトリにあるDockerfileをビルドするという意味になる。上記の例の場合は、カレントディレクトリ(.)にあるDockerfileを使用してコンテナイメージをビルドすることを示している。

ネットワーク管理

Dockerネットワークの一覧を表示(docker network ls)

docker network ls

Dockerネットワークの作成(docker network create)

docker network rm <NETWORK ID> or <NETWORK NAME>

※オプションで、ドライバ、サブネット、IPレンジなどを指定可能することができる。

docker-compose.ymlファイルでdocker-net-workをCreateするには
services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    networks: # この部分の記述をする
      - my-network
    depends_on:
      - db

  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    ports:
      - "5432:5432"
    networks: # この部分の記述をする
      - my-network

networks: # この部分の記述をする
  my-network:

Dockerネットワークの詳細確認(docker network inspect)

docker network inspect <NETWORK ID> or <NETWORK NAME>

※ネットワークID、名前、ドライバー、サブネット、IPレンジ、接続しているコンテナの情報などを表示することができる。

docker-compose.ymlファイルでdocker-net-workをCreateし、ネットワークとコンテナが同一ネットワーク内にあるか確認する方法
> docker network inspect 45dbd0a440c4
[
    {
        "Name": "test-python_my-network",
        "Id": "45dbd0a440c40a39718eb402f547e85928bf923891161a8df37760530229dbfe",
        "Created": "2024-06-23T12:39:33.433387996Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "c317fb7d665633fd0b0c07011a430aa212b5bf743d7fb953bcf809cb5442b4dd": {
                "Name": "test-python-db-1",  ← データベースのコンテナ
                "EndpointID": "9995764498c3b4721088c3606e7265c7c4af3750a9d08b7d77dc2c9b3c1de52f",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            },
            "e3f581d2bc8c9bb1fbe8822d6184344e16c2ed256959d242d9addc75901b4e7f": {
                "Name": "test-python-web-1", ← アプリケーションのコンテナ
                "EndpointID": "e1dd29ff939ec2134af555c3cbed28a456ea713195d3257c05216647f9bc1a1f",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "my-network",
            "com.docker.compose.project": "test-python",
            "com.docker.compose.version": "2.27.0"
        }
    }
]

実行中のコンテナを指定したネットワークに接続(docker network connect)

docker network connect <NETWORK NAME> <CONTAINER NAME>

既に起動しているコンテナをネットワークに接続できる
接続したコンテナは、ネットワーク内の他のコンテナと通信できるようになる

実行中のコンテナをネットワークから切断(docker network disconnect)

docker network disconnect <NETWORK NAME> <CONTAINER NAME>

ネットワークに接続しているコンテナを切断できる
切断したコンテナは、ネットワーク内の他のコンテナと通信できなくなる

Dockerネットワークの削除(docker network rm)

docker network rm <NETWORK ID> or <NETWORK NAME>

ボリューム管理

Dockerボリュームの一覧を表示(docker volume ls)

docker volume ls

Dockerボリュームの作成(docker volume create)

docker volume create <VOLUME NAME>

Dockerボリュームの削除(docker volume rm)

docker volume rm <VOLUME NAME>

名前付きボリュームの実行(

docker run -v <VOLUME NAME>:/<コンテナのvolume用ディレクトリ> sample/image:latest
ubuntuイメージからtest-containerというコンテナ名をつけ、test-volumeというボリューム名のtest/_dataディレクトリにデータを保存していくという記述。
docker run -it --name test-container -v test-volume:/test/_data ubuntu:latest /bin/bash
実行詳細
コンテナを作成し、testファイルの作成を実行
> docker run -it --name test-container -v test-volume:/test/_data ubuntu:latest /bin/bash                                                
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
9c704ecd0c69: Pull complete
Digest: sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30
Status: Downloaded newer image for ubuntu:latest
root@9e35313638f7:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
root@9e35313638f7:/# cd test
root@9e35313638f7:/test# ls
_data
root@9e35313638f7:/test# cd _data
root@9e35313638f7:/test/_data# ls
root@9e35313638f7:/test/_data# touch test
root@9e35313638f7:/test/_data# ls
test
root@9e35313638f7:/test/_data#

参考:
https://qiita.com/aki_55p/items/63c47214cab7bcb027e0

Discussion