🦔

Docker Desktopでminikube(k8s)環境作成 (No.01)

7 min read

はじめに

機械学習プロダクトをする上で、アーキテクチャ周りの知識が必要です。
どんなに機械学習のいいモデルがローカルでできても本番で利用する時になって勉強を始めては時間がかかるかと思います。

アーキテクチャの重要性を感じてMLOpsで代表されるKubeflowを行うため(今後検証するため)、元になるKubernetes (k8s)の勉強を始めました。

書籍を利用して一通り基本を固めるのが好きなので、以下の本を行いました。

この本では、Hyper-Vで仮想環境(CentOS7)を作成して、Ansibleで環境構築を自動で行います。AnsibleのファイルはGitからダウンロードして使います。

この本は難易度が高めです。Dockerの知識はある程度ないと厳しいかと思います。 書籍の感想

この本での環境構築はDocker Desktopに入っているKubernetesを起動することで行います。かなり簡単にできます。
ハンズオンというよりはKubernetesの説明に力を入れており、図解がとても分かりやすかったです。 書籍の感想

そして、いまは15Stepで習得 Dockerから入るKubernetes コンテナ開発からK8s本番運用までという本をやっています。

ここで問題が起きました。いままではDocker Desktopや事前に用意されてたAnsibleのファイルでの(Hyper-Vで作成したCentOS7上での)環境構築でしたが、この本ではVagrantを利用しています。

Docker Desktop for windowsとVagrantは共存できず、Vagrantを利用することはできません。また、VagrantFileも配布されているものを利用するため、自分で環境構築することはありません。
Hyper-Vを切ってVagrantを利用できるようにしてもよいですが、

  • 自分で環境を用意できるほうが良い
  • どの書籍でも勉強できるようになる
  • 環境構築の勉強になるとおもい

と考えて、1から環境を用意してみることにしました。

たった1日で基本が身に付く! Docker/Kubernetes超入門で書籍通りにminikubeがインストールできずかなり苦戦した記憶が残っており、「minikube」のインストールはかなり難しいという印象がありますが頑張ってみることにしました。

開発環境

  • Docker Desktop for Windows v20.10.7

方針

今回は以下の流れで作業を行っていこうと考えました。

  1. AlpineLinux環境をdockerで構築する
  2. Alpineコンテナでminikube環境を構築する (CentOS7のコンテナを作成してその上にインストール)

なぜ今回をNo.01としているかというと、色々エラーと格闘して結果的にCentOS7でのminikube環境を構築できたからです。
しかし、問題がある & わからないところがあるため、今後も記事を作成できるようにNo.をつけることとしました。

今後更新できたらと思います。

環境構築

1. AlpineLinux環境構築

Docker-in-Dockerを利用して、minikube環境を作成します。
そこで、まずはAlpineLinux環境を作成しました。

ubuntuCentOS7でもよかったのですが、軽量なAlpineにしました。

CentOS7に関しては、dockerの起動にコマンド(systemctl start docker)を毎回コンテナの中でたたかないといけない。という問題が発生したため辞めることにしました。
詳細はこちら : CentOS7でdockr-in-dockerすると毎回systemctl start dockerしないといけないのでなんとかしたい

まずはDockerfileを用意します。

FROM docker:20.10 as docker
FROM alpine:3.14

RUN apk update && \
		apk upgrade

RUN apk add \
		docker-compose

# ホストのdocker daemon共有
COPY --from=docker /usr/local/bin/docker /usr/local/bin/

ポイントは、Alpineの環境の中でのdockerはホストのソケットを利用するという事です。この設定をすることでsystemctl start dockerでdockerを起動する必要がなくなります。

docker-compose.ymlは以下にしました。

version: '3'
services:
  alpine:
    restart: always
    build: .
    container_name: 'alpine'
    tty: true  
    working_dir: '/work'
    volumes:
      - ./vm:/work/
      - /var/run/docker.sock:/var/run/docker.soc

また、カレントディレクトリにvmというディレクトリを作ります。

┣ Dockerfile
┣ docker-compose.yml
┣ vm (ディレクトリ)

vmの中に入れたファイルはコンテナにバインドされて、コンテナ内で利用できるようになります。のちほど、Dokerfileとdocker-compose.ymlを作成して、共有することでdocker-in-dockerを行います。

また、docker-in-dockerのため、dockerはホストと同じものを使います。
docker-composeはDockerfileでインストールして使えるようにしています。

2. Alpineコンテナでminikube環境を構築する

minikubeの環境を構築します。
ここで、CentOS7の環境を作成してそこにminikubekubectlをインストールします。

