🐕

今更ながらDockerに入門する

2024/04/04に公開

やること

ちょっと触ったことあったけど、ちゃんと理解して動かしたい。
こちらの動画を参考にして全体像をつかみながら細部を調べていきます。
https://www.youtube.com/watch?v=B5tSZr_QqXw&ab_channel=PythonプログラミングVTuberサプー

前置き

基本的な内容にフォーカスしたため、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

  1. Dockerfileの作成(テキストエディタで作成)
  2. Docker imageの作成(docker build): AWS AMIの作成
  3. Docker containerの作成(docker create): EC2インスタンス作成
  4. 作成したDocker containerの起動(docker start): EC2インスタンス起動
  5. 起動した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 createdocker 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)をオープンしコンテナ内のプロセスと対話的にやりとりできるようにする
    -tTTY(入出力デバイス、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を使うと良いです。
https://qiita.com/moritalous/items/14d4099023981dcf4fd2

そのほかUbuntu+Docker CLIを使用するという手もあります。
https://dev.classmethod.jp/articles/docker-cli-without-dockerdesktop-on-windows/
https://www.d3654.be/create-hyperv-machine-for-docker04/

参考にした情報とメモ

カーネルの理解

カーネル:CPUやメモリを操作する
シェル:カーネルへの命令(API)の仲介役
BIOS:Basic Input Output Systemの略、OS起動前のハードチェック

https://enterprisezine.jp/article/detail/13391?p=2

【10分で解説】BIOS・カーネル・シェルが何か説明できますか?【OSの仕組みの絵本】
https://www.youtube.com/watch?v=w3yJWYcwHmA&ab_channel=IT入門チャンネル

【10分で解説】サーバ入門 OSカーネル【エンジニアとして知っておきたい基礎知識】
https://www.youtube.com/watch?v=wOCCpYWMpmk&ab_channel=IT入門チャンネル

【初心者向け】Linuxカーネルって一体なんだ?
https://qiita.com/uguis410/items/17ec1e447e9716bfdca7

Discussion