はじめに
kubernetesの書籍を読んでおり、VagrantにDockerをインストールして起動していたのですが、
Docker Desktopを利用しているのでVagrantが利用できなかったので、docker in dockerをしました。
そこで問題が発生したのでまとめます。
問題
以下の環境を作成しました。
┣ Dockerfile
┣ docker-compose.yml
┣ data
┣ hello_world.txt
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
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を起動します。
$ docker-compose build
$ docker-compose up
別のターミナルからコンテナの中に入ります。
$ docker exec -it centos7 bin/bash
docker daemonを起動します。
$ systemctl start docker
これで利用できるようになるのですが、コンテナを落とすたびにsystemctl
コマンドをたたく必要があります。
また、CMDを使ってDockerfileに書いたりもしたのですが、反映されていないようでした。
毎回コンテナに入って設定するのは、使いづらいので困っていました。
原因
CentOS7をdocker-in-dockerで利用する場合にはcommand: /sbin/init/
とpriviliage=True
が必要となります。
それがおそらく原因になっていそうです。
また、ホストコンテナとソケットを共有することで、同じDockerを利用する方法もできませんでした。
FROM docker:20.10 as docker # 追加
FROM centos:centos7
RUN yum update -y && yum upgrade -y
RUN yum install -y \
yum-utils \
device-mapper-persistent-data \
lvm2 \
git \
curl
# 追加
COPY --from=docker /usr/local/bin/docker /usr/local/bin/
version: '3'
services:
centos7:
restart: always
build: .
container_name: 'centos7'
tty: true
privileged: true
working_dir: '/'
command:
- /sbin/init
volumes:
- ./data:/work/
- /var/run/docker.sock:/var/run/docker.sock
解決方法
CentOS7がそもそも利用できなさそうなので、他にイメージに変えたら上の方法ですんなりできました。
これでsystemctl
でいちいち起動しなくて済みます。
また、alpine
とubuntu
では問題なく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/
docker-compose.yml
version: '3'
services:
alpine:
restart: always
build: .
container_name: 'alpine'
tty: true
working_dir: '/work'
volumes:
- ./data:/work/
- /var/run/docker.sock:/var/run/docker.sock
CentOS7を使っていないので根本的解決にはなっていませんが、CentOS7でないといけない理由がないのでこれで回避しました。
おわりに
肝心のkubernetes環境はできておりません。
ことごとくエラーが発生します。果たしてできるのでしょうか。。。