コンテナと仮想マシン
VMwareの仮想マシンとは使い方がかなり違うので、そちらに慣れていると初めたてのころは戸惑うかもしれない。
VMwareの仮想マシンではインスタンスを生成した後、依存パッケージやプログラムをインストールした状態を保存して使うが、Dockerはインスタンスを生成するときにdockerfileに従って必要な依存パッケージやプログラムをインストールする。
生成したインスタンスはイメージと呼ばれ、イメージを元にコンテナを生成する。生成したコンテナは、タグやダイジェストを指定して外部からアクセスできる。
docker runで生成したコンテナ内で作業した内容は、docker commitでイメージに保存することができるが、-vオプションを使ってホストとコンテナのディレクトリを共有することができるのでdocker commitはあまり使われない。
一般的にDocker単体で使うことは少なく、Docker Composeというツールを使って複数のコンテナを管理することが多い。ソースコードに加えて、docker-compose.ymlをgitで管理し、コンテナやイメージにソースコードが含まれることは少ない。
サブコマンド
ps
稼働中のコンテナの一覧を出す
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
923f3e2a1d15 centos:7.8.2003 "/bin/bash" 2 minutes ago Up 2 minutes nervous_cartwright
images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest ba6acccedd29 9 months ago 72.8MB
ローカルに保有しているコンテナ一覧
pull
Docker Hubからコンテナイメージをダウンロードしてくる。gitと違ってfetchはない。
Docker Hub以外にもローカルからダウンロードすることもできる。
# :の後ろがタグ ubuntuの20.04をダウンロード
$ docker pull ubuntu:20.04
# ダイジェスト指定でダウンロード
$ docker pull ubuntu@sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac21d6af3
- タグ指定
- 対象のタグに最新があれば、最新のものが入れられる
- ダイジェスト指定
- タグに更新があっても、固定のバージョンがインストールされるのでイメージの動作に再現性がある
run
コンテナイメージを元にコンテナを生成して起動する
docker run -it ubuntu:20.04
Ctrl+Dで終了するとルートプロセスから終了していまうのでデタッチという操作で抜けます
cp
コンテナからローカルにファイルをコピーすることができる
docker cp {{コンテナ名}}:/data.sql ./
デタッチ
ctrl+Pとctrl+Q
キーバインド削除
vscodeを使っている場合ショートカットキーが重複してるので変更します
基本設定のキーボードショートカットで[ctrl p と ctrl q]でそれぞれ検索してdeleteキーでキーバインドを消します
rename
パラメーター指定なしで起動したコンテナには変な名前がついてます。気に食わないので変えたい人は
docker rename old_contena_name new_contena_name
コマンドラインにアタッチ
起動しているコンテナで、コマンドラインで操作したい場合は、次のコマンドを実行する
docker exec -it contena_name /bin/bash
alphine版のコンテナ
ubutuベースのコンテナはサイズが大きいので、軽量版のLinuxであるalphineがよく使われている
bashは使えない
alphineは/bin/bashのバイナリを持っていないので、/bin/ashを使う
$ docker run -it python:3.6.9-alpine /bin/bash
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown.
- docker run -it python:3.6.9-alpine /bin/bash
+ docker run -it python:3.6.9-alpine /bin/ash
dockerfile
既存のコンテナをカスタマイズして、新たにイメージをビルドするための設定ファイル
FROM python:3.6.9-alpine
WORKDIR /app
ENV FLASK_APP=app
COPY ./app /app
RUN pip install --upgrade pip
RUN pip install -r ./requirements.txt
コンテナを停止して削除
docker rm -f {container_id}
便利な拡張機能
sshで開発するのは面倒なので、Remote - Containersを使うとremote sshと似たような開発環境が作れる