ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

いよいよDockerやらないとまずそうな風潮を感じるので入門する

はじめに

構成管理ツールだとか。Infrastructure as Codeとか、大好きなんですけど、どうもここ数年Dockerの勢いが止まりません。もう構成をコードで書くんじゃなくてコンテナのほうが楽なんじゃないって時代、目の前に来てる気がする。

何年遅れてんだって感じでようやく仕事でもAnsibleを使い始めましたが、これはこれで大事だけどDockerは使えないとマズい。なぜかそんな空気を感じるので触っときます。

vagrantでdeploy

Macにも入れられるとは思いますが、まずはVM上に実行します。

記事最後にgithubへのリンク貼ります。

ansibleのplaybook、とりあえずyumでいれる。

---
- hosts: all
  become: yes
  tasks:
    - name: install yum package
      yum: name=docker state=present

Vagrantfileはいつもと同じです。

Vagrant.configure(2) do |config|
  config.vm.box = "CentOS72"
  config.vm.hostname = "docker"
  config.vm.network "private_network", ip: "192.168.100.104"
  config.vm.provision "shell", inline: <<-SHELL
    systemctl restart network.service
    SHELL
  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "provisioning/site.yaml"
    ansible.inventory_path = "provisioning/hosts"
    ansible.limit = 'all'
  end
end

upする

take@lenovo:~/work/vagrant/docker$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS72'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: docker_default_1476720786434_78729
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: 
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: 
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default: 
    default: Guest Additions Version: 4.3.30
    default: VirtualBox Version: 5.1
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /home/take/work/vagrant/docker
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.100.104]

TASK [install yum package] *****************************************************
changed: [192.168.100.104]

PLAY RECAP *********************************************************************
192.168.100.104            : ok=2    changed=1    unreachable=0    failed=0   

Dockerを立ち上げる

sshして動かす。

[vagrant@docker ~]$ systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: http://docs.docker.com

立ち上がってないのでplaybookにservice moduleでenable onにして起動させておきましょう。

2行追加する。

---
- hosts: all
  become: yes
  tasks:
    - name: install yum package
      yum: name=docker state=present
    - name: start docker service
      service: name=docker state=started enabled=yes
take@lenovo:~/work/vagrant/docker$ vagrant provision
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: Running provisioner: ansible...
    default: Running ansible-playbook...

PLAY ***************************************************************************

TASK [setup] *******************************************************************
ok: [192.168.100.104]

TASK [install yum package] *****************************************************
ok: [192.168.100.104]

TASK [start docker service] ****************************************************
changed: [192.168.100.104]

PLAY RECAP *********************************************************************
192.168.100.104            : ok=3    changed=1    unreachable=0    failed=0

あがったようです。

[vagrant@docker ~]$ systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2016-10-17 17:26:31 BST; 34s ago
     Docs: http://docs.docker.com
 Main PID: 5563 (docker-current)
   CGroup: /system.slice/docker.service
           └─5563 /usr/bin/docker-current daemon --exec-opt native.cgroupdriver=s...

バージョンもみておきます。

[vagrant@docker ~]$ docker version
Client:
 Version:         1.10.3
 API version:     1.22
 Package version: docker-common-1.10.3-46.el7.centos.14.x86_64
 Go version:      go1.6.3
 Git commit:      cb079f6-unsupported
 Built:           Fri Sep 16 13:24:25 2016
 OS/Arch:         linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Dockerを使ってみる

CentOS7ですが、Ubuntuのイメージを落としてきてみましょう。

[vagrant@docker ~]$ sudo docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ... 
latest: Pulling from docker.io/library/ubuntu
6bbedd9b76a4: Pull complete 
fc19d60a83f1: Pull complete 
de413bb911fd: Pull complete 
2879a7ad3144: Pull complete 
668604fde02e: Pull complete 
Digest: sha256:2d44ae143feeb36f4c898d32ed2ab2dffeb3a573d2d8928646dfc9cb7deb1315
Status: Downloaded newer image for docker.io/ubuntu:latest

使用可能なイメージファイルを確認します。

