こうりんのブログ

主に勉強した事を書いていくつもり

Dockerイメージ作ってGCEにデプロイするまで

Google Compute EngineでVMインスタンスを作ろうとブラウザで設定していたら, VMインスタンスに自動でコンテナイメージをデプロイできるらしい.
Google Container Registryにリポジトリを置くこともできるが, 今回はDocker Hubに置いたリポジトリを参照してデプロイする方向でやってみようと思う.
そもそも, Dockerを使ったこと無いので, 基本的なイメージ作りから触ってみることにした.

今回は, 作成したDockerイメージをGCEのインスタンスが立ち上がった時に自動で読み込まれるところまで行う.
(動作確認とかはまた次回)

ローカルでDockerのイメージ作成

まず, Docker-machineを作る.
Docker-machineはmacとかでコンテナを動かすためのVM環境のことらしい.
つまり, macの上でDocker-machineが動き, Docker-machineの上でDockerコンテナが動くみたい.

docker-machine create --driver virtualbox default
docker-machine env default
eval "$(docker-machine env default)"

次にDockerのイメージの定義ファイルであるDockerfileを作成する.
まず始めに最小構成として以下のようにした.

Dockerfile
# Base Image
FROM coreos/apache
# User Info
MAINTAINER kourin
# RUN: run in docker build
RUN echo "now building..."
# CMD: run in docker run
CMD echo "now running..."

docker build でDockerfileを元にDockerイメージを作成できる.
docker run でCMDコマンドで設定したコマンドが実行される.

docker build ./ -t (つけたいイメージ名)
docker run  (イメージ名)

以下のようにすると作成したdockerの環境下に入れる.

docker run -it (イメージ名) /bin/bash

出るときはexitで出れるが, 環境下で変更した部分は消えてしまうので注意.
環境下でコマンドを確認しつつ, Dockerfileに環境構築のためのコマンドを追記していけば良いらしい.
そして, docker build でイメージを更新していく.

今回は、とりあえずC/C++コンパイラとPython3.6が実行できる環境を構築した.
以下がそのDockerfile
EXPOSEは外部に向けて公開するポートを記す.

Dockerfile(ver2)
# Base Image
FROM coreos/apache
# User Info
MAINTAINER kourin

# build
RUN \
    apt-get update && \
    # C/C++
    apt-get install -y build-essential make && \
    # Python3.6
    apt-get install -y zlib1g-dev libssl-dev libreadline-dev \
        libsqlite3-dev libbz2-dev libncurses5-dev libgdbm-dev liblzma-dev \
        tk-dev zlibc wget curl && \
    cd /usr/local/src && \
    wget --no-check-certificate https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz && \
    tar zxvf Python-3.6.3.tgz && \
    cd Python-3.6.3 && \
    ./configure && \
    make && \
    make altinstall && \
    cd ~ && \
    curl -kL https://bootstrap.pypa.io/get-pip.py | python3.6

EXPOSE 80
EXPOSE 8080

DockerHubにpush

DockerHubというDockerイメージを保存できるリポジトリがある.
以下のサイトでアカウントを作成する.

https://hub.docker.com/

今回はGithubと連携してみる.
GithubでDockerfileを管理し, DockerfileをpushするとDockerHubでイメージがビルドされる.
まず, Docker HubのアカウントのSettingsからGithubとのアカウント連携を行う.
次に, 上のバーからCreate >> Create Automated Build >> Githubを選び, 任意のGithubリポジトリを選択する.

GithubにDockerfileをpushすると, DockerHubのリポジトリも反映される.
Docker Hubのbuild detailsを見れば, イメージのbuild状況が確認できる.

GCE インスタンスの作成

GCPのコンソールからインスタンスを作成する.
マシンタイプは f1-micro にし, ゾーンをusから始まる名前にすると無料枠で利用できる.
この VM インスタンスにコンテナ イメージをデプロイします。 にチェックを入れる.
コンテナイメージは, docker.io/(アカウント名)/(リポジトリ名) とする.
今回はお試しなので, とりあえず特に他に設定せずに作成.

sshインスタンスに接続する, しばらく待ってdocker imagesを実行すると指定したコンテナイメージが出てくる.
docker runでイメージを起動してシェルの中に入れる.

DockerfileのCMDでサーバを起動するコマンドとかを指定すれば, 展開後プロセスが起動して終了しないので, docker psでプロセスが見れると思う.
次回は実際にプログラムを書いて, 自動でアプリケーションをビルドするところをしていく.

参考

「Cannot connect to the Docker daemon. 」と怒られる時の対処法 – 不動産屋のエンジニア

効率的に安全な Dockerfile を作るには - Qiita

Docker Hubを使ってGitHubにあるDockerfileからimageを自動生成する – Simple IT Life

VM およびマネージド インスタンス グループへのコンテナのデプロイ  |  Compute Engine ドキュメント  |  Google Cloud