MoChiwakiブログ

女性エンジニアがゆる~く書く備忘録ブログ 〜だいたいいつもつまづいている〜

WindowsにDocker入れて、MySQLを複数動かすの!

最近私のチームがスクラムになりました。
スクラムってシステムが配信されるまで一通り把握しないといけないのね。

なので新しいものに触れることが多くなりそうです。
例えばIntelliJIDEA, Scala, Docker, VirtualBox, バッチも...
(スクラムとか新しいツールについては今度まとめるとして)
そこでつまづいたDockerについてめもります。

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

Dockerとは

Dockerとは、Linux上で独立した別のLinuxシステムを起動することができる、コンテナ型の仮想化ソフトウェアの一つ。Docker社(旧dotCloud社)が開発を創始したもので、オープンソースとして公開されている。

使い時とは

どういうタイミングで使うのかと言うと、
私の場合は
スクラムになったので違うチームのプロジェクトも環境構築しなければならなくなりました。

でもDBは同じの使っていたりした。

テストとかするときどうすんねん

MySQL複数たてたいよね!

んじゃDocker使うか!

仮想環境にDocker(コンテナ)を立てて使い捨てのMySQL(データベース)を立てることができるすぐれものなのだ。
といっても手こずってるからまだまだこれから。

だいぶ戦って、

www.bunkei-programmer.net

に助けられました。
(というか助けられたサイトと同じことしてますのでそっち見た方がわかりやすいです。。)

なんか、toolbox入れたらDockerクライアントのバイナリとか、docker-machineとか入ってるから別々に用意する必要ないらしいじゃn。。。
それ入れてたからか、versionが違ってたからか、
何故か仮想環境作ってもIPふってくれなくて
やたらこのエラー。

exit status 255

ということで全消ししてやり直し!

構築前に Windows必見!

Windowsの64bitは設定が必要な可能性があります。
VirtualBoxを入れてみると64bitが設定できなかったりします。
その場合はBIOSの設定が必要になります。
がーん、再起動ですw

PCによって違いますが、
電源入るときのメーカーのロゴが流れた時に、
F2とかDeleteとかで設定画面になります。
LenovoのデスクトップはF1押しながら電源ボタンで設定画面になりました。

Intel(R) Virtualization Technology: Enabled

↑をdesabledからEnabledに変更できれば大丈夫です!

構築

結局これ入れればOKです!

Docker Toolbox | Docker

インストール中にVirtualBoxも入れられる様子。
その後、Docker Quickstart Terminalでとりあえず起動!

仮想環境作ります

VirtualBox使って、devって名前で作るよーってコマンド

 $ docker-machine create --driver virtualbox dev
    Running pre-create checks...
    Creating machine...
    (dev) Copying C:\Users\mochiwaki \.docker\machine\cache\boot2docker.iso to C:\Users\mochiwaki \.docker\machine\machines\dev\boot2docker.iso...
    (dev) Creating VirtualBox VM...
    (dev) Creating SSH key...
    (dev) Starting the VM...
    (dev) Check network to re-create if needed...
    (dev) Waiting for an IP...
    Waiting for machine to be running, this may take a few minutes...
    Detecting operating system of created instance...
    Waiting for SSH to be available...
    Detecting the provisioner...
    Provisioning with boot2docker...
    Copying certs to the local machine directory...
    Copying certs to the remote machine...
    Setting Docker configuration on the remote daemon...
    Checking connection to Docker...
    Docker is up and running!
    To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run:
    C:\Program Files\Docker Toolbox\docker-machine.exe env dev

dockerの中にはどんな仮想環境あるか見るコマンド
※ちゃんとURLあるか確認

 $ docker-machine ls
    NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
    default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.10.3
    dev       -        virtualbox   Running   tcp://192.168.99.101:2376           v1.10.3

eval使って変数つけるよーってコマンド

 $ eval "$(docker-machine env dev)"

