おそらく複数の内容がチャンポンしてしまっているのかも知れません。切り分けの第一歩として、コマンドの意味から入って、各々の動作を確認するのが急がば回れだと思います。
docker \
# コンテナを実行する。コンテナが存在しない場合は、Dockerfile の内容を
# もとに作成してから実行する。
run \
# -d は detach(切り離す)の略。コンテナ起動後、ターミナル/コマンドプロン
# プトを閉じても動き続けるようにバックグラウンドで実行する、の意。
-d \
# -p は publish(公開)の略。コンテナのポートを外部からアクセスできる
# ようにポートを公開する、の意。8080:80 は、ホスト(Docker が動いてい
# るマシン)の 8080 番ポートを公開し、外部からの接続をコンテナの 80 番
# ポートに転送する。これによりホストから、もしくはホスト以外の他のマシンか
# らホストの 8080 ポートにアクセスするとコンテナの 80 番に接続できる。
-p 8080:80 \
# -v は volume の略。ホストのローカル・ディレクトリをコンテナにマウントす
# るの意。ローカルの `/var/docker/cont1/htdocs` ディレクトリは、コ
# ンテナの `/usr/local/apache2/htdocs` にマウントされる。ハード
# ディスクやドライブでもないのにマウントというのは Linux の習慣。Linux
# ではフォルダもディスクもデバイスも全て「ファイル」として扱うため。
-v /var/docker/cont1/htdocs:/usr/local/apache2/htdocs
# --name はコンテナの名前。Docker 内部のネットワークで、コンテナを認
# 識するためのホスト名(コンピューター名)の意。他のコンテナを同時に起動し
# た場合に、他のコンテナから `ping cont1` のように、ホスト名でアクセス
# できる。ホスト側では使えないホスト名で、コンテナの名前確認用としてしか
# 機能しない。
--name cont1 \
# コンテナの元(雛形)となる Docker イメージの名前。
httpd
@tonberry1050 さんがおっしゃるように、ホスト(ローカル)の 8080 番ポートがすでに使われている場合は、-p 8081:80
のようにポートを変更してどうか、になります。
もし http://localhost:8081/
で接続できた場合は、試行錯誤している間に作成した、裏で起動している他のコンテナが 8080
を使っている可能性があります。もしくは、他のローカルのサービスが利用していることになります。
起動しているコンテナが他にもないかの確認は、@tonberry1050 さんの docker ps -a
で起動 & 終了しているコンテナのプロセス(ps
)を確認できます。
また、docker ls -a
により、起動中 & 終了含めた、作成された全てのコンテナを確認することができます。
一度終了してしまったコンテナの再起動は面倒、かつ意図しない挙動につながるので、docker container prune
コマンドで、使われていないコンテナを削除することをオススメします。(prune
はコンテナの搾りカスを処分するコマンドです)
Docker は体で覚えることが多く、最初のうちはコンテナを作っては壊し、を繰り返します。しかし、それ(作りなおされること)が前提なのが Docker のいいところでもあります。
$ docker container ls -la
$ docker image ls -a
上記の 2 つのコマンドで大量に出てきた場合は、以下のコマンドで真っさらにしてから再チャレンジすると安定すると思います。
このコマンドは、イメージとコンテナをすべて削除します。そのため、docker run
や docker build
で、ベースとなるイメージも再ダウンロードされます。しかし、色々といじっている間に壊れたイメージやコンテナも再作成されるので、最初のうちは定期的に実行して綺麗な(シンプルな)状態で試すのが良いと思います。