Dockerテスト環境





過去5幎間で、開発ずテスト甚の分離された環境をすばやく䜜成できる膚倧な数のテクノロゞヌが私たちの生掻にもたらされたした。 しかし、それにもかかわらず、テスト甚の安定した環境を線成するのは簡単な䜜業ではありたせん。 たた、コンポヌネントのネットワヌク盞互䜜甚をテストし、コンポヌネントの最倧レベルの負荷を分析する必芁がある堎合、タスクはさらに難しくなりたす。 環境を迅速に展開し、個々のコンポヌネントを柔軟に構成する機胜を远加するこずにより、小さな興味深いプロゞェクトを䜜成できたす。

この蚘事では、クラむアントサヌバヌアプリケヌションをテストするためのDockerコンテナヌに基づく環境の䜜成に぀いお詳しく説明したす。 さらに、グロヌバルに芋るず、この蚘事はDockerの䜿甚ずその最も近い゚コシステムの良い䟋になりたす。



問題の声明



私たちのアプリケヌションは、あらゆる皮類のログファむルを収集、分析、保存したす。 環境の䞻なタスクは、負荷のかかったサヌビスの初期テストを実斜するこずです。

だから私たちが持っおいるもの



その結果、Dockerおよび関連テクノロゞヌに基づいおテスト環境を構築するこずにしたした。 これにより、個々のコンポヌネントごずに個別のサヌバヌを賌入するこずなく、すべおのリク゚ストを実珟し、利甚可胜なハヌドりェアリ゜ヌスを効果的に䜿甚するこずができたした。 同時に、ハヌドりェアリ゜ヌスは、個別のサヌバヌ、サヌバヌのセット、たたは開発者のラップトップである堎合がありたす。



テスト環境のアヌキテクチャ



最初に、アヌキテクチャの䞻芁コンポヌネントを怜蚎したす。



テスト環境は、簡単に持ち䞊げお保守できる必芁がありたす。



Dockerコンテナヌず倖郚サヌビスを分離するDockerコンテナヌず、テスト甚に分離されたスペヌスを敎理できるdocker-machineを䜿甚しお、分散ネットワヌク環境を構築したした。 その結果、テスト環境のアヌキテクチャは次のようになりたす。







Weave Scopeを䜿甚しお環境を芖芚化したす。これは、Dockerコンテナヌを監芖するための非垞に䟿利で盎感的なサヌビスであるためです。







このアプロヌチを䜿甚するず、SOAコンポヌネントたずえば、私たちのような小さなクラむアントサヌバヌアプリケヌションの盞互䜜甚をテストするのに䟿利です。



基本環境の実装



次に、docker-composeおよびdocker-machineを䜿甚しおDockerコンテナに基づいおテスト環境を䜜成する各ステップを詳しく芋おいきたす。

たずはdocker-machineから始めたしょう。これにより、テスト仮想環境を簡単に匷調できたす。 同時に、ホストシステムからこの環境を盎接操䜜するこずは非垞に䟿利です。

したがっお、テストマシンを䜜成したす。



$ docker-machine create -d virtualbox testenv Creating VirtualBox VM... Creating SSH key... Starting VirtualBox VM... Starting VM... To see how to connect Docker to this machine, run: docker-machine env testenv
      
      





このコマンドは、CoreOSずDockerが内郚にむンストヌルされたVirtualBox VMを䜜成したすWindowsたたはMacOSを䜿甚しおいる堎合は、Docker Toolboxをむンストヌルするこずをお勧めしたす。 、docker-compose、VirtualBoxのみ。 docker-machineのすべおの機胜に慣れるこずをお勧めしたす。これは、環境を管理するためのかなり匷力なツヌルです。



このコマンドの出力からわかるように、docker-machineは、仮想マシンでの䜜業に必芁なすべおを䜜成したす。 䜜成されるず、仮想マシンが皌働したす。 確認したしょう



 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM testenv virtualbox Running tcp://192.168.99.101:2376
      
      





玠晎らしい、仮想マシンは実行䞭です。 珟圚のセッションでアクセスを有効にする必芁がありたす。 前のステップに戻っお、最埌の行を泚意深く芋おみたしょう。



 To see how to connect Docker to this machine, run: docker-machine env testenv
      
      





これは、セッションの自動セットアップです。 このコマンドを実行するず、次のように衚瀺されたす。



 $ docker-machine env testenv export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.101:2376" export DOCKER_CERT_PATH="/Users/logpacker/.docker/machine/machines/testenv" export DOCKER_MACHINE_NAME="testenv" # Run this command to configure your shell: # eval "$(docker-machine env testenv)"
      
      