なぜわざわざ、Alpineコンテナを作った上にCentOS7を作成しているのか疑問に思う方もいるかと思いますので説明します。
本来minikubeを使うだけなら、初めからCentOS7の環境を作成してminikubeをインストールすればよいです。

しかし、書籍をやるうえで複数の環境(ローカル/ステージング/本番)が必要となることが多いです。
docker-in-dockerにすることで、複数の環境を一気に作成可能です。そのあと、コンテナ同士をSSH接続しようかと思いました (ここは後日調べます)

では、環境を作成します。

/vmに以下の二つのファイルを作成します。

Dockerfile

FROM centos:centos7

RUN yum update -y && yum upgrade -y
RUN yum install -y \
			yum-utils \
			device-mapper-persistent-data \
			lvm2 \
			git \
			curl

# docker & docker-compos install
RUN yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
RUN yum install -y\
			docker-ce \
			docker-ce-cli \
			containerd.io
RUN curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
RUN chmod +x /usr/local/bin/docker-compose 
RUN ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# kubectl install
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl

# minikube install
RUN curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
  && chmod +x minikube
RUN install minikube /usr/local/bi

Dockerfileの中で、minikubekubectlをインストールしています。
また、CentOS7でホストのdockerを利用するとうまくminikubeが起動できなかったので、dockerをインストールしています。

docker-compose.yml

version: '3'
services:
  centos7:
    restart: always
    build: .
    container_name: 'centos7'
    tty: true
    privileged: true    
    working_dir: '/'
    command: 
      - /sbin/init
    volumes:
      - ./data:/work/

先ほどとほとんど変わりませんが、ポイントとしてDockerを利用するために「command: /sbin/init」と「privileged: true」を設定してます。
これがないと動きません。また、コンテナ内で「systemctl start docker」というコマンドを打つ必要があります。(後述)

本来はこのコマンドをコンテナで打たないといけないという手間をなくしたい(docker-compose upだけで環境が構築される)ので、CentOS7は使いたくなかったですが、とりあえず動いたのがCentOS7だったので使っています。

おそらくですが、Ubuntuでもdockerをうまく起動できれば起動コマンドなしにdocker-compose upだけで起動できるようになるかと思います。今回はうまくdockerが動いてくれなかったので、CentOS7にしています。

最後にdataというディレクトリを作成します。docker-compose.ymlでバインドしています。

ファイル構成は以下となります。

┣ Dockerfile
┣ docker-compose.yml
┣ mv
	┣ Dockerfile
	┣ docker-compose.yml
	┣ data (ディレクトリ)

起動

起動には以下の手順を行います。

$ docker-compose build
$ docker-compose up -d

# Alpineコンテナに入る
$ docker exec -it alpine sh

$ docker-compose build
$ docker-compose up -d

# CentOS7コンテナに入る
# bin/bashでないとdockerは起動しない
$ docker exec -it centos7 bin/bash

# Dockerの起動
$ systemctl start docker

# Dockerユーザー作成
# minikube start --vm-driver=dockerでrootユーザーが使えないため設定する

1. user add [ユーザー名]
2. passwd [ユーザー名]
(パスワードを2回入力 (ex: password) )
3. usermod -aG docker [ユーザー名] && newgrp docker
4. su [ユーザー名]
(ここで、root@が[ユーザー名]@に変わる)

私はユーザー名: test パスワード: passwordに設定した。
なんでも大丈夫。

# minikube起動
$ minikube start --vm-driver=docker

# kubectl起動確認
$ kubectl version --client

# minikube起動確認
# runningとなっていれば成功
$ minikube status

Dockerのユーザー作成が面倒な場合は以下のコマンドで起動できます。

$ minikube start --vm-driver=docker --force

コンテナ内でsystemctl start dockrをする必要があったため、Dockerfile内で、minikube startをするのをあきらめました。
本来ならすべてDockerfileで行いたいです。

これでとりあえず環境が構築できました。
勉強程度なら問題ないですが、実践的にやる場合は改善が必要そうです。

今後やること

  • systemctl start dockerをしなくても済むように、ubuntuの上で次はminikubeを起動したいです。いまはDockerの起動に悩ませれています。

  • 複数環境をたてて、SSH接続できるように設定したいです。

おわりに

docker-in-dockerでminikube環境を作成している人がいなかったため、行ってみました。
記事通りにいくことが少なく、色々エラーと戦う必要がありました。

今後も進捗があれば記事にまとめていきたいです。

参考

GitHubで編集を提案

Discussion

ログインするとコメントできます