ubuntu14.04のDockerのipアドレスを変更

dockerはdocker0インターフェースに自動で172.17.42.1のIPアドレスを割り当てます。
これで困るのが、実際のネットワーク上にこのセグメントがある場合。
dockerを起動したこのサーバに、リモートからアクセスできなくなります。

デフォルトの設定
# ifconfig
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

そこで、docker0のIPアドレスを変更します

修正

/etc/default/dockerファイルに追加

DOCKER_OPTS="--bip=172.66.33.0/24"

リブートします

$ sudo reboot
確認

再度ログインし確認します

$ ifconfig
docker0   Link encap:Ethernet  HWaddr 56:84:7a:fe:97:99  
          inet addr:172.66.33.0  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ubuntu14.04のDockerをubuntuユーザで起動

ubuntu14.04にDockerをインストールし、一般ユーザで動かします。

インストール
$ sudo apt-get install docker.io

面倒になると困るのでiptablesを削除します

$ sudo iptables -F -t nat
$ sudo iptables -F 
起動

こちらを参考に

$ sudo groupadd docker   # これは不要かもしれない
$ sudo gpasswd -a ${USER} docker
$ sudo /etc/init.d/docker restart

一度ログアウトしもう一度ログインします

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Docker in DockerのJenkins環境をdockerで構築

dockerで構築したjnekins内でdockerイメージを作成する

これができるとjenkinsでDockerイメージまで作成し、デプロイが簡単になります。

Dindイメージを使って作成してみます

Dockerfile

FROM docker:dind

############### add tools(jdk etc...) ####################
RUN apk update
RUN apk add wget git curl zip unzip	make bzip2 zlib openssl g++ libstdc++

# jdk
RUN apk add	openjdk7

# ant
RUN apk add apache-ant --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN echo "export PATH=$PATH:/usr/share/java/apache-ant/bin" >> /root/.bashrc

# node
RUN apk add	nodejs

# grunt
RUN npm install -g grunt-cli
# gulp
RUN npm install -g gulp

# Ruby
RUN apk add libffi libffi-dev gcc
RUN apk add ruby ruby-dev

# add
RUN apk add	expect

RUN apk add freetype freetype-dev fontconfig
RUN apk add xorg-server
RUN apk add bash
RUN apk add rsync --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN apk add openssh --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted

################## set up Jenkins ##########################

RUN apk --update add openjdk7 ttf-dejavu && rm -rf /var/cache/apk/*
ENV JENKINS_HOME /var/lib/jenkins

RUN mkdir -p /usr/local/jenkins
RUN adduser -D -H -s /bin/sh jenkins
RUN chown -R jenkins:jenkins /usr/local/jenkins/
ADD jenkins.war /usr/local/jenkins/jenkins.war
RUN chmod 644 /usr/local/jenkins/jenkins.war

# jst
RUN apk add tzdata --update-cache --repository http://dl-4.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN ln -sf	/usr/share/zoneinfo/Asia/Tokyo /etc/localtime

################### set process ##################
COPY jenkins.sh /usr/local/bin/jenkins.sh
ENTRYPOINT /usr/local/bin/start.sh && /bin/bash

start.sh

#!/bin/sh
set -eo pipefail

# If there are any arguments then we want to run those instead
java -jar /usr/local/jenkins/jenkins.war --httpPort=8080	> /tmp/jenkins.log 2>&1 &	

set -e
docker daemon \
								--host=unix:///var/run/docker.sock \
								--host=tcp://0.0.0.0:2375 \
								--storage-driver=vfs \
--bip=172.17.101.1/24		# docker0のアドレス域を変更

docker-compose.xml

ついでにdocker-composeで起動するように設定します

myjenkins:
	restart: always
	image: myjenkins:1.0
	ports: 
		- "8080:8080"
	volumes:
		- /data/jenkins:/var/lib/jenkins		# host volumeをマップング
		- /data/git:/opt/git:ro
	env_file:
		- ./.docker-compose.env
	environment:
		- JAVA_OPTS=-XX:MaxPermSize=256m
	privileged: true

.docker-compose.env

NO_PROXY=localhost,127.0.0.1
no_proxy=localhost,127.0.0.1
HTTP_PROXY=
HTTPS_PROXY=
http_proxy=
https_proxy=

起動

# docker build -t myjenkins:1.0 .
# docker-compose -f docker-compose.yml up -d myjenkins

docker buildのエラー

dockerで今までうまくいっていたBuildが突然落ちるようになったりすることがあります

$ docker build .
..
Err http://archive.ubuntu.com/ubuntu/ trusty-security/main libnss3-nssdb all 2:3.19.2.1-0ubuntu0.14.04.1
404	Not Found [IP: 91.189.88.149 80]
Err http://archive.ubuntu.com/ubuntu/ trusty-security/main libnss3 amd64 2:3.19.2.1-0ubuntu0.14.04.1
404	Not Found [IP: 91.189.88.149 80]
Fetched 108 MB in 3min 14s (555 kB/s)
Unable to correct missing packages.
[91mE: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/n/nss/libnss3-nssdb_3.19.2.1-0ubuntu0.14.04.1_all.deb	404	Not Found [IP: 91.189.88.149 80]
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/n/nss/libnss3_3.19.2.1-0ubuntu0.14.04.1_amd64.deb	404	Not Found [IP: 91.189.88.149 80]

こういう時には一度キャッシュをクリーンすれば治ります

$ docker --no-cache build .