Help us understand the problem. What is going on with this article?

レガシーエンジニアによるDocker入門

初めに

この記事は技術進化が5年前くらいで止まっている環境で働く私が、モダンな技術に触れる為に学習したことを記録したものです。
暇潰しに読んでいただければ幸いです
本記事では、

  • Windows10 Home + WSL2の環境に、Dockerをインストール
  • Golang + GitがインストールされているコンテナをDockerfileで立ち上げる
  • VSCodeからコンテナに接続してHello World

の3つを行います。

Dockerとは?

DockerはOracleVM等と同様、仮想環境を提供するソフトウェアです。OracleVMのようにOS全体を仮想化せず、OSの一部とアプリケーションの実行環境をまとめたコンテナと呼ばれる仮想環境を提供します。

コンテナはDockerfileというテキストファイルを元に作成され、Dockerfileが同一であれば、どのOSでも同一の環境を作ることができます。

Dockerと呼ばれるものは正確にはDocker engineを指し、Docker engineはDockerコマンドの実行をサポートしています。

しかし、Docker engineはLinuxカーネルに依存するため、Linuxカーネルを持たないWindowsやmacOSでは、Docker-machineというツールを経由することでDockerコマンドの実行を行います。

※例:OracleVMとDockerにGoとMySQLの実行環境を作成する例
Dockerイメージ.png

WSL2のインストール

まずはWindows10Homeのバージョンが1903以上であることを確認してみましょう。そうでない場合は更新が必要ですので、更新して下さい。

続いて、コルタナさんに「Windows機能の有効化または無効化」と入力し、表示された同名のプログラムを起動します。Windows Subsystem for Linux(Linux用Windowsサブシステム)という項目があるので、チェックを付けて下さい。

Linux用Windowsサブシステム.png

その後PowerShellで以下のコマンドを実行し、PCを再起動しましょう

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

おかえりなさい。次はWSL用LinuxディストリビューションをMicrosoft Storeからダウンロードします。

Microsoft Storeにアクセスし、Ubuntu 20.04 LTSをインストールしましょう
Ubuntu.png

最後に、以下のコマンドを実行して準備完了です。

wsl --set-version Ubuntu 20.04 LTS 2

Dockerをインストール

それでは、いよいよDockerをインストールしましょう!
Dockerhubから、Docker for windowsのStateble版をダウンロードして実行するだけです。
何事もなく終了すれば、Docker desktop起動後コマンドが入力できるようになっているはずです。

docker --version
Docker version 19.03.8, build afacb8b

Dockerfileを元にコンテナを起動しよう

Dockerfileはテキストベースのファイルで、Dockerで作成するコンテナのレシピのようなものです。今回は GoとGitが使えて、ホストOSのc:/workspace/go下にコンテナで作成したプログラムを保存できる。というものを作りました。

# ベースイメージを決める。今回はDockerhubからGolangの最新版を取得する
FROM golang:latest
# プロジェクトのルートディレクトリを決定する。
WORKDIR /src/app/go-gin 
# ginをインストール
RUN  go get -u github.com/codegangsta/gin
# gitをインストール
RUN  apt-get update && apt-get install -y git
# ポートを3000に指定
EXPOSE 3000
# ホスト側の共有先ディレクトリを指定する。
VOLUME [ "/c:\workspace\go" ]

このコンテナを以下のコマンドでビルドしましょう。

docker build -t gocontainer .

このコマンドは、現在のディレクトリに存在するDockerfileを使って、gocontainerという名前のコンテナを作成するコマンドです。

作成後、実行します。

docker run -it gocontainer 
root:/src/app/go-gin# 

ルートユーザで、WORKDIRに指定したディレクトリにいることを確認しましょう
最後にGitがインストールされている事を確認します。
(ついでに今回使わないけどginが入っていることも)

root:/src/app/go-gin# git --version
git version 2.20.1
root:/src/app/go-gin# gin -h

コンテナ上で開発しよう

VSCodeに拡張機能をインストールして、コンテナ上で開発してみます。
インストールするのは以下です。

  • Docker(Microsoft)
  • Remote - Containers(Microsoft)

それぞれインストールしたら、Docker拡張機能のマークをクリックしてコンテナの一覧を開きます。
Docker拡張機能.png

起動中のgocontainerを右クリック→「Attach Visual Stadio Code」を選択します。

暫く待つと、WORKDIRで指定したディレクトリを開いたVSCodeが別ウィンドウで表示されます。試しにhello.goを作成し、実行してみましょう。

hello.go
package main
import "fmt"

func main() {
    fmt.Println("Hello Container")
}
root:/src/app/go-gin# go run hello.go
Hello Container

DockerfileのVOLUMESで指定したディレクトリにも同様のファイルが存在していれば、成功です。

終わりに

Dockerコンテナの一連の流れを見ていきました。もっと効率的にコンテナ実行ができるDocker composeやマルチステージ・ビルドに触れられなかったのが残念です。理解したら記事にします…

mamoru12150927
常駐エンジニアとして働き出して5年目になりました。脱却を目指してkotlinを勉強中のJava、Pythonエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした