【Linux第1回】Linuxを始める(GCPとDocker上でそれぞれCentOS、Ubuntuを起動)

【Linux第1回】Linuxを始める(GCPとDocker上でそれぞれCentOS、Ubuntuを起動)

Linuxの再学習したので備忘録としてまとめていきます。第1回はLinuxの概要/インストール方法/ターミナルからコマンドを打ってみるまでを記載していきます。

再学習の理由

  • Dockerに入門した際に、改めてLinuxの基礎から整理をする必要が出てきたから
  • Ubuntuを触ってみたかったから

学習内容をまとめるにあたって、以下のUdemy教材を参考にさせていただきました。筆者は15年以上実務でLinuxを使っていますが、新しい発見がたくさんありました。初学者の方にも、ミドル以上のエンジニアの方にもおすすめの教材です。


【参考資料/Udemy】


【参考資料/書籍など】


【参考資料/ChatGPT】
また、情報収集にChatGPTを使用しました。

かなり強力な情報収集ツールになるという印象です。

(ただし、出力結果は鵜呑みにせず、随時公式ドキュメントなどで裏どりする必要があります)


【関連記事】

Linuxとは

  • OSの一種/コンピュータを動かすための基本ソフト
  • 1991年にリーナス・トーバルスがUNIXをベースに一から開発
  • 現在もっとも普及しているOS

UNIX

  • 背景として有料版のUNIXがあった
  • 小さなOOSと呼ばれプアーな環境でも快適に動いた
  • 当時のコンピューターは低スペックであったため、UNIXは大学や研究機関で普及した
  • UNIXはオープンソースコードだったが有料版であった

Linuxの特徴

  • オープンソースなので誰でも自由に使える
  • 世界中で使われていて信頼性が高い
  • 品質が高い多くのソフトウェアが利用できる
  • 自動化するための仕組みがあり、サーバーの運行がしやすい
  • 商用アプリケーションがあまりない(MS Officeなどが使えない)
  • 日本語対応がされていない部分が多い

Linuxを学習するメリット

  • 汎用性が高い(幅広い場所で使われている)
  • LinuxはIT業界で幅広く使われているため、汎用性が高い
  • サーバー用、組み込み機器など多様な場所で使われている
  • 長い時間をかけて多くのユーザーに検証されている
  • 大きな変更がなくなっている
  • 一度習得すれば、長い時間使える

カーネルとディストリビューション

  • カーネル        # OSの中核となるソフトウェア
  • ディストリビューション # カーネルに色々なソフトウェアを足して使いやすくしたもの
  • ディストリビューションは1000種類以上あり、独自のコミュニティが存在
  • RedHat系とDebian系が主流

Linuxカーネルとは

  • カーネルを通してLinuxはハードウェアにアクセスする
  • Linuxカーネルにアクセスするためのプログラム=Linuxコマンド

主なディストリビューション

RedHat系 ・RedHat Enterprise Linux
・CentOS
・Fedora
Debian系 ・Debian GNU/Linux
・ubuntu

シェルとは

  • LinuxのCLIを提供するソフトウェア
  • プロンプトはコマンド入力待ちの記号
  • ユーザーにLinux OSを扱うためのインターフェースを提供
  • コマンドやプログラムの実行を行う
+------+         +-------+                     +---------------+
| user |-------->| シェル | ------------------->  Linux カーネル  
|      | input   |       | コマンドを解釈して伝える  
|      |         |       |                     |               |
|      |<--------|       | <-------------------|               |
|      | 結果表示            コマンド実行         
+------+         +-------+                     +---------------+

シェルの画面

ユーザー名 ホスト名     プロンプト
[conti @ localhost ~ ]$

シェルの仕組み

1 ユーザーがプロンプトにコマンドを打つ
2 シェルが入力された名前のコマンドを探す
3 Linuxカーネルが見つかったコマンドを実行する
4 シェルが実行結果を画面に表示する

ターミナル

  • ターミナルは画面を担当するソフトウェア
  • シェルはコマンドを解釈するソフトウェア

代表的なシェル

sh(シェル) ・最も古い
・ほぼ全てのUNIXで利用可能
・機能少ない
csh(シーエスエイチ) ・Bashよりも古く現在はあまり利用されない
bash(バッシュ) ・最も一般的
・shの機能拡張版
・Linux環境のデフォルトログインシェル
zsh(ゼットエスエイチ) ・Macではデフォルトのシェル
・Bashの機能も盛り込んだ最新のシェル

Linuxの設計思想

  • Linuxでは、カーネルとシェルが分かれていたり、シェルとターミナルが分かれている
  • このように、Linuxには「分業制、機能は分ける」という設計思想がある

Linuxの環境構築

さまざまな方法が可能ですが、以下をハンズオンしてみました。

  • 例1 GCPでGCEを起動 → Ubuntuをインストール
  • 例2 Docker上でCentOSのコンテナを起動 → CentOSのBashを起動
  • 例3 Docker上でUbuntuのコンテナを起動 → bashを起動

以下に手順を記載していきます。

例1 GCPでGCEを起動/Ubuntuをインストール

【Docker第2回】Linuxの概要/GCPでGCEを起動→Ubuntuインストール

例2 Docker上でCentOSのコンテナを起動 → CentOSのBashを起動

