Docker Desktopでminikube(k8s)環境作成 (No.02)
はじめに
昨日から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
方針
- UbuntuにDocker環境を構築
ここで、ホストのソケットを共有して使うこともできるのですが、ネットワークが拒否されてしまい(プロキシの関係?)、minikubeの起動ができなくなるため、Ubuntu内で再度用意します。ここがかなり苦戦しました。
- 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 /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が初めから使えるようになっているのでそちらを使うほうがスマートなのかもしれません。
自分を苦しめて頑張りました。
Discussion