何に変数つけたのって人はこれで確認

 $ env | grep -i docker
    DOCKER_HOST=tcp://192.168.99.101:2376
    DOCKER_MACHINE_NAME=dev
    DOCKER_TLS_VERIFY=1
    PATH=…<略>…/c/Program Files/Docker Toolbox
    DOCKER_TOOLBOX_INSTALL_PATH=C:\Program Files\Docker Toolbox
    DOCKER_CERT_PATH=C:\Users\mochiwaki \.docker\machine\machines\dev
    BASH_FUNC_docker%%=() {  MSYS_NO_PATHCONV=1 docker.exe "$@"

その仮想環境にMySQLをpullする

 $ docker pull mysql:5.7
    5.7: Pulling from library/mysql
    fdd5d7827f33: Pull complete
    a3ed95caeb02: Pull complete
    2d9b55a37647: Pull complete
    9964041ec782: Pull complete
    f3e6609e3bc3: Pull complete
    15e1bcfe2437: Pull complete
    16eea8ab42c7: Pull complete
    3ebb6d314aee: Pull complete
    ed7cc70659fd: Pull complete
    5003cda816ca: Pull complete
    Digest: sha256:e39950cee6807d271bee8160ef20f927e0ed90e120db8edf3a93669468b94f98
    Status: Downloaded newer image for mysql:5.7

こんな設定ファイルあると良いらしいです。

 $ mkdir -pv $HOME/docker/mysql/conf.d
    mkdir: created directory ‘/c/Users/mochiwaki /docker’
    mkdir: created directory ‘/c/Users/mochiwaki /docker/mysql’
    mkdir: created directory ‘/c/Users/mochiwaki /docker/mysql/conf.d’

    
    $ cat << EOF > $HOME/docker/mysql/conf.d/my.cnf
    > [client]
    > port=3306
    > default-character-set = utf8mb4
    >
    > [mysqld]
    > port=3306
    > character-set-server = utf8mb4
    > skip-character-set-client-handshake
    > skip-name-resolve
    > lower_case_table_names = 1
    > default-storage-engine = InnoDB
    > innodb_file_format = Barracuda
    > innodb_file_per_table = 1
    > EOF

    

いざ立ち上がれMySQL
mysql5.7って名前で

 $ docker run --name mysql5.7 -p 3307:3306 -v ~/docker/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_DATABASE=hoge -e MYSQL_USER=worker -e MYSQL_PASSWORD=worker -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
    4f3e50ab88928137c5329d6676077b5f13cf01699fdfa451b801a2eb1701387c

    
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS            PORTS                    NAMES
    4f3e50ab8892        mysql:5.7           "/entrypoint.sh mysql"   11 seconds ago      Up 11 seconds     0.0.0.0:3307->3306/tcp   mysql5.7


んじゃ、いざはいるぞ!
(pathにMySQL5.7のbin通してね)

 mysql -h$(docker-machine ip dev) -P3307 -uworker -pworker hoge

    mysql: [Warning] Using a password on the command line interface can be insecure.
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 2
    Server version: 5.7.11 MySQL Community Server (GPL)

    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

入れたあああ!

よし、調子乗ってもう1つ作ろう

んで、
一つ建てられたけど、同時に2つ建てたい場合は例えば

 docker run --name mysql5.7 -p 3308:3306 -v ~/docker/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_DATABASE=hoge -e MYSQL_USER=worker -e MYSQL_PASSWORD=worker -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

というように、3308:3306 左側のポートを変えればできます

つまりこのポートの使い分けが肝な訳ですね!

(ex)
testって名前でまた仮想環境作った場合。(繰り返し)

 $ docker-machine create --driver virtualbox dev
    …
    $ docker-machine env test
    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://192.168.99.102:2376"
    export DOCKER_CERT_PATH="C:\Users\mochiwaki \.docker\machine\machines\test"
    export DOCKER_MACHINE_NAME="test"
    # Run this command to configure your shell:
    # eval $("C:\Program Files\Docker Toolbox\docker-machine.exe" env test)

    
    $ eval "$(docker-machine env test)"

    $ docker run --name mysql5.7 -p 3308:3306 -v ~/docker/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_DATABASE=hoge -e MYSQL_USER=worker -e MYSQL_PASSWORD=worker -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 
    Unable to find image 'mysql:5.7' locally 5.7: Pulling from library/mysql
    fdd5d7827f33: Pull complete
    a3ed95caeb02: Pull complete
    2d9b55a37647: Pull complete
    9964041ec782: Pull complete
    f3e6609e3bc3: Pull complete
    15e1bcfe2437: Pull complete
    16eea8ab42c7: Pull complete
    3ebb6d314aee: Pull complete
    ed7cc70659fd: Pull complete
    5003cda816ca: Pull complete
    Digest: sha256:e39950cee6807d271bee8160ef20f927e0ed90e120db8edf3a93669468b94f98
    Status: Downloaded newer image for mysql:5.7
    785fc98474262c495744c21503bd477c5c39a926c8c7583a44feb0cbb6f85d70

    
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS           PORTS                    NAMES
    785fc9847426        mysql:5.7           "/entrypoint.sh mysql"   37 seconds ago      Up 37 seconds     0.0.0.0:3308->3306/tcp   mysql5.7

これでdevにもtestにも入れます。

$ mysql -h$(docker-machine ip test) -P3308 -uworker -pworker hoge

ちなみに、コマンドプロンプトでも入れます。
↑のホスト名は変数使えないので

 $ docker-machine ip test

などでIP確認してそれを-hに書けばOK!