{"id":24179,"date":"2019-02-26T12:15:59","date_gmt":"2019-02-26T10:15:59","guid":{"rendered":"https:\/\/www.webcodegeeks.com\/?p=24179"},"modified":"2019-02-26T10:46:01","modified_gmt":"2019-02-26T08:46:01","slug":"docker-basics-docker-compose","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/","title":{"rendered":"Docker basics: Docker compose"},"content":{"rendered":"\n<p>Docker Compose is a tool that allows you to run multi-container applications. With compose we can use yaml files to configure our application\u2019 services and then using a single command create and start all of the configured services. I use this tool a lot when it comes to local development in a microservice environment. It is also lightweight and needs just a small effort. Instead of managing how to run each service while developing you can have the environment and services needed preconfigured and focus on the service that you currently develop.<\/p>\n\n\n\n<p>With docker compose we can configure a network for our services, volumes, mount-points, environmental variables just about everything.<br>To showcase this we are going to solve a problem. Our goal would be to extract data from mongodb using grafana. Grafana does not have out of the box support for MongoDB therefore we will have to use a <a href=\"https:\/\/github.com\/JamesOsgood\/mongodb-grafana\">plugin<\/a>.<\/p>\n\n\n\n<p>First step we shall create our networks. Creating a network is not necessary since your services once started will join the default network. We shall make a showcase of using custom networks. We shall have a network for backend services and a network for frontend services. Apparently network configuration can get more advanced and specify custom <a href=\"https:\/\/docs.docker.com\/compose\/networking\/\">network<\/a> drivers or even configure static <a href=\"https:\/\/docs.docker.com\/compose\/compose-file\/compose-file-v2\/#ipv4-address-ipv6-address\">addresses<\/a>.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_466946\" class=\"syntaxhighlighter  py\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"py plain\">version: <\/code><code class=\"py string\">'3.5'<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"py plain\">networks:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">frontend:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">name: frontend<\/code><code class=\"py keyword\">-<\/code><code class=\"py plain\">network<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">backend:<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">name: backend<\/code><code class=\"py keyword\">-<\/code><code class=\"py plain\">network<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">internal: true<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>The backend network is going to be internal therefore there won\u2019t be any outbound connectivity to the containers attached to it.<\/p>\n\n\n\n<p>Then we shall setup our mongodb instance.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_168855\" class=\"syntaxhighlighter  py\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"py plain\">version: <\/code><code class=\"py string\">'3.5'<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"py plain\">services:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">mongo:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">image: mongo<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">restart: always<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">environment:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">volumes:<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">${DB_PATH}:<\/code><code class=\"py keyword\">\/<\/code><code class=\"py plain\">data<\/code><code class=\"py keyword\">\/<\/code><code class=\"py plain\">db<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">networks:<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">backend<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>As you see we specified a volume. Volumes can also be specified separately and attach them to a service.<br>Also we used environmental variables for the root account, you might as well have spotted that the password is going to be provided through environmental variables ie. MONGO_USER=root MONGO_PASSWORD=root docker-compose -f stack.yaml up. The same applies for the volume path too. You can have a more advanced configuration for volumes in your compose configuration and reference them from your service.<\/p>\n\n\n\n<p>Our next goal is to setup the proxy server which shall be in the middle of our grafana and mongodb server. Since it needs a custom Dockerfile to create it, we shall do it through docker-compose. Compose has the capability to spin up a service by specifying the docker file.<\/p>\n\n\n\n<p>So let\u2019s start with the Dockerfile.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_622058\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">FROM node<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">WORKDIR <\/code><code class=\"bash plain\">\/usr\/src\/mongografanaproxy<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">COPY . <\/code><code class=\"bash plain\">\/usr\/src\/mongografanaproxy<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"bash plain\">EXPOSE 3333<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"bash plain\">RUN <\/code><code class=\"bash functions\">cd<\/code> <code class=\"bash plain\">\/usr\/src\/mongografanaproxy<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"bash plain\">RUN npm <\/code><code class=\"bash functions\">install<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"bash plain\">ENTRYPOINT [<\/code><code class=\"bash string\">\"npm\"<\/code><code class=\"bash plain\">,<\/code><code class=\"bash string\">\"run\"<\/code><code class=\"bash plain\">,<\/code><code class=\"bash string\">\"server\"<\/code><code class=\"bash plain\">]<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Then let\u2019s add it to compose<\/p>\n\n\n\n<div>\n<div id=\"highlighter_870208\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">version: <\/code><code class=\"bash string\">'3.5'<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">services:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;<\/code><code class=\"bash plain\">mongo-proxy:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">build:<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">context: .<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">dockerfile: ProxyDockerfile<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">restart: always<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">networks:<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">- backend<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>And the same shall be done to the Grafana image that we want to use. In stead of using a ready grafana image we shall create one with the plugin preinstalled.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_576616\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">FROM grafana<\/code><code class=\"bash plain\">\/grafana<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">COPY . <\/code><code class=\"bash plain\">\/var\/lib\/grafana\/plugins\/mongodb-grafana<\/code><\/div>\n<div class=\"line number4 index3 alt1\">&nbsp;<\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash plain\">EXPOSE 3000<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<div>\n<div id=\"highlighter_186607\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">version: <\/code><code class=\"bash string\">'3.5'<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"bash plain\">services:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;<\/code><code class=\"bash plain\">grafana:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">build:<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">context: .<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">dockerfile: GrafanaDockerfile<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">restart: always<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">ports:<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">- 3000:3000<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">networks:<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">- backend<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"bash spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"bash plain\">- frontend<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>Let\u2019s wrap them all together<\/p>\n\n\n\n<div>\n<div id=\"highlighter_813405\" class=\"syntaxhighlighter  py\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">01<\/div>\n<div class=\"line number2 index1 alt1\">02<\/div>\n<div class=\"line number3 index2 alt2\">03<\/div>\n<div class=\"line number4 index3 alt1\">04<\/div>\n<div class=\"line number5 index4 alt2\">05<\/div>\n<div class=\"line number6 index5 alt1\">06<\/div>\n<div class=\"line number7 index6 alt2\">07<\/div>\n<div class=\"line number8 index7 alt1\">08<\/div>\n<div class=\"line number9 index8 alt2\">09<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<div class=\"line number23 index22 alt2\">23<\/div>\n<div class=\"line number24 index23 alt1\">24<\/div>\n<div class=\"line number25 index24 alt2\">25<\/div>\n<div class=\"line number26 index25 alt1\">26<\/div>\n<div class=\"line number27 index26 alt2\">27<\/div>\n<div class=\"line number28 index27 alt1\">28<\/div>\n<div class=\"line number29 index28 alt2\">29<\/div>\n<div class=\"line number30 index29 alt1\">30<\/div>\n<div class=\"line number31 index30 alt2\">31<\/div>\n<div class=\"line number32 index31 alt1\">32<\/div>\n<div class=\"line number33 index32 alt2\">33<\/div>\n<div class=\"line number34 index33 alt1\">34<\/div>\n<div class=\"line number35 index34 alt2\">35<\/div>\n<div class=\"line number36 index35 alt1\">36<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"py plain\">version: <\/code><code class=\"py string\">'3.5'<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"py plain\">services:<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">mongo:<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">image: mongo<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">restart: always<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">environment:<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">MONGO_INITDB_ROOT_USERNAME: ${MONGO_USER}<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">MONGO_INITDB_ROOT_PASSWORD: ${MONGO_PASSWORD}<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">volumes:<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">${DB_PATH}:<\/code><code class=\"py keyword\">\/<\/code><code class=\"py plain\">data<\/code><code class=\"py keyword\">\/<\/code><code class=\"py plain\">db<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">networks:<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">backend<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">mongo<\/code><code class=\"py keyword\">-<\/code><code class=\"py plain\">proxy:<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">build:<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">context: .<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">dockerfile: ProxyDockerfile<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">restart: always<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">networks:<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">backend<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">grafana:<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">build:<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">context: .<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">dockerfile: GrafanaDockerfile<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">restart: always<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">ports:<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py value\">3000<\/code><code class=\"py plain\">:<\/code><code class=\"py value\">3000<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">networks:<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">backend<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py keyword\">-<\/code> <code class=\"py plain\">frontend<\/code><\/div>\n<div class=\"line number31 index30 alt2\"><code class=\"py plain\">networks:<\/code><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">frontend:<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">name: frontend<\/code><code class=\"py keyword\">-<\/code><code class=\"py plain\">network<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;<\/code><code class=\"py plain\">backend:<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">name: backend<\/code><code class=\"py keyword\">-<\/code><code class=\"py plain\">network<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"py spaces\">&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"py plain\">internal: true<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>So let\u2019s run them all together.<\/p>\n\n\n\n<div>\n<div id=\"highlighter_951100\" class=\"syntaxhighlighter  bash\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"bash plain\">docker-compose -f stack.yaml build<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"bash plain\">MONGO_USER=root MONGO_PASSWORD=root DB_PATH=~<\/code><code class=\"bash plain\">\/grafana-mongo<\/code>&nbsp; <code class=\"bash plain\">docker-compose -f stack.yaml up<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n\n\n\n<p>The above can be found on <a href=\"https:\/\/github.com\/gkatzioura\/mongodb-grafana\">github<\/a>.<\/p>\n\n\n\n<p>You might as well find the <a href=\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-images\/\">Docker Images<\/a>, <a href=\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-containers\/\">Docker Containers<\/a> and <a href=\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-registry\/\">Docker registry<\/a> posts useful.<\/p>\n\n\n\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>Published on Web Code Geeks with permission by Emmanouil Gkatziouras, partner at our <a href=\"\/\/www.webcodegeeks.com\/join-us\/wcg\/\" target=\"_blank\" rel=\"noopener noreferrer\">WCG program<\/a>. See the original article here: <a href=\"https:\/\/egkatzioura.com\/2019\/02\/26\/docker-basics-docker-compose\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker basics: Docker compose<\/a><\/p>\n<p>Opinions expressed by Web Code Geeks contributors are their own.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Docker Compose is a tool that allows you to run multi-container applications. With compose we can use yaml files to configure our application\u2019 services and then using a single command create and start all of the configured services. I use this tool a lot when it comes to local development in a microservice environment. It &hellip;<\/p>\n","protected":false},"author":99,"featured_media":10356,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[217],"class_list":["post-24179","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker basics: Docker compose - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn about Docker compose? Check our article discussing about Docker Compose, a tool that allows you to run multi-container applications\" \/>\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.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker basics: Docker compose - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn about Docker compose? Check our article discussing about Docker Compose, a tool that allows you to run multi-container applications\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-26T10:15:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Emmanouil Gkatziouras\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emmanouil Gkatziouras\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\"},\"author\":{\"name\":\"Emmanouil Gkatziouras\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f242ded62465cfd1f8f091603351ba96\"},\"headline\":\"Docker basics: Docker compose\",\"datePublished\":\"2019-02-26T10:15:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\"},\"wordCount\":506,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"keywords\":[\"Docker\"],\"articleSection\":[\"DevOps\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\",\"name\":\"Docker basics: Docker compose - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"datePublished\":\"2019-02-26T10:15:59+00:00\",\"description\":\"Interested to learn about Docker compose? Check our article discussing about Docker Compose, a tool that allows you to run multi-container applications\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/devops\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Docker basics: Docker compose\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f242ded62465cfd1f8f091603351ba96\",\"name\":\"Emmanouil Gkatziouras\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5c6d031d211ab786ec335687ad6f3f076f93f47e24c92d78041d2f805ee6c291?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5c6d031d211ab786ec335687ad6f3f076f93f47e24c92d78041d2f805ee6c291?s=96&d=mm&r=g\",\"caption\":\"Emmanouil Gkatziouras\"},\"description\":\"He is a versatile software engineer with experience in a wide variety of applications\/services.He is enthusiastic about new projects, embracing new technologies, and getting to know people in the field of software.\",\"sameAs\":[\"http:\/\/egkatzioura.wordpress.com\/\",\"https:\/\/gr.linkedin.com\/in\/gkatziourasemmanouil\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/emmanouil-gkatziouras\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker basics: Docker compose - Web Code Geeks - 2026","description":"Interested to learn about Docker compose? Check our article discussing about Docker Compose, a tool that allows you to run multi-container applications","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.webcodegeeks.com\/devops\/docker-basics-docker-compose\/","og_locale":"en_US","og_type":"article","og_title":"Docker basics: Docker compose - Web Code Geeks - 2026","og_description":"Interested to learn about Docker compose? Check our article discussing about Docker Compose, a tool that allows you to run multi-container applications","og_url":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2019-02-26T10:15:59+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","type":"image\/jpeg"}],"author":"Emmanouil Gkatziouras","twitter_card":"summary_large_image","twitter_creator":"@webcodegeeks","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Emmanouil Gkatziouras","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/"},"author":{"name":"Emmanouil Gkatziouras","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f242ded62465cfd1f8f091603351ba96"},"headline":"Docker basics: Docker compose","datePublished":"2019-02-26T10:15:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/"},"wordCount":506,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","keywords":["Docker"],"articleSection":["DevOps"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/","url":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/","name":"Docker basics: Docker compose - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","datePublished":"2019-02-26T10:15:59+00:00","description":"Interested to learn about Docker compose? Check our article discussing about Docker Compose, a tool that allows you to run multi-container applications","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2016\/01\/docker-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/devops\/docker-basics-docker-compose\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/www.webcodegeeks.com\/category\/devops\/"},{"@type":"ListItem","position":3,"name":"Docker basics: Docker compose"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f242ded62465cfd1f8f091603351ba96","name":"Emmanouil Gkatziouras","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5c6d031d211ab786ec335687ad6f3f076f93f47e24c92d78041d2f805ee6c291?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c6d031d211ab786ec335687ad6f3f076f93f47e24c92d78041d2f805ee6c291?s=96&d=mm&r=g","caption":"Emmanouil Gkatziouras"},"description":"He is a versatile software engineer with experience in a wide variety of applications\/services.He is enthusiastic about new projects, embracing new technologies, and getting to know people in the field of software.","sameAs":["http:\/\/egkatzioura.wordpress.com\/","https:\/\/gr.linkedin.com\/in\/gkatziourasemmanouil"],"url":"https:\/\/www.webcodegeeks.com\/author\/emmanouil-gkatziouras\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/24179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/99"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=24179"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/24179\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/10356"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=24179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=24179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=24179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}