文系出身業務経験なしのプログラマーがDocker使ってみた


業務経験なしのプログラマーがDocker使ってみた

はじめに

今年9月まで学生で、それまで独学のプログラミング歴は約2年です。
Dockerを使い始めたのはある企業での学生用インターンがきっかけでした。
その時の経験や感じたことをまとめて同じ境遇の方に少しでもシェアできたらと思います。

Dockerについて

Dockerとは仮想環境を軽量でかつ短時間で構築できるオープンソースのソフトウェアサービスで、IaC(Infrastructire as Code)という概念のもと、複数人の開発にて発生するコンフリクトやバージョンの違いによるエラーを少なくする為に多くの企業で取り入れられているようです。実際には日本での使用はまだまだ浸透してないという声もあり、今後開発効率を上げる為にも導入を検討している所もあるようです。

Dockerについて学んだこと

  • Dockerfileというファイルがある
  • DockerImageというDockerHubで無償で提供された仮想環境がある(厳密にはコンテナ)
  • Docker-composeは便利である
  • Alpine LinuxというDockerに特化したLinuxのディストリビューションがある

Dockerfileというファイルがある

Dockerで仮想環境を構築する上で欠かせないDockerfile
前述した通りコードで管理する仮想環境なので、必要な情報をモジュールに書き出します。
書き方は下記の例を見てほしいです

FROM alpine:latest
RUN apk update
RUN apk add nginx php7 php7-fpm git bash vim curl lsof supervisor
などなど

上記例はwebアプリを開発するための環境でAlpineLinuxというOSにnginxやphp-fpmなど必要なパッケージをインストールしています。もちろんインストールパッケージは少なければ少ないほどより軽量な仮想環境となります。1行目にFROM alpine:latestというコードはDockerHubからalpineというDockerImageをlatest(最新版)として引っ張ってきています。こうすることでalpineというOSのもとで構築できるようになります。そのほかにもUbuntuやDebianなども指定できます。続いて2行目のRUN apk updateですが、RUNは実行という意味と捉えて良いでしょう。alpineを指定しているのでapkコマンドを使ってパッケージのインストールの為に最新版に更新しています。続いて3行目からは必要なパッケージのインストールです。これはなんとなくわかると思うので割愛します。このように非常にシンプルな書き方で環境構築の準備ができます。

ここで疑問に感じた人もいるでしょう。DockerHubとは?実態が見えてこないと思います。
そういう方は次を見てください。

DockerImageというDockerHubで無償で提供された仮想環境がある(厳密にはコンテナ)

DockerにはDockerHubという自身のDockerアカウントを管理するサイトhttps://hub.docker.com があります。

ここの上部にある検索欄で既存の環境を検索してを引っ張ってくることができます。
試しにUbuntuを検索してみましょう。

このようにUbuntuのDockerImageが表示されました。右のLinux-x86(latest)と書いてあるのがバージョンです。
これをDockerfileで引っ張ってくると

FROM ubuntu:latest

となります。

ここで感の良い方は気づくはず。ここで紹介したイメージはOS単体でしたが、他にもより開発に便利なカスタマイズされたイメージがあってそれをインストールすれば自分で構築しなくて済むと。
そうなんです!
実はこのDocker、人が作成した環境を使ってそれを元に開発できるのです!
例えばこのイメージ

centOSに初めからmysqlが入ってます。(まぁ、基本的にデータベースは別コンテナにした方が良いですが..)
このように人の書いた環境を使うことができます。
これがDockerの利点の一つでしょう。

Docker-composeは便利である

続いてDocker-composeの紹介に入ります。
DockerではDockerfileからイメージ化されたDockerImageをdockerコマンドでコンテナ化させます。しかし、しかし複数のイメージを一度にコンテナ化させたり管理する時はdocker-composeコマンドを使うことをお勧めします。docker-composeを使用するための条件はdocker-compose.ymlというymlファイルを作成する必要があります。
例えば

version: "3"
services:
    ubuntu:
        image: ubuntu
        ports:
            - "80:80"
        volumes:
            - ./config/nginx.conf:/etc/nginx/nginx.conf
            - ./config/sub.conf:/etc/php7/php-fpm.d/sub.conf
            - ./config/php.ini:/etc/php7/conf.d/php.ini
            - ./config/default.conf:/etc/nginx/conf.d/default.conf
            - ./config/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf
        command: ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]
        stdin_open: true
        tty: true
        container_name: alp-pha

全ての解説をすると莫大な文字数になりそうなのでざっくりとお話しします。
基本的な構文の構造はインデントを使って階層化しています。
まずversionなのですが、現段階では基本的に3にしといてください。servicesの欄に管理したいコンテナを記入します。(現時点ではコンテナは作成されていません) ubuntuという名前のコンテナを作成する為に先ほど引っ張ってきたUbuntuのイメージを指定してコンテナのポート番号など詳細設定をしていきます。volumesではファイルのマウントをすることでローカルとコンテナ内のファイルをつなぐことができます。commandやcontainer_nameなどの細かい設定は公式ドキュメントを読んだ方が早いでしょう。

完成したdocker-compose.ymlが置いてあるフォルダに移り、コンテナを作成します。

docker-compose up -d 

これでエラーがない限りコンテナが作成されるはずです。よくあるエラーではymlファイルの構文が間違っているので注意が必要です。ちなみに -d は バックグラウンドでコンテナを起動してくれますが、詳しくはこれも公式ドキュメントを読んでみた方が良いかもしれません。コンテナは作成したら勝手に起動しています。
作成されたコンテナは

docker ps 
もしくは
docker ps -a

で確認できます。(docker-composeコマンドでもOK)
続いて作成したコンテナに入ります。

docker-compose exec -it コンテナID bash

で入れます。コマンドIDはdocker psで確認したら書いてあります。 bashは例で、shだったり何かしらシェルを指定します。※ttyが割り当てられていないコンテナもあるので、それはdocker-compose.ymlで設定したりできます。コンテナの中に入ったらdocker-compose.ymlでマウントしたファイルだったりイメージでインストールしたパッケージがあったりが確認できるかと思います。
これでDockerによる環境は完成です。

Alpine LinuxというDockerに特化したLinuxのディストリビューションがある

AlpineというディストリビューションはDockerを使ってみて初めて知りました。Docker用に作られたのか定かではありませんが、なぜAlpineはDockerに特化しているのかというと、なんと言っても軽量さです。
UbuntuやDebianなどその他OSで作られた仮想環境は基本的に500MB以上だったりします。それをAlpineで構築すると5MB~100MBくらいで済むのです。従来のやり方では環境を構築するたびに要領を取るし時間もかかる、重いしなど不満爆発の状態でしたが、alpineの登場によってより便利になりました。
AlpineもDockerHubにあるので、皆さんもぜひ使ってみてください!

終わりに

初めてQiitaで記事を書かせていただきました。文章力ゼロだと思いますが、お許しください笑
Dockerについては他にも書きたいことがたくさんあるのですが、一度では書ききれないので、個人的に話したいことだけを選んで書きました。

さて、Dockerを使ってみての感想ですが、正直感動しました。文系出身業務経験なしのプログラマーですが、非常に直感的に使いやすいですし、チームでの開発を想定した場合、コンフリクトも減りそうです。
Dockerを扱えるのは需要のあるスキルですし、今後使えることが当たり前の時代になってくると思います。
学習難易度も高くないと思うので、ぜひ皆さんも使ってみてください!