たった1日で基本が身に付く! Docker/Kubernetes超入門 実践 CHAPTER2

SECTION01

イメージの使い方の全体像

読むだけです。

イメージを検索する

本の検索結果とは異なりますが、問題なく検索できます。

同一名のイメージを区別するタグ

curlコマンドなんですが、実行に失敗します。

スルーしましょう。

イメージをPullして確認する

後で使うので、Pullしておきましょう。

イメージを削除してみる

使わないイメージやコンテナは削除しましょう。

この項目の内容は大事です。

すでに削除済みだったのか、本とは違う結果になりました。

どのDockerレジストリを使うべきか

読むだけです。

SECTION02

イメージ作成から登録までの流れ

読むだけです。

コンテナを起動してパッケージをインストール

flask1.1.1はサポート切れなのか、問題が起きるので、flask2.2.3にしましょう。

ホスト(Windowsなど)からコンテナにファイルを送る

改めて記述しますが、UbuntuからWindowsのフォルダを見るには、/mnt/cから始まるパスにアクセスします。

例えば、以下のようにカレントディレクトリを移動しました。

もちろん、サンプルファイルをこのパスに該当するように配置してくださいね。

$ cd /mnt/c/GitHub/docker-book/chap2/c2img1

本にある通り、ファイルをコンテナに転送します。

前に起動したコンテナからexitしてしまっていたので、stop、rmしてから、再度、コンテナを起動しました。

あとは、本の通りに、pythonを実行します。

おっと、コンテナを削除してしまったので、転送したファイルも消えてますね。

当たり前です。

別のコンソールを開いて、転送をもう1度実行します。

flaskもインストールが必要です。

あとは本の通りに進めましょう。

コンテナを停止してイメージ化する

本の通りに進めます。

イメージの階層構造について

一応、本の通りに進めましょう。

イメージにタグ付けする

本の通りに進めましょう。

ただし、yuichi110という部分は、著者のユーザー名なので、ご自分のDockerHubのユーザー名に変えましょう。

レジストリ(DockerHub)へのPush

本の通りに進めましょう。

DockerHub上のイメージを削除するには

読むだけでよいでしょう。

SECTION03

構築するWebアプリの構成

読むだけです。

環境変数を使ったイメージのパラメーター

読むだけです。

アプリで環境変数を利用する

筆者の環境の場合ですが、server.pyがあるところまで移動します。

$ /mnt/c/GitHub/docker-book/chap2/c2env1_app

あとは本の通りに進めましょう。

ただし、前述の通り、flaskのバージョンは、2.2.3にしましょう。

環境変数を使って設定ファイルを作成する

記述ミスがあります。

/chap2/c2env2_web

となっていますが、

/chap2/c2env1_web

が正しいです。

$ /mnt/c/GitHub/docker-book/chap2/c2env1_web

上記コマンドで移動しましょう。

あとは、本の通りに進めましょう。

環境変数ファイルを利用する

本の通りに進めましょう。

SECTION04

リモートのDockerホストを使う

こちらの項目では、仮想マシンの複製が必要です。

以下の手順で複製できます。

UbuntuではなくPowerShellで実行してください。

① 今のUbuntuをエクスポート

$ wsl --export Ubuntu-22.04 ubuntu-backup.tar

② 複製先としてインポート

Ubuntu-Copyは、任意の名前です。

本に従うなら、Linux-A、Linux-B、Linux-Cになります。

※WSLフォルダは作成しておく必要があります。

$ wsl --import Ubuntu-Copy C:\WSL\Ubuntu-Copy ubuntu-backup.tar --version 2

③ 起動して確認

下記コマンドで起動し、ログインまでします。

$ wsl -d Ubuntu-Copy

whoamiで複製成功を確認しましょう。

あとは本に従って進めましょう。

※ls ~/.ssh/を実行したとき、本ではknown_hostsというファイルがありますが、初回はないはずなので、なくて大丈夫です。

