lisz-works

プログラミングと興味を貴方に

Docker ToolboxをMSYS2で動かす手順(docker-machine,docker-composeも)

【スポンサーリンク】

MSYS2 × Docker Toolbox

Docker ToolboxをMSYS2で動かす手順についてです!

セットアップから、docker-machineとdocker-composeの動作確認まで行います!

Docker Toolboxインストール

ここに沿って実施。

qiita.com

インストーラは、このページから最新版をゲットしましょう。

github.com

インストール手順は、公式のこのページにも書かれています。

手順の概要は

  1. インストーラを取得してくる
  2. インストールする(次へ次へ進めてけばOK)
  3. Kitematicのショートカットが作られるので実行
  4. VMの作成完了を待つ
  5. Doeck Hubのログインは「SKIP FOR NOW」

MSYS2でDockerするために

色々見たり試したりしたが、最終的にここのお陰で解決した。

dreamcloud.artark.ca

ただ英語のページなので、手順を書いていきます。

必要ファイル/フォルダの設定

まずはWindows側で操作していきます。

とはいえMSYS2上でもWindowsフォルダは操作できるので、そちらに読み替えて操作しても問題ないと思います。

Dockerのexeをコピー

まずは「C:\msys64\usr\local\bin」を作成と、下記3ファイルをこのフォルダにコピーします。

  1. docker-machine.exe
  2. docker.exe
  3. docker-compose.exe
mkdir C:\msys64\usr\local\bin
cd "c:\Program Files\Docker Toolbox"
copy docker-machine.exe C:\msys64\usr\local\bin
copy docker.exe C:\msys64\usr\local\bin
copy docker-compose.exe C:\msys64\usr\local\bin

コピーができちゃえば、Docker Toolbox自体はお役御免なので、アンインストールしちゃってもOKです。

「アンインストールする」って手順上書いてあったんですが、更新とか考えたらそのままでもいいんじゃね?とも半分思ってます。

ディレクトリハードリンクを作成

後々使用するProgram Filesのリンクを作成しておきます。

x64とx86のProgram Fileを「Program_Files~」として扱えるようにします。

mklink /j C:\Program_Files "C:\Program Files"
mklink /j "C:\Program_Files_x86" "C:\Program Files (x86)"
C:\Program_Files <<===>> C:\Program Files のジャンクションが作成されました

のような結果が出力されていれば成功です。

コレ作っておけばWindowsのコンソール操作もわざわざ「"C:\Program Files\~"」と、ダブルクォーテーションで囲わなくて便利なんじゃね?と思ったり。

設定用shellを作成

MSYS2で操作します。

/etc/profile.d/の下に「portabledevops.sh」を作成する。

portabledevops.shの元々のバージョンはここから取得できます。

github.com

ここから参考ページが提示しているように編集していきます。

詳細な変更が書かれているというより、その箇所を適宜変更のような書き方がされています。

それに合わせて修正することで、一応動作確認まではできています。

自分で修正が面倒……という方は、コチラにぼくが修正した版を置いておきました。

HOMEの設定

このブロックを

if [ $PORTSYS = 'MSYS' ] || [ $PORTSYS = 'MINGW32' ] || [ $PORTSYS = 'MINGW64' ]; then
    if [ ! -d /home/$USERNAME ]; then
        mkdir -p /home/$USERNAME
    fi
    HOME=/home/$USERNAME
    USERPROFILE=$HOME
    HOMEPATH=$HOME
elif [ $PORTSYS = 'Linux' ] && [ `uname -a|awk '{print $4}'|cut -d'-' -f2` = Microsoft ];then
    ()

このように変更しました。

if [ $PORTSYS = 'MSYS' ] || [ $PORTSYS = 'MINGW32' ] || [ $PORTSYS = 'MINGW64' ]; then
    if [ ! -d /home/$USERNAME ]; then
        echo "First time to run bash, create home folder: /home/$USERNAME"
        mkdir -p /home/$USERNAME
    fi
    export HOME=/home/$USERNAME
    export USERPROFILE=$HOME
    export HOMEPATH=$HOME
elif [ $PORTSYS = 'Linux' ] && [ `uname -a|awk '{print $4}'|cut -d'-' -f2` = Microsoft ];then
    ()

HOME, USERPROFILE, HOMEPATHをexportするように変更しました。

HOMEDRIVEの設定

このブロックを

if [ $PORTABLEBASH = NO ] || ([ $PORTSYS = 'Linux' ] && [ `uname -a|awk '{print $4}'|cut -d'-' -f2` = Microsoft ]);then
    ()
else 
    # portable msys2/cygwin/mobaxterm
    if [  "`env|grep MOBANOACL`" ]; then
      ()
    fi
fi

このように変更しました。

if [ $PORTABLEBASH = NO ] || ([ $PORTSYS = 'Linux' ] && [ `uname -a|awk '{print $4}'|cut -d'-' -f2` = Microsoft ]);then
    ()
else 
    # portable msys2/cygwin/mobaxterm
    export HOMEDRIVEL=`cygpath -m \`pwd\` |cut -d: -f1`
    export HOMEDRIVE=$HOMEDRIVEL:

    if [  "`env|grep MOBANOACL`" ]; then
      ()
    fi
fi