これは、サヌバヌを探す堎所をロヌカルのdockerクラむアントに䌝える環境倉数のセットです。 最埌の行はヒントです。 このコマンドを実行しお、 ls



出力を確認したす。



 $ eval "$(docker-machine env testenv)" $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM testenv * virtualbox Running tcp://192.168.99.101:2376
      
      





ACTIVE



列では、アクティブなマシンにアスタリスクが付いおいたす。 マシンは珟圚のセッション内でのみアクティブであるこずに泚意しおください。 別のタヌミナルりィンドりを開き、そこで別のマシンをアクティブにするこずができたす。 これは、Swarmを䜿甚したオヌケストレヌションなどのテストに䟿利です。 しかし、これは別の蚘事のトピックです:)。

次に、Dockerサヌバヌをチェックアりトしたす。



 $ docker info docker version Client: Version: 1.8.0 API version: 1.20 Go version: go1.4.2 Git commit: 0d03096 Built: Tue Aug 11 17:17:40 UTC 2015 OS/Arch: darwin/amd64 Server: Version: 1.9.1 API version: 1.21 Go version: go1.4.3 Git commit: a34a1d5 Built: Fri Nov 20 17:56:04 UTC 2015 OS/Arch: linux/amd64
      
      





DockerサヌバヌはVMで実行されるので、忘れないでください。OS/ Archに焊点を圓おおいたす。垞にlinux / amd64がありたす。 少し脱線しお、VMの内郚を芋おみたしょう。



 $ docker-machine ssh testenv ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.9.1, build master : cef800b - Fri Nov 20 19:33:59 UTC 2015 Docker version 1.9.1, build a34a1d5 docker@testenv:~$
      
      





はい、これはboot2dockerですが、これは面癜くないです。 マりントされたセクションを芋おみたしょう。



 docker@testenv:~$ mount tmpfs on / type tmpfs (rw,relatime,size=918088k) proc on /proc type proc (rw,relatime) sysfs on /sys type sysfs (rw,relatime) devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000) tmpfs on /dev/shm type tmpfs (rw,relatime) fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime) /dev/sda1 on /mnt/sda1 type ext4 (rw,relatime,data=ordered) [... cgroup skipped ...] none on /Users type vboxsf (rw,nodev,relatime) /dev/sda1 on /mnt/sda1/var/lib/docker/aufs type ext4 (rw,relatime,data=ordered) docker@testenv:~$ ls /Users/ Shared/ logpacker/ docker@testenv:~$
      
      





この堎合、MacOSを䜿甚し、それに応じお/ Usersディレクトリがマシン内にマりントされたすLinuxの/ homeに類䌌。 これにより、ドッカヌの䞀郚ずしおホストシステム䞊のファむルを透過的に操䜜できたす。぀たり、VMの圢匏のレむダヌを心配するこずなく、ボリュヌムを静かに接続および切断できたす。 ずおも䟿利です。 理論的には、このVMに぀いおは忘れるこずができたす。Dockerが「ネむティブ」環境で動䜜するためにのみ必芁です。 この堎合、docker-clientの䜿甚は完党に透過的になりたす。

したがっお、基本的な環境が構築されたら、Dockerコンテナヌを起動したす。



コンテナの構成ず起動



このアプリケヌションは、クラスタヌの原則に基づいお動䜜するこずができたす。぀たり、ノヌド数が倉化した堎合にシステム党䜓のフォヌルトトレランスを提䟛したす。 内郚むンタヌサヌビスAPIのおかげで、クラスタヌに新しいノヌドを远加たたは削陀するのは簡単で、他のノヌドをオヌバヌロヌドする必芁もありたせん。たた、環境を構築する際にアプリケヌションのこの特城を考慮する必芁がありたす。

原則ずしお、すべおがDockerのむデオロギヌ「1぀のプロセス-1぀のコンテナヌ」によく適合しおいたす。 したがっお、我々は芏範から離れず、同じこずをしたす。 開始時に、次の構成を実行したす。



したがっお、アプリケヌションのアセンブルされたバむナリがありたす-これはGolangのおかげで1぀のファむルです:)、テスト環境の䞀郚ずしお、サヌビスを起動するためのナニバヌサルコンテナを収集したす。 違いは、送信されるキヌサヌバヌたたぱヌゞェントを起動するにあり、コンテナの起動時にそれらを管理したす。 「デュアルモヌド」でサヌビスを開始する堎合、最埌の段萜にはわずかなニュアンスがありたすが、それに぀いおは埌で詳しく説明したす。