※本ではIPアドレスで識別していますが、wsl2の場合、IPアドレスがいずれも同じで識別できないです。

というわけで、IPアドレスではなく、ポートで識別するやり方で行きましょう。

LinuxA-Cにopenssh-serverをインストールし、手動起動します。

$ sudo apt update
$ sudo apt install openssh-server
$ sudo /usr/sbin/sshd -p 2222

※ポート番号は、環境ごとに変えます。それぞれ、2222, 2223, 2224としました。

Linux-Bに対して、実行したところ、下記のエラーが出ました。

Missing privilege separation directory: /run/sshd

ディレクトリがないためのようです。

Linux-Aが大丈夫だったのは、本にしたがって、すでにSSHキーを作成していたためでしょう。

Linux-BとCに下記を実行します。

$ sudo mkdir -p /run/sshd
$ sudo chmod 755 /run/sshd

もう一度、Linux-Bで下記を実行します。※Linux-Cも同様です。

sudo /usr/sbin/sshd -p 2223

では、SSHキーをLinux-Bにコピーしましょう。

ssh-copy-id -p 2223 root@localhost

初回のみ、接続を続行するか聞かれるので、yesにします。

パスワードを聞かれるので、入力します。

なぜか、Permission denied, please try again.になりました。

パスワードによるログインを許可してないからだそうです。

以下の編集が必要です。

$ sudo vi /etc/ssh/sshd_config

以下の項目を探して、編集します。

#PermitRootLogin prohibit-password
PermitRootLogin yes

#PasswordAuthentication no
PasswordAuthentication yes

sshdを再起動します。

ポート番号は、マシンごとに変えてください。

$ sudo pkill sshd
$ sudo /usr/sbin/sshd -p 2223

さらに、そもそも、パスワードが設定されていない可能性があります。

以下のコマンドを使って、各マシンにパスワードを設定します。

$ sudo passwd root

最後にもう一度キーをコピーします。

$ ssh-copy-id -p 2223 root@localhost

そしたら、すでにコピーされてるよって言われて、ハテナになりましたが、たぶん、パスワード認証だけ失敗していたのでしょう。

あとは、試すだけです。

$ ssh -p 2223 root@localhost

これでログインできるはずです。

さらに、以下を編集します。

$ sudo vi ~/.ssh/config
Host LinuxB
  HostName localhost
  Port 2223
  User root

以下でログインできるようになります。

$ ssh LinuxB

長々とやってしまいましたが、この項目の作業って、Ansibleが楽だよ、ってことを思い知るのが目的の作業だったんですよね…。

Dockerはあまり関係ないです。

ただ、以下のようにDockerをリモートで動かせるようになるそうです。

$ docker -H ssh://LinuxB version

でも、エラーになりました。

そりゃ、Dockerをインストールした覚えはないですからね。

これは、Docker DesktopをUbuntuに統合することで、解決できます。

Chapter1のSECTION02のUbuntuと統合の当たりを参照してください。

以下の作業です。

  1. Docker Desktopを開く
  2. 設定(⚙マーク)→ Resources > WSL Integration
  3. Ubuntu 22.04 をONにする ✅
  4. 適用すればOK!

Ubuntu 22.04と同様に、Linux-A~Cが並んでいるので、ONにしましょう。

これで以下のコマンドが動きます。

$ docker -H ssh://LinuxB version

AnsibleでDockerホストを作成しよう

この項目を進めるには、前項目のように、ホストを3つ用意します。

前の項目ですでにエクスポートしていたtarファイルを使って、Host-A~Cにインポートします。

これは、PowerShellで実行します。

$ wsl --import Host-A C:\WSL\Host-A ubuntu-backup.tar --version 2
$ wsl --import Host-B C:\WSL\Host-B ubuntu-backup.tar --version 2
$ wsl --import Host-C C:\WSL\Host-C ubuntu-backup.tar --version 2

各ホストにSSHをインストールし、起動します。

