<?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: Duc Tran</title>
    <description>The latest articles on DEV Community by Duc Tran (@ductnn).</description>
    <link>https://dev.to/ductnn</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%2F764170%2F9fd08023-7fc8-4c35-8fc1-cb1cb52724b2.png</url>
      <title>DEV Community: Duc Tran</title>
      <link>https://dev.to/ductnn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ductnn"/>
    <language>en</language>
    <item>
      <title>Chat UI for Deepseek in your local</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Sat, 01 Feb 2025 08:30:35 +0000</pubDate>
      <link>https://dev.to/ductnn/chat-ui-for-deepseek-in-your-local-4pkd</link>
      <guid>https://dev.to/ductnn/chat-ui-for-deepseek-in-your-local-4pkd</guid>
      <description>&lt;h2&gt;
  
  
  Chat deepseek UI
&lt;/h2&gt;

&lt;p&gt;A simple web-based chat interface powered by Ollama's deep-seek model.&lt;br&gt;
This tool provides an interactive, real-time chatting experience with the&lt;br&gt;
assistant, using Streamlit for the frontend. The assistant processes and streams&lt;br&gt;
responses back to the user, ensuring a seamless and engaging interaction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwetx39nrzxup98tg069.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwetx39nrzxup98tg069.png" alt="Image description" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full source code in &lt;a href="https://github.com/ductnn/chat-deepseek-ui" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Chat Interface&lt;/strong&gt;: Allows for dynamic interaction with the assistant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent Chat History&lt;/strong&gt;: Maintains chat history between sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save &amp;amp; Load Chat History&lt;/strong&gt;: Automatically saves chat history to a JSON file for persistent conversations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Install &lt;a href="https://ollama.com/download" rel="noopener noreferrer"&gt;ollama&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pull deepseek-r1 model&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull deepseek-r1 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clone repo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;-b&lt;/span&gt; v1 https://github.com/ductnn/chat-deepseek-ui.git
&lt;span class="nb"&gt;cd &lt;/span&gt;chat-deepseek-ui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install required packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;streamlit ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you still get build errors in package &lt;code&gt;pyarrow&lt;/code&gt;, try installing &lt;code&gt;pyarrow&lt;/code&gt;&lt;br&gt;
as a binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--only-binary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;:all: pyarrow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>chatgpt</category>
      <category>deepseek</category>
    </item>
    <item>
      <title>A solution for Monitoring and Logging Containers</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Thu, 08 Dec 2022 16:01:22 +0000</pubDate>
      <link>https://dev.to/ductnn/a-solution-for-monitoring-and-logging-containers-43io</link>
      <guid>https://dev.to/ductnn/a-solution-for-monitoring-and-logging-containers-43io</guid>
      <description>&lt;h2&gt;
  
  
  domolo
&lt;/h2&gt;

&lt;p&gt;A monitoring and logging solution for Docker hosts and containers with &lt;a href="https://prometheus.io/" rel="noopener noreferrer"&gt;Prometheus&lt;/a&gt;, &lt;a href="http://grafana.org/" rel="noopener noreferrer"&gt;Grafana&lt;/a&gt;, &lt;a href="https://github.com/grafana/loki/" rel="noopener noreferrer"&gt;Loki&lt;/a&gt;, &lt;a href="https://github.com/google/cadvisor" rel="noopener noreferrer"&gt;cAdvisor&lt;/a&gt;, &lt;a href="https://github.com/prometheus/node_exporter" rel="noopener noreferrer"&gt;NodeExporter&lt;/a&gt; and alerting with &lt;a href="https://github.com/prometheus/alertmanager" rel="noopener noreferrer"&gt;AlertManager&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inspired by &lt;a href="https://github.com/stefanprodan/dockprom" rel="noopener noreferrer"&gt;dockprom&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Full source code in &lt;a href="https://github.com/ductnn/domolo" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Clone this repository on your Docker host, cd into &lt;code&gt;domolo&lt;/code&gt; directory and run &lt;code&gt;docker-compose up -d&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ductnn/domolo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;domolo
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus&lt;/strong&gt; (metrics database): &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:9090&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prometheus-Pushgateway&lt;/strong&gt; (push acceptor for ephemeral and batch jobs): &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:9091&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AlertManager&lt;/strong&gt; (alerts management): &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:9093&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grafana&lt;/strong&gt; (visualize metrics): &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loki&lt;/strong&gt; (likes prometheus, but for logs): &lt;code&gt;http://&amp;lt;host-ip&amp;gt;:3100&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promtail&lt;/strong&gt; (is the agent, responsible for gathering logs and sending them to Loki)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NodeExporter&lt;/strong&gt; (host metrics collector)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cAdvisor&lt;/strong&gt; (containers metrics collector)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caddy&lt;/strong&gt; (reverse proxy and basic auth provider for prometheus and alertmanager)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Grafana
&lt;/h2&gt;

&lt;p&gt;Change the credentials in file &lt;a href="https://github.com/ductnn/domolo/blob/master/config" rel="noopener noreferrer"&gt;config&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GF_SECURITY_ADMIN_USER=admin
GF_SECURITY_ADMIN_PASSWORD=changeme
GF_USERS_ALLOW_SIGN_UP=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Grafana&lt;/strong&gt; is preconfigured with dashboards, setup &lt;strong&gt;Prometheus&lt;/strong&gt;(default) and &lt;strong&gt;Loki&lt;/strong&gt; in &lt;a href="https://github.com/ductnn/domolo/blob/master/grafana/provisioning/datasources/datasource.yml" rel="noopener noreferrer"&gt;datasources&lt;/a&gt;&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="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;

&lt;span class="na"&gt;datasources&lt;/span&gt;&lt;span class="pi"&gt;:&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;Prometheus&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prometheus&lt;/span&gt;
    &lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proxy&lt;/span&gt;
    &lt;span class="na"&gt;orgId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://prometheus:9090&lt;/span&gt;
    &lt;span class="na"&gt;basicAuth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;isDefault&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;editable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;Loki&lt;/span&gt;
    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;loki&lt;/span&gt;
    &lt;span class="na"&gt;access&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;proxy&lt;/span&gt;
    &lt;span class="na"&gt;jsonData&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;maxLines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1000&lt;/span&gt;
    &lt;span class="na"&gt;basicAuth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://loki:3100&lt;/span&gt;
    &lt;span class="na"&gt;isDefault&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;editable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prometheus + Node Exporter
&lt;/h3&gt;

&lt;p&gt;Config &lt;code&gt;prometheus&lt;/code&gt; for receiving &lt;em&gt;metrics&lt;/em&gt; from &lt;code&gt;node_exporter&lt;/code&gt;. First, setup &lt;code&gt;node_exporter&lt;/code&gt; in servers we need monitor with &lt;a href="https://github.com/ductnn/domolo/blob/master/docker-compose.agents.yml" rel="noopener noreferrer"&gt;docker-compose.agents.yml&lt;/a&gt; and run command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker-compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.agents.yml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file will setup 3 agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node_exporter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cAdvisor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;promtail&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, we need config scrape &lt;em&gt;metric&lt;/em&gt; on &lt;strong&gt;prometheus server&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Live monitoring &lt;strong&gt;prometheus server&lt;/strong&gt;:&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="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nodeexporter'&lt;/span&gt;
    &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nodeexporter:9100'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Monitoring other Server, we need to add &lt;code&gt;external_labels&lt;/code&gt;:&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="na"&gt;external_labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;monitor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;docker-host-alpha'&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ApiExporter'&lt;/span&gt;
    &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;IP&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;need&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Monitor&amp;gt;:Port'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Grafana Dashboards
&lt;/h3&gt;

&lt;p&gt;Simple dashboards on &lt;em&gt;Grafana&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Node Exporter&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmc4ewddjxjkygmnmvcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmc4ewddjxjkygmnmvcs.png" alt="NodeExporter" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Monitor Services&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tmax1r9ur33gdt2fr4w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tmax1r9ur33gdt2fr4w.png" alt="MonitorServices" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Docker Host&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgw5ebigcmry47194ogu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhgw5ebigcmry47194ogu.png" alt="DockerHost" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Loki
&lt;/h2&gt;

&lt;p&gt;Setup config &lt;em&gt;loki&lt;/em&gt; in file &lt;a href="https://github.com/ductnn/domolo/blob/master/loki/loki-config.yaml" rel="noopener noreferrer"&gt;loki-config&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;TODO: Setup s3&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Config scrape &lt;em&gt;logs&lt;/em&gt; with &lt;em&gt;promtail&lt;/em&gt;, create file &lt;code&gt;promtail-config.yaml&lt;/code&gt; and setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scrape logs container:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;container_logs&lt;/span&gt;
  &lt;span class="na"&gt;docker_sd_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unix:///var/run/docker.sock&lt;/span&gt;
      &lt;span class="na"&gt;refresh_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
  &lt;span class="na"&gt;relabel_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;source_labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__meta_docker_container_name'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;regex&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/(.*)'&lt;/span&gt;
      &lt;span class="na"&gt;target_label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;container'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Scrape logs systems:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;system&lt;/span&gt;
  &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
    &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;job&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;varlogs&lt;/span&gt;
      &lt;span class="na"&gt;__path__&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/log/*log&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;Create simple tool generate logs and containerization this tool. Navigate to file &lt;a href="https://github.com/ductnn/domolo/blob/master/fake-logs/entrypoint.sh" rel="noopener noreferrer"&gt;entrypoint.sh&lt;/a&gt; and run test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  domolo git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;fake-logs
➜  fake-logs git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ &lt;span class="nb"&gt;chmod&lt;/span&gt; +x entrypoint.sh
➜  fake-logs git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ ./entrypoint.sh
2022-12-08T13:20:00Z ERROR An error is usually an exception that has been caught and not handled.
2022-12-08T13:20:00Z DEBUG This is a debug log that shows a log that can be ignored.
2022-12-08T13:20:01Z WARN A warning that should be ignored is usually at this level and should be actionable.
2022-12-08T13:20:03Z ERROR An error is usually an exception that has been caught and not handled.
2022-12-08T13:20:05Z ERROR An error is usually an exception that has been caught and not handled.
2022-12-08T13:20:09Z INFO This is less important than debug log and is often used to provide context &lt;span class="k"&gt;in &lt;/span&gt;the current task.
2022-12-08T13:20:13Z ERROR An error is usually an exception that has been caught and not handled.
2022-12-08T13:20:15Z DEBUG This is a debug log that shows a log that can be ignored.
2022-12-08T13:20:16Z INFO This is less important than debug log and is often used to provide context &lt;span class="k"&gt;in &lt;/span&gt;the current task.
2022-12-08T13:20:17Z INFO This is less important than debug log and is often used to provide context &lt;span class="k"&gt;in &lt;/span&gt;the current task.
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, add &lt;code&gt;fake-logs&lt;/code&gt; in &lt;a href="https://github.com/ductnn/domolo/blob/master/docker-compose.yml" rel="noopener noreferrer"&gt;docker-compose.yml&lt;/a&gt;&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;# Fake Logs&lt;/span&gt;
&lt;span class="na"&gt;flogs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ductn4/flog:v1&lt;/span&gt; &lt;span class="c1"&gt;# Set your name image :)&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;./fake-logs&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;fake-logs&lt;/span&gt;
  &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
  &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;monitor-net&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;org.label-schema.group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monitoring"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or checkout &lt;a href="https://github.com/ductnn/domolo/blob/master/docker-compose.with-flogs.yml" rel="noopener noreferrer"&gt;docker-compose.with-flogs.yml&lt;/a&gt; and run command &lt;code&gt;docker-compose -f docker-compose.with-flogs.yml up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Navigate &lt;em&gt;&lt;a href="https://dev.tolocalhost:3000"&gt;grafana&lt;/a&gt;&lt;/em&gt; and open &lt;code&gt;Explore&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxa65yl7gh9ohi97jlio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmxa65yl7gh9ohi97jlio.png" alt="Explore" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, we can select &lt;code&gt;labels&lt;/code&gt; and views &lt;code&gt;logs&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2th1xb43ucs07m8akkrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2th1xb43ucs07m8akkrg.png" alt="Labels" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ex: Select &lt;code&gt;label container&lt;/code&gt; and view log container &lt;code&gt;fake-logs&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgyh05c4988bomnjqmv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgyh05c4988bomnjqmv7.png" alt="LabelFlog" width="800" height="967"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqf3qow1424eqwxpnzje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqf3qow1424eqwxpnzje.png" alt="LogsFlog" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;More logs: &lt;em&gt;logs system, other containers, ....&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjddn9abt83zpc9mdm6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbjddn9abt83zpc9mdm6d.png" alt="SystemLogs" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5q7vkwd8wjvmcd6jamjv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5q7vkwd8wjvmcd6jamjv.png" alt="ContainersLogs" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Show your support
&lt;/h2&gt;

&lt;p&gt;Give a ⭐ if you like this application ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribution
&lt;/h2&gt;

&lt;p&gt;All contributions are welcomed in this project!&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;The MIT License (MIT). Please see &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; for more information.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>logging</category>
      <category>docker</category>
      <category>devops</category>
    </item>
    <item>
      <title>Simple tool check informations from domain name with golang</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Tue, 20 Sep 2022 16:49:09 +0000</pubDate>
      <link>https://dev.to/ductnn/simple-tool-check-domain-information-with-golang-54j8</link>
      <guid>https://dev.to/ductnn/simple-tool-check-domain-information-with-golang-54j8</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;LOOKUP&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LOOKUP&lt;/strong&gt; is a simple tool check IP informations, CNAME, NS(Name Server), A records, MX records, TXT records with &lt;strong&gt;Go&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;     /&lt;span class="se"&gt;\/&lt;/span&gt;| __   /&lt;span class="se"&gt;\/&lt;/span&gt;| __
    |/&lt;span class="se"&gt;\/&lt;/span&gt; /_/  |/&lt;span class="se"&gt;\/&lt;/span&gt; /_/
      ___     ___
     / _ &lt;span class="se"&gt;\ &lt;/span&gt;  / _ &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; | | &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; |
     &lt;span class="se"&gt;\_&lt;/span&gt;__/   &lt;span class="se"&gt;\_&lt;/span&gt;__/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Full source code in &lt;a href="https://github.com/ductnn/lookup" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundamental
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CNAME&lt;/strong&gt;: is a &lt;em&gt;Canonical Name Record&lt;/em&gt; or &lt;em&gt;Alias Record&lt;/em&gt;. A type of resource record in the &lt;em&gt;Domain Name System&lt;/em&gt; (DNS), that specifies that one domain name is an alias of another canonical domain name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A and AAAA Record&lt;/strong&gt;: An A and AAAA record are actually primary DNS records. They associate a domain name with a specific IP address.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TXT Record&lt;/strong&gt; : A TXT record (short for text record) is a type of resource record in the &lt;em&gt;Domain Name System&lt;/em&gt; (DNS) used to provide the ability to associate arbitrary text with a host or other name, such as human readable information about a server, network, data center, or other accounting information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MX(Mail Exchanger) Record&lt;/strong&gt;: A mail exchanger record (MX record) specifies the mail server responsible for accepting email messages on behalf of a domain name. It is a resource record in the Domain Name System (DNS). It is possible to configure several MX records, typically pointing to an array of mail servers for load balancing and redundancy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NameServer&lt;/strong&gt;: Nameserver is a server on the internet specialized in handling queries regarding the location of a domain name's various services. Nameservers are a fundamental part of the Domain Name System (DNS). They allow using domains instead of IP addresses.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;First, install &lt;a href="https://go.dev/doc/install" rel="noopener noreferrer"&gt;golang&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then, clone from soucre code and setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ductnn/lookup.git
&lt;span class="nb"&gt;cd &lt;/span&gt;lookup
go get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Without docker
&lt;/h3&gt;

&lt;p&gt;Run command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go run main.go
# Enter domain you want to check.
# Example
google.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwgutf9lzyn2zurvqxrz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwgutf9lzyn2zurvqxrz.png" width="800" height="445"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Check result:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CNAME&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fke94axjrf7gyh0xy4ilq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fke94axjrf7gyh0xy4ilq.png" width="770" height="242"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TXT records&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uxg29yxmktjg0gzhuo9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4uxg29yxmktjg0gzhuo9.png" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP informations&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk786b1jt9jslbblm8wga.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk786b1jt9jslbblm8wga.png" width="800" height="211"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name Servers&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal30gza180hlgq6zol9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fal30gza180hlgq6zol9z.png" width="476" height="442"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MX records&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frygxueyo98scdr44c1h3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frygxueyo98scdr44c1h3.png" width="536" height="262"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;
&lt;h3&gt;
  
  
  With docker
&lt;/h3&gt;

&lt;p&gt;Check &lt;a href="https://dev.toDockerfile"&gt;Dockerfile&lt;/a&gt; and build with command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;your-image&amp;gt; &lt;span class="nt"&gt;-f&lt;/span&gt; Dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or pulls my image in &lt;a href="https://hub.docker.com/r/ductn4/loo" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and run &lt;em&gt;container&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; ductn4/loo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With file binary
&lt;/h3&gt;

&lt;p&gt;You can down file &lt;em&gt;binary&lt;/em&gt; in &lt;a href="https://dev.tobin/loo"&gt;here&lt;/a&gt; for running tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download file bin to your local&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x loo
./loo
&lt;span class="c"&gt;# And check result ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test with &lt;strong&gt;facebook.com&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  bin git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ ./loo

     /&lt;span class="se"&gt;\/&lt;/span&gt;| __   /&lt;span class="se"&gt;\/&lt;/span&gt;| __
    |/&lt;span class="se"&gt;\/&lt;/span&gt; /_/  |/&lt;span class="se"&gt;\/&lt;/span&gt; /_/
      ___     ___
     / _ &lt;span class="se"&gt;\ &lt;/span&gt;  / _ &lt;span class="se"&gt;\&lt;/span&gt;
    | &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; | | &lt;span class="o"&gt;(&lt;/span&gt;_&lt;span class="o"&gt;)&lt;/span&gt; |
     &lt;span class="se"&gt;\_&lt;/span&gt;__/   &lt;span class="se"&gt;\_&lt;/span&gt;__/


Enter subdomain or domain name:
facebook.com

CNAME
+---------------------+--------------+---------------+
| DOMAIN OR SUBDOMAIN |    DOMAIN    |     CNAME     |
+---------------------+--------------+---------------+
| facebook.com        | facebook.com | facebook.com. |
+---------------------+--------------+---------------+

TXT records
+--------------+----------------------------------------------------------------------+
|    DOMAIN    |                             TXT RECORDS                              |
+--------------+----------------------------------------------------------------------+
| facebook.com | google-site-verification&lt;span class="o"&gt;=&lt;/span&gt;A2WZWCNQHrGV_TWwKh6KHY90tY0SHZo_RnyMJoDaG0s |
+              +----------------------------------------------------------------------+
|              | &lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;spf1                                                               |
|              | &lt;span class="nv"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;_spf.facebook.com                                           |
+              +----------------------------------------------------------------------+
|              | google-site-verification&lt;span class="o"&gt;=&lt;/span&gt;sK6uY9x7eaMoEMfn3OILqwTFYgaNp4llmguKI-C3_iA |
+              +----------------------------------------------------------------------+
|              | google-site-verification&lt;span class="o"&gt;=&lt;/span&gt;wdH5DTJTc9AYNwVunSVFeK0hYDGUIEOGb-RReU6pJlY |
+--------------+----------------------------------------------------------------------+

IP Informations
+--------------+------------------------------------+------------------+------------------+------------------------+
|    DOMAIN    |                 IP                 | CITY AND COUNTRY |     LOCATION     |      ORGANIZATION      |
+--------------+------------------------------------+------------------+------------------+------------------------+
| facebook.com | 31.13.75.35                        | Hong             | 22.2783,114.1747 | AS32934 Facebook,      |
|              |                                    | Kong, HK         |                  | Inc.                   |
+              +------------------------------------+------------------+------------------+                        +
|              | 2a03:2880:f15a:83:face:b00c:0:25de | Dublin,          | 53.3331,-6.2489  |                        |
|              |                                    | IE               |                  |                        |
+--------------+------------------------------------+------------------+------------------+------------------------+

Name Servers
+--------------+--------------------+
|    DOMAIN    |    NAME SERVERS    |
+--------------+--------------------+
| facebook.com | b.ns.facebook.com. |
+              +--------------------+
|              | d.ns.facebook.com. |
+              +--------------------+
|              | a.ns.facebook.com. |
+              +--------------------+
|              | c.ns.facebook.com. |
+--------------+--------------------+

MX Records
+--------------+-----------------------------+
|    DOMAIN    |         MX RECORDS          |
+--------------+-----------------------------+
| facebook.com | smtpin.vvv.facebook.com.    |
|              | 10                          |
+--------------+-----------------------------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Okkk! Thank you for reading 😍 🤩 🥳&lt;/p&gt;

</description>
      <category>go</category>
      <category>ip</category>
      <category>tooling</category>
      <category>docker</category>
    </item>
    <item>
      <title>Optimize Dockerfile images for NextJS</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Fri, 05 Aug 2022 03:15:00 +0000</pubDate>
      <link>https://dev.to/ductnn/optimize-dockerfile-images-for-nextjs-23b7</link>
      <guid>https://dev.to/ductnn/optimize-dockerfile-images-for-nextjs-23b7</guid>
      <description>&lt;h2&gt;
  
  
  Optimize Dockerfile images for NextJS
&lt;/h2&gt;

&lt;p&gt;NextJS Docker images is &lt;strong&gt;too big&lt;/strong&gt;. So, this article will focus on the way optimize dockerfile for production. Here, i will use 2 ways for optimize docker images.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Full source code in &lt;a href="https://github.com/ductnn/Dockerfile/tree/master/examples/nextjs" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;First, we need to create a project with &lt;strong&gt;nextjs&lt;/strong&gt;. Quickly, i use an example of &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;, project in &lt;a href="https://github.com/vercel/next.js/tree/canary/examples/blog-starter" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Project structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── @types
│   └── remark-html.d.ts
├── README.md
├── _posts
│   ├── dynamic-routing.md
│   ├── hello-world.md
│   └── preview.md
├── components
│   ├── alert.tsx
│   ├── avatar.tsx
│   ├── container.tsx
│   ├── cover-image.tsx
│   ├── date-formatter.tsx
│   ├── footer.tsx
│   ├── header.tsx
│   ├── hero-post.tsx
│   ├── intro.tsx
│   ├── layout.tsx
│   ├── markdown-styles.module.css
│   ├── meta.tsx
│   ├── more-stories.tsx
│   ├── post-body.tsx
│   ├── post-header.tsx
│   ├── post-preview.tsx
│   ├── post-title.tsx
│   └── section-separator.tsx
├── interfaces
│   ├── author.ts
│   └── post.ts
├── lib
│   ├── api.ts
│   ├── constants.ts
│   └── markdownToHtml.ts
├── next-env.d.ts
├── package.json
├── pages
│   ├── _app.tsx
│   ├── _document.tsx
│   ├── index.tsx
│   └── posts
│       └── &lt;span class="o"&gt;[&lt;/span&gt;slug].tsx
├── postcss.config.js
├── public
│   ├── assets
│   │   └── blog
│   │       ├── authors
│   │       │   ├── jj.jpeg
│   │       │   ├── joe.jpeg
│   │       │   └── tim.jpeg
│   │       ├── dynamic-routing
│   │       │   └── cover.jpg
│   │       ├── hello-world
│   │       │   └── cover.jpg
│   │       └── preview
│   │           └── cover.jpg
│   └── favicon
│       ├── android-chrome-192x192.png
│       ├── android-chrome-512x512.png
│       ├── apple-touch-icon.png
│       ├── browserconfig.xml
│       ├── favicon-16x16.png
│       ├── favicon-32x32.png
│       ├── favicon.ico
│       ├── mstile-150x150.png
│       ├── safari-pinned-tab.svg
│       └── site.webmanifest
├── styles
│   └── index.css
├── next.config.js
├── tailwind.config.js
└── tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, install and build this blog:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ yarn
➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ yarn build
➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ yarn start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your blog should be up and running on &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;localhost:3000&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build on Docker
&lt;/h2&gt;

&lt;p&gt;Ignore unneeded files with &lt;code&gt;.dockerignore&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
*.DS_Store
.next
.gitignore
README.md
.dockerignore
LICENSE
.docker
.gitlab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have 3 scenarios &lt;code&gt;dockerfile&lt;/code&gt; in &lt;a href="//blog-starter/.docker/"&gt;here&lt;/a&gt;. First, i'll use &lt;strong&gt;&lt;a href="https://github.com/ductnn/Dockerfile/blob/master/examples/nextjs/blog-starter/.docker/basic.dockerfile" rel="noopener noreferrer"&gt;Basic Dockerfile&lt;/a&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker build &lt;span class="nt"&gt;-t&lt;/span&gt; blog-with-basic-dockerfile &lt;span class="nt"&gt;-f&lt;/span&gt; .docker/basic.dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyj8k0ufppravo174z2mc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyj8k0ufppravo174z2mc.png" alt="basic" width="800" height="222"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check docker images&lt;/span&gt;
➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker images
REPOSITORY                                       TAG                               IMAGE ID       CREATED          SIZE
blog-with-basic-dockerfile                       latest                            b70f75178890   8 seconds ago    370MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this scenarios, we built &lt;code&gt;nextjs image&lt;/code&gt; with size &lt;strong&gt;370MB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Next, we use multi-stage docker with &lt;strong&gt;&lt;a href="https://github.com/ductnn/Dockerfile/blob/master/examples/nextjs/blog-starter/.docker/multistage.dockerfile" rel="noopener noreferrer"&gt;Multi Stage Docker&lt;/a&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker build &lt;span class="nt"&gt;-t&lt;/span&gt; blog-with-multistage-dockerfile &lt;span class="nt"&gt;-f&lt;/span&gt; .docker/multistage.dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdjgd96xt7t38k0g4561.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqdjgd96xt7t38k0g4561.png" alt="multi" width="800" height="299"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check docker images&lt;/span&gt;
➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker images
REPOSITORY                                           TAG                               IMAGE ID       CREATED           SIZE
blog-with-multistage-dockerfile                      latest                            07c84ea2173a   38 seconds ago    339MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this way, i use module &lt;code&gt;node-prune&lt;/code&gt; in stage &lt;strong&gt;BUILD&lt;/strong&gt; after install packages. &lt;code&gt;node-prune&lt;/code&gt; can remove unnecessary files from &lt;code&gt;node_modules&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;         files total 43,924
       files removed 12,814
        size removed 28 MB
            duration 866ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hehe, reduced &lt;strong&gt;28MB&lt;/strong&gt;. You can follow this &lt;a href="https://github.com/ductnn/Dockerfile/blob/master/nodejs/node/16/alpine/Dockerfile" rel="noopener noreferrer"&gt;guide&lt;/a&gt; for setup in your &lt;em&gt;base node image&lt;/em&gt;. So, this images has been optimized &lt;strong&gt;370MB -&amp;gt; 339MB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Finally, we build &lt;code&gt;dockerfile&lt;/code&gt; with multi-stage docker and enable mode &lt;strong&gt;standalone&lt;/strong&gt; of &lt;strong&gt;NextJS&lt;/strong&gt;. Create file &lt;code&gt;next.config.js&lt;/code&gt; with content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;standalone&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;/div&gt;



&lt;p&gt;&lt;code&gt;Nextjs&lt;/code&gt; can automatically create a &lt;strong&gt;standalone folder&lt;/strong&gt; which copies only the necessary files for a production deployment including select files in &lt;code&gt;node_modules&lt;/code&gt;. More &lt;a href="https://nextjs.org/docs/advanced-features/output-file-tracing" rel="noopener noreferrer"&gt;docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Let's start with &lt;strong&gt;&lt;a href="https://github.com/ductnn/Dockerfile/blob/master/examples/nextjs/blog-starter/.docker/multistage_standalone.dockerfile" rel="noopener noreferrer"&gt;Dockerfile&lt;/a&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker build &lt;span class="nt"&gt;-t&lt;/span&gt; blog-with-multistage-standalone-dockerfile &lt;span class="nt"&gt;-f&lt;/span&gt; .docker/multistage_standalone.dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzqeazz9njypqkq4e6bu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmzqeazz9njypqkq4e6bu.png" alt="standalone" width="800" height="304"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check docker images&lt;/span&gt;
➜  blog-starter git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker images
REPOSITORY                                                      TAG                     IMAGE ID       CREATED           SIZE
blog-with-multistage-standalone-dockerfile                      latest                  07c84ea2173a   38 seconds ago    119MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;WoW! Great ...&lt;/strong&gt; The size of images is only &lt;strong&gt;119MB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwu57jwxu6y6jo6le0tch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwu57jwxu6y6jo6le0tch.png" alt="3 images" width="800" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, I have presented 3 ways to optimize image size but ... it build very &lt;strong&gt;slow&lt;/strong&gt;. In the next post, i will show you how to build image faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks for reading&lt;/strong&gt; 😁😁😁&lt;/p&gt;

</description>
      <category>docker</category>
      <category>nextjs</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Simple tool crawl urls form domain</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Sat, 30 Jul 2022 11:06:00 +0000</pubDate>
      <link>https://dev.to/ductnn/simple-tool-crawl-urls-form-domain-7m2</link>
      <guid>https://dev.to/ductnn/simple-tool-crawl-urls-form-domain-7m2</guid>
      <description>&lt;p&gt;&lt;strong&gt;cUrls&lt;/strong&gt; is a simple tool crawl urls from domain using &lt;a href="https://github.com/gocolly/colly" rel="noopener noreferrer"&gt;colly&lt;/a&gt;&lt;br&gt;
library. Source code in &lt;a href="https://github.com/ductnn/cUrls" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;First, install &lt;a href="https://go.dev/doc/install" rel="noopener noreferrer"&gt;golang&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, clone from soure code and install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ductnn/cUrls.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cUrls
go get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Run command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go run curls.go &amp;gt; sub.txt
# Enter domain you want to crawl.
# Example
http://httpbin.org/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check results in file &lt;em&gt;sub.txt&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visiting http://httpbin.org/
Link found: "\n        \n            \n            \n            \n        \n    " -&amp;gt; https://github.com/requests/httpbin
Link found: "the developer - Website" -&amp;gt; https://kennethreitz.org
Link found: "Send email to the developer" -&amp;gt; mailto:me@kennethreitz.org
Link found: "Flasgger" -&amp;gt; https://github.com/rochacbruno/flasgger
Link found: "HTML form" -&amp;gt; /forms/post
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So done !!! =))))&lt;/p&gt;

&lt;h3&gt;
  
  
  Show your support
&lt;/h3&gt;

&lt;p&gt;Give a ⭐ if you like this application ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribution
&lt;/h2&gt;

&lt;p&gt;Contributions are more than welcome in this project!&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;The MIT License (MIT). Please see &lt;a href="https://dev.tolicense"&gt;LICENSE&lt;/a&gt; for more information.&lt;/p&gt;

</description>
      <category>go</category>
      <category>crawler</category>
    </item>
    <item>
      <title>Build API Server for upload files to AWS S3</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Tue, 29 Mar 2022 16:32:19 +0000</pubDate>
      <link>https://dev.to/ductnn/build-api-server-for-upload-files-to-aws-s3-3bkj</link>
      <guid>https://dev.to/ductnn/build-api-server-for-upload-files-to-aws-s3-3bkj</guid>
      <description>&lt;h1&gt;
  
  
  Build API Server for upload files to AWS S3
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweqa8f451yy6vh1v4r0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fweqa8f451yy6vh1v4r0k.png" alt="Image description" width="711" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Full source code in &lt;a href="https://github.com/ductnn/api-upload-to-s3" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project structure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
├── ./src
├── ./Dockerfile
├── ./README.md
├── ./package-lock.json
├── ./package.json
└── ./tsconfig.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Detail&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;src
├── config
│   ├── config.ts
│   └── index.ts
├── main.ts
├── routes
│   ├── index.ts
│   └── upload-to-S3.ts
├── services
│   ├── api.ts
│   └── index.ts
└── utils
    ├── index.ts
    └── utils.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install and build
&lt;/h2&gt;

&lt;h3&gt;
  
  
  With manual
&lt;/h3&gt;

&lt;p&gt;Clone this repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ductnn/api-upload-to-s3.git
&lt;span class="nb"&gt;cd &lt;/span&gt;api-upload-to-s3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the enviroment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env

&lt;span class="c"&gt;# open .env and modify the environment variables&lt;/span&gt;
&lt;span class="c"&gt;## AWS_ACCESS_KEY=&lt;/span&gt;
&lt;span class="c"&gt;## AWS_SECRET_KEY=&lt;/span&gt;
&lt;span class="c"&gt;## AWS_REGION_DEFAULT=&lt;/span&gt;
&lt;span class="c"&gt;## AWS_BUCKET_NAME=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start API Server woth command &lt;code&gt;npm start&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  api-upload-to-s3 git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; npm start 

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; api-upload-to-s3@1.0.0 start
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; node &lt;span class="nt"&gt;--require&lt;/span&gt; ts-node/register src/main.ts

Running service:  undefined
🚀 Server started as undefined at http://localhost:5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open url &lt;code&gt;127.0.0.1:5000&lt;/code&gt; on browser to view result or use &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  api-upload-to-s3 git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ curl 127.0.0.1:5000
&amp;lt;h3&amp;gt;Build API Server &lt;span class="k"&gt;for &lt;/span&gt;upload files to AWS S3&amp;lt;/h3&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we use &lt;strong&gt;Postman&lt;/strong&gt; with method &lt;code&gt;PUT&lt;/code&gt; in &lt;code&gt;127.0.0.1:5000/s3/upload&lt;/code&gt; to &lt;br&gt;
upload files.&lt;/p&gt;
&lt;h3&gt;
  
  
  With Dockerfile
&lt;/h3&gt;

&lt;p&gt;Easy to build API with &lt;a href="//./Dockerfile"&gt;Dockerfile&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Build images&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;YOUR-DOCKER-ID&amp;gt;/api-upload-to-s3:v1 &lt;span class="nt"&gt;-f&lt;/span&gt; Dockerfile &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Push to your registry&lt;/span&gt;
docker push &amp;lt;YOUR-DOCKER-ID&amp;gt;/api-upload-to-s3:v1

&lt;span class="c"&gt;# And run this docker image&lt;/span&gt;
docker run &lt;span class="nt"&gt;-itd&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 5000:5000 &amp;lt;YOUR-DOCKER-ID&amp;gt;/api-upload-to-s3:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contribution
&lt;/h2&gt;

&lt;p&gt;Contributions are more than welcome in this project!&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;The MIT License (MIT). Please see &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; for more information.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>s3</category>
      <category>node</category>
      <category>typescript</category>
    </item>
    <item>
      <title>MongoDB cluster on Docker</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Fri, 28 Jan 2022 17:40:26 +0000</pubDate>
      <link>https://dev.to/ductnn/mongodb-cluster-on-docker-5ghh</link>
      <guid>https://dev.to/ductnn/mongodb-cluster-on-docker-5ghh</guid>
      <description>&lt;p&gt;## MongoDB Cluster on Docker&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbadges.frapsoft.com%2Fos%2Fv1%2Fopen-source.svg%3Fv%3D102" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbadges.frapsoft.com%2Fos%2Fv1%2Fopen-source.svg%3Fv%3D102" alt="Open Source Love" width="120" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ductnn/mongodb-cluster-docker/pulls" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2FPRs-welcome-brightgreen.svg%3Fstyle%3Dflat-square" alt="PRs Welcome" width="90" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="LICENSE"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Flicense-MIT-blue.svg" alt="license" width="78" height="20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A simple implement MongoDB Cluster on Docker with &lt;strong&gt;PSS Style&lt;/strong&gt; (Primary - Secondary - Secondary). Inspired by this &lt;a href="https://viblo.asia/p/cai-dat-mongo-cluster-voi-docker-m68Z0NN25kG" rel="noopener noreferrer"&gt;article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source code in &lt;a href="https://github.com/ductnn/mongodb-cluster-docker" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2 Mongos&lt;/strong&gt; (router): The mongos acts as query routers, providing an interface
between client applications and the sharded cluster.

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;router01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;router02&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;3 Config Servers&lt;/strong&gt;: Store metadata and configuration settings for the cluster

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;configsvr01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configsvr02&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configsvr03&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;3 Shards&lt;/strong&gt; (each a 3 member replica set): Each shard contains a subset of
the sharded data. Each shard can be deployed as a replica set.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shard01-a&lt;/code&gt;, &lt;code&gt;shard01-b&lt;/code&gt;, &lt;code&gt;shard01-c&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shard02-a&lt;/code&gt;, &lt;code&gt;shard02-b&lt;/code&gt;, &lt;code&gt;shard02-c&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shard03-a&lt;/code&gt;, &lt;code&gt;shard03-b&lt;/code&gt;, &lt;code&gt;shard03-c&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Clone this repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ductnn/mongodb-cluster-docker.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mongodb-cluster-docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run &lt;code&gt;docker-compose.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
Creating network &lt;span class="s2"&gt;"mongodb-cluster-docker_default"&lt;/span&gt; with the default driver
Pulling router01 &lt;span class="o"&gt;(&lt;/span&gt;mongo:5.0.3&lt;span class="o"&gt;)&lt;/span&gt;...
5.0.3: Pulling from library/mongo
7b1a6ab2e44d: Already exists
90eb44ebc60b: Already exists
5085b59f2efb: Already exists
c7499923d022: Already exists
019496b6c44a: Already exists
c0df4f407f69: Already exists
351daa315b6c: Already exists
557b07ecd9d7: Already exists
a2dff157a5e3: Already exists
07d83e88231b: Already exists
Digest: sha256:07212fb304ea36b8c5a9e5694527f16deeb0b99f87fc60162dc15ab260bf8a2a
Status: Downloaded newer image &lt;span class="k"&gt;for &lt;/span&gt;mongo:5.0.3
Creating shard-02-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-03-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-03-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-02-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating router-01       ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-01-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-01-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-03-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-01-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating shard-02-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating router-02       ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating mongo-config-01 ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating mongo-config-02 ... &lt;span class="k"&gt;done
&lt;/span&gt;Creating mongo-config-03 ... &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                                           NAMES
302243ef45a3   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 15 minutes   0.0.0.0:27121-&amp;gt;27017/tcp, :::27121-&amp;gt;27017/tcp   mongo-config-03
4599103daf74   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27120-&amp;gt;27017/tcp, :::27120-&amp;gt;27017/tcp   mongo-config-02
5be686736dd8   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27119-&amp;gt;27017/tcp, :::27119-&amp;gt;27017/tcp   mongo-config-01
4eff0c607d3c   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27118-&amp;gt;27017/tcp, :::27118-&amp;gt;27017/tcp   router-02
b28d39a0a262   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27125-&amp;gt;27017/tcp, :::27125-&amp;gt;27017/tcp   shard-02-node-a
ad9c4985f630   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27122-&amp;gt;27017/tcp, :::27122-&amp;gt;27017/tcp   shard-01-node-a
5a43e22ff9ae   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27128-&amp;gt;27017/tcp, :::27128-&amp;gt;27017/tcp   shard-03-node-a
52520b1b29a9   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27124-&amp;gt;27017/tcp, :::27124-&amp;gt;27017/tcp   shard-01-node-c
9591f85f2dc0   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27130-&amp;gt;27017/tcp, :::27130-&amp;gt;27017/tcp   shard-03-node-c
1b745802b88a   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27126-&amp;gt;27017/tcp, :::27126-&amp;gt;27017/tcp   shard-02-node-b
161baac14972   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27117-&amp;gt;27017/tcp, :::27117-&amp;gt;27017/tcp   router-01
4468e7f23da1   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27123-&amp;gt;27017/tcp, :::27123-&amp;gt;27017/tcp   shard-01-node-b
1b99d3d5ea54   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27129-&amp;gt;27017/tcp, :::27129-&amp;gt;27017/tcp   shard-03-node-b
0480f8b2247d   mongo:5.0.3   &lt;span class="s2"&gt;"docker-entrypoint.s…"&lt;/span&gt;   16 minutes ago   Up 16 minutes   0.0.0.0:27127-&amp;gt;27017/tcp, :::27127-&amp;gt;27017/tcp   shard-02-node-c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we need to init &lt;code&gt;config-servers&lt;/code&gt;, &lt;code&gt;shards&lt;/code&gt; and &lt;code&gt;router&lt;/code&gt;:&lt;/p&gt;

&lt;h4&gt;
  
  
  Config servers
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initilizing the config server&lt;/span&gt;
➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ bash bash/init-configserver.sh 
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors&lt;span class="o"&gt;=&lt;/span&gt;disabled&amp;amp;gssapiServiceName&lt;span class="o"&gt;=&lt;/span&gt;mongodb
Implicit session: session &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt; : UUID&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"555e23b7-f1bd-4232-9947-8f5dd0db6c3b"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
MongoDB server version: 5.0.3
&lt;span class="o"&gt;================&lt;/span&gt;
Warning: the &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been superseded by &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;,
which delivers improved usability and compatibility.The &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been deprecated and will be removed &lt;span class="k"&gt;in
&lt;/span&gt;an upcoming release.
We recommend you begin using &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
&lt;span class="o"&gt;================&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$gleStats&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"lastOpTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305337, 1&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"electionId"&lt;/span&gt; : ObjectId&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"000000000000000000000000"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"lastCommittedOpTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;0, 0&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
bye
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Shards
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Initilzing the shards&lt;/span&gt;
➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ bash bash/init-replicaset.sh 
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors&lt;span class="o"&gt;=&lt;/span&gt;disabled&amp;amp;gssapiServiceName&lt;span class="o"&gt;=&lt;/span&gt;mongodb
Implicit session: session &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt; : UUID&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"815f9a5c-997b-48a6-bba0-8847b0890521"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
MongoDB server version: 5.0.3
&lt;span class="o"&gt;================&lt;/span&gt;
Warning: the &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been superseded by &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;,
which delivers improved usability and compatibility.The &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been deprecated and will be removed &lt;span class="k"&gt;in
&lt;/span&gt;an upcoming release.
We recommend you begin using &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
&lt;span class="o"&gt;================&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$clusterTime&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"clusterTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305394, 1&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"signature"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"hash"&lt;/span&gt; : BinData&lt;span class="o"&gt;(&lt;/span&gt;0,&lt;span class="s2"&gt;"AAAAAAAAAAAAAAAAAAAAAAAAAAA="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"keyId"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"operationTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305394, 1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
bye
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors&lt;span class="o"&gt;=&lt;/span&gt;disabled&amp;amp;gssapiServiceName&lt;span class="o"&gt;=&lt;/span&gt;mongodb
Implicit session: session &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt; : UUID&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"16424801-e037-450b-b4db-4d9dfe19752b"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
MongoDB server version: 5.0.3
&lt;span class="o"&gt;================&lt;/span&gt;
Warning: the &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been superseded by &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;,
which delivers improved usability and compatibility.The &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been deprecated and will be removed &lt;span class="k"&gt;in
&lt;/span&gt;an upcoming release.
We recommend you begin using &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
&lt;span class="o"&gt;================&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1 &lt;span class="o"&gt;}&lt;/span&gt;
bye
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors&lt;span class="o"&gt;=&lt;/span&gt;disabled&amp;amp;gssapiServiceName&lt;span class="o"&gt;=&lt;/span&gt;mongodb
Implicit session: session &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt; : UUID&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"6f621971-1d81-45c6-9f74-23eacc9cc4a1"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
MongoDB server version: 5.0.3
&lt;span class="o"&gt;================&lt;/span&gt;
Warning: the &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been superseded by &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;,
which delivers improved usability and compatibility.The &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been deprecated and will be removed &lt;span class="k"&gt;in
&lt;/span&gt;an upcoming release.
We recommend you begin using &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
&lt;span class="o"&gt;================&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$clusterTime&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"clusterTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305395, 1&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"signature"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"hash"&lt;/span&gt; : BinData&lt;span class="o"&gt;(&lt;/span&gt;0,&lt;span class="s2"&gt;"AAAAAAAAAAAAAAAAAAAAAAAAAAA="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"keyId"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"operationTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305395, 1&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
bye
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Routers
&lt;/h3&gt;

&lt;p&gt;After initilizing &lt;code&gt;config-server&lt;/code&gt; and &lt;code&gt;shards&lt;/code&gt;, wait a bit to to elect primaries&lt;br&gt;
before initilizing &lt;code&gt;router&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ bash bash/init-router.sh 
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors&lt;span class="o"&gt;=&lt;/span&gt;disabled&amp;amp;gssapiServiceName&lt;span class="o"&gt;=&lt;/span&gt;mongodb
Implicit session: session &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt; : UUID&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"25a1c2a2-135c-4550-b732-713e018eb0a2"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
MongoDB server version: 5.0.3
&lt;span class="o"&gt;================&lt;/span&gt;
Warning: the &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been superseded by &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;,
which delivers improved usability and compatibility.The &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been deprecated and will be removed &lt;span class="k"&gt;in
&lt;/span&gt;an upcoming release.
We recommend you begin using &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
&lt;span class="o"&gt;================&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"shardAdded"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-01"&lt;/span&gt;,
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$clusterTime&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"clusterTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305656, 6&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"signature"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"hash"&lt;/span&gt; : BinData&lt;span class="o"&gt;(&lt;/span&gt;0,&lt;span class="s2"&gt;"AAAAAAAAAAAAAAAAAAAAAAAAAAA="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"keyId"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"operationTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305656, 5&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"shardAdded"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-02"&lt;/span&gt;,
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$clusterTime&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"clusterTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305660, 2&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"signature"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"hash"&lt;/span&gt; : BinData&lt;span class="o"&gt;(&lt;/span&gt;0,&lt;span class="s2"&gt;"AAAAAAAAAAAAAAAAAAAAAAAAAAA="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"keyId"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"operationTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305658, 4&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"shardAdded"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-03"&lt;/span&gt;,
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$clusterTime&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"clusterTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305662, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"signature"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"hash"&lt;/span&gt; : BinData&lt;span class="o"&gt;(&lt;/span&gt;0,&lt;span class="s2"&gt;"AAAAAAAAAAAAAAAAAAAAAAAAAAA="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"keyId"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"operationTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305662, 3&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
bye
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Verify status
&lt;/h4&gt;

&lt;p&gt;We can check the status of replicasets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Exec to the shard&lt;/span&gt;
➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; shard-01-node-a bash 
root@ad9c4985f630:/# mongo
rs-shard-01:PRIMARY&amp;gt; rs.status&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"set"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-01"&lt;/span&gt;,
        &lt;span class="s2"&gt;"date"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.326Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
        &lt;span class="s2"&gt;"myState"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"term"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;,
        &lt;span class="s2"&gt;"syncSourceHost"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
        &lt;span class="s2"&gt;"syncSourceId"&lt;/span&gt; : &lt;span class="nt"&gt;-1&lt;/span&gt;,
        &lt;span class="s2"&gt;"heartbeatIntervalMillis"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;2000&lt;span class="o"&gt;)&lt;/span&gt;,
        &lt;span class="s2"&gt;"majorityVoteCount"&lt;/span&gt; : 2,
        &lt;span class="s2"&gt;"writeMajorityCount"&lt;/span&gt; : 2,
        &lt;span class="s2"&gt;"votingMembersCount"&lt;/span&gt; : 3,
        &lt;span class="s2"&gt;"writableVotingMembersCount"&lt;/span&gt; : 3,
        &lt;span class="s2"&gt;"optimes"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"lastCommittedOpTime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"lastCommittedWallTime"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.283Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"readConcernMajorityOpTime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"appliedOpTime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"durableOpTime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 8&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"lastAppliedWallTime"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.283Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"lastDurableWallTime"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.278Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"lastStableRecoveryTimestamp"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306245, 14&lt;span class="o"&gt;)&lt;/span&gt;,
        &lt;span class="s2"&gt;"electionCandidateMetrics"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"lastElectionReason"&lt;/span&gt; : &lt;span class="s2"&gt;"electionTimeout"&lt;/span&gt;,
                &lt;span class="s2"&gt;"lastElectionDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:16:45.266Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"electionTerm"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"lastCommittedOpTimeAtElection"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;0, 0&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"lastSeenOpTimeAtElection"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305394, 1&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="s2"&gt;"numVotesNeeded"&lt;/span&gt; : 2,
                &lt;span class="s2"&gt;"priorityAtElection"&lt;/span&gt; : 1,
                &lt;span class="s2"&gt;"electionTimeoutMillis"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;10000&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"numCatchUpOps"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"newTermStartDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:16:45.299Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"wMajorityWriteAvailabilityDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:16:45.957Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"members"&lt;/span&gt; : &lt;span class="o"&gt;[&lt;/span&gt;
                &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"_id"&lt;/span&gt; : 0,
                        &lt;span class="s2"&gt;"name"&lt;/span&gt; : &lt;span class="s2"&gt;"shard01-a:27017"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"health"&lt;/span&gt; : 1,
                        &lt;span class="s2"&gt;"state"&lt;/span&gt; : 1,
                        &lt;span class="s2"&gt;"stateStr"&lt;/span&gt; : &lt;span class="s2"&gt;"PRIMARY"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"uptime"&lt;/span&gt; : 1211,
                        &lt;span class="s2"&gt;"optime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                                &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                                &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"syncSourceHost"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
                        &lt;span class="s2"&gt;"syncSourceId"&lt;/span&gt; : &lt;span class="nt"&gt;-1&lt;/span&gt;,
                        &lt;span class="s2"&gt;"infoMessage"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
                        &lt;span class="s2"&gt;"electionTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305405, 1&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"electionDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:16:45Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"configVersion"&lt;/span&gt; : 2,
                        &lt;span class="s2"&gt;"configTerm"&lt;/span&gt; : 1,
                        &lt;span class="s2"&gt;"self"&lt;/span&gt; : &lt;span class="nb"&gt;true&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeatMessage"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"_id"&lt;/span&gt; : 1,
                        &lt;span class="s2"&gt;"name"&lt;/span&gt; : &lt;span class="s2"&gt;"shard01-b:27017"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"health"&lt;/span&gt; : 1,
                        &lt;span class="s2"&gt;"state"&lt;/span&gt; : 2,
                        &lt;span class="s2"&gt;"stateStr"&lt;/span&gt; : &lt;span class="s2"&gt;"SECONDARY"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"uptime"&lt;/span&gt; : 867,
                        &lt;span class="s2"&gt;"optime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                                &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306260, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                                &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDurable"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                                &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306260, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                                &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:00Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDurableDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:00Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeat"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.263Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeatRecv"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.252Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"pingMs"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeatMessage"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
                        &lt;span class="s2"&gt;"syncSourceHost"&lt;/span&gt; : &lt;span class="s2"&gt;"shard01-a:27017"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"syncSourceId"&lt;/span&gt; : 0,
                        &lt;span class="s2"&gt;"infoMessage"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
                        &lt;span class="s2"&gt;"configVersion"&lt;/span&gt; : 2,
                        &lt;span class="s2"&gt;"configTerm"&lt;/span&gt; : 1
                &lt;span class="o"&gt;}&lt;/span&gt;,
                &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"_id"&lt;/span&gt; : 2,
                        &lt;span class="s2"&gt;"name"&lt;/span&gt; : &lt;span class="s2"&gt;"shard01-c:27017"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"health"&lt;/span&gt; : 1,
                        &lt;span class="s2"&gt;"state"&lt;/span&gt; : 2,
                        &lt;span class="s2"&gt;"stateStr"&lt;/span&gt; : &lt;span class="s2"&gt;"SECONDARY"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"uptime"&lt;/span&gt; : 867,
                        &lt;span class="s2"&gt;"optime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                                &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306260, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                                &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDurable"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                                &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306260, 9&lt;span class="o"&gt;)&lt;/span&gt;,
                                &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:00Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"optimeDurableDate"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:00Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeat"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.263Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeatRecv"&lt;/span&gt; : ISODate&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"2021-11-07T17:31:01.248Z"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"pingMs"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"lastHeartbeatMessage"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
                        &lt;span class="s2"&gt;"syncSourceHost"&lt;/span&gt; : &lt;span class="s2"&gt;"shard01-a:27017"&lt;/span&gt;,
                        &lt;span class="s2"&gt;"syncSourceId"&lt;/span&gt; : 0,
                        &lt;span class="s2"&gt;"infoMessage"&lt;/span&gt; : &lt;span class="s2"&gt;""&lt;/span&gt;,
                        &lt;span class="s2"&gt;"configVersion"&lt;/span&gt; : 2,
                        &lt;span class="s2"&gt;"configTerm"&lt;/span&gt; : 1
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;]&lt;/span&gt;,
        &lt;span class="s2"&gt;"ok"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$gleStats&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"lastOpTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;0, 0&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"electionId"&lt;/span&gt; : ObjectId&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"7fffffff0000000000000001"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"lastCommittedOpTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 9&lt;span class="o"&gt;)&lt;/span&gt;,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$configServerState&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"opTime"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"ts"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 11&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"t"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$clusterTime&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"clusterTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 11&lt;span class="o"&gt;)&lt;/span&gt;,
                &lt;span class="s2"&gt;"signature"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;"hash"&lt;/span&gt; : BinData&lt;span class="o"&gt;(&lt;/span&gt;0,&lt;span class="s2"&gt;"AAAAAAAAAAAAAAAAAAAAAAAAAAA="&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,
                        &lt;span class="s2"&gt;"keyId"&lt;/span&gt; : NumberLong&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;,
        &lt;span class="s2"&gt;"operationTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636306261, 9&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar with another &lt;code&gt;shards&lt;/code&gt;. Check the status of &lt;code&gt;router&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker-compose &lt;span class="nb"&gt;exec &lt;/span&gt;router01 mongo &lt;span class="nt"&gt;--port&lt;/span&gt; 27017
MongoDB shell version v5.0.3
connecting to: mongodb://127.0.0.1:27017/?compressors&lt;span class="o"&gt;=&lt;/span&gt;disabled&amp;amp;gssapiServiceName&lt;span class="o"&gt;=&lt;/span&gt;mongodb
Implicit session: session &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"id"&lt;/span&gt; : UUID&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"69408b5a-d313-44ae-ae64-81e9d3d21588"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
MongoDB server version: 5.0.3
&lt;span class="o"&gt;================&lt;/span&gt;
Warning: the &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been superseded by &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;,
which delivers improved usability and compatibility.The &lt;span class="s2"&gt;"mongo"&lt;/span&gt; shell has been deprecated and will be removed &lt;span class="k"&gt;in
&lt;/span&gt;an upcoming release.
We recommend you begin using &lt;span class="s2"&gt;"mongosh"&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
&lt;span class="o"&gt;================&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt;
The server generated these startup warnings when booting: 
        2021-11-07T17:10:47.048+00:00: Access control is not enabled &lt;span class="k"&gt;for &lt;/span&gt;the database. Read and write access to data and configuration is unrestricted
&lt;span class="nt"&gt;---&lt;/span&gt;
mongos&amp;gt; sh.status&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="nt"&gt;---&lt;/span&gt; Sharding Status &lt;span class="nt"&gt;---&lt;/span&gt; 
  sharding version: &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"_id"&lt;/span&gt; : 1,
        &lt;span class="s2"&gt;"minCompatibleVersion"&lt;/span&gt; : 5,
        &lt;span class="s2"&gt;"currentVersion"&lt;/span&gt; : 6,
        &lt;span class="s2"&gt;"clusterId"&lt;/span&gt; : ObjectId&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"618809c41517a9e726602e13"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
  shards:
        &lt;span class="o"&gt;{&lt;/span&gt;  &lt;span class="s2"&gt;"_id"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-01"&lt;/span&gt;,  &lt;span class="s2"&gt;"host"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-01/shard01-a:27017,shard01-b:27017,shard01-c:27017"&lt;/span&gt;,  &lt;span class="s2"&gt;"state"&lt;/span&gt; : 1,  &lt;span class="s2"&gt;"topologyTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305656, 2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;  &lt;span class="s2"&gt;"_id"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-02"&lt;/span&gt;,  &lt;span class="s2"&gt;"host"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-02/shard02-a:27017,shard02-b:27017,shard02-c:27017"&lt;/span&gt;,  &lt;span class="s2"&gt;"state"&lt;/span&gt; : 1,  &lt;span class="s2"&gt;"topologyTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305658, 2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;  &lt;span class="s2"&gt;"_id"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-03"&lt;/span&gt;,  &lt;span class="s2"&gt;"host"&lt;/span&gt; : &lt;span class="s2"&gt;"rs-shard-03/shard03-a:27017,shard03-b:27017,shard03-c:27017"&lt;/span&gt;,  &lt;span class="s2"&gt;"state"&lt;/span&gt; : 1,  &lt;span class="s2"&gt;"topologyTime"&lt;/span&gt; : Timestamp&lt;span class="o"&gt;(&lt;/span&gt;1636305662, 1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
  active mongoses:
        &lt;span class="s2"&gt;"5.0.3"&lt;/span&gt; : 2
  autosplit:
        Currently enabled: &lt;span class="nb"&gt;yes
  &lt;/span&gt;balancer:
        Currently enabled: &lt;span class="nb"&gt;yes
        &lt;/span&gt;Currently running: &lt;span class="nb"&gt;yes
        &lt;/span&gt;Collections with active migrations: 
                config.system.sessions started at Sun Nov 07 2021 17:33:54 GMT+0000 &lt;span class="o"&gt;(&lt;/span&gt;UTC&lt;span class="o"&gt;)&lt;/span&gt;
        Failed balancer rounds &lt;span class="k"&gt;in &lt;/span&gt;last 5 attempts: 0
        Migration results &lt;span class="k"&gt;for &lt;/span&gt;the last 24 hours: 
                237 : Success
  databases:
        &lt;span class="o"&gt;{&lt;/span&gt;  &lt;span class="s2"&gt;"_id"&lt;/span&gt; : &lt;span class="s2"&gt;"config"&lt;/span&gt;,  &lt;span class="s2"&gt;"primary"&lt;/span&gt; : &lt;span class="s2"&gt;"config"&lt;/span&gt;,  &lt;span class="s2"&gt;"partitioned"&lt;/span&gt; : &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
                config.system.sessions
                        shard key: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"_id"&lt;/span&gt; : 1 &lt;span class="o"&gt;}&lt;/span&gt;
                        unique: &lt;span class="nb"&gt;false
                        &lt;/span&gt;balancing: &lt;span class="nb"&gt;true
                        &lt;/span&gt;chunks:
                                rs-shard-01     787
                                rs-shard-02     118
                                rs-shard-03     119
                        too many chunks to print, use verbose &lt;span class="k"&gt;if &lt;/span&gt;you want to force print
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done ... &lt;em&gt;wait&lt;/em&gt;. You can &lt;strong&gt;remove&lt;/strong&gt; all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  mongodb-cluster-docker git:&lt;span class="o"&gt;(&lt;/span&gt;master&lt;span class="o"&gt;)&lt;/span&gt; bash clean_all.sh 
Stopping mongo-config-03 ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping mongo-config-02 ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping mongo-config-01 ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping router-02       ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-02-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-01-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-03-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-01-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-03-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-02-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping router-01       ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-01-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-03-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Stopping shard-02-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing mongo-config-03 ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing mongo-config-02 ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing mongo-config-01 ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing router-02       ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-02-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-01-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-03-node-a ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-01-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-03-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-02-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing router-01       ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-01-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-03-node-b ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing shard-02-node-c ... &lt;span class="k"&gt;done
&lt;/span&gt;Removing network mongodb-cluster-docker_default
Removing image mongo:5.0.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And so real &lt;em&gt;done&lt;/em&gt; =))))&lt;/p&gt;

&lt;h3&gt;
  
  
  Show your support
&lt;/h3&gt;

&lt;p&gt;Give a ⭐ if you like this application ❤️&lt;/p&gt;

&lt;h2&gt;
  
  
  Contribution
&lt;/h2&gt;

&lt;p&gt;All contributions are welcomed in this project!&lt;/p&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;The MIT License (MIT). Please see &lt;a href="https://dev.toLICENSE"&gt;LICENSE&lt;/a&gt; for more information.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>mongodb</category>
      <category>javascript</category>
      <category>containers</category>
    </item>
    <item>
      <title>Install Jenkins with Docker 🐳</title>
      <dc:creator>Duc Tran</dc:creator>
      <pubDate>Tue, 30 Nov 2021 17:41:21 +0000</pubDate>
      <link>https://dev.to/ductnn/install-jenkins-with-docker-3lfe</link>
      <guid>https://dev.to/ductnn/install-jenkins-with-docker-3lfe</guid>
      <description>&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1n6n8bp1vequehm4c0g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1n6n8bp1vequehm4c0g.jpg" width="800" height="384"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Downloading and running Jenkins on Docker&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The recommended Docker image to use is the Official &lt;a href="https://hub.docker.com/r/jenkins/jenkins/" rel="noopener noreferrer"&gt;jenkins/jenkins&lt;/a&gt;&lt;br&gt;
image from Docker hub repo. A new &lt;a href="https://hub.docker.com/r/jenkins/jenkins/" rel="noopener noreferrer"&gt;jenkins/jenkins&lt;/a&gt;&lt;br&gt;
image is published each time a new release of Jenkins Docker is published (Don't use &lt;a href="https://hub.docker.com/_/jenkins" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt; image - Already &lt;strong&gt;deprecated&lt;/strong&gt;).&lt;br&gt;
&lt;em&gt;OK!!! Let's start&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: To install &lt;code&gt;Jenkins&lt;/code&gt;, we need to deploy 2 containers: &lt;code&gt;docker:dind&lt;/code&gt; and &lt;code&gt;jenkins/jenkins&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Create bridge network for 2 container&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Setup &lt;code&gt;docker:dind&lt;/code&gt; &lt;strong&gt;(DinD: Docker-in-Docker)&lt;/strong&gt;: is just what it says &lt;em&gt;running Docker inside a Docker container&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; jenkins-docker &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--privileged&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; jenkins &lt;span class="nt"&gt;--network-alias&lt;/span&gt; docker &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/certs &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume&lt;/span&gt; ~/docker-certs-jk:/certs/client &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--volume&lt;/span&gt; ~/jenkins-home:/var/jenkins_home &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 2376:2376 docker:dind &lt;span class="nt"&gt;--storage-driver&lt;/span&gt; overlay2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--privileged&lt;/code&gt;: Running Docker in Docker currently requires privileged access to function properly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--network-alias docker&lt;/code&gt;: Makes the Docker in Docker container available as the hostname docker within the jenkins network.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--env DOCKER_TLS_CERTDIR=/certs&lt;/code&gt;: Enables the use of TLS in the Docker server.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--volume ~/jenkins-home:/var/jenkins_home&lt;/code&gt;: Mounting volume &lt;code&gt;jenkins-home&lt;/code&gt; to workspace directory of Jenkins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps 3&lt;/strong&gt;: Deploy container &lt;code&gt;Jenkins&lt;/code&gt;. We can use command to run container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; jenkins &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; jenkins &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp://docker:2376 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_CERT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/certs/client &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_TLS_VERIFY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-p&lt;/span&gt; 50000:50000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/jenkins_home:/var/jenkins_home &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/docker-certs-jk:/certs/client:ro &lt;span class="se"&gt;\&lt;/span&gt;
  jenkins/jenkins:2.289.3-lts-jdk11
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But i'll custom for my new &lt;code&gt;jenkins image&lt;/code&gt;. &lt;em&gt;Create Dockerfile&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; jenkins/jenkins:2.289.3-lts-jdk11&lt;/span&gt;

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; root&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; apt-transport-https &lt;span class="se"&gt;\
&lt;/span&gt;    ca-certificates curl gnupg2 &lt;span class="se"&gt;\
&lt;/span&gt;    software-properties-common
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/debian/gpg | apt-key add -
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-key fingerprint 0EBFCD88
&lt;span class="k"&gt;RUN &lt;/span&gt;add-apt-repository &lt;span class="se"&gt;\
&lt;/span&gt;     &lt;span class="s2"&gt;"deb [arch=amd64] https://download.docker.com/linux/debian &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;span class="s2"&gt;     &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;lsb_release &lt;span class="nt"&gt;-cs&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce-cli

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; jenkins&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can see more in my &lt;a href="https://github.com/ductnn/CI-CD-tu/tree/main/jenkins" rel="noopener noreferrer"&gt;repo&lt;/a&gt;&lt;br&gt;
  Navigate to directory with &lt;code&gt;Dockerfile&lt;/code&gt; and build new image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; jenkins-new:v1 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, we run the new jenkins image as container in Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--name&lt;/span&gt; jenkins &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt; jenkins &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp://docker:2376 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_CERT_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/certs/client &lt;span class="nt"&gt;--env&lt;/span&gt; &lt;span class="nv"&gt;DOCKER_TLS_VERIFY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-p&lt;/span&gt; 50000:50000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/jenkins_home:/var/jenkins_home &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/docker-certs-jk:/certs/client:ro &lt;span class="se"&gt;\&lt;/span&gt;
  jenkins-new:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check our result&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;➜  jenkins git:&lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED        STATUS         PORTS                                                                                      NAMES
d5609c0f9f69   jenkins-new:v1   &lt;span class="s2"&gt;"/sbin/tini -- /usr/…"&lt;/span&gt;   18 hours ago   Up 9 seconds   0.0.0.0:8080-&amp;gt;8080/tcp, :::8080-&amp;gt;8080/tcp, 0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp   jenkins
339877c8ca20   docker:dind      &lt;span class="s2"&gt;"dockerd-entrypoint.…"&lt;/span&gt;   18 hours ago   Up 5 seconds   2375/tcp, 0.0.0.0:2376-&amp;gt;2376/tcp, :::2376-&amp;gt;2376/tcp                                        jenkins-docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we need to config &lt;code&gt;Jenkins&lt;/code&gt; after installation, let access the dashboard at &lt;code&gt;localhost:8080&lt;/code&gt;, and unlock jenkins using password:&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi203aelylbn4b63hg11p.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi203aelylbn4b63hg11p.jpg" width="800" height="548"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Follow the tutorial, we can take the password at &lt;code&gt;/var/lib/jenkins/secrets/initialAdminPassword&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;CONTAINER ID   IMAGE            COMMAND                  CREATED        STATUS          PORTS                                                                                      NAMES
d5609c0f9f69   jenkins-new:v1   &lt;span class="s2"&gt;"/sbin/tini -- /usr/…"&lt;/span&gt;   19 hours ago   Up 29 minutes   0.0.0.0:8080-&amp;gt;8080/tcp, :::8080-&amp;gt;8080/tcp, 0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp   jenkins
339877c8ca20   docker:dind      &lt;span class="s2"&gt;"dockerd-entrypoint.…"&lt;/span&gt;   19 hours ago   Up 29 minutes   2375/tcp, 0.0.0.0:2376-&amp;gt;2376/tcp, :::2376-&amp;gt;2376/tcp                                        jenkins-docker
➜  jenkins git:&lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt; ✗ docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; d5 bash
jenkins@d5609c0f9f69:/&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /var/lib/jenkins/secrets/initialAdminPassword
YOUR_PASSWORD_IN_HERE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After unlock jenkins, the Customize Jenkins page appears. We choose &lt;code&gt;Install suggested plugins&lt;/code&gt;, and &lt;code&gt;Create Admin User&lt;/code&gt;. &lt;code&gt;Jenkins&lt;/code&gt; ready to use 🤟 🤟 🤟.&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2molghhf5m1lhllxe5fj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2molghhf5m1lhllxe5fj.png" width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;And we can install &lt;code&gt;BlueOcean&lt;/code&gt; plugins (GUI for CI/CD Pipeline)&lt;/p&gt;


&lt;p&gt;&lt;br&gt;
    &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxbyxolkzisz20lgueuo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frxbyxolkzisz20lgueuo.png" width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;OK Done !!! Thanks you for reading my article 🥰🥰🥰&lt;/p&gt;

&lt;p&gt;Shopping on &lt;a href="https://golozone.com" rel="noopener noreferrer"&gt;my store&lt;/a&gt; 🥰🥰🥰&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.nestybox.com/2019/09/14/dind.html" rel="noopener noreferrer"&gt;Docker DinD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>jenkins</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
