🌊

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

2021/08/24に公開

はじめに

昨日からDocker Desktopを利用して、docker-in-dockerを行いKubernetes(k8s)の環境に苦戦していました。

そして、「Docker Desktopでminikube(k8s)環境作成 (No.01)」という記事を作成しました。

この記事の中では、AlpineLinuxコンテナの中で、CentOS7の環境をコンテナを立ち上げて、その中でminikubeをインストールする構成としました。

しかし、気になる点がありました。

  • systemctl start dockerをしなくても済むようにしたい
  • Ubuntuの環境を利用したい

というものです。

記事で行った環境では、CentOS7コンテナにかならず入って手動でSystemctlコマンドを打つ必要がありました。その手間をなんとか省略したいと思っていました。今回はそこの点を踏まえて、Ubuntu環境にminikubeをインストールしていきます。

結論から言うと、
「systemctl start dockerは必要で手間を省けなさそう」ということがわかりました。

環境

  • Docker Desktop for Windows v20.10.7

方針

  1. UbuntuにDocker環境を構築

ここで、ホストのソケットを共有して使うこともできるのですが、ネットワークが拒否されてしまい(プロキシの関係?)、minikubeの起動ができなくなるため、Ubuntu内で再度用意します。ここがかなり苦戦しました。

  1. minikubeのインストール
    ここは前回の記事と手順がすべて同じため省略します。

問題

UbuntuにDocker環境を構築するのに今回はかなり時間を使いました。
CentOS7は起動するのにprivilage=True/sbin/initが必要であったため、指定しなくても済むようにUbuntu20.04を利用することにしました。
(
まずは、Ubuntu 20.04へのDockerのインストールおよび使用方法を参考にしてDockerをインストールしました。

Dockerfile

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo

RUN apt update
RUN apt install -y \
	apt-transport-https \
	ca-certificates \
	curl \
	software-properties-common \
	sudo \
	tzdata

RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
RUN apt update
RUN apt install -y docker-ce

RUN apt install curl
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

RUN apt update
RUN curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
        && chmod +x minikube
RUN mkdir -p /usr/local/bin/
RUN install minikube /usr/local/bin/

docker-compose.yml

version: '3'
services:
  vm:
    restart: always
    build: .
    container_name: 'ubuntu'
    tty: true  
    working_dir: '/work'

しかし、起動したコンテナに入ってdocker psをすると以下のようなエラーになりました。

$ docker-compose up -d
$ docker exec -it ubuntu bash
$ docker ps

エラーが表示される

root@9b63cfeefb20:/work# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Dockerデーモンが起動できていないようでした。
ログを確認してみました。

$ dockerd

途中でエラーになって、起動できていません。

(省略)
INFO[2021-08-24T19:04:48.258460700+09:00] ClientConn switching balancer to "pick_first"  module=grpc
ERRO[2021-08-24T19:04:48.260623100+09:00] failed to mount overlay: operation not permitted  storage-driver=overlay2
ERRO[2021-08-24T19:04:48.260745300+09:00] exec: "fuse-overlayfs": executable file not found in $PATH  storage-driver=fuse-overlayfs
ERRO[2021-08-24T19:04:48.260912000+09:00] AUFS was not found in /proc/filesystems       storage-driver=aufs
ERRO[2021-08-24T19:04:48.261592000+09:00] failed to mount overlay: operation not permitted  storage-driver=overlay
WARN[2021-08-24T19:04:48.262033100+09:00] Unable to setup quota: operation not permitted
WARN[2021-08-24T19:04:48.285577500+09:00] Your kernel does not support cgroup blkio weight
WARN[2021-08-24T19:04:48.285617200+09:00] Your kernel does not support cgroup blkio weight_device
WARN[2021-08-24T19:04:48.285624400+09:00] Your kernel does not support cgroup blkio throttle.read_bps_device
WARN[2021-08-24T19:04:48.285627600+09:00] Your kernel does not support cgroup blkio throttle.write_bps_device
WARN[2021-08-24T19:04:48.286467600+09:00] Your kernel does not support cgroup blkio throttle.read_iops_device
WARN[2021-08-24T19:04:48.286517800+09:00] Your kernel does not support cgroup blkio throttle.write_iops_device
INFO[2021-08-24T19:04:48.286742700+09:00] Loading containers: start.            

WARN[2021-08-24T19:04:48.288677300+09:00] Running iptables --wait -t nat -L -n failed with message: `iptables v1.8.4 (legacy): can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.`, error: exit status 3    
INFO[2021-08-24T19:04:48.315692900+09:00] stopping event stream following graceful shutdown  error="<nil>" module=libcontainerd namespace=moby
INFO[2021-08-24T19:04:48.316178700+09:00] stopping event stream following graceful shutdown  error="context canceled" module=libcontainerd namespace=plugins.moby
INFO[2021-08-24T19:04:48.316185300+09:00] stopping healthcheck following graceful shutdown  module=libcontainerd
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.8.4 (legacy): can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
 (exit status 3)
WARN[2021-08-24T19:04:49.317820200+09:00] grpc: addrConn.createTransport failed to connect to {unix:///var/run/docker/containerd/containerd.sock  <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial unix:///var/run/docker/containerd/containerd.sock: timeout". Reconnecting...  module=grpc

色々、このエラーについて調べましたがよくわからずでした。

$ service docker start

としても途中でエラーになり止まっています。

root@9b63cfeefb20:/work# service docker start
 * Starting Docker: docker                                               [ OK ] 
root@9b63cfeefb20:/work# service docker status
 * Docker is not running

そこで特権モード privileged: trueを付与したところ、動くようになりました。

CentOS7だからprivilegedが必要というよりは、docker-in-dockerをする上でprivileged:trueが必要でした。

また、起動時の設定になるので起動自体はコンテナの中で以下のコマンドをたたく必要があります。

$ systemctl start docker

この設定をすることで、Dockerが使えるようになります。

結局、Ubuntuでもできるようになりましたが、ほぼ同じ環境になりました。
手間もほぼ変わらず。しかし、いい勉強になりました。

最終的な環境

以下の環境でminikubeが動くようになりました。

ディレクトリ構成

root/
┣ Dockerfile (Alpine)
┣ docker-compose.yml (Alpine)
┣ vm 
	┣ Dockerfile (Ubuntu)
	┣ docker-compose.yml (Ubuntu)

Dockerfile (Alpine)

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/

docker-compose.yml (Alpine)

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.sock

Dockerfile (Ubuntu)

FROM ubuntu:20.04

ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Tokyo

RUN apt update
RUN apt install -y \
	apt-transport-https \
	ca-certificates \
	curl \
	software-properties-common \
	sudo \
	tzdata

RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

RUN add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
RUN apt update
RUN apt install -y docker-ce

RUN apt install curl
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

RUN apt update
RUN curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
        && chmod +x minikube
RUN mkdir -p /usr/local/bin/
RUN install minikube /usr/local/bin/

docker-compose.yml (ubuntu)

version: '3'
services:
  vm:
    restart: always
    build: .
    container_name: 'ubuntu'
    privileged: true
    tty: true  
    working_dir: '/work'

起動は以下のように行います。

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

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

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

# Ubuntuコンテナに入る
$ docker exec -it ubuntu bash

# Docker起動
$ service docker start

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

以上で環境構築終了です。
やっとKubernetesの勉強に進めます。

おわりに

今回は1から環境を作ることを目的にdocker-in-dockerを使って行いましたが、Docker DesktopにはKubernetesが初めから使えるようになっているのでそちらを使うほうがスマートなのかもしれません。

自分を苦しめて頑張りました。

参考

GitHubで編集を提案

Discussion