はじめに
構成管理ツールだとか。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を使ってみましょう。
なお結構前に買ってようやく読み出したのがこの本。ただ内容は浅く、わかりづらいので結局ネット使ってる。
プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化
- 作者: WINGSプロジェクト阿佐志保
- 出版社/メーカー: 翔泳社
- 発売日: 2015/11/19
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
CentOS7.2の上にdockerいれるplaybook書いただけですが、githubにあげておきました。