ポートは、2225, 2226, 2227にします。

$ sudo mkdir -p /run/sshd
$ sudo chmod 755 /run/sshd
$ sudo apt update
$ sudo apt install openssh-server
$ sudo /usr/sbin/sshd -p 2225

※Missing privilege separation directory: /run/sshdが出るときは、ディレクトリを作り直してください。

各ホストでパスワード認証を有効化します。

$ sudo vi /etc/ssh/sshd_config

以下の項目を探して、編集します。

ポート番号は、各ホストごとに変えてください。

#Port 22
Port 2225

#PermitRootLogin prohibit-password
PermitRootLogin yes

#PasswordAuthentication no
PasswordAuthentication yes

sshdを再起動します。

ポート番号は、マシンごとに変えてください。

$ sudo pkill sshd
$ sudo /usr/sbin/sshd -p 2225

パスワードを設定します。

$ sudo passwd root

Host-Aに以下を設定します。

$ sudo mkdir ~/.ssh
$ sudo vi ~/.ssh/config
Host Host-A
  HostName localhost
  Port 2225
  User root
Host Host-B
  HostName localhost
  Port 2226
  User root
Host Host-C
  HostName localhost
  Port 2227
  User root

本にしたがって、Host-AにAnsibleをインストールします。

ただし、本はCentOSであり、こちらはUbuntuなので読み替える必要があります。

epel-releaseは飛ばします。

$ sudo apt install ansible unzip

各種ファイルがあるディレクトリに移動します。

$ cd /mnt/c/GitHub/docker-book/chap2/ansible/dockerhost

本にしたがって、定義ファイルの作成を行います。

本にしたがって、定義ファイルを適用します。

が、そのままでは動きません。CentOS用だからです。

下記のようになります。

- hosts: all
  remote_user: root
  tasks:

    - name: Disable ufw
      ufw:
        state: disabled

    - name: Change sshd config
      replace:
        dest: '/etc/ssh/sshd_config'
        regexp: '#MaxSessions 10'
        replace: 'MaxSessions 100'
      register: sshd_config

    - name: Restart ssh when config changed
      systemd:
        name: ssh
        state: restarted
        daemon_reload: yes
        enabled: yes
      when: sshd_config.changed

    - name: Copy ssh public key
      copy:
        src: ./id_rsa.pub
        dest: /root/.ssh/id_rsa.pub
        mode: 0644

    - name: Copy ssh private key
      copy:
        src: ./id_rsa
        dest: /root/.ssh/id_rsa
        mode: 0600

    - name: Add authorized key
      authorized_key:
        user: root
        state: present
        key: "{{ lookup('file', './id_rsa.pub') }}"

    - name: Install prerequisites
      apt:
        name:
          - apt-transport-https
          - ca-certificates
          - curl
          - gnupg
          - lsb-release
        state: latest
        update_cache: yes

    - name: Add Docker GPG key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker APT repo
      apt_repository:
        repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
        state: present
        filename: docker

    - name: Install Docker
      apt:
        name:
          - docker-ce
          - docker-ce-cli
          - containerd.io
        state: latest
        update_cache: yes

    - name: Download Docker Compose
      get_url: 
        url: https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64
        dest: /usr/local/bin/docker-compose
        mode: 0511

    - name: Start/Enable docker
      systemd:
        name: docker
        state: started
        enabled: yes

コマンドは以下に代わります。

$ sudo ssh-copy-id Host-A

$ sudo ansible-playbook -i Host-A, ./pb_centos7.yml

本にしたがって、Dockerホストの確認をします。

本にしたがって、ほかのホストへ実施します。

コマンドは以下に代わります。

$ ssh-copy-id Host-B
$ ssh-copy-id Host-C
$ sudo ansible-playbook -i Host-B,Host-C ./pb_centos7.yml

CHAPTER2は以上になります。

続きはこちら

たった1日で基本が身に付く! Docker/Kubernetes超入門 実践 CHAPTER2」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。