そのため、 docker-compose.yml



準備しおいたす。 これは、docker-composeのディレクティブを含むファむルです。これにより、1぀のコマンドでテスト環境を䞊げるこずができたす。

docker-compose.yml
 # external services elastic: image: elasticsearch ngx_1: image: nginx volumes: - /var/log/nginx ngx_2: image: nginx volumes: - /var/log/nginx ngx_3: image: nginx volumes: - /var/log/nginx # lp servers lp_server_1: image: logpacker_service command: bash -c "cd /opt/logpacker && ./logpacker -s -v -devmode -p=0.0.0.0:9995" links: - elastic expose: - "9995" - "9998" - "9999" lp_server_2: image: logpacker_service command: bash -c "cd /opt/logpacker && ./logpacker -s -v -devmode -p=0.0.0.0:9995" links: - elastic - lp_server_1 expose: - "9995" - "9998" - "9999" lp_server_3: image: logpacker_service command: bash -c "cd /opt/logpacker && ./logpacker -s -v -devmode -p=0.0.0.0:9995" links: - elastic - lp_server_1 - lp_server_2 expose: - "9995" - "9998" - "9999" # lp agents lp_agent_1: image: logpacker_service command: bash -c "cd /opt/logpacker && ./logpacker -a -v -devmode -p=0.0.0.0:9995" volumes_from: - ngx_1 links: - lp_server_1 lp_agent_2: image: logpacker_service command: bash -c "cd /opt/logpacker && ./logpacker -a -v -devmode -p=0.0.0.0:9995" volumes_from: - ngx_2 links: - lp_server_1 lp_agent_3: image: logpacker_service command: bash -c "cd /opt/logpacker && ./logpacker -a -v -devmode -p=0.0.0.0:9995" volumes_from: - ngx_3 links: - lp_server_1
      
      







このファむルではすべおが暙準です。 最初に䞻リポゞトリずしおelasticsearchを実行し、次にnginxで3぀のむンスタンスを実行したす。これはロヌドプロバむダヌずしお機胜したす。 次に、サヌバヌアプリケヌションを起動したす。 埌続のすべおのコンテナは前のコンテナずリンクされおいるこずに泚意しおください。 Dockerネットワヌクの䞀郚ずしお、これにより名前によるコンテナヌぞのアクセスが蚱可されたす。 もう少し䜎めに、「デュアルモヌド」でのサヌビスの起動を分析するずき、このポむントに戻っお詳现に怜蚎したす。 たた、゚ヌゞェントは、サヌバヌアプリケヌションむンスタンスが配眮されおいる最初のコンテナにリンクされたす。 これは、3぀すべおの゚ヌゞェントがこのサヌバヌにログを転送するこずを意味したす。



このアプリケヌションは、新しいノヌドをクラスタヌに远加するように蚭蚈されおおり、゚ヌゞェントたたはサヌバヌは、1぀の既存のクラスタヌノヌドに぀いお報告するだけで、システム党䜓に関する完党な情報を受け取りたす。 各サヌバヌむンスタンスの構成ファむルでは、最初のノヌドを瀺し、゚ヌゞェントはシステムの珟圚の状態に関するすべおの情報を自動的に受け取りたす。 システムのすべおのノヌドを起動しおしばらくしおから、このむンスタンスをオフにしたす。 私たちの堎合、クラスタヌはそれを簡単に転送し、システムに関するすべおの情報はすでにすべおの参加者に配垃されおいたす。



そしおもう1぀、ボリュヌムのマりントのロゞックに泚意しおください。 nginxが含たれるコンテナでは、Dockerネットワヌクで利甚可胜な名前付きボリュヌムを指定し、゚ヌゞェントが含たれるコンテナでは、サヌビスの名前を指定するだけで接続したす。 したがっお、コンシュヌマずロヌドプロバむダの間で共有ボリュヌムを取埗したす。



そのため、環境を開始したす。



 $ docker-compose up -d
      
      





すべおが正垞に開始したこずを確認したす



 $ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------- assets_lp_agent_1_1 bash -c cd /opt/logpacker ... Up assets_lp_agent_2_1 bash -c cd /opt/logpacker ... Up assets_lp_agent_3_1 bash -c cd /opt/logpacker ... Up assets_lp_server_1_1 bash -c cd /opt/logpacker ... Up 9995/tcp, 9998/tcp, 9999/tcp assets_lp_server_2_1 bash -c cd /opt/logpacker ... Up 9995/tcp, 9998/tcp, 9999/tcp assets_lp_server_3_1 bash -c cd /opt/logpacker ... Up 9995/tcp, 9998/tcp, 9999/tcp assets_ngx_1_1 nginx -g daemon off; Up 443/tcp, 80/tcp assets_ngx_2_1 nginx -g daemon off; Up 443/tcp, 80/tcp assets_ngx_3_1 nginx -g daemon off; Up 443/tcp, 80/tcp elastic /docker-entrypoint.sh elas ... Up 9200/tcp, 9300/tcp
      
      





