try catch and ...release
ページ
ホーム
Chromeアプリ開発Tips
公開アプリ
Ubuntu
Linuxコマンド
#!/bin/bash
ブロックチェーンと暗号通貨
2016年9月13日火曜日
Dockerの基本とUbuntuサーバ構築など
Dockerの基本的な使い方のメモです。 [Vagrantの使い方](http://trycatchand.blogspot.jp/2016/07/vagrant-install-vm-start-stop-backup.html)を以前に掲載しましたが、Vagrantに比べて、Dockerの方は軽量で起動も速いのでなかなか使えそうです。早速試してみましょう。
**※DockerでUbuntuサーバを構築する方法だけをサクッと知りたい人は[Dockerfileを書かずにUbuntuサーバをシンプルに構築](#practice-docker-ubuntu)だけ読めばOKです。** - [Dockerのインストール](#docker-install) - [DockerでHelloWorld!](#docker-helloworld) - [Dockerfileを作ってみる](#create-dockerfile) - [Dockerfileからイメージをビルド](#build-image-from-dockerfile) - [イメージを走らせる](#run-image) - [実践1: Dockerfileを書いてnginxサーバを構築](#practice-docker-nginx) - [実践2: Dockerfileを書かずにUbuntuサーバをシンプルに構築](#practice-docker-ubuntu) - [実践3: Dockerfileを書かずにDBサーバ(mysql & postgresql)をシンプルに構築](#practice-docker-dbserver)
# Dockerをインストール ``` # インストール: $ curl -fsSL https://get.docker.com/ | sh # インストールできたか確認: $ sudo docker version Client: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 05:33:38 2016 OS/Arch: linux/amd64 Server: Version: 1.12.1 API version: 1.24 Go version: go1.6.3 Git commit: 23cf638 Built: Thu Aug 18 05:33:38 2016 OS/Arch: linux/amd64 ```
# Docker HelloWorld! ``` # hello-worldなDockerイメージを起動: $ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world c04b14da8d14: Pull complete Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/engine/userguide/ # 全コンテナの状況を確認: $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 739b7d7ccf70 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago infallible_archimedes ``` 次に[Docker Hub の Whalesayイメージ](https://hub.docker.com/r/docker/whalesay/)を走らせてみます: ``` $ sudo docker run docker/whalesay cowsay hoge Unable to find image 'docker/whalesay:latest' locally latest: Pulling from docker/whalesay e190868d63f8: Pull complete 909cd34c6fd7: Pull complete 0b9bfabab7c1: Pull complete a3ed95caeb02: Pull complete 00bf65475aba: Pull complete c57b6bcc83e3: Pull complete 8978f6879e2f: Pull complete 8eed3712d2cf: Pull complete Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b Status: Downloaded newer image for docker/whalesay:latest ______ < hoge > ------ \ \ \ ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ # 全イメージを確認: $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest c54a2cc56cbb 10 weeks ago 1.848 kB docker/whalesay latest 6b362a9f73eb 15 months ago 247 MB ```
# Dockerfileを書く ``` $ mkdir mydockerbuild $ cd mydockerbuild $ touch Dockerfile $ nano Dockerfile # Dockerfileファイルを以下の内容で保存: FROM docker/whalesay:latest RUN apt-get -y update && apt-get install -y fortunes CMD /usr/games/fortune -a | cowsay ```
# Dockerfileからイメージをビルド ``` # カレントディレクトリにあるDockerfileからイメージ名 'docker-whale' でビルド: $ sudo docker build -t docker-whale . Sending build context to Docker daemon 2.048 kB ... Successfully built 3106ff65eaa4 # イメージ一覧を確認: $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker-whale latest 3106ff65eaa4 8 minutes ago 274.9 MB hello-world latest c54a2cc56cbb 10 weeks ago 1.848 kB docker/whalesay latest 6b362a9f73eb 15 months ago 247 MB ```
# 自作イメージを走らせてみる Dockerfile内で apt-get install された fortunes がクジラに名言をランダムに喋らせます: ``` $ sudo docker run docker-whale _________________ / Kill Ugly Radio \ | | \ -- Frank Zappa / ----------------- \ \ \ ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ ```
# 実践1: Dockerfileを書いてnginxサーバを構築 次はより実践的な使い方です。 nginxインスタンスをDockerコンテナとして立ち上げてみます。 以下はDockerfileを書く方法です。 ``` $ cd .. $ mkdir example-nginx $ cd example-nginx/ ### Dockerfileを新規作成: $ touch Dockerfile $ nano Dockerfile ### Dockerfileを以下の内容で保存: FROM nginx COPY static-html-directory /usr/share/nginx/html ### nginxのstaticコンテンツディレクトリを作ってテキトーなhtmlを置く: $ mkdir static-html-directory $ touch static-html-directory/index.html $ nano static-html-directory/index.html ### index.htmlを以下の内容で保存: Hellow example-nginx! ### "some-content-nginx"という名でイメージを生成: $ sudo docker build -t some-content-nginx . Sending build context to Docker daemon 3.584 kB Step 1 : FROM nginx latest: Pulling from library/nginx ... Successfully built a25916520ede ### "some-content-nginx"イメージを使って"example-nginx"という名のコンテナを起動(晒すポートは8080): $ sudo docker run --name example-nginx -d -p 8080:80 some-content-nginx ### nginxの起動確認してみる: $ curl localhost:8080 Hello example-nginx! ### nginxのログを確認してみる: $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 10266d045b53 some-content-nginx "nginx -g 'daemon off" 12 minutes ago Up 12 minutes 443/tcp, 0.0.0.0:8080->80/tcp example-nginx $ sudo docker logs 10266d045b53 172.17.0.1 - - [13/Sep/2016:05:47:03 +0000] "GET / HTTP/1.1" 200 21 "-" "curl/7.47.0" "-" ### 起動しているコンテナからnginx.confをローカルにぶっこ抜いて: $ sudo docker cp example-nginx:/etc/nginx/nginx.conf ./nginx.conf $ ls Dockerfile nginx.conf static-html-directory/ ### ローカルのnginx.confを適当にいじる: $ sudo nano nginx.conf # confファイルの行頭に適当なコメントを入れて保存: # 今日の日付:2016/09/13 user nginx; worker_processes 1; ... ### コンテナ起動時にローカルのnginx.confを読み込ませるようにしてみる: $ nano Dockerfile # Dockerfileを以下の内容で保存: FROM nginx COPY static-html-directory /usr/share/nginx/html COPY nginx.conf /etc/nginx/nginx.conf ### イメージを再生成: $ sudo docker build -t some-content-nginx . ### コンテナを一旦落として削除してから再び起動(restartによる再起動ではない): $ sudo docker stop 10266d045b53 $ sudo docker rm 10266d045b53 $ sudo docker run --name example-nginx -d -p 8080:80 some-content-nginx ### コンテナの中を覗いてみる(execでシェルを使う): $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b744f445cb9 some-content-nginx "nginx -g 'daemon off" 43 seconds ago Up 42 seconds 443/tcp, 0.0.0.0:8080->80/tcp example-nginx $ sudo docker exec -i -t 3b744f445cb9 /bin/bash root@3b744f445cb9:/# cat /etc/nginx/nginx.conf # 今日の日付:2016/09/13 ←ちゃんと変更されている user nginx; worker_processes 1; ... ```
# 実践2: Ubuntuサーバをシンプルに構築 次にUbuntuサーバをDockerコンテナとして構築してみましょう。 ここではDockerfileを書かずにシンプルに作っていきたいと思います。 (ここまで長々と書いてきましたが、実はこのやり方が一番シンプルで実用性も高いかもしれません) ### Ubuntuコンテナを作成: ``` $ sudo docker pull ubuntu ``` ### ホスト名:ubuntu-dev なUbuntuサーバをバックグラウンド起動: ``` $ sudo docker run -d --name ubuntu-dev --hostname ubuntu-dev -it ubuntu /bin/bash ``` ### ubuntu-devに接続: 以下のコマンドを入力後、Enterをもう一回押すとubuntu-devに入れます: ``` $ sudo docker attach ubuntu-dev root@ubuntu-dev:/# ``` ### ubuntu-devから一旦exitする: ``` root@ubuntu-dev:/# exit ``` exitするとコンテナは停止してしまいます。 再度Ubuntuコンテナにログインするときは、あらかじめ以下の手順でコンテナをリスタートしておきます。 ### ubuntu-devコンテナのスタート: ``` $ sudo docker start ubuntu-dev ``` ### ubuntu-devに再度接続: ``` $ sudo docker attach ubuntu-dev ``` ### IPアドレスをチェックしておく: ``` root@ubuntu-dev:/# cat /etc/hosts ... 172.17.0.2 ubuntu-dev ``` ### ubuntu-devコンテナを停止させずにコンテナからexit: コンテナを停止させずにコンテナから抜けるには `Ctrl + P, Q` を押す。 ### 起動させてあるUbuntuコンテナ(ubuntu-dev=172.17.0.2)にpingを打ってみる: ``` $ ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.065 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.076 ms ``` ホスト側からコンテナ側ubuntu-devサーバへpingが通りました。 ### コンテナに固定IPを与える: 起動されるコンテナは自動的にIPアドレスが割り振られますが、IPアドレスを固定したい場合には次のように起動すればOK。例えば以下はubuntuなコンテナを 192.168.11.1 固定で起動する方法です: ``` # mynetworkというネットワークを設定: $ sudo docker network create --subnet=192.168.11.0/24 mynetwork # --net と --ip にそれぞれ "mynetwork" と "192.168.11.1" を指定: $ sudo docker run --name container-ubuntu -it --net=mynetwork --ip=192.168.11.1 -d ubuntu /bin/bash ``` ### コンテナ内でapt-getを使う: ``` root@ubuntu-dev:/# apt-get update ``` ### sudoを入れる: ``` root@ubuntu-dev:/# apt-get install sudo ``` ### ホスト・コンテナ間のファイルコピー: ファイルをコンテナ側にコピーしたり、逆にホスト側に持ってきたりするだけなら、わざわざsshをインストールしてscpとかやらなくても大丈夫。普通に `docker cp` でコピーできます: ``` $ sudo docker cp hoge.txt ubuntu-dev:/home/akirattii/ ``` ### sshを使えるようにする: どうしてもsshを使いたい場合は以下のようにする。 sshd のインストール: ``` root@ubuntu-dev:/# apt-get install openssh-server ``` ログインユーザrootのパスワード設定: ``` root@ubuntu-dev:/# passwd
Enter new UNIX password: Retype new UNIX password: ``` sshd_configの設定: ``` root@ubuntu-dev:/# nano /etc/ssh/sshd_config ... #PermitRootLogin prohibit-password PermitRootLogin yes ... ``` sshdリスタート: ``` root@ubuntu-dev:/# /etc/init.d/ssh restart ``` 以下でubuntuコンテナにログインできる: ``` $ ssh root@ubuntu-dev ``` ### デーモンの自動起動: たとえば先ほどのsshデーモンを自動起動させたい場合は、`/etc/bash.bashrc`に起動コマンドを追加すればOK: ``` root@ubuntu-dev:/# nano /etc/bash.bashrc ... /etc/init.d/ssh restart # ←追加 ``` コンテナからexitしてから再度 `$ sudo docker start ubuntu-dev` し、`$ ssh root@ubuntu-dev`を叩いてみれば確認できる。 ### 後片付け: コンテナを削除する: ``` $ sudo docker rm ubuntu-dev ``` ちゃんと消えたか確認: ``` $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` ubuntu-devなコンテナが消えました。
# 実践3: DBサーバをシンプルに構築 Dockerfileを書かずに、mysqlサーバとpostgresqlサーバのコンテナをシンプルに構築してみます。 以下はmysqlとpostgresqlのDBサーバコンテナをそれぞれ固定IP(192.168.11.11, 192.168.11.12)で起動しています: ``` # IPを固定するため mynetwork というネットワークを設定: $ sudo docker network create --subnet=192.168.11.0/24 mynetwork # コンテナ名 container-mysql としてmysqlサーバコンテナ起動: $ sudo docker run --name container-mysql -e MYSQL_ROOT_PASSWORD=mysql --net=mynetwork --ip=192.168.11.11 -d -p 3306:3306 mysql # mysqlクライアントでアクセスしてみる: $ mysql -h 192.168.11.11 -u root -p # コンテナ名 container-postgres としてpostgresqlサーバコンテナ起動: $ sudo docker run --name container-postgres -e POSTGRES_PASSWORD=postgres --net=mynetwork --ip=192.168.11.12 -d postgres # psqlクライアントでアクセスしてみる: $ psql -h 192.168.11.12 -p 5432 -d postgres -U postgres --password ``` 一度 `docker run` で作ってしまえば、後は `docker stop/start` で停止・起動ができます。
## まとめ Dockerを使うことでUbuntuサーバ環境構築があっという間に出来上がりますし、Vagrantと比べて起動も速くてなかなか使えますね。 開発環境をサクッと構築したい人にはおすすめですね。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