else側にHOMEDRIVEL, HOMEDRIVEのexportを追加しました。

外側のifブロックは実行環境をチェックしているようです。

MSYS2はこれに当てはまらないので、else側に処理を入れました。

Docker Toolbox関連

このブロックを

# portable docker toolbox
if [ -d $PORTABLEPATH/dockertoolbox ]; then
    ()
fi

このように変更しました。

if [ -d $PORTABLEPATH/dockertoolbox ]; then
    ()
else
    alias dm=/usr/local/bin/docker-machine.exe
    alias dc=/usr/local/bin/docker-compose.exe
    denv(){
        eval $(docker-machine env "$@")
    }
    export -f denv
fi

elseブロックを追加しました。

ここにaliasやexportを追加しています。

ここを通れば、docker-machine, docker-composeを、dm, dcで使うことができるようになります。

参考ページの実行テストに使われている「dm」なんかはココで設定したdocker-machineを使っています。

MSYS2を再起動する

MSYS2起動時にportabledevops.shが自動で読み込まれます。

こんな感じの表示が出たらOKです。

check sshd status
starting sshd
sshd: no hostkeys available -- exiting.
sshd failed
sshd is listening at 22
Agent pid 2414
ssh key not exist: /home/lis/.ssh/id_rsa
please generate it using ssh-keygen

Welcome to portabledevops
Platform: MINGW64
Home: /home/lis
Portable path:
Driver: C
Shortcut: alias|grep

docker-machineの動作テスト

参考ページで実施されている通り、docker-machineでVMを作って起動したりするテストをします。

作成と起動

msysdemoという名称のVMを、createで作成してstartで実行しています。

$ dm create --driver virtualbox --virtualbox-hostonly-cidr "10.0.10.1/24" msysdemo 
$ dm start msysdemo

実行するとVirtual Boxマネージャーからも、msysdemoが作られ、起動していることが確認できます。

環境変数の設定

Dockerの環境変数(なのかな?)に設定をします。

コレをしないとうまく動きませんでした。

$ denv msysdemo

VM一覧表示

起動まで行ってるのでやる必要も無いですが、msysdemoが作成されていることが確認できます。

$ dm ls
NAME       ACTIVE   DRIVER       STATE     URL                      SWARM   DOCKER     ERRORS
msysdemo   *        virtualbox   Running   tcp://10.0.10.100:2376           v19.03.5

SSH接続

SSHで作ったdockerのVMに接続します。

$ dm ssh msysdemo

実行するとこんな感じで表示されました。

$ dm ssh msysdemo
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@msysdemo:~$ exit
logout

SSH経由でコマンド実行

SSH経由でコマンドを実行した結果を取得したり

$ dm ssh msysdemo "hostname && uname -a"
msysdemo
Linux msysdemo 4.14.154-boot2docker #1 SMP Thu Nov 14 19:19:08 UTC 2019 x86_64 GNU/Linux

docker-composeの動作テスト

ココを元に、docker-composeでHello Worldします。

そもそもdocker-compose動くか確認

動作確認ということで、バージョン表示を行います。

$ dc --version
docker-compose version 1.24.1, build 4667896b

動いてますね。

docker-compose.ymlの作成

適当な作業ディレクトリを作り、Hello world用のdocker-compose.ymlを作ります。

ファイル名は「docker-compose.yml」固定。

version: "3"
services:
  hello:
    image: hello-world:latest

docker-compose実行

ということでコレを実行。

$ dc up
Creating network "hello-world_default" with the default driver
Pulling hello (hello-world:latest)...
latest: Pulling from library/hello-world
Digest: sha256:4fe721ccc2e8dc7362278a29dc660d833570ec2682f4e4194f4ee23e415e1064
Status: Downloaded newer image for hello-world:latest
Creating hello-world_hello_1 ... done
Attaching to hello-world_hello_1
hello_1  |
hello_1  | Hello from Docker!
hello_1  | This message shows that your installation appears to be working correctly.
hello_1  |
hello_1  | To generate this message, Docker took the following steps:
hello_1  |  1. The Docker client contacted the Docker daemon.
hello_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
hello_1  |     (amd64)
hello_1  |  3. The Docker daemon created a new container from that image which runs the
hello_1  |     executable that produces the output you are currently reading.
hello_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
hello_1  |     to your terminal.
hello_1  |
hello_1  | To try something more ambitious, you can run an Ubuntu container with:
hello_1  |  $ docker run -it ubuntu bash
hello_1  |
hello_1  | Share images, automate workflows, and more with a free Docker ID:
hello_1  |  https://hub.docker.com/
hello_1  |
hello_1  | For more examples and ideas, visit:
hello_1  |  https://docs.docker.com/get-started/
hello_1  |
hello-world_hello_1 exited with code 0

やった動いたぁぁぁぁぁぁ!!!

docker-composeができちゃえば色々かつる(イメージ)なので、勝利宣言状態です。

参考

コチラを参考にしました。ありがとうございました!

qiita.com dreamcloud.artark.ca qiita.com

あとがき

Docker ToolboxをMSYS2で動かす手順についてでした!

わからずググったり、躓きながら進めて、やっと成功したので結構喜んでます……

MSYS2を強化していけば、MSYS2×Docker環境でいろんなことできちゃうんじゃね!?という妄想を膨らましております。