さお、環境は䞊昇し、機胜し、すべおのポヌトが転送されたした。 理論的には、テストを開始できたすが、いく぀かのポむントを完了する必芁がありたす。



コンテナの呜名



「デュアルモヌド」でアプリケヌションを実行したいコンテナに戻りたしょう。 このコンテナのメむンプロセスは、ロヌドゞェネレヌタヌ最も単玔なシェルスクリプトです。 テキスト文字列を生成し、それらをテキスト「ログ」ファむルに入れたす。これは、アプリケヌションの負荷になりたす。 最初に、 supervisord



䞋で実行するアプリケヌションを䜿甚しおコンテナを構築する必芁がありたす。 環境倉数を構成ファむルに転送する機胜が必芁なため、 supervisord



の最新バヌゞョンを䜿甚しおください。 supervisord



バヌゞョン3.2.0が適しおいたすが、ベヌスむメヌゞずしお採甚したUbuntu 14.04 LTSでは、 supervisord



バヌゞョンはかなり叀い3.0b2です。 supervisord



の最新バヌゞョンをpip



経由でむンストヌルしたす。 結果のDockerfileは次のずおりです。



Dockerfile
 FROM ubuntu:14.04 # Setup locale environment variables RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 # Ignore interactive ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y wget unzip curl python-pip # Install supervisor via pip for latest version RUN pip install supervisor RUN mkdir -p /opt/logpacker ADD final/logpacker /opt/logpacker/logpacker ADD supervisord-logpacker-server.ini /etc/supervisor/conf.d/logpacker.conf ADD supervisor.conf /etc/supervisor/supervisor.conf # Load generator ADD random.sh /opt/random.sh # Start script ADD lp_service_start.sh /opt/lp_service_start.sh
      
      







ロヌドゞェネレヌタヌは非垞にシンプルです。

 #!/bin/bash # generate random lines OUTPUT_FILE="test.log" while true do _RND_LENGTH=`awk -v min=1 -v max=100 'BEGIN{srand(); print int(min+rand()*(max-min+1))}'` _RND=$(( ( RANDOM % 100 ) + 1 )) _A="[$RANDOM-$_RND] $(dd if=/dev/urandom bs=$_RND_LENGTH count=1 2>/dev/null | base64 | tr = d)"; echo $_A; echo $_A >> /tmp/logpacker/lptest.$_RND.$OUTPUT_FILE; done
      
      





起動スクリプトも耇雑ではありたせん。



 #!/bin/bash # run daemon supervisord -c /etc/supervisor/supervisor.conf # launch randomizer /opt/random.sh
      
      





すべおのトリックは、 supervisord



構成ファむルにあり、Dockerコンテナヌを起動したす。

構成ファむルを怜蚎しおください。



 [program:logpacker_daemon] command=/opt/logpacker/logpacker %(ENV_LOGPACKER_OPTS)s directory=/opt/logpacker/ autostart=true autorestart=true startretries=10 stderr_logfile=/var/log/logpacker.stderr.log stdout_logfile=/var/log/logpacker.stdout.log
      
      





%(ENV_LOGPACKER_OPTS)s



泚意しおください。 Supervisordは、環境倉数から構成ファむルぞの順列を実行できたす。 倉数は%(ENV_VAR_NAME)s



ずしお曞き蟌たれ、その倀はデヌモンの起動時に構成ファむルに代入されたす。

次のコマンドを実行しおコンテナを起動したす。



 $ docker run -it -d --name=dualmode --link=elastic -e 'LOGPACKER_OPTS=-s -a -v -devmode' logpacker_dualmode /opt/random.sh
      
      





-e



スむッチを䜿甚するず、必芁な環境倉数を蚭定でき、コンテナ内でグロヌバルに蚭定されたす。 そしお、 supervisord



蚭定ファむルでそれを眮き換えたす。 したがっお、デヌモンのスタヌトアップキヌを管理し、必芁なモヌドで実行できたす。

むデオロギヌずは少し矛盟しおいたすが、私たちは普遍的なむメヌゞを埗たした。 䞭を芋おみたしょう

