Featured image of post Dockerのメモ

Dockerのメモ

目次

概要

よく使うDockerのコマンドのメモ。

Docker

Lifecycle

Docker全体のライフサイクル

DockerのLifecycleの全体像は次のような形になる。

image

Conatinerのライフサイクル

Conatinerに関しては次のライフサイクルを持つ。

container

Dockerの基本コマンド

1
2
3
$ docker version
$ docker info
$ docker login

Image

Dockerfile -> Image

buildコマンドはDockerfileをビルドしてcontainer imageを作る。

1
2
$ docker build --no-cache
$ docker build -t REPOSITORY[:tag] .

Image <-> Registry

1
2
3
$ docker push REPOSITORY[:tag]
$ docker pull REPOSITORY[:tag]
$ docker search KEYWORDS

Image操作

1
2
3
4
$ docker images -a
$ docker rmi IMAGE
$ docker history IMAGE 
$ docker inspect IMAGE

Images -> Containers

runコマンドは、作ったcontainer imageをcontainer processにする。

1
2
$ docker run  [OPTIONS] REPOSITORY[:TAG] CMD # run=create+start
$ docker run -i -t -d -p 80:80 REPOSITORY[:TAG] CMD

Containers

Container操作

以下はコンテナ関連のコマンド。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ docker ps -a

$ docker create IMAGE
$ docker start CONTAINER
$ docker stop CONTAINER
$ docker kill CONTAINER
$ docker rm [CONTAINER...]

$ docker diff CONTAINER
$ docker top CONTAINER
$ docker events CONTAINER
$ docker logs CONTAINER

Host -> Containers

既に起動しているContainer processにアタッチする。

1
2
3
4
$ docker attach CONTAINER
$ docker exec CONTAINER CMD
$ docker exec -it CONTAINER CMD
$ export TERM=xterm

Backup

Backup Image

Docker Imageのバックアップ。

1
2
$ docker save IMAGE > FILE
$ docker load < FILE

Backup Container

Docker Containerのバックアップ。

1
2
3
4
$ docker commit -m "msg" CONTAINER REPOSITORY[:TAG]
$ docker tag IMAGE REPOSITORY[:tag]
$ docker export CONTAINER > FILE
$ docker import FILE

Backup Container File

Docker Container内のファイルのバックアップ。

1
$ docker cp CONTAINER:FILE ./

docker-machine

今はないdocker-machineコマンド。

1
2
3
4
5
6
7
8
9
$ docker-machine create --driver virtualbox default
$ docker-machine env default 
$ docker-machine regenerate-certs default # 認証書の再作成
$ docker-machine rm default
$ docker-machine start default
$ docker-machine ls
$ docker-machine ssh
$ docker-machine ip
$ eval $(docker-machine env default) # docker-machineとdockerの連携

Volume

Data Volume

1
2
3
4
5
$ docker volume create --name HOGE
$ docker volume ls
$ docker run -v /<containerVolumepath> # containerに新しいvolumeを作成
$ docker run -v /<hostDirectorypath>:/<containerVolumepath> # hostのdirectoryをcontainerのvolumesにマウント$ docker run -v /<hostDirectorypath>:/<containerVolumepath>:ro # リードオンリーでマウント
$ docker inspect CONTAINER # Mounts項目で確認

Network

None

ネットワーク接続を必要としないコンテナを作成する場合に使用される。

None

Bridge

dockerのデフォルトの挙動。

Bridge

Host

Docker ホストマシンと同じネットワークインタフェース、IP アドレスを持つようになる。

Host

違い系

ホストとコンテナの違い

  • ホストはDockerを実行する環境
  • コンテナはContainer processの内部環境

ArgsとEnvの違い

  • ARG
    • build時に使われる
    • ビルド後のImage内では値は残らない
    • そのため、次のようにセットすることも一般的
    1
    2
    
      ARG VERSION=latest
      ENV MY_APP_VERSION=$VERSION
    
    • docker build --build-arg VERSION=1.2.3 . みたいな形でsetする
  • ENV
    • ENVは実行時に使われる環境変数
    • ENVはImageそのものに記憶される
    • .envを読み込む事も可能

CMDとRUNの違い

  • RUN
    • ビルド時に実行され、イメージに変更を加えるためのコマンド
  • CMD
    • Dockerコンテナが起動された際に実行されるデフォルトのコマンド