【関連記事】
【Docker第1回】DockerでLinux(CentOS7)を起動し、シェルスクリプトを操作する環境を構築する


手順

> MacのAPPランチャーでDockerを起動
> MacのターミナルでDockerのディレクトリに移動し、以下のコマンドを入力
# docker run -it cents
> プロンプトが変わったら、起動完了
  ※VSCodeの場合、Spril Terminalをしておくと、片方はDocker上のCentOS, 片方はMacのターミナルが使えるので便利

例3 Docker上でUbuntuのコンテナを起動 → bashを起動

【関連記事】
DockerでUbuntuのコンテナを起動し、Hello Worldを表示


手順

# DockerでUbuntuのbashを起動
cd ~/tutorial/tutorial_docker
docker run -it ubuntu:20.04 bash

# 全てのコンテナを確認する
docker ps -a

# Docker上のコンテナで起動したUbuntuでユーザーを作成
adduser conti    # example 
password conti   # example
su - conti       # example

# result
conti@nnnnnnnnnnn:~$

コマンドの意味

  • Dockerを使用してUbuntu 20.04のコンテナを起動し、Bashシェルにアクセス
  • 通常のUbuntuとの主な違いは、コンテナが仮想化されていること
    つまり、実際の物理マシンではなく、Dockerエンジンが管理する仮想環境で実行される
  • ホストシステムとは別のファイルシステム、ネットワークスタック、プロセス空間、
    そしてユーザーアカウントを持っている
  • これにより、Dockerコンテナは、異なるバージョンのアプリケーションやライブラリ、
    異なるオペレーティングシステムに依存するアプリケーションなど、ホストシステムとは別の環境で実行可能

Dockerコンテナ

  • Dockerコンテナは、クロスプラットフォームのポータブル性を提供し、
    実行環境を迅速にデプロイしたり、開発環境をセットアップしたりするための便利な方法
  • しかし、コンテナは通常のUbuntuシステムとは異なるユーザーアカウント、
    権限、およびリソースの制限を持つため、完全に同じものではない

コンテナ内で追加した作業を次回起動時に引き継ぐ方法

dockerでUbuntuを起動するところから、ハンズオンしましたので手順を記載します。

DockerでUbuntuを起動 → コンテナ内のUbuntuでBashを起動 → 変更を加える

docker run -it ubuntu:20.04 bash

  • -it オプションを使用してコンテナをインタラクティブモードで起動
  • ubuntu:20.04 イメージを使用してコンテナを起動している
  • bash コマンドを実行することで、Dockerコンテナ内でbashシェルを起動している
  • 上記により、コンテナにはターミナルがアタッチされるため、コンテナ内での操作が可能となる

ハンズオン

# MacのZshで以下のコマンドを実施していく
# はじめにコンテナがないことを確認
% docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

% docker run -it ubuntu:20.04 bash
:
:
# プロンプトが変わり、Ubunsu内に移動したら、ユーザーを追加する
#
# adduser conti
Adding user `conti' ...
:
New password:
Retype new password:
passwd: password updated successfully
:
:
Is the information correct? [Y/n] Y


# 無事ユーザーが追加されたか確認
# su - conti
$ whoami
conti

# コンテナで加えた変更を保存するため、Exitする
$
$ exit
logout

# exit
exit
%
以上で変更完了

Dockerコンテナに加えた変更を保存しておく

  • 変更を保存した新しいDockerイメージを作成
  • そのイメージを使って新しいDockerコンテナを起動

ハンズオン

# コンテナを停止する
# コンテナIDを確認するために、docker ps -a コマンドを実行する
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
561a579f52b4 ubuntu:20.04 "bash" 5 minutes ago Exited (0) 4 minutes ago objective_mccarthy

# 変更を加えたDockerコンテナを元に新しいDockerイメージを作成する
# docker commit {container_id} {new_image_name}

$ docker commit 561a579f52b4 ubuntu:20.04_20230307_0600
sha256:8e425ee091913515b5044a524ccf0bf87bc4e509e19f3c67a4874da55a0a976d

# 新しいDockerイメージが作成されたことを確認するために、 docker images コマンドを実行
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04_20230307_0600 8e425ee09191 38 seconds ago 66MB

# 新しいDockerイメージを使用して、新しいDockerコンテナを起動
# docker run -it {new_image_name} bash

$ docker run -it ubuntu:20.04_20230307_0600 bash
#
# su - conti
$ whoami
conti
$

以上、でLinuxで作業可能な環境が構築できました。

コマンドを打ってみる

dateコマンド

# 現在時刻を表示
$ date
Thu Feb 16 08:55:26 UTC 2023

# フォーマット指定
# %u : 曜日
$ date '+%Y%m%d %u %H:%M:%S'
20230216 4 08:56:48

処理の流れ

Terminal # date コマンドを打つ
  ↓
bash     # dateコマンドを解釈
  ↓
bash     # dateというコマンドを探す
  ↓
カーネル  # Linuxのカーネルにdateコマンドの実行を指示
  ↓
カーネル  # Linuxのカーネルがdateコマンドを実行
  ↓
bash     # 結果をbashが受け取る
  ↓
Terminal # 結果をTerminalが受け取る
  ↓
Terminal # 標準出力として結果が表示される