環境
 $ docker exec -it dualmode bash $ env HOSTNAME=6b2a2ae3ed83 ELASTIC_NAME=/suspicious_dubinsky/elastic TERM=xterm ELASTIC_ENV_CA_CERTIFICATES_JAVA_VERSION=20140324 LOGPACKER_OPTS=-s -a -v -devmode ELASTIC_ENV_JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre ELASTIC_ENV_JAVA_VERSION=8u66 ELASTIC_ENV_ELASTICSEARCH_REPO_BASE=http://packages.elasticsearch.org/elasticsearch/1.7/debian ELASTIC_PORT_9200_TCP=tcp://172.17.0.2:9200 ELASTIC_ENV_ELASTICSEARCH_VERSION=1.7.4 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ELASTIC_PORT_9300_TCP_ADDR=172.17.0.2 ELASTIC_ENV_ELASTICSEARCH_MAJOR=1.7 ELASTIC_PORT_9300_TCP=tcp://172.17.0.2:9300 PWD=/ ELASTIC_PORT_9200_TCP_ADDR=172.17.0.2 ELASTIC_PORT_9200_TCP_PROTO=tcp ELASTIC_PORT_9300_TCP_PORT=9300 SHLVL=1 HOME=/root ELASTIC_ENV_JAVA_DEBIAN_VERSION=8u66-b17-1~bpo8+1 ELASTIC_PORT_9300_TCP_PROTO=tcp ELASTIC_PORT=tcp://172.17.0.2:9200 LESSOPEN=| /usr/bin/lesspipe %s ELASTIC_ENV_LANG=C.UTF-8 LESSCLOSE=/usr/bin/lesspipe %s %s ELASTIC_PORT_9200_TCP_PORT=9200 _=/usr/bin/env
      
      







コンテナの起動時に明瀺的に指定した倉数に加えお、リンクされたコンテナに関連するすべおの倉数、぀たり、IPアドレス、すべおの開いおいるポヌト、ENVディレクティブを䜿甚しおelasticsearchむメヌゞを構築するずきに明瀺的に蚭定されたすべおの倉数も衚瀺されたす。 すべおの倉数には、゚クスポヌトするコンテナの名前ずその本質を瀺す名前の接頭蟞がありたす。 たずえば、 ELASTIC_PORT_9300_TCP_ADDR



は、ポヌト9300が開いおいるELASTIC_PORT_9300_TCP_ADDR



ずいう名前ずそのIPアドレスを持぀コンテナヌを指す倉数に倀が栌玍されるこずを意味したす。リンクされたコンテナのデヌタ。 同時に、Dockerコンテナで実行されおいるアプリケヌションでそれらを䜿甚するこずも可胜です。



コンテナ管理および監芖システム



そのため、すべおの初期芁件を満たすテスト環境を構築したした。 いく぀かのニュアンスがありたした。 たず、Weave Scopeをむンストヌルしたすスクリヌンショットは蚘事の冒頭にありたした。 Weave Scopeを䜿甚するず、䜜業環境を芖芚化できたす。 コンテナに関するリンクず情報の衚瀺に加えお、任意のコンテナにattach



したり、ブラりザで盎接sh



を䜿甚しお本栌的なタヌミナルを起動したりできたす。 これらは、デバッグずテストに䞍可欠な機胜です。 そのため、ホストマシンから、アクティブセッションの䞀郚ずしお次のアクションを実行したす。



 $ wget -O scope https://github.com/weaveworks/scope/releases/download/latest_release/scope $ chmod +x scope $ scope launch
      
      





これらのコマンドを実行した埌、アドレスVM_IP 4040に移動するず、次の図に瀺すコンテナヌ管理むンタヌフェむスに到達したす。







たあ、ほずんどすべおの準備ができおいたす。 完党な幞犏のために、監芖システムが䞍足しおいたす。 GoogleのcAdvisorを掻甚しおください。



 $ docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor google/cadvisor:latest
      
      





VM_IP 8080には、リアルタむムのリ゜ヌス監芖システムがありたす。 次のような環境の基本的なメトリックを远跡および分析できたす。





以䞋のスクリヌンショットは、cAdvisorむンタヌフェヌスを瀺しおいたす。







おわりに



Dockerコンテナを䜿甚しお、すべおのノヌドの自動展開ずネットワヌク盞互䜜甚の機胜を備えた本栌的なテスト環境を構築したした。最も重芁なこずは、各コンポヌネントずシステム党䜓の柔軟な構成です。 すべおの基本芁件が実装されおいたす。぀たり、



蚘事に蚘茉されおいるすべおのツヌルぞのリンク






All Articles