Dockerを使ってて遭遇したトラブルとかそういうのです。docker-composeもある。
メモ書き程度ですが何かの役に立つかも知れない。
目次
docker-compose のコンテナにはattachできない
docker-compose upで作成したコンテナに、dockerコマンドで attachしようとしたけどうまく動いてくれませんでした。
ググってみるとどうも他でもそうらしい。
参考: docker-composeで作成したcontainerにattach
docker-composeのコンテナには、docker-compose execでattachするのがよさそう。
dockerコンテナからdockerを操作する
docker.sockファイルを共有するって力技。面白い。
コンテナの中から別のコンテナを実行させたくて調べてるときに見つけました。
参考:Docker コンテナ内から他の Docker コンテナに docker exec する
docker-composeで「指定されたファイルが見つかりません」と表示される。
Windows環境で次のようになる場合。
> docker-compose up ERROR: Windows named pipe error: 指定されたファイルが見つかりません。 (code: 2)
単純にDockerサービスが落ちてた。
docker-composeでvolumeが使えない
Windowsで「ERROR: Cannot create container for service app: b'Drive sharing seems blocked by a firewall'」とエラーが出てマウントできないとき。
ほんとにファイアウォールに邪魔されてた。
参考:Windows10 × Docker for Windows トラブルシューティング
まさにウチもカスペルスキーを使っていて、先のリンクにあるように「プロテクション > ファイアウォール > ネットワーク > DockerNAT」を「許可するネットワーク」にしたら通りました。感謝。
dockerでentrypointを実行しつつcommandも実行する
コンテナが起動したときのデフォルト実行スクリプトみたいな感じにできます。
要は最後に「exec "$@"」を実行するシェルスクリプトを作成して、entrypointに設定する。
そうするとそのスクリプトは実行されるし、引数として取ったcommandも実行されるしってわけ。
参考:Docker ENTRYPOINT & CMD: Dockerfile best practices
Docker RUNは一つづつ別々に実行している
RUN cd /usr/local/src
RUN wget xxx
とするとwgetでダウンロードしたものは 「/」 に保存されます。
コマンドを続けて実行したいのであれば、次のようにします。
RUN cd /usr/local/src; \
wget xxx
Dockerコンテナ内からホストマシンのIPアドレスを指定する (Win/Mac)
コンテナ内からホストマシンのIPを指定したときは、host.docker.internal
と記載するとDNSで名前解決してくれます。
またホストマシンでも host.docker.internal
でアクセスすると、Dockerコンテナのホストを名前解決してくれるようです。
例えばngixnでportsを8080:80でフォワーディングし、ホストマシンから host.docker.internal:8080
とするとアクセスできます。
参考:
- https://docs.docker.com/docker-for-windows/networking/#use-cases-and-workaroundsc
- https://qiita.com/xanagi/items/8d958425597947435fee