今更ながらDockerに入門する
やること
ちょっと触ったことあったけど、ちゃんと理解して動かしたい。
こちらの動画を参考にして全体像をつかみながら細部を調べていきます。
前置き
基本的な内容にフォーカスしたため、Docker compouseやKubernetesなどは別記事にまとめる予定です。
現状の理解の整理
仮想環境をサクッと作れる仕組み
仮想環境=OS+何らかのアプリケーション
環境を丸っとシェアできるので、環境統一できて良き
環境を分離できるので、環境が汚染されているかどうかを気にせずできて良き
コンテナという単位がある
Docker Hubでコンテナイメージが配布されている
Docker DesktopというGUIアプリケーションがある
AWS AMIみたいな感じ??
Docker Compose??
Docker イメージ??
Docker Engine??
Docker CLI??
Hyper-V??
Kubernetes??
用語と概要理解
ホストOS:物理マシン上で動作しているOS
ゲストOS:仮想環境上で動作しているOS
Docker ファイル:Docker イメージを作るためのもの
Docker イメージ:Docker コンテナを作るためのもの
Docker コンテナ:立ち上げる仮想環境の単位
コンテナ型の仮想環境
- Docker上で動作している
- ミドルウェア+アプリケーションのセットのこと
コンテナ型でない仮想環境
- 仮想化ソフト上で動作している
- ゲストOS+ミドルウェア+アプリケーションのセットのこと
コンテナ型の場合は「あたかもゲストOSが動いている」ように見せているだけ
→ゲストOSが無い分軽量で良き
Dockerの仕組みで統一できること
- (動いているように見えている)OS
- ミドルウェアのインストール
- 環境設定
→これらがDockerファイルに記載されている
→Dockerファイルはテキストファイルなのでバージョン管理できる
仮想環境が起動するまでの流れ
Dockerfile -> Docker image -> Docker container
Docker file:Dockerイメージを作成するためのもの
Docker image:コンテナのBlueprint
Docker container:実際に稼働するインスタンス自身
file : image : container = 1 : 1 : n
- Dockerfileの作成(テキストエディタで作成)
- Docker imageの作成(
docker build
): AWS AMIの作成 - Docker containerの作成(
docker create
): EC2インスタンス作成 - 作成したDocker containerの起動(
docker start
): EC2インスタンス起動 - 起動したDocker containerの停止(
docker stop
): EC2インスタンス停止
Docker CLIの基本操作
-
docker pull
Docker Hub上のコンテナイメージをローカルにDLする -
docker info
Dockerの設定・稼働状況を表示する -
docker images
DLしたコンテナイメージのリストを表示する
Docker イメージの保存先は/var/lib/dockerとされている
Docker Root Dir: /var/lib/docker
macOSでdocker infoで確認しても上記のパスが表示されるが、ディレクトリが存在しない
macOSの場合は~/.dockerに設定ファイル等が保存されているが、images/ディレクトリは存在しない、どこにあるんだ?? -
docker run
docker run --name 識別子 -p ローカルPCのポート:コンテナ側のポート -e コンテナの環境変数 -d コンテナイメージの指定:バージョンタグ
コンテナイメージからコンテナを作成し起動する
docker create
とdocker start
を一度に行う
dはデタッチモード、バックグラウンドで動作する
バージョンタグを省略した場合はlatest -
docker ps
起動中のコンテナの表示、psはProcess Statusの略 -
docer exec <container_id> <command>
指定したコンテナ内でコマンドを実行する -
docker exec -it <container_id> /bin/bash
指定したコンテナ内でbashシェルが起動し、ユーザーはコンテナ内でコマンドを実行できるようになる
-i
オプションと-t
オプションの組み合わせ、Interactiveに入出力デバイス(コマンド実行した画面)でコンテナ内のシェルとやりとりができるようになる
-i
はinteractiveの略で、標準入力(stdin, standard input)をオープンしコンテナ内のプロセスと対話的にやりとりできるようにする
-t
TTY(入出力デバイス、teletypeまたはteletypewriterの略)を割り当てる、TTYについては下記を参照のこと
https://ja.wikipedia.org/wiki/テレタイプ端末
http://piyopiyocs.blog115.fc2.com/blog-entry-663.html
https://wa3.i-3-i.info/word11668.html -
Ctrl + Q
またはCtrl + Q + P
コンテナとの対話的セッションを終了する -
docker stop <container_id>
起動中のコンテナの停止
※コンテナの破棄は行われない -
docker start
作成済みのコンテナを起動する
このとき環境変数などの指定は不要 -
docker rm <container_id>
コンテナの破棄 -
docker rmi <container_image_id:バージョンタグ>
Docker イメージの破棄
Dockerファイルの記述
-
FROM コンテナイメージの指定:バージョンタグ
ベースとなるOSを記述する(性格には「ベースとなるイメージを指定する」と表現するみたい)
通常、Dockerfile内で1回だけ使用される
複数のFROMを使用するケースもあるみたい(マルチステージビルド)
Ex,FROM ubuntu:20.04
-
USER <user_name>
ユーザー名の指定 -
RUN apt
コンテナイメージの作成時=docker build時に実行される
ENTRYPOINTと異なり、複数記述することができる
パッケージのインストールや設定の変更などの用途で使われる -
ENTRYPOINT ["<実行ファイル>", "<param1>", "<param2>"]
コンテナ起動時=docker start(またはrun)時に実行される
サーバーのアプリケーションなどバックグラウンドで常時実行させておくものを登録する
ENTRYPOINTは1行のみ記述可能で、複数行記述すると最後のENTRYPOINTが他のものを上書きしてしまう
登録した実行ファイルが終了するとコンテナも終了する
Ex,ENTRYPOINT ["python", "app.py"]
-
COPY <コピー元のパス> <コンテナ側のパス>
ファイルのコピー
ローカル環境からコンテナ環境へファイルをコピーする際などに使用する
圧縮ファイルは解答されず、そのままコピーされる
※リモート(自端末以外、つまり同じネットワーク内の別のサーバーや、インターネット上の他のサーバー)のファイルはコピーできない -
ADD <コピー元のパス> <コンテナ側のパス>
ファイルのコピー
リモートのファイルを扱うことができる
圧縮ファイルは自動的に解答される -
ENV <env_variant_name>=<env_variant_value>
環境変数の設定 -
WORKDIR <コンテナ側のパス>
ワークディレクトリのパスの設定
EX,WORKDIR /var
Rancher Desktop, Ubuntu + Docker CLI
ほぼ自分用のメモです。
Docker Desktopは誰でも無料に使えるわけではないので、お仕事で利用する場合は注意が必要です。
従業員数250名を超える企業、または年間売上高1000万ドルを超える企業でDocker Desktopを商用利用するには、有料サブスクリプション(Pro、Team、または Business) が必要です。
https://www.docker.com/ja-jp/pricing/
Docker Desktopが使用できない場合はRancher Desktopを使うと良いです。
そのほかUbuntu+Docker CLIを使用するという手もあります。
参考にした情報とメモ
カーネルの理解
カーネル:CPUやメモリを操作する
シェル:カーネルへの命令(API)の仲介役
BIOS:Basic Input Output Systemの略、OS起動前のハードチェック
【10分で解説】BIOS・カーネル・シェルが何か説明できますか?【OSの仕組みの絵本】
【10分で解説】サーバ入門 OSカーネル【エンジニアとして知っておきたい基礎知識】
【初心者向け】Linuxカーネルって一体なんだ?
Discussion