from 30

30歳からwebエンジニアになったけど、思ったよりも苦しいので、その苦闘の記録をば

今更ながらDockerについて整理してみる[コマンド・基礎]

経緯

今年のre:inventもまあ盛り沢山な内容ですが、例に漏れずサーバレス関連も非常にたくさんのアップデートがあります。

中でも比較的注目されているのが、Lambdaでコンテナイメージがサポートされたことでしょうか。

実行時間やメモリなどはそのままなので、あくまで関数実行モデルはそのままに、コード実行よりも一つ下の層のコントロールが可能になったと言う感じでしょうか。

twitterで聞きかじった感じでは、GCPのCloudFunctionsでは既にコンテナイメージが使えるとのこと。

いずれにせよ、今までなんとなく避けてきたコンテナ関連について一度がっつり向き合ってみようと思い本記事を書くにいたりました。

今までのコンテナ経験

ANGEL Dojo等の催しを通して、一通りのハンズオンでrailsやexpressのアプリケーションをECSへデプロイしてみたことはやったことあります。

あとは、Lambdaのruntimeでpython3.8からAmazonLinux2ベースになっているので、ちょっとした検証をしたことはあるかなって程度です。

$ docker run -it amazon/aws-sam-cli-build-image-python3.8:latest /bin/bash

ぼんやりコマンドのことはわかるけど、細かくはわからないというのが現状です。

まあ、逆に言えば、この程度のことも知らずにそれらしいものを作れるのだから、AWSにおけるサーバレス関連のエコシステムが如何に完成度が高いのかってのの証左でもありますよね(自分を棚にあげた言い訳)

全体像

まずは手元のPCでどうオペレーションするのかというところを中心に以下のような範囲でまとめてみました。

f:id:kohski:20201206180904p:plain

以降はユースケース別にコマンドやオプションについてわかったことを触れてみます。

1. Docker Imageを取得する

docker imageをpullしてくる

$ docker pull <イメージ名>
  • <イメージ名/>のところは<hostname>:<port>/<username>/<repository>:<tag>が省略しない形
  • hostname = regitory-1.docker.io / username = library / tag = latestがデフォルトになっている。
  • registryをdockerhubから変更したい時(ECRとか)はhostnameのを省略せずに記載する。

2. Docker Imageを削除する

docekr rmi <イメージ名 | イメージID>

3. Dockerコンテナを作成して起動する

$ docker run hello-world
$ docker run -it ubuntu bash
  • imageを元にcontainerを起動
  • 第二引数はデフォルトコマンド(DockerfileのCMDインストラクション)を上書きしている
  • Hostにイメージがない時は、dockerhubからpullしてくる。
  • run = create + start
$ dcoker create <コンテナ名 | コンテナID>
$ docker start <コンテナ名 | コンテナID>
  • オプション
    • -i ... インタラクティブ。STDINを開いたままにする
    • -t ... TTYの略。擬似TTYの割当。表示がきれいになる
    • --name
      • コンテナに名前をつける
      • 共有サーバーでコンテナを立てる時などに使用
      • 名前が重複する場合はエラーになるので注意 run = create + start
    • -d ... ディタッチドモード
    • --rm ... Exitになったときにコンテナを削除する(ちょっと手元で試すときに多用)
    • -v
    • -u
      • ユーザーとグループの指定
      • <ユーザ名>:<所有グループ>
    • -p
      • publishの略
      • <ホストのポート>:<コンテナのポート>
    • --cpus ... コンテナがアクセスできる上限のCPUを設定
    • --memory <bytes> ... メモリの上限
docker run -v $(pwd)/mounted_folder:/new_dir -u $(id -u):$(id -g) -it <コンテナID> bash
docker run -it a146787c385e bash

4. コンテナの一覧を確認する

起動中のdockerのコンテナ一覧

$ docker ps
$ docker ps -a
  • -a ... 停止中のコンテナも含めて表示

5. コンテナのプロセスに入る

$ docker exec -it <コンテナID / コンテナ名> bash

6. コンテナから出る

detach

docker ps -a するとstatusがUpのままになる vscodeのterminalを使っているとキーバインドの関係でうまくいかないので、iTermとかで試すといいかも。

ctrl + p + q 

なお、入り直す時は、

$ docker attach <コンテナID / コンテナ名> bash

exit

プロセスを殺して出る。

# exit

docker ps -a するとstatusがExitedになる

7. コンテナを削除する

$ docker rm <コンテナID>

StatusがCreate, Existedなものは削除可能

$ docker stop <コンテナID> <コンテナID> ...

Up状態のコンテナをExitedにする

一括してstopにしたいときは以下のようにコマンドのネスト実行が有効。以下2つは同じ意味。

$ docker stop $(docker ps -a -q)
$ docker stop `docker ps -a -q`
$ docker system prune

stopしているコンテナや

8. コンテナから直接イメージを作成する

まずはdocker execしてコンテナ内で作業 その後、docker commitする

$ docker commit <対象のコンテナID> コンテナ名称
$ docker tag <イメージ名:タグ> <dockerhubのユーザー名/リポジトリ名>
$ docker push <dockerhubのユーザー名/リポジトリ名>

変更されたレイヤーだけpushされる 元にしていたubuntuイメージはdockerhub内で共有されている

f:id:kohski:20201205125927p:plain