イメージを直接指定してアタッチする。 あんまり使わない。
$ docker run -it IMAGE bash
Dockerfile
でイメージを指定して、それをもとにビルド〜起動する。
FROM php:5.6-apache
COPY src/ /var/www/html/
ビルドするとイメージができる。 このイメージは、大本のimageにDockerfileで記載したコマンドがレイヤーとして重なってるもの。
$ docker build .
//イメージにタグをつけると何につかってるかわかりやすいね
$ docker build -t my-web-app .
$ docker ps -a
REPOSITORY TAG IMAGE ID CREATED SIZE
php-5.6-apache latest ab48c9989831 24 seconds ago 355MB
php my-web-app 24c791995c1e 15 months ago 355MB
イメージからコンテナを起動してコマンドを叩く。
$ docker run イメージID /bin/echo 'Hello World'
//叩く度に、コンテナが作成されていくので単発で叩くのであれば--rmオプションをつけるのがいい
$ docker run --rm イメージID /bin/echo 'Hello World'
ひとまず、コンテナ起動してコンテナの中に入りたいでやんす。
$ docker run --rm -it イメージID /bin/bash
コンテナ内のファイルをホストOSにコピーしたい。 https://qiita.com/gologo13/items/7e4e404af80377b48fd5
$ docker cp <コンテナID>:/etc/httpd/conf/httpd.conf httpd.conf
逆
$ docker cp httpd.conf <コンテナID>:/etc/httpd/conf/httpd.conf
とりあえずphpを試したい。 ホストOSの実行ディレクトリをdocrootにして、Apacheモジュールとして実行する。 php-cliも入ってた。 これは最高。
$ docker run -d -p 8000:80 --name my-apache-php-app -v "$PWD":/var/www/html php:7.2-apache
$ docker exec -it コンテナ名 bash
https://qiita.com/mom0tomo/items/f536e6759d3f42d58ffc https://qiita.com/wasanx25/items/d47caf37b79e855af95f
ひとまず、コンテナ起動してコンテナの中に入りたいでやんす。
$ docker-compose run --rm サービス名 /bin/bash
docker-compose run
はアドホック的にコンテナを起動する。
docker-composeで定義したcontainer_name
とかも割り当てられない。
記憶が曖昧だけど、ネットワークも割り当てられなかったかも。
基本的に、コンテナ内で単発でおわるコマンドを実行したいときに使うものなのかな。
mysqlのイメージをrunで起動したとき、ctrl + c
では終了できなくって、docker stop コンテナ名
で個別に終了した。
これもなんでだろう。
→ デーモンが起動するコンテナに入るのであれば、upで起動した上で、docker-compose exec サービス名 bash
で接続するのがよさげ。
サービスを開始、再起動する。 サービスに紐づくコンテナがあれば、コンテナを起動。なければイメージからコンテナを作成して起動してくれる。
$ dokcer-compose up
停止したコンテナを起動する。
$ dokcer-compose start
//使ってない、コンテナ、イメージ、ネットワークを消す
$ docker system prune
//使ってない、イメージを消す
$ docker image prune
//使ってない、コンテナを消す
$ docker container prune
利用できるimageのtagは以下で参照できる。
https://registry.hub.docker.com/v1/repositories/<イメージ名>/tags
ひとつのコンテナの中で、httpdとmemcachedを起動しようと思った。 Dockerはフォアグラウンドで処理を動かし続ける必要があるので、シェルスクリプトで各サービスをラップした処理を起動させる必要がある。 https://docs.docker.com/config/containers/multi-service_container/ https://www.itmedia.co.jp/enterprise/articles/1602/17/news004.html
今回はシンプルにコンテナをわけることにしたので、上記はやってない。
1コンテナ・1アプリケーションのポリシーを厳密に適用してしまうと、コンテナの数が膨大になることが予想されます。
FTPサーバー別でたてんのかとかいわれるとたしかに。
なんで1コンテナ複数デーモンがまずいんだっけってのは、この記事が参考になった。
https://goodbyegangster.hatenablog.com/entry/2019/05/25/230517
- ゾンビプロセスができないように管理する必要がある
- ふつうのLinuxであればプロセスの一番親になる
systemd
(昔はinit
)が存在していて、ゾンビプロセスがいればいい感じに対応してくれる - Dockerには、
systemd
が存在してなくって、CMD(or ENTORYPOINT)で指定した処理がプロセスの一番親になる - なので、フォーク処理があるプロセスをkillした場合、子がゾンビになりっぱなしになってしまう
ふつうのLinuxの書籍に、forkした親は子をwaitpidで待ってあげるが、sigactionとかで俺は子を待たないんだぞ!って宣言する必要があることが書かれてたね。
systemd
がゾンビプロセスの対応をするのは知らなかった。
https://meetup-jp.toast.com/2162
httpd
で起動するのとなんか違いがあるんかな。
https://qiita.com/onokatio/items/fcc9f8f94f8533bb030a
DBのコンテナつくるときに、docker-compose
でdb-data
を指定するやつ。
仕組みとしては、volumesでホストOSのデータと同期してるのとかわんない。
パスを指定しなくてもdockerがいい感じに領域をつくってくれるっぽい。
mysqlのイメージでは、以下のディレクトリに置いてある、.sql
or .sh
を実行していく。
なので、volumesでマウントして実行するとよさげ。
実行されるタイミングは、データベースが作成されていない初回起動のみ。
/docker-entrypoint-initdb.d
もし、再度実行しなおしたい場合は、volume、コンテナを削除して、upを行う。
$ docker volume ls
$ docker volume rm volume-name
コンテナで使われている場合は削除できないので、コンテナを削除する。
$ docker-compose rm サービス名
$ docker rm コンテナ名
コピーはビルド時にするので、イメージに含まれるってこと。
FROM mysql:5.7.29
COPY src dist