RUNとENTRYPOINTの違い

  • CMD
    • コンテナが起動する際に実行されるデフォルトのコマンド
    • ただし、ENTRYPOINTと組み合わせた場合はENTRYPOINTのデフォルトの引数として機能する
      1
      2
      
      ENTRYPOINT ["curl"]
      CMD ["http://example.com"]
      
  • ENTRYPOINT
    • ENTRYPOINTはコンテナのメインの実行コマンドを固定する
    • ENTRYPOINTで指定されたコマンドは、コンテナが実行される際にいつも呼び出される
    • スタートアップスクリプト(例えばentrypoint.sh)を通じて、複数のコマンドを実行することが目的

Tips

Dockerfileの分割の定番

Dev, Stg, ProdなどでDockerfileを分けたいときは、おおむね次の三つの方法を使う。

  • docker-composeのoverwrideを使う
  • multi stageを使う
  • Dockerfile.xxxとファイルを分割する

ログが分かりにくい時

ログが分かりにくい時は、はファイルに出力する。

1
$ docker-compose logs -f -t >> myDockerCompose.log

docker-composeのbuildの際に注意すること

  • docker-compose upする前にdocker-compose downする。
  • docker-compose psでpsの確認する。
  • 開発するときはタブラローサからdocker execしてインタラクティブに開発する
  • ビルドする場合は、docker-compose up --buildする
  • キャッシュを飛ばしてビルドする場合は、docker-compose up --build --no-cachedする
  • COPYADDはファイルに変更があった場合は、cacheがhitしないので注意
  • 時間のかかるrequirements.txtなどは先にADD requirements.txt .してRUN pip install -r requirements.txtする
  • 消すときはdocker-compose down --remove-orphansを使う。
  • すると、定義していないコンテナも消せる。

Docker Buildがうまく動かない時

Dockerが動かないときは、とりあえずエラー前でSleepコマンドを入れて動くDockerfileにする。

1
CMD ["sleep" "10000"]

次のコマンドを実行して起動する。

1
2
$ docker build -t hoge .
$ docker run hoge 

その後、次のように実行して、実際のRUNのコマンドを確認する。

1
$ docker exec hoge /bin/bash

Dockerのお掃除

以下は肥大化したDockerfile関連のファイルを消す。

1
2
3
$ docker image prune -a
$ docker container prune
$ docker volume prune

最近は次のコマンドでも実行が可能。

1
$ docker system prune --volumes

Docker Imageの大きさ

  • ECRなどのリポジトリにPushしたDocker ImageとローカルのDocker Imageのサイズには差があるので注意
  • --no-truncをつけて、フルメッセージを確認して、どこのレイヤーが重いのかを確認するのが大切
1
2
$ docker image | grep xxx
$ docker hisotry xxx --no-trunc > hoge.txt

Dockerの使い方の例

シンプルにRUNする

一番シンプルな使い方。

1
$ docker run -it --rm -d -p 8080:80 --name web nginx

停止は次のコマンド

1
$ docker stop web

VSCodeのDocker Extension

VSCodeのDocker Extensionが簡単なので、おすすめ。

VSCode Docker Extension

ボリュームにファイルを置く

カスタムHTMLを追加する使い方。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Docker Nginx</title>
</head>
<body>
  <h2>Hello from Nginx container</h2>
</body>
</html>

コマンドは次となる。

1
$ docker run -it --rm -d -p 8080:80 --name web -v ~/site-content:/usr/share/nginx/html nginx

継承したDockerfileを用意する

1
2
FROM nginx:latest
COPY ./site-content/index.html /usr/share/nginx/html/index.html

重要なのは、ENTRYPOINTCMDなどは不要ということ。それらはベースのNGINXのイメージのを使えるから。

ビルドする。

1
$ docker build -t webserver .

実行する。

1
$ docker run -it --rm -d -p 8080:80 --name web webserver

マルチステージでビルドして渡す

シンプルに次のようなフロントのファイル構成で、

1
2
$ ls -al 
packages.json package-lock.json app.js 

次のようにマルチステージでビルドする。そして、そのビルド後のファイルを持ってくる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
FROM node:12.18.2 as builder

WORKDIR /app

COPY ./package.json /app/package.json
COPY ./package-lock.json /app/package-lock.json

RUN yarn install
COPY . .
RUN yarn build

FROM nginx
COPY ./nginx/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=builder /app/build /usr/share/nginx/html

設定ファイルは次のようになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
conf:nginx.conf
server { 
 listen 80;
 server_name frontend;
 location / {
   # This would be the directory where your React app's static files are stored at
   root /usr/share/nginx/html;
   try_files $uri /index.html;
 }
}

ビルド時の不要なファイルは省かれるのでスリムになる。

References

Built with Hugo
テーマ StackJimmy によって設計されています。