#author("2020-03-09T11:12:13+09:00","default:narushima","narushima")
#author("2020-03-09T11:19:52+09:00","default:narushima","narushima")
#contents

* Centos 8 [#lf2c1d90]
8になった Centosは、Centos Linux と Centos Stream に分離したが、いわゆる過去のCentosの特徴を持った正当な後継はCentos 8 Linux なのでここではこれについて記載する。

** Centos 7 からの相違点 [#rb294146]
カーネルのバージョンが上がったことは、別段普通に使う分には大きな問題はない。yum が dnf (Dandified Yumの略。意味はイカしたYum) に変更されたり、ntp が chrony に変更されていたり、iptables が nftables(Net Filter Tablesの略。過去 iptables, ip6tables,arptables,ebtablesなどに分かれていたパケットフィルタリングを統合したもの。高速化とセキュリティの向上もされている)などが代表的だが、6から7に変わったときほどの変更はない。これらは過去の使い方とほとんど同じであり導入コストは小さい。

**サーバーとしての導入 [#i0ec76c0]
インストーラーはGUIベースの画面で行われる。[[centosの公式サイト:https://www.centos.org/download/]]からisoイメージをダウンロードするだけで良い。vmware上(但しvmwareがまだ centos8に対応していないので、簡易インストールは選択しない方が良い) であれば、isoファイルを指定するだけでよく、実機にインストールするのであれば、usb起動にUEFI(Unified Extensible Firmware Interface)または  bios を設定し usb に焼いた iso イメージで起動すればインストーラーが実行される。

***インストール時の注意点 [#g19a8deb]
ここでは主にサーバー用途向けの紹介のため、無駄なソフトはインストールしないように画像のように「最低限のインストール」を選択する。右のソフトは全部チェックしない。(インストールしない)また kdump もまず専門の人間以外は見てもわからないため(kdumpが発生する状況はハードの問題が多い)導入しない。後は日付とネットワークを有効にして、インストール先のディスクを選ぶだけで完了する。

#ref(centos8_install_001.png)

「ソフトウェアの選択」を選ぶと下記のダイヤログが表示される。

#ref(centos8_install_002.png)

これで再起動すればコマンドプロンプトが出て、root ログインができるようになる。IPアドレスがわかっていれば、この後一切の実機端末からログインせずに ssh で接続できる。(上記の場合 ssh は自動的に起動され、ssh でも、root のパスワードログインが許可されているため)

&color(red){※vmware上でのインストールの場合、まだvmware側がcentos8に正式対応していない為、vmware-toolsが自動でインストールされない。基本的にサーバーの場合は ssh 接続からのCUI操作になるのであまり問題は無いと思うが、GUIを導入している場合はかなり不便となるだろう};


*** sshの接続と設定 [#a1713906]
centos8 では、インストール時にネットワークを有効にしておけば「最小限のインストール」を選んでも ssh は導入され起動されているので、ip addr などのコマンドで、ip アドレスを確認して ssh ログインから環境導入の準備ができる。

&color(red){※sshログイン後の最初の作業には下記の内容があるが、sshdを再起動するときには現在繋がっているセッションは切らずに平行して残しておくことで、新設定の接続ができないなどのトラブル時でも対応が可能になる。};

またopensslコマンドで公開鍵方式の鍵ペアを1組作成し、サーバー側とクライアント側にそれぞれ設置する。詳しくは[[sshの設定ページ:https://www.gamvaro.com/kswiki/index.php?%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/SSH#tbece256]]を参照。

公開鍵の設置が終わったら設定ファイルを修正する。 </etc/ssh/sshd_config>
+ PermitRootLogin no (必要に応じて yes。noの場合はユーザーアカウントを作成するのを忘れないこと。公開鍵もユーザーフォルダ内に設置する)
+ PubkeyAuthentication yes (上記の公開鍵は必須なので必ずyes)   <− ファイルの初期値は ~/.ssh/authorized_keys
+ PasswordAuthentication no (上記の公開鍵を使うので必ず no)
+ PermitEmptyPasswords no (公開鍵の場合関係ないが念のため常に no)
とりあえずこの4つの項目は必ず設定する。

***その他のLinux環境の設定 [#ne027d43]
/etc/profile や、bash_profile 周りの設定は、centos8 特有の特徴は無い。このあたりは個人の趣味嗜好もあるのでここでは割愛する。

***docker install [#g1349926]
とりあえずsshが公開鍵で接続できるようになったのを確認してから下記を行う。
 # dnf -y update         <--- yum でも中では dnf を呼んでいるので結果同じだが・・
無事に更新されたのを確認し、dockerインストールの為のリポジトリを追加する。但し現状dnf(yum)の標準リポジトリに docker のパッケージは登録されていない。
 # dnf repolist
初期に登録されているリポジトリはこのコマンドの結果の通り3つ。そこで dnf に docker.com で提供しているリポジトリを追加する。
 # dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
ちなみに追加したリポジトリを削除したい場合は、/etc/yum.repos.d/<リポジトリ名> を削除する。上記のdockerリポジトリを削除する場合は
 # rm -rf /etc/yum.repos.d/docker-ce.repo となる。(dnfになってもフォルダの名前は未だ yum が使われている)
どのような docker パッケージが登録されているか確認する。
 # dnf list | grep docker
そうすると下記の3つのパッケージが増えている。(ちなみに docker-ce の ce とは Community Editionで無料版ということ。そのため docker という名前だけのパッケージは今はない)
|パッケージ名|概要|h
|docker-ce|Docker本体|
|docker-ce-cli|Dockerクライアント(CLI=Command Line Interface)|
|docker-ce-selinux|このパッケージの場合は docker-ce-cli のほかに containerd.ioも依存関係で一緒にインストールされる。ある意味 yum で docker 検索したときに、containerd.io を見つけやすくしたともいう|

*** containerd.io 問題 [#z58db170]
現在の Docker-ce は 実際のコンテナエンジン部分を containerd.io として切り離したプロジェクトになっており、この部分の最新が実は上記 yum リポジトリに存在しない。(というより古い)そのためこの rpm を直接ダウンロードしてインストールする。ただ EL8 の型式のものは見当たらないので EL7 の物を流用する。
 # wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
 # dnf install ./containerd.io-1.2.6-3.3.el7.x86_64.rpm

**** OCIレイヤライブラリ [#z72cedcd]
基本的に docker では低レイヤランタイム(OCI)の部分として、runcがインストールされるが、nvidia gpuを持っている場合は、 nvidia-container-cli を導入する事も可能。
***Docker本体のインストールと起動 [#if3416a6]
 # dnf install docker-ce docker-ce-cli
 # systemctl start docker
これで docker が起動。

次に docker compose も導入。
 # curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
 # chown root:docker /usr/local/bin/docker-compose
 # chmod ug+x /usr/local/bin/docker-compose
 # update-alternatives --install /usr/bin/docker-compose docker-compose /usr/local/bin/docker-compose 10

バージョンチェック
 # docker-compose --version

DNSの設定
 # vi /etc/docker/daemon.json
    {
        "dns": ["10.0.0.2", "8.8.8.8"]
    }


***docker registoryのインストール [#ece3d415]
自分で docker を利用する場合、巨大なdockerイメージや、公開したくないイメージなどがある場合には、自分で registoryを立てる方が良い場合がある。
  # vi docker-compose.yml
  registory:
    container_name: local-docker-registory
    image: registry:2.7.1
    ports:
      - 5000:5000
    volumes:
      - ./repo:/var/lib/registry
    environment:
      - REGISTRY_STORAGE_DELETE_ENABLED=true
      - CLANG

&color(blue){environmentセクションはコンテナに環境変数を渡す。「=」で指定した内容で設定するが、この例のCLANGの部分のように「=」以降がないものは、ホストOSと同じ内容が設定される。};

保存する場所の作成
 # mkdir repo
 # chown root:docker repo

レジストリの起動
 # docker-compose up -d

***ローカルに立てたレジストリの利用 [#a486cbef]
まずは登録するイメージに新しいtagをつけてイメージを増やす。(実体は増えないイメージIDは同じ)ここではこのレジストリコンテナを参考に登録する。
 # docker tag registry:2.7.1 localhost:5000/myrepo/myregistry:2.7.1
これは「registry:2.7.1」というイメージを「localhost:5000/myrepo/myregistry:2.7.1」という名前でイメージのシンボリックリンクを作る感じとなる。ちなみにこの場合の名前はフォルダで階層化することも可能。(※myrepo の部分はレポジトリー名)
 # docker images
これで無事にイメージが増えていることを確認。その後にこのイメージを実際のローカルレジストリーにアップする。
 # docker push localhost:5000/myrepo/myregistry:2.7.1

作成されたリポジトリ一覧は下記で取得可能。
 https://<DockerHost IP>:5000/v2/_catalog

リポジトリ毎に登録されたイメージとタグを確認するのは下記の通り。
  https://<DockerHost IP>:5000/v2/myrepo/tags/list

リポジトリのイメージの削除は registry v2 から導入された digest(ハッシュ値)値を元に削除される。下記コマンドで確認できる。(pushされたイメージじゃない場合は digest値は生成されていないので注意)
registry v2 から導入された digest(ハッシュ値)値は下記コマンドで確認できる。(pushされた事のあるイメージじゃない場合は digest値は生成されていないので注意)
 # docker images --digests

&color(red){注意:digest値を使うことで同じ名前+tagでも push の度に生成されているため、絶対的にイメージの同一性が保証される。そのため docker-compose.yml 内などでイメージの指定する場合にもこの digest値を入れておくと確実};

レジストリからのイメージ削除は、上記のdigest値を使って行うことができるが、基本的にはレジストリからの削除は運用上おすすめしない。もし行うのであれば registry を新規で立てて必要なものだけ push し直す方がリポジトリーの不変性が保てると思われる。
よって削除については他のサイトを参照してほしい。