Skip to content

Instantly share code, notes, and snippets.

@Ryomasao
Last active March 23, 2021 23:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Ryomasao/d0eecd7c5311b9c8984d6d8fba098ac9 to your computer and use it in GitHub Desktop.
Save Ryomasao/d0eecd7c5311b9c8984d6d8fba098ac9 to your computer and use it in GitHub Desktop.

すべてを忘れた自分のためのDockerコマンドメモ

Docker基本

イメージを直接指定してアタッチする。 あんまり使わない。

$ 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

docker-compose基本

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

その他備忘録・コンテンツ化しそうなら切り出す

docker imageのタグについて

利用できるimageのtagは以下で参照できる。

https://registry.hub.docker.com/v1/repositories/<イメージ名>/tags

1コンテナ、複数デーモンについて

ひとつのコンテナの中で、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の-DFOREGROUNDについて

httpdで起動するのとなんか違いがあるんかな。

データの永続化について

https://qiita.com/onokatio/items/fcc9f8f94f8533bb030a

DBのコンテナつくるときに、docker-composedb-dataを指定するやつ。 仕組みとしては、volumesでホストOSのデータと同期してるのとかわんない。 パスを指定しなくてもdockerがいい感じに領域をつくってくれるっぽい。

mysqlイメージの初期データ設定について

mysqlのイメージでは、以下のディレクトリに置いてある、.sql or .shを実行していく。 なので、volumesでマウントして実行するとよさげ。

実行されるタイミングは、データベースが作成されていない初回起動のみ。

/docker-entrypoint-initdb.d

もし、再度実行しなおしたい場合は、volume、コンテナを削除して、upを行う。

volumeの削除

$ docker volume ls
$ docker volume rm volume-name

コンテナで使われている場合は削除できないので、コンテナを削除する。

$ docker-compose rm サービス名
$ docker rm コンテナ名

Dockerfileの書き方

COPY

コピーはビルド時にするので、イメージに含まれるってこと。

FROM mysql:5.7.29
COPY src dist 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment