<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aqeel-Zeid</title>
    <description>The latest articles on DEV Community by Aqeel-Zeid (@aqeelzeid).</description>
    <link>https://dev.to/aqeelzeid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F840855%2Fb1c96843-617c-4ee2-b45c-50f2dfc7afe8.png</url>
      <title>DEV Community: Aqeel-Zeid</title>
      <link>https://dev.to/aqeelzeid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aqeelzeid"/>
    <language>en</language>
    <item>
      <title>Building a Local MongoDB Sharded Cluster with Docker</title>
      <dc:creator>Aqeel-Zeid</dc:creator>
      <pubDate>Sat, 05 Apr 2025 15:18:52 +0000</pubDate>
      <link>https://dev.to/aqeelzeid/building-a-local-mongodb-sharded-cluster-with-docker-dfc</link>
      <guid>https://dev.to/aqeelzeid/building-a-local-mongodb-sharded-cluster-with-docker-dfc</guid>
      <description>&lt;p&gt;This tutorial guides you through setting up a local MongoDB sharded cluster using Docker. This setup is ideal for development and testing, providing an environment that closely resembles a production sharded deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target Audience:&lt;/strong&gt; Developers needing a local, sharded MongoDB instance.&lt;br&gt;
&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Docker installed (&lt;a href="https://docs.docker.com/get-docker/" rel="noopener noreferrer"&gt;https://docs.docker.com/get-docker/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;  Docker Compose installed (usually included with Docker Desktop)&lt;/li&gt;
&lt;li&gt;  Basic understanding of Docker and MongoDB concepts (sharding, replica sets).&lt;/li&gt;
&lt;li&gt;  A text editor.&lt;/li&gt;
&lt;li&gt;  A terminal or command prompt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Why a Local Sharded Cluster?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Transaction Support:&lt;/strong&gt; The main reason is that when developing/testing transaction in MongoDB basic MongoDB containers wont containers wont work, you need a cluster not a single node. &lt;/li&gt;
&lt;li&gt;  *&lt;em&gt;Realistic Development: *&lt;/em&gt; Test application logic against a sharded environment.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance Insights:&lt;/strong&gt; Understand query behavior across shards.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Isolation:&lt;/strong&gt; Avoid conflicts with shared development databases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Cluster Architecture
&lt;/h2&gt;

&lt;p&gt;We will build a minimal sharded cluster consisting of:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Config Server Replica Set (1 Node):&lt;/strong&gt; Stores cluster metadata. (Port: 27018)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Shard Replica Set (1 Node):&lt;/strong&gt; Stores a portion of the data. (Port: 27019)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Mongos Router (1 Instance):&lt;/strong&gt; The entry point for applications. (Port: 27017)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All components will run within a single Docker container, orchestrated by a startup script.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Project Setup
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a dedicated directory for this setup. Let's call it &lt;code&gt;mongodb-dev&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;mongodb-dev
&lt;span class="nb"&gt;cd &lt;/span&gt;mongodb-dev
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Inside &lt;code&gt;mongodb-dev&lt;/code&gt;, we will create the necessary configuration and script files.&lt;/p&gt;&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Create Initialization Scripts
&lt;/h2&gt;

&lt;p&gt;These JavaScript files contain commands run by &lt;code&gt;mongosh&lt;/code&gt; to initialize the replica sets and register the shard.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;init-replica.js&lt;/code&gt; (Initialize Config Server Replica Set)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;init-replica.js&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// init-replica.js&lt;/span&gt;
&lt;span class="nx"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initiate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;configReplSet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;configsvr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;localhost:27018&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; This initiates a replica set named &lt;code&gt;configReplSet&lt;/code&gt;, marks it as a config server (&lt;code&gt;configsvr: true&lt;/code&gt;), and adds the &lt;code&gt;mongod&lt;/code&gt; instance running on &lt;code&gt;localhost:27018&lt;/code&gt; as its only member.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;init-shard.js&lt;/code&gt; (Initialize Shard Replica Set)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;init-shard.js&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// init-shard.js&lt;/span&gt;
&lt;span class="nx"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initiate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shard1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;members&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;localhost:27019&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; This initiates a regular replica set named &lt;code&gt;shard1&lt;/code&gt; with the &lt;code&gt;mongod&lt;/code&gt; instance running on &lt;code&gt;localhost:27019&lt;/code&gt; as its only member.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;init-router.js&lt;/code&gt; (Add Shard to Cluster)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;init-router.js&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// init-router.js&lt;/span&gt;
&lt;span class="nx"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addShard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;shard1/localhost:27019&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; This command, run against the &lt;code&gt;mongos&lt;/code&gt; router, tells the cluster about the &lt;code&gt;shard1&lt;/code&gt; replica set located at &lt;code&gt;localhost:27019&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create the Dockerfile
&lt;/h2&gt;

&lt;p&gt;This file defines the Docker image for our cluster.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;Dockerfile&lt;/code&gt; (no extension) with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Dockerfile&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; mongo:latest&lt;/span&gt;

&lt;span class="c"&gt;# Create necessary directories&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /data/configdb /data/shard1 /scripts

&lt;span class="c"&gt;# Copy initialization scripts&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; init-replica.js /scripts/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; init-shard.js /scripts/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; init-router.js /scripts/&lt;/span&gt;

&lt;span class="c"&gt;# Copy the startup script&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; start-cluster.sh /scripts/&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /scripts/start-cluster.sh

&lt;span class="c"&gt;# Expose ports (Router, Config Server, Shard)&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 27017 27018 27019&lt;/span&gt;

&lt;span class="c"&gt;# Set the working directory (optional)&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /&lt;/span&gt;

&lt;span class="c"&gt;# Command to run when the container starts&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["/scripts/start-cluster.sh"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;br&gt;
    *   Uses the official &lt;code&gt;mongo&lt;/code&gt; image as a base.&lt;br&gt;
    *   Creates directories for database files (&lt;code&gt;/data/*&lt;/code&gt;) and scripts (&lt;code&gt;/scripts&lt;/code&gt;).&lt;br&gt;
    *   Copies our &lt;code&gt;.js&lt;/code&gt; initialization scripts and the (yet to be created) startup script into &lt;code&gt;/scripts&lt;/code&gt;.&lt;br&gt;
    *   Makes the startup script executable.&lt;br&gt;
    *   Exposes the ports for the router, config server, and shard.&lt;br&gt;
    *   Sets the command to run the &lt;code&gt;start-cluster.sh&lt;/code&gt; script when the container launches.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Create the Startup Script
&lt;/h2&gt;

&lt;p&gt;This script orchestrates the starting and initialization of all MongoDB components within the container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;start-cluster.sh&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# start-cluster.sh&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Starting config server (configReplSet)..."&lt;/span&gt;
mongod &lt;span class="nt"&gt;--configsvr&lt;/span&gt; &lt;span class="nt"&gt;--replSet&lt;/span&gt; configReplSet &lt;span class="nt"&gt;--port&lt;/span&gt; 27018 &lt;span class="nt"&gt;--dbpath&lt;/span&gt; /data/configdb &lt;span class="nt"&gt;--fork&lt;/span&gt; &lt;span class="nt"&gt;--logpath&lt;/span&gt; /data/configdb/config.log

&lt;span class="c"&gt;# Wait for config server to be ready&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Waiting for config server..."&lt;/span&gt;
&lt;span class="k"&gt;until &lt;/span&gt;mongosh &lt;span class="nt"&gt;--port&lt;/span&gt; 27018 &lt;span class="nt"&gt;--eval&lt;/span&gt; &lt;span class="s2"&gt;"db.adminCommand('ping')"&lt;/span&gt; &amp;amp;&amp;gt; /dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Config server is ready."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Initializing config server replica set..."&lt;/span&gt;
mongosh &lt;span class="nt"&gt;--port&lt;/span&gt; 27018 &amp;lt; /scripts/init-replica.js
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Config server replica set initialized."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Starting shard server (shard1)..."&lt;/span&gt;
mongod &lt;span class="nt"&gt;--shardsvr&lt;/span&gt; &lt;span class="nt"&gt;--replSet&lt;/span&gt; shard1 &lt;span class="nt"&gt;--port&lt;/span&gt; 27019 &lt;span class="nt"&gt;--dbpath&lt;/span&gt; /data/shard1 &lt;span class="nt"&gt;--fork&lt;/span&gt; &lt;span class="nt"&gt;--logpath&lt;/span&gt; /data/shard1/shard1.log

&lt;span class="c"&gt;# Wait for shard server to be ready&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Waiting for shard server..."&lt;/span&gt;
&lt;span class="k"&gt;until &lt;/span&gt;mongosh &lt;span class="nt"&gt;--port&lt;/span&gt; 27019 &lt;span class="nt"&gt;--eval&lt;/span&gt; &lt;span class="s2"&gt;"db.adminCommand('ping')"&lt;/span&gt; &amp;amp;&amp;gt; /dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Shard server is ready."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Initializing shard replica set..."&lt;/span&gt;
mongosh &lt;span class="nt"&gt;--port&lt;/span&gt; 27019 &amp;lt; /scripts/init-shard.js
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Shard replica set initialized."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Starting router (mongos)..."&lt;/span&gt;
mongos &lt;span class="nt"&gt;--configdb&lt;/span&gt; configReplSet/localhost:27018 &lt;span class="nt"&gt;--port&lt;/span&gt; 27017 &lt;span class="nt"&gt;--bind_ip_all&lt;/span&gt; &lt;span class="nt"&gt;--fork&lt;/span&gt; &lt;span class="nt"&gt;--logpath&lt;/span&gt; /data/mongos.log

&lt;span class="c"&gt;# Wait for router to be ready&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Waiting for router..."&lt;/span&gt;
&lt;span class="k"&gt;until &lt;/span&gt;mongosh &lt;span class="nt"&gt;--port&lt;/span&gt; 27017 &lt;span class="nt"&gt;--eval&lt;/span&gt; &lt;span class="s2"&gt;"db.adminCommand('ping')"&lt;/span&gt; &amp;amp;&amp;gt; /dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;sleep &lt;/span&gt;2
&lt;span class="k"&gt;done
&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Router is ready."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Adding shard to the cluster via router..."&lt;/span&gt;
mongosh &lt;span class="nt"&gt;--port&lt;/span&gt; 27017 &amp;lt; /scripts/init-router.js
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Shard added."&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cluster setup complete. Tailing mongos log..."&lt;/span&gt;
&lt;span class="c"&gt;# Keep container running by tailing a log file&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /data/mongos.log
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;br&gt;
    *   Starts &lt;code&gt;mongod&lt;/code&gt; as a config server (&lt;code&gt;--configsvr&lt;/code&gt;), assigns it to &lt;code&gt;configReplSet&lt;/code&gt;, listens on port 27018, stores data in &lt;code&gt;/data/configdb&lt;/code&gt;, and forks to the background (&lt;code&gt;--fork&lt;/code&gt;).&lt;br&gt;
    *   Waits until the server responds to a ping.&lt;br&gt;
    *   Initializes the config server replica set using &lt;code&gt;mongosh&lt;/code&gt; and &lt;code&gt;init-replica.js&lt;/code&gt;.&lt;br&gt;
    *   Starts &lt;code&gt;mongod&lt;/code&gt; as a shard server (&lt;code&gt;--shardsvr&lt;/code&gt;), assigns it to &lt;code&gt;shard1&lt;/code&gt;, listens on port 27019, stores data in &lt;code&gt;/data/shard1&lt;/code&gt;, and forks.&lt;br&gt;
    *   Waits for the shard server.&lt;br&gt;
    *   Initializes the shard replica set using &lt;code&gt;mongosh&lt;/code&gt; and &lt;code&gt;init-shard.js&lt;/code&gt;.&lt;br&gt;
    *   Starts &lt;code&gt;mongos&lt;/code&gt; (the router), connects it to the config replica set (&lt;code&gt;--configdb configReplSet/localhost:27018&lt;/code&gt;), listens on port 27017, binds to all interfaces (&lt;code&gt;--bind_ip_all&lt;/code&gt;) so it's accessible from outside the container, and forks.&lt;br&gt;
    *   Waits for the router.&lt;br&gt;
    *   Adds the shard to the cluster using &lt;code&gt;mongosh&lt;/code&gt; connected to the router and &lt;code&gt;init-router.js&lt;/code&gt;.&lt;br&gt;
    *   Uses &lt;code&gt;tail -f&lt;/code&gt; on the &lt;code&gt;mongos&lt;/code&gt; log file as the main process to keep the container running.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Build and Run the Cluster
&lt;/h2&gt;

&lt;p&gt;Now we can build the Docker image and run the container.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build the Image:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Make sure you are in the &lt;code&gt;mongodb-dev&lt;/code&gt; directory in your terminal.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; local-mongo-cluster &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;This builds the image using our &lt;code&gt;Dockerfile&lt;/code&gt; and tags it as &lt;code&gt;local-mongo-cluster&lt;/code&gt;.&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Run the Container:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Run the image as a container:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mongo-cluster-dev &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 27017:27017 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 27018:27018 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 27019:27019 &lt;span class="se"&gt;\&lt;/span&gt;
  local-mongo-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   **Explanation:**
    *   `-d`: Run in detached (background) mode.
    *   `--name mongo-cluster-dev`: Give the container a convenient name.
    *   `-p &amp;lt;host_port&amp;gt;:&amp;lt;container_port&amp;gt;`: Map ports from your host machine to the container. We map all three for potential direct access/debugging, but only 27017 (mongos) is essential for application connection.
    *   `local-mongo-cluster`: The name of the image to run.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Check Logs (Optional):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can view the startup logs:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs mongo-cluster-dev &lt;span class="nt"&gt;-f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   Press `Ctrl+C` to stop following the logs. You should see messages indicating the successful start and initialization of all components.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Step 6: Connect and Verify
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect using &lt;code&gt;mongosh&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you have &lt;code&gt;mongosh&lt;/code&gt; installed locally:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mongosh mongodb://localhost:27017
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   This connects you to the `mongos` router.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verify Cluster Status:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Once connected via &lt;code&gt;mongosh&lt;/code&gt;, run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*   This command should show information about the sharded cluster, including the `configReplSet`, the `shard1` shard, and databases.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Using with Docker Compose (Integration)
&lt;/h2&gt;

&lt;p&gt;While the &lt;code&gt;docker run&lt;/code&gt; command works, integrating this into a &lt;code&gt;docker-compose.yaml&lt;/code&gt; file is often more practical for multi-service applications.&lt;/p&gt;

&lt;p&gt;Consider a &lt;code&gt;dev.docker-compose.yaml&lt;/code&gt; in your project's root directory:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# dev.docker-compose.yaml (Example Snippet)&lt;/span&gt;
&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mongodb_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb_cluster_data&lt;/span&gt; &lt;span class="c1"&gt;# Use a named volume for persistence&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mongodb-cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./mongodb-dev&lt;/span&gt; &lt;span class="c1"&gt;# Path to the directory containing the Dockerfile&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongodb-cluster&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;27017:27017"&lt;/span&gt;  &lt;span class="c1"&gt;# Expose router port to host&lt;/span&gt;
      &lt;span class="c1"&gt;# - "27018:27018" # Optional: Expose config server&lt;/span&gt;
      &lt;span class="c1"&gt;# - "27019:27019" # Optional: Expose shard&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mongodb_data:/data&lt;/span&gt; &lt;span class="c1"&gt;# Mount named volume to persist data&lt;/span&gt;
    &lt;span class="c1"&gt;# Add healthcheck, restart policy etc. as needed&lt;/span&gt;
    &lt;span class="c1"&gt;# healthcheck:&lt;/span&gt;
    &lt;span class="c1"&gt;#   test: ["CMD", "mongosh", "--port", "27017", "--eval", "db.adminCommand('ping')"]&lt;/span&gt;
    &lt;span class="c1"&gt;#   interval: 20s&lt;/span&gt;
    &lt;span class="c1"&gt;#   timeout: 10s&lt;/span&gt;
    &lt;span class="c1"&gt;#   retries: 5&lt;/span&gt;
    &lt;span class="c1"&gt;#   start_period: 30s&lt;/span&gt;
    &lt;span class="c1"&gt;# restart: unless-stopped&lt;/span&gt;

  &lt;span class="c1"&gt;# Example application service&lt;/span&gt;
  &lt;span class="na"&gt;my-app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt; &lt;span class="c1"&gt;# Or specify app context/dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Connect using the service name 'mongodb-cluster'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=mongodb://mongodb-cluster:27017/myappdb&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mongodb-cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# condition: service_healthy # Use if healthcheck is defined&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_started&lt;/span&gt; &lt;span class="c1"&gt;# Basic dependency&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To run with Compose:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; dev.docker-compose.yaml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;To stop:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; dev.docker-compose.yaml down
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;em&gt;(Add &lt;code&gt;-v&lt;/code&gt; to &lt;code&gt;down&lt;/code&gt; to also remove the &lt;code&gt;mongodb_data&lt;/code&gt; volume)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You have successfully built and run a local MongoDB sharded cluster using Docker. This setup provides a valuable tool for developing and testing applications designed for sharded environments. Remember to adapt port mappings, volumes, and Compose configurations to your specific project needs. &lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>docker</category>
    </item>
    <item>
      <title>Be Careful About Timezones In Backend and Frontend Development</title>
      <dc:creator>Aqeel-Zeid</dc:creator>
      <pubDate>Mon, 04 Apr 2022 14:33:18 +0000</pubDate>
      <link>https://dev.to/aqeelzeid/be-careful-about-timezones-in-backend-and-frontend-development-47c6</link>
      <guid>https://dev.to/aqeelzeid/be-careful-about-timezones-in-backend-and-frontend-development-47c6</guid>
      <description>&lt;p&gt;Dear Devs, &lt;/p&gt;

&lt;p&gt;Today I ran into an issue regarding  timezones &lt;br&gt;
When I was working on the local host the backend , frontend(browser) and the database all ran on the same machine which is my laptop in a single timezone.&lt;/p&gt;

&lt;p&gt;But when I push to production the dates in the backend and the dates in the frontend was 5 hours apart. &lt;br&gt;
This is because the server and the frontend resided in different time zones. &lt;/p&gt;

&lt;p&gt;I checked the backend code and the database they were fine , and the frontend code also didn't show any issues.&lt;/p&gt;

&lt;p&gt;When I checked my Javascript code it was using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;h4&amp;gt;{new Date(startTime).toLocaleTimeString()}&amp;lt;/h4&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which uses local-time which adds 5 hours to the start time&lt;br&gt;
So instead I used UTC time.  &lt;/p&gt;

&lt;p&gt;the backend code was using UTC time &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;So make sure you pay attention to timezones configurations in your database , backend and frontend according to your use case and your execution environments. *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;here are some articles that helped me &lt;br&gt;
&lt;a href="https://www.ursahealth.com/new-insights/dates-and-timezones-in-javascript"&gt;https://www.ursahealth.com/new-insights/dates-and-timezones-in-javascript&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/24192558/incorrect-timezone-from-server-side-to-javascript"&gt;https://stackoverflow.com/questions/24192558/incorrect-timezone-from-server-side-to-javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo Credit Donald Wu on Unsplash&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
  </channel>
</rss>
