{"id":2319,"date":"2017-01-06T07:06:55","date_gmt":"2017-01-06T07:06:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2319"},"modified":"2023-11-17T08:43:26","modified_gmt":"2023-11-17T16:43:26","slug":"docker-services-stack-distributed-application-bundle","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/docker-services-stack-distributed-application-bundle\/","title":{"rendered":"Servi\u00e7os do Docker, pilha e pacote de aplicativos distribu\u00eddos"},"content":{"rendered":"<p><a href=\"\/wp-content\/original-assets\/july2015\/docker-services-stack-and-distributed-application-bundle\/docker-1.12.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-14057 size-full\" src=\"\/wp-content\/original-assets\/july2015\/docker-services-stack-and-distributed-application-bundle\/docker-1.12.jpg\" alt=\"docker-1.12\" width=\"280\" height=\"300\" \/><\/a><\/p>\n<p><a href=\"https:\/\/github.com\/docker\/docker\/releases\/tag\/v1.12.0-rc1\">Primeira vers\u00e3o candidata do Docker 1.12<\/a> foi anunciado em <a href=\"https:\/\/blog.docker.com\/2016\/06\/docker-1-12-built-in-orchestration\/\">duas semanas atr\u00e1s<\/a>. V\u00e1rios novos recursos s\u00e3o<br \/>\nplanejado para esta vers\u00e3o.<\/p>\n<p>Este blog mostrar\u00e1 como criar um <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/distributed-applications\/\">Aplicativo distribu\u00eddo<\/a> Bundle do Docker Compose e implante-o como Docker Stack em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/deploy-docker-compose-services-swarm\/\">Docker Swarm<\/a> Modo. Muito obrigado a <a href=\"https:\/\/twitter.com\/friism\">@friismo<\/a>\u00a0por me ajudar a entender esses conceitos.<\/p>\n<p>Vamos dar uma olhada nos recursos primeiro:<\/p>\n<ul>\n<li><strong>Orquestra\u00e7\u00e3o integrada<\/strong>: Um aplicativo t\u00edpico \u00e9 definido usando um arquivo Docker Compose. Essa defini\u00e7\u00e3o consiste em v\u00e1rios cont\u00eaineres e \u00e9 implantada em v\u00e1rios hosts. Isso evita o ponto \u00fanico de falha (SPOF) e mant\u00e9m seu aplicativo<br \/>\nresiliente. V\u00e1rias estruturas de orquestra\u00e7\u00e3o, como Docker Swarm, Kubernetes e Mesos, permitem orquestrar esses aplicativos. No entanto, como essa \u00e9 uma caracter\u00edstica t\u00e3o importante do aplicativo, o Docker Engine agora tem orquestra\u00e7\u00e3o integrada.<br \/>\nMais detalhes sobre esse t\u00f3pico em um blog posterior.<\/li>\n<li><strong>Servi\u00e7o<\/strong>: Um servi\u00e7o replicado, distribu\u00eddo e com balanceamento de carga pode ser facilmente criado usando <code>servi\u00e7o docker create<\/code> comando. Um \"estado desejado\" do aplicativo, como a execu\u00e7\u00e3o de 3 cont\u00eaineres do Couchbase, \u00e9 fornecido e o comando<br \/>\nO mecanismo de autocorre\u00e7\u00e3o do Docker garante que muitos cont\u00eaineres estejam em execu\u00e7\u00e3o no cluster. Se um cont\u00eainer for desativado, outro cont\u00eainer ser\u00e1 iniciado. Se um n\u00f3 for desativado, os cont\u00eaineres desse n\u00f3 ser\u00e3o iniciados em um n\u00f3 diferente. Mais sobre isso em um pr\u00f3ximo<br \/>\nblog.<\/li>\n<li><strong>Seguran\u00e7a de configura\u00e7\u00e3o zero<\/strong>: O Docker 1.12 vem com TLS mutuamente autenticado, fornecendo autentica\u00e7\u00e3o, autoriza\u00e7\u00e3o e criptografia para as comunica\u00e7\u00f5es de todos os n\u00f3s que participam do enxame, prontos para uso. Mais sobre isso em<br \/>\nem um blog posterior.<\/li>\n<li><strong>Pilha do Docker e pacote de aplicativos distribu\u00eddos<\/strong>: O Distributed Application Bundle, ou DAB, \u00e9 um formato de imagem distribu\u00edvel de v\u00e1rios servi\u00e7os. Leia mais para obter mais detalhes.<\/li>\n<\/ul>\n<p>At\u00e9 o momento, voc\u00ea pode pegar um <code>Dockerfile<\/code>\u00a0e criar uma imagem a partir dela usando o <code>constru\u00e7\u00e3o de docas<\/code> comando. Um cont\u00eainer pode ser iniciado usando o comando\u00a0<code>execu\u00e7\u00e3o do docker<\/code> comando. V\u00e1rios cont\u00eaineres podem ser iniciados facilmente com o comando<br \/>\nesse comando v\u00e1rias vezes. Ou voc\u00ea tamb\u00e9m pode usar o arquivo Docker Compose e aumentar a escala dos seus cont\u00eaineres usando o comando <code>escala do docker-compose<\/code> comando.<br \/>\n<a href=\"\/wp-content\/original-assets\/july2015\/docker-services-stack-and-distributed-application-bundle\/docker-lifecycle-1024x329.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-14051\" src=\"\/wp-content\/original-assets\/july2015\/docker-services-stack-and-distributed-application-bundle\/docker-lifecycle-1024x329.png\" alt=\"docker-lifecycle\" width=\"604\" height=\"194\" \/><\/a><\/p>\n<p>A imagem \u00e9 um formato port\u00e1til para um \u00fanico cont\u00eainer. <a href=\"https:\/\/docker.com\/dab\">Pacote de aplicativos distribu\u00eddos<\/a>ou DAB, um novo conceito introduzido no Docker 1.12, \u00e9 um formato port\u00e1til para v\u00e1rios cont\u00eaineres. Cada pacote pode ser implantado como<br \/>\na <em>Pilha<\/em>\u00a0em tempo de execu\u00e7\u00e3o.<\/p>\n<p><a href=\"\/wp-content\/original-assets\/july2015\/docker-services-stack-and-distributed-application-bundle\/docker-stack-lifecycle-1024x344.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-14052\" src=\"\/wp-content\/original-assets\/july2015\/docker-services-stack-and-distributed-application-bundle\/docker-stack-lifecycle-1024x344.png\" alt=\"docker-stack-lifecycle\" width=\"604\" height=\"203\" \/><\/a><\/p>\n<p>Saiba mais sobre o DAB em <a href=\"https:\/\/docker.com\/dab\">docker.com\/dab<\/a>. Para simplificar, aqui est\u00e1 uma analogia que pode ser feita:<\/p>\n<p><strong>Dockerfile -&gt; Imagem -&gt; Cont\u00eainer<\/strong><\/p>\n<p><strong>Docker Compose -&gt; Pacote de aplicativos distribu\u00eddos -&gt; Docker Stack<\/strong><\/p>\n<p>Vamos usar um arquivo Docker Compose, criar um DAB a partir dele e implant\u00e1-lo como um Docker Stack.<\/p>\n<p><span style=\"color: #333333;line-height: 20.8px;text-align: left\">\u00c9 importante observar que esse \u00e9 um recurso experimental na vers\u00e3o 1.12-RC2.<\/span><\/p>\n<h2>Criar um pacote de aplicativos distribu\u00eddos a partir do Docker Compose<\/h2>\n<p>O Docker Compose CLI adiciona um novo <code>feixe<\/code> comando. Mais detalhes podem ser encontrados:<\/p>\n<pre class=\"lang:default decode:true\">docker-compose bundle --help\r\nGenerate a Docker bundle from the Compose file.\r\n\r\nLocal images will be pushed to a Docker registry, and remote images\r\nwill be pulled to fetch an image digest.\r\n\r\nUsage: bundle [options]\r\n\r\nOptions:\r\n    -o, --output PATH          Path to write the bundle file to.\r\n                               Defaults to \".dsb\".<\/pre>\n<p>Agora, vamos pegar uma defini\u00e7\u00e3o do Docker Compose e criar um DAB a partir dela. Aqui est\u00e1 nossa defini\u00e7\u00e3o do Docker Compose:<\/p>\n<pre class=\"lang:default decode:true\">version: \"2\"\r\nservices:\r\n  db:\r\n    container_name: \"db\"\r\n    image: arungupta\/oreilly-couchbase:latest\r\n    ports:\r\n      - 8091:8091\r\n      - 8092:8092 \r\n      - 8093:8093 \r\n      - 11210:11210\r\n  web:\r\n    image: arungupta\/oreilly-wildfly:latest\r\n    depends_on:\r\n      - db\r\n    environment:\r\n      - COUCHBASE_URI=db\r\n    ports:\r\n      - 8080:8080<\/pre>\n<p>Esse arquivo Compose inicia um servidor WildFly e um servidor Couchbase. Um aplicativo Java EE \u00e9 pr\u00e9-implantado no servidor WildFly que se conecta ao servidor Couchbase e permite executar opera\u00e7\u00f5es CRUD usando a API REST. A fonte desse arquivo est\u00e1 em:<br \/>\n<a href=\"https:\/\/github.com\/arun-gupta\/oreilly-docker-book\/blob\/master\/hello-javaee\/docker-compose.yml\">github.com\/arun-gupta\/oreilly-docker-book\/blob\/master\/hello-javaee\/docker-compose.yml<\/a>. Gere um pacote de aplicativos com ele:<\/p>\n<pre class=\"lang:default decode:true\">docker-compose bundle\r\nWARNING: Unsupported key 'depends_on' in services.web - ignoring\r\nWARNING: Unsupported key 'container_name' in services.db - ignoring\r\nWrote bundle to hellojavaee.dsb<\/pre>\n<p><code>depende_de<\/code> apenas cria depend\u00eancia entre dois servi\u00e7os e os faz iniciar em uma ordem espec\u00edfica. Isso s\u00f3 garante que o cont\u00eainer do Docker seja iniciado, mas o aplicativo dentro do cont\u00eainer pode demorar mais para iniciar. Portanto, esse atributo apenas<br \/>\nresolve parcialmente o problema.\u00a0<code>nome_do_cont\u00eainer<\/code> fornece um nome espec\u00edfico para o cont\u00eainer. Depender de um nome de cont\u00eainer espec\u00edfico \u00e9 um acoplamento r\u00edgido e n\u00e3o permite dimensionar o cont\u00eainer.  Portanto, ambos os avisos podem ser ignorados,<br \/>\npor enquanto. Esse comando gera um arquivo usando o nome do projeto Compose, que \u00e9 o nome do diret\u00f3rio. Portanto, no nosso caso, <code>hellojavaee.dsb<\/code> \u00e9 gerado. Essa extens\u00e3o de arquivo foi renomeada para <code>.dab<\/code> no RC3. O c\u00f3digo gerado<br \/>\npacote de aplicativos \u00e9 semelhante:<\/p>\n<pre class=\"lang:default decode:true\">{\r\n  \"services\": {\r\n    \"db\": {\r\n      \"Image\": \"arungupta\/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c\", \r\n      \"Networks\": [\r\n        \"default\"\r\n      ], \r\n      \"Ports\": [\r\n        {\r\n          \"Port\": 8091, \r\n          \"Protocol\": \"tcp\"\r\n        }, \r\n        {\r\n          \"Port\": 8092, \r\n          \"Protocol\": \"tcp\"\r\n        }, \r\n        {\r\n          \"Port\": 8093, \r\n          \"Protocol\": \"tcp\"\r\n        }, \r\n        {\r\n          \"Port\": 11210, \r\n          \"Protocol\": \"tcp\"\r\n        }\r\n      ]\r\n    }, \r\n    \"web\": {\r\n      \"Env\": [\r\n        \"COUCHBASE_URI=db\"\r\n      ], \r\n      \"Image\": \"arungupta\/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914\", \r\n      \"Networks\": [\r\n        \"default\"\r\n      ], \r\n      \"Ports\": [\r\n        {\r\n          \"Port\": 8080, \r\n          \"Protocol\": \"tcp\"\r\n        }\r\n      ]\r\n    }\r\n  }, \r\n  \"version\": \"0.1\"\r\n}<\/pre>\n<p>Esse arquivo fornece uma descri\u00e7\u00e3o completa dos servi\u00e7os inclu\u00eddos no aplicativo. N\u00e3o tenho certeza se Distributed Application Bundle \u00e9 o nome mais apropriado; discuta isso em\u00a0<a href=\"https:\/\/github.com\/docker\/docker\/issues\/24250\">#24250<\/a>. Ele<br \/>\nseria \u00f3timo se outros formatos de cont\u00eaineres, como o Rkt, ou mesmo VMs, pudessem ser suportados aqui. Mas, por enquanto, o Docker \u00e9 o \u00fanico formato compat\u00edvel.<\/p>\n<h2>Inicializar o modo Swarm no Docker<\/h2>\n<p>Conforme mencionado acima, o \"estado desejado\" agora \u00e9 mantido pelo Docker Swarm. E isso j\u00e1 est\u00e1 incorporado ao Docker Engine. Os conceitos do Docker Swarm tamb\u00e9m evolu\u00edram e podem ser lidos em <a href=\"https:\/\/docs.docker.com\/engine\/swarm\/key-concepts\/\">Conceitos-chave do modo Swarm<\/a>. A<br \/>\num blog mais detalhado sobre isso ser\u00e1 publicado posteriormente. Mas para este blog, um novo comando\u00a0<code>enxame de docas<\/code> foi adicionado:<\/p>\n<pre class=\"lang:default decode:true\">docker swarm --help\r\n\r\nUsage: docker swarm COMMAND\r\n\r\nManage Docker Swarm\r\n\r\nOptions:\r\n      --help   Print usage\r\n\r\nCommands:\r\n  init        Initialize a Swarm\r\n  join        Join a Swarm as a node and\/or manager\r\n  update      Update the Swarm\r\n  leave       Leave a Swarm\r\n  inspect     Inspect the Swarm\r\n\r\nRun 'docker swarm COMMAND --help' for more information on a command.<\/pre>\n<p>Inicialize um n\u00f3 do Swarm (como um gerenciador) no Docker Engine:<\/p>\n<pre class=\"lang:default decode:true\">docker swarm init\r\nSwarm initialized: current node (ek9p1k8r8ox7iiua5c247skci) is now a manager.<\/pre>\n<p>Mais detalhes sobre esse n\u00f3 podem ser encontrados em <code>inspe\u00e7\u00e3o de n\u00f3 doca<\/code> autocomando.<\/p>\n<p>A sa\u00edda detalhada \u00e9 detalhada, mas a se\u00e7\u00e3o relevante \u00e9:<\/p>\n<pre>\"Spec\": {\r\n            \"Role\": \"manager\",\r\n            \"Membership\": \"accepted\",\r\n            \"Availability\": \"active\"\r\n        },\r\n<\/pre>\n<p>A sa\u00edda mostra que o n\u00f3 \u00e9 um gerente. Em um cluster de n\u00f3 \u00fanico, esse n\u00f3 tamb\u00e9m atuar\u00e1 como um trabalhador.<\/p>\n<p>Mais detalhes sobre o cluster podem ser obtidos usando o comando <code>inspe\u00e7\u00e3o de enxame de docas<\/code> comando.<\/p>\n<pre class=\"lang:default decode:true\">docker swarm inspect\r\n[\r\n    {\r\n        \"ID\": \"1rcvu7m9mv2c8hiaijr7an9zk\",\r\n        \"Version\": {\r\n            \"Index\": 1895\r\n        },\r\n        \"CreatedAt\": \"2016-07-01T23:52:38.074748177Z\",\r\n        \"UpdatedAt\": \"2016-07-02T04:54:32.79093117Z\",\r\n        \"Spec\": {\r\n            \"Name\": \"default\",\r\n            \"AcceptancePolicy\": {\r\n                \"Policies\": [\r\n                    {\r\n                        \"Role\": \"worker\",\r\n                        \"Autoaccept\": true\r\n                    },\r\n                    {\r\n                        \"Role\": \"manager\",\r\n                        \"Autoaccept\": false\r\n                    }\r\n                ]\r\n            },\r\n            \"Orchestration\": {\r\n                \"TaskHistoryRetentionLimit\": 10\r\n            },\r\n            \"Raft\": {\r\n                \"SnapshotInterval\": 10000,\r\n                \"LogEntriesForSlowFollowers\": 500,\r\n                \"HeartbeatTick\": 1,\r\n                \"ElectionTick\": 3\r\n            },\r\n            \"Dispatcher\": {\r\n                \"HeartbeatPeriod\": 5000000000\r\n            },\r\n            \"CAConfig\": {\r\n                \"NodeCertExpiry\": 7776000000000000\r\n            }\r\n        }\r\n    }\r\n]<\/pre>\n<p><code>Pol\u00edtica de aceita\u00e7\u00e3o<\/code> mostra que outros <code>trabalhador<\/code> Os n\u00f3s podem entrar nesse cluster, mas um gerente precisa de aprova\u00e7\u00e3o expl\u00edcita.<\/p>\n<h2>Implantar uma pilha do Docker<\/h2>\n<p>Crie uma pilha usando <code>implanta\u00e7\u00e3o de docas<\/code> comando:<\/p>\n<pre class=\"lang:default decode:true\">docker deploy -f hellojavaee.dsb hellojavaee\r\nLoading bundle from hellojavaee.dsb\r\nCreating network hellojavaee_default\r\nCreating service hellojavaee_db\r\nCreating service hellojavaee_web<\/pre>\n<p>O uso do comando certamente pode ser simplificado, conforme discutido em\u00a0<a href=\"https:\/\/github.com\/docker\/docker\/issues\/24249\">#24249<\/a>. Veja a lista de servi\u00e7os:<\/p>\n<pre class=\"lang:default decode:true\">docker service ls\r\nID            NAME             REPLICAS  IMAGE                                                                                                COMMAND\r\n2g8kmrimztes  hellojavaee_web  1\/1       arungupta\/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914    \r\n46xhlb15cc60  hellojavaee_db   1\/1       arungupta\/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c<\/pre>\n<p>A sa\u00edda mostra que dois servi\u00e7os, WildFly e Couchbase, est\u00e3o em execu\u00e7\u00e3o. <a href=\"https:\/\/docs.docker.com\/engine\/swarm\/key-concepts\/#\/Services-and-tasks\">Servi\u00e7os<\/a> tamb\u00e9m \u00e9 um novo conceito introduzido no Docker 1.12. \u00c9 isso que d\u00e1 a voc\u00ea o<br \/>\n\"estado desejado\", e o Docker Engine trabalha para fornecer isso a voc\u00ea. <code>docker ps<\/code> mostra a lista de cont\u00eaineres em execu\u00e7\u00e3o:<\/p>\n<pre class=\"lang:default decode:true\">CONTAINER ID        IMAGE                                                                                                 COMMAND                  CREATED             STATUS              PORTS                                                        NAMES\r\n622756277f40        arungupta\/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c   \"\/entrypoint.sh \/opt\/\"   3 seconds ago       Up 1 seconds        8091-8093\/tcp, 11207\/tcp, 11210-11211\/tcp, 18091-18092\/tcp   hellojavaee_db.1.19enwdt6i5m853m5675tx3z29\r\nabf8703ed713        arungupta\/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914     \"\/opt\/jboss\/wildfly\/b\"   3 seconds ago       Up 1 seconds        8080\/tcp                                                     hellojavaee_web.1.70piloz6j4zt06co8htzisgyl<\/pre>\n<p>O cont\u00eainer WildFly \u00e9 iniciado antes que o cont\u00eainer do Couchbase esteja em funcionamento. Isso significa que o aplicativo Java EE tenta se conectar ao servidor Couchbase e falha. Portanto, o aplicativo nunca \u00e9 inicializado com \u00eaxito.<\/p>\n<h2>Servi\u00e7o do Docker com autocorre\u00e7\u00e3o<\/h2>\n<p>O Docker Service mant\u00e9m o \"estado desejado\" de um aplicativo. No nosso caso, o estado desejado \u00e9 garantir que um, e somente um, cont\u00eainer para o servi\u00e7o esteja em execu\u00e7\u00e3o. Se removermos o cont\u00eainer, e n\u00e3o o servi\u00e7o, o servi\u00e7o ser\u00e1<br \/>\niniciar automaticamente o cont\u00eainer novamente. Remova o cont\u00eainer como:<\/p>\n<pre class=\"lang:default decode:true\">docker rm -f abf8703ed713<\/pre>\n<p>Observe que voc\u00ea deve dar <code>-f<\/code> porque o cont\u00eainer j\u00e1 est\u00e1 em execu\u00e7\u00e3o. Os mecanismos de autocorre\u00e7\u00e3o do Docker 1.12 entram em a\u00e7\u00e3o e reiniciam automaticamente o cont\u00eainer. Agora, se voc\u00ea listar os cont\u00eaineres novamente:<\/p>\n<pre class=\"lang:default decode:true\">CONTAINER ID        IMAGE                                                                                                 COMMAND                  CREATED             STATUS                  PORTS                                                        NAMES\r\ndb483ac27e41        arungupta\/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914     \"\/opt\/jboss\/wildfly\/b\"   1 seconds ago       Up Less than a second   8080\/tcp                                                     hellojavaee_web.1.ddvwdmojjysf46d4n3x4g8uv4\r\n622756277f40        arungupta\/oreilly-couchbase@sha256:f150fcb9fca5392075c96f1baffc7f893858ba763f3c05cf0908ef2613cbf34c   \"\/entrypoint.sh \/opt\/\"   26 seconds ago      Up 25 seconds           8091-8093\/tcp, 11207\/tcp, 11210-11211\/tcp, 18091-18092\/tcp   hellojavaee_db.1.19enwdt6i5m853m5675tx3z29<\/pre>\n<p>Isso mostra que um novo cont\u00eainer foi iniciado. Inspecione o servi\u00e7o WildFly:<\/p>\n<pre class=\"lang:default decode:true\">docker service inspect hellojavaee_web\r\n[\r\n    {\r\n        \"ID\": \"54otfi6dc9bis7z6gc6ubynwc\",\r\n        \"Version\": {\r\n            \"Index\": 328\r\n        },\r\n        \"CreatedAt\": \"2016-07-02T01:36:35.735767569Z\",\r\n        \"UpdatedAt\": \"2016-07-02T01:36:35.739240775Z\",\r\n        \"Spec\": {\r\n            \"Name\": \"hellojavaee_web\",\r\n            \"Labels\": {\r\n                \"com.docker.stack.namespace\": \"hellojavaee\"\r\n            },\r\n            \"TaskTemplate\": {\r\n                \"ContainerSpec\": {\r\n                    \"Image\": \"arungupta\/oreilly-wildfly@sha256:d567ade7bb82ba8f15a85df0c6d692d85c15ec5a78d8826dfba92756babcb914\",\r\n                    \"Env\": [\r\n                        \"COUCHBASE_URI=db\"\r\n                    ]\r\n                }\r\n            },\r\n            \"Mode\": {\r\n                \"Replicated\": {\r\n                    \"Replicas\": 1\r\n                }\r\n            },\r\n            \"Networks\": [\r\n                {\r\n                    \"Target\": \"epw57lz7txtfchmbf6u0cimis\",\r\n                    \"Aliases\": [\r\n                        \"web\"\r\n                    ]\r\n                }\r\n            ],\r\n            \"EndpointSpec\": {\r\n                \"Mode\": \"vip\",\r\n                \"Ports\": [\r\n                    {\r\n                        \"Protocol\": \"tcp\",\r\n                        \"TargetPort\": 8080\r\n                    }\r\n                ]\r\n            }\r\n        },\r\n        \"Endpoint\": {\r\n            \"Spec\": {},\r\n            \"Ports\": [\r\n                {\r\n                    \"Protocol\": \"tcp\",\r\n                    \"TargetPort\": 8080,\r\n                    \"PublishedPort\": 30004\r\n                }\r\n            ],\r\n            \"VirtualIPs\": [\r\n                {\r\n                    \"NetworkID\": \"9lpz688ir3pzexubkcb828ikg\",\r\n                    \"Addr\": \"10.255.0.5\/16\"\r\n                },\r\n                {\r\n                    \"NetworkID\": \"epw57lz7txtfchmbf6u0cimis\",\r\n                    \"Addr\": \"10.0.0.4\/24\"\r\n                }\r\n            ]\r\n        }\r\n    }\r\n]<\/pre>\n<p>O Swarm atribui uma porta aleat\u00f3ria ao servi\u00e7o, ou isso pode ser atualizado manualmente usando <code>Atualiza\u00e7\u00e3o do servi\u00e7o de docker<\/code> comando. No nosso caso, a porta <code>8080<\/code> do cont\u00eainer \u00e9 mapeado para <code>30004<\/code> no host.<\/p>\n<h2>Verificar o aplicativo<\/h2>\n<p>Verifique se o aplicativo foi implantado com \u00eaxito:<\/p>\n<pre class=\"lang:default decode:true\">curl https:\/\/localhost:30004\/books\/resources\/book\r\n[{\"books\":0}]<\/pre>\n<p>Adicione um novo livro ao aplicativo:<\/p>\n<pre class=\"lang:default decode:true\">curl -v \r\n&gt; -H \"Content-Type: application\/json\" \r\n&gt; -X POST -d '{\r\n&gt;   \"isbn\": \"978-1-4919-1889-0\",\r\n&gt;   \"name\": \"Minecraft Modding with Forge\",\r\n&gt;   \"cost\": 29.99\r\n&gt; }' \r\n&gt; https:\/\/localhost:30004\/books\/resources\/book\r\n*   Trying ::1...\r\n* Connected to localhost (::1) port 30004 (#0)\r\n&gt; POST \/books\/resources\/book HTTP\/1.1\r\n&gt; Host: localhost:30004\r\n&gt; User-Agent: curl\/7.43.0\r\n&gt; Accept: *\/*\r\n&gt; Content-Type: application\/json\r\n&gt; Content-Length: 92\r\n&gt; \r\n* upload completely sent off: 92 out of 92 bytes\r\n&lt; HTTP\/1.1 200 OK\r\n&lt; Connection: keep-alive\r\n&lt; X-Powered-By: Undertow\/1\r\n&lt; Server: WildFly\/10\r\n&lt; Content-Type: application\/octet-stream\r\n&lt; Content-Length: 88\r\n&lt; Date: Sat, 02 Jul 2016 01:39:49 GMT\r\n&lt; \r\n* Connection #0 to host localhost left intact\r\n{\"name\":\"Minecraft Mhttps:\/\/localhost:30004\/books\/resources\/book-1-4919-1889-0\"}<\/pre>\n<p>Verifique os livros novamente:<\/p>\n<pre class=\"lang:default decode:true\">curl https:\/\/localhost:30004\/books\/resources\/book\r\n[{\"books\":{\"name\":\"Minecraft Modding with Forge\",\"cost\":29.99,\"id\":\"1\",\"isbn\":\"978-1-4919-1889-0\"}}, {\"books\":1}]<\/pre>\n<p>Saiba mais sobre esse aplicativo Java EE em\u00a0<a href=\"https:\/\/github.com\/arun-gupta\/oreilly-docker-book\/tree\/master\/hello-javaee\">github.com\/arun-gupta\/oreilly-docker-book\/tree\/master\/hello-javaee<\/a>.<\/p>\n<p>Este blog mostrou como criar um pacote de aplicativos distribu\u00eddos a partir do Docker Compose e implant\u00e1-lo como Docker Stack no modo Docker Swarm.<\/p>\n<h2>Refer\u00eancias de servi\u00e7o e pilha do Docker<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.docker.com\/engine\/reference\/commandline\/service_create\/\">Cria\u00e7\u00e3o de servi\u00e7o do Docker<\/a><\/li>\n<li>Livro GRATUITO da O'Reilly:\u00a0<a href=\"https:\/\/shop.oreilly.com\/product\/0636920050872.do\">Docker para desenvolvedores Java<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/containers\/\">Couchbase em cont\u00eaineres<\/a><\/li>\n<li><a href=\"https:\/\/developer.couchbase.com\/server\">Portal do desenvolvedor do Couchbase<\/a><\/li>\n<li>Fa\u00e7a perguntas sobre <a href=\"https:\/\/twitter.com\/couchbasedev\">@couchbasedev<\/a> ou <a href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stackoverflow<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>First Release Candidate of Docker 1.12 was announced over two weeks ago. Several new features are planned for this release. This blog will show\u00a0how to create a Distributed Application Bundle from Docker Compose and deploy it as Docker Stack in [&hellip;]<\/p>","protected":false},"author":58,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[8933],"class_list":["post-2319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker Services, Stack &amp; Distributed Application Bundle<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/docker-services-stack-distributed-application-bundle\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Services, Stack and Distributed Application Bundle\" \/>\n<meta property=\"og:description\" content=\"First Release Candidate of Docker 1.12 was announced over two weeks ago. Several new features are planned for this release. This blog will show\u00a0how to create a Distributed Application Bundle from Docker Compose and deploy it as Docker Stack in [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/docker-services-stack-distributed-application-bundle\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-01-06T07:06:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-17T16:43:26+00:00\" \/>\n<meta name=\"author\" content=\"Arun Gupta, VP, Developer Advocacy, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@arungupta\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Arun Gupta, VP, Developer Advocacy, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/\"},\"author\":{\"name\":\"Arun Gupta, VP, Developer Advocacy, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/39d8caed0f536489b6aa6e8d31ee631f\"},\"headline\":\"Docker Services, Stack and Distributed Application Bundle\",\"datePublished\":\"2017-01-06T07:06:54+00:00\",\"dateModified\":\"2023-11-17T16:43:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/\"},\"wordCount\":1146,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/\",\"name\":\"Docker Services, Stack & Distributed Application Bundle\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-01-06T07:06:54+00:00\",\"dateModified\":\"2023-11-17T16:43:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Services, Stack and Distributed Application Bundle\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/39d8caed0f536489b6aa6e8d31ee631f\",\"name\":\"Arun Gupta, VP, Developer Advocacy, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8900a75409c646948fe0bd80f6240337\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f912e10b5f39748ee4f1a0b0da6f42747f0b3a94fe7acb511791468656f5e726?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f912e10b5f39748ee4f1a0b0da6f42747f0b3a94fe7acb511791468656f5e726?s=96&d=mm&r=g\",\"caption\":\"Arun Gupta, VP, Developer Advocacy, Couchbase\"},\"description\":\"Arun Gupta is the vice president of developer advocacy at Couchbase. He has built and led developer communities for 10+ years at Sun, Oracle, and Red Hat. He has deep expertise in leading cross-functional teams to develop and execute strategy, planning and execution of content, marketing campaigns, and programs. Prior to that he led engineering teams at Sun and is a founding member of the Java EE team. Gupta has authored more than 2,000 blog posts on technology. He has extensive speaking experience in more than 40 countries on myriad topics and is a JavaOne Rock Star for three years in a row. Gupta also founded the Devoxx4Kids chapter in the US and continues to promote technology education among children. An author of several books on technology, an avid runner, a globe trotter, a Java Champion, a JUG leader, NetBeans Dream Team member, and a Docker Captain, he is easily accessible at @arungupta.\",\"sameAs\":[\"https:\/\/x.com\/arungupta\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/arun-gupta\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker Services, Stack & Distributed Application Bundle","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/docker-services-stack-distributed-application-bundle\/","og_locale":"pt_BR","og_type":"article","og_title":"Docker Services, Stack and Distributed Application Bundle","og_description":"First Release Candidate of Docker 1.12 was announced over two weeks ago. Several new features are planned for this release. This blog will show\u00a0how to create a Distributed Application Bundle from Docker Compose and deploy it as Docker Stack in [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/docker-services-stack-distributed-application-bundle\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-01-06T07:06:54+00:00","article_modified_time":"2023-11-17T16:43:26+00:00","author":"Arun Gupta, VP, Developer Advocacy, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@arungupta","twitter_misc":{"Written by":"Arun Gupta, VP, Developer Advocacy, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/"},"author":{"name":"Arun Gupta, VP, Developer Advocacy, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/39d8caed0f536489b6aa6e8d31ee631f"},"headline":"Docker Services, Stack and Distributed Application Bundle","datePublished":"2017-01-06T07:06:54+00:00","dateModified":"2023-11-17T16:43:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/"},"wordCount":1146,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/","url":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/","name":"Docker Services, Stack & Distributed Application Bundle","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-01-06T07:06:54+00:00","dateModified":"2023-11-17T16:43:26+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/docker-services-stack-distributed-application-bundle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker Services, Stack and Distributed Application Bundle"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/39d8caed0f536489b6aa6e8d31ee631f","name":"Arun Gupta, vice-presidente de defesa do desenvolvedor, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8900a75409c646948fe0bd80f6240337","url":"https:\/\/secure.gravatar.com\/avatar\/f912e10b5f39748ee4f1a0b0da6f42747f0b3a94fe7acb511791468656f5e726?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f912e10b5f39748ee4f1a0b0da6f42747f0b3a94fe7acb511791468656f5e726?s=96&d=mm&r=g","caption":"Arun Gupta, VP, Developer Advocacy, Couchbase"},"description":"Arun Gupta \u00e9 o vice-presidente de defesa do desenvolvedor na Couchbase. Ele criou e liderou comunidades de desenvolvedores por mais de 10 anos na Sun, Oracle e Red Hat. Ele tem grande experi\u00eancia na lideran\u00e7a de equipes multifuncionais para desenvolver e executar estrat\u00e9gias, planejamento e execu\u00e7\u00e3o de conte\u00fado, campanhas de marketing e programas. Antes disso, liderou equipes de engenharia na Sun e \u00e9 membro fundador da equipe Java EE. Gupta \u00e9 autor de mais de 2.000 postagens em blogs sobre tecnologia. Ele tem uma vasta experi\u00eancia em palestras em mais de 40 pa\u00edses sobre uma infinidade de t\u00f3picos e \u00e9 um JavaOne Rock Star h\u00e1 tr\u00eas anos consecutivos. Gupta tamb\u00e9m fundou o cap\u00edtulo Devoxx4Kids nos EUA e continua a promover a educa\u00e7\u00e3o tecnol\u00f3gica entre as crian\u00e7as. Autor de v\u00e1rios livros sobre tecnologia, corredor \u00e1vido, viajante do mundo inteiro, campe\u00e3o de Java, l\u00edder de JUG, membro do NetBeans Dream Team e capit\u00e3o do Docker, ele pode ser facilmente acessado em @arungupta.","sameAs":["https:\/\/x.com\/arungupta"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/arun-gupta\/"}]}},"authors":[{"term_id":8933,"user_id":58,"is_guest":0,"slug":"arun-gupta","display_name":"Arun Gupta, VP, Developer Advocacy, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f912e10b5f39748ee4f1a0b0da6f42747f0b3a94fe7acb511791468656f5e726?s=96&d=mm&r=g","author_category":"","last_name":"Gupta","first_name":"Arun","job_title":"","user_url":"","description":"Arun Gupta \u00e9 o vice-presidente de defesa do desenvolvedor na Couchbase. Ele criou e liderou comunidades de desenvolvedores por mais de 10 anos na Sun, Oracle e Red Hat. Ele tem grande experi\u00eancia na lideran\u00e7a de equipes multifuncionais para desenvolver e executar estrat\u00e9gias, planejamento e execu\u00e7\u00e3o de conte\u00fado, campanhas de marketing e programas. Antes disso, liderou equipes de engenharia na Sun e \u00e9 membro fundador da equipe Java EE.\r\n\r\nGupta \u00e9 autor de mais de 2.000 postagens em blogs sobre tecnologia. Ele tem uma vasta experi\u00eancia em palestras em mais de 40 pa\u00edses sobre diversos t\u00f3picos e \u00e9 um JavaOne Rock Star h\u00e1 tr\u00eas anos consecutivos. Gupta tamb\u00e9m fundou o cap\u00edtulo Devoxx4Kids nos EUA e continua a promover a educa\u00e7\u00e3o tecnol\u00f3gica entre as crian\u00e7as. Autor de v\u00e1rios livros sobre tecnologia, corredor \u00e1vido, viajante do mundo inteiro, campe\u00e3o de Java, l\u00edder de JUG, membro do NetBeans Dream Team e capit\u00e3o do Docker, ele pode ser facilmente acessado em @arungupta."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/58"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2319"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2319\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2319"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}