[vagrant@docker ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              f753707788c5        3 days ago          127.1 MB

Hello Worldしてみる

[vagrant@docker ~]$ sudo docker run ubuntu:latest /bin/echo 'Hello world'
Hello world

イメージにログインする。

[vagrant@docker ~]$ sudo docker run --name test -i -t ubuntu:latest /bin/bash
root@5aa4e71850ed:/# cat /etc/environment 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
root@5aa4e71850ed:/# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

えっめっちゃ楽じゃんすごい。コンテナ仮想すごい。

参考: CentOS 7.0でDockerを動かしてみた - 夜はいよいよ冴えたのだ。

mariadbをインストール

dockerでmariadbをいれてみましょう。

dockerhubにmariadbありますね。

https://hub.docker.com/r/_/mariadb/

[vagrant@docker ~]$ sudo docker run --name root -e MYSQL_ROOT_PASSWORD=root -d mariadb:latest
Unable to find image 'mariadb:latest' locally
Trying to pull repository docker.io/library/mariadb ... 
latest: Pulling from docker.io/library/mariadb
6a5a5368e0c2: Pull complete 
0689904e86f0: Pull complete 
486087a8071d: Pull complete 
3eff318f6785: Pull complete 
8c6f9c30cf5d: Pull complete 
7ac01ce32cbf: Pull complete 
d82bb19cbdca: Pull complete 
e874ed07dd07: Pull complete 
a5e2e7bf2e8e: Pull complete 
a311c2c58467: Pull complete 
beb44718230b: Pull complete 
45046d6898ad: Pull complete 
Digest: sha256:2092b4328148ed2f18759d615ca73a79968ba87f99ad67bcbbc99f8202824a1c
Status: Downloaded newer image for docker.io/mariadb:latest
92088e86eebb8a27fc2cf48003da1507ea643b974531201e76cc685ee1d14120

ギャ。本当につながった。

[vagrant@docker ~]$ sudo docker run -it --link root:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.18-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> 

あとかたづけ

docker psコマンドで見ます。

[vagrant@docker ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
fd1219fa5f5d        mariadb:latest      "docker-entrypoint.sh"   5 minutes ago       Exited (0) 5 minutes ago                          mariadb
92088e86eebb        mariadb:latest      "docker-entrypoint.sh"   10 minutes ago      Up 10 minutes                 3306/tcp            root
5aa4e71850ed        ubuntu:latest       "/bin/bash"              17 minutes ago      Exited (127) 14 minutes ago                       test
a816faa16596        ubuntu:latest       "/bin/echo 'Hello wor"   21 minutes ago      Exited (0) 21 minutes ago                         big_jennings

1つdocker rmしてみる

[vagrant@docker ~]$ sudo docker rm fd1219fa5f5d
fd1219fa5f5d
[vagrant@docker ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
92088e86eebb        mariadb:latest      "docker-entrypoint.sh"   12 minutes ago      Up 12 minutes                 3306/tcp            root
5aa4e71850ed        ubuntu:latest       "/bin/bash"              20 minutes ago      Exited (127) 17 minutes ago                       test
a816faa16596        ubuntu:latest       "/bin/echo 'Hello wor"   23 minutes ago      Exited (0) 23 minutes ago                         big_jennings

mariadbのコンテナを消そうとするが

[vagrant@docker ~]$ sudo docker rm 92088e86eebb
Failed to remove container (92088e86eebb): Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f

とめないとだめみたい。

[vagrant@docker ~]$ sudo docker stop 92088e86eebb
92088e86eebb
[vagrant@docker ~]$ sudo docker rm 92088e86eebb
92088e86eebb
[vagrant@docker ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
5aa4e71850ed        ubuntu:latest       "/bin/bash"              20 minutes ago      Exited (127) 17 minutes ago                       test
a816faa16596        ubuntu:latest       "/bin/echo 'Hello wor"   24 minutes ago      Exited (0) 24 minutes ago                         big_jennings

コンテナ=プロセスってことなんだねー。

おわりに

今回、vagrant + ansibleでdockerを立てて、その上で軽く動かしてみるところまでやりました。

作ったイメージにいろいろインストールしてイメージ化したりもできるんですよね。多分phpipamはこっちのほうが向いてそうです。コマンド流し込みでいける部分はansibleとかでもいいと思いますが、ちょっと両方やりながら可能性を考えてみたい。

また、dockerを使って何を実現するかについてのアイデアがまだないのでいろいろ調べて探してみようと思います。

次回はDockerfileを使ってみましょう。

なお結構前に買ってようやく読み出したのがこの本。ただ内容は浅く、わかりづらいので結局ネット使ってる。

CentOS7.2の上にdockerいれるplaybook書いただけですが、githubにあげておきました。

github.com