<?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: Repro Dev</title>
    <description>The latest articles on DEV Community by Repro Dev (@reprodev).</description>
    <link>https://dev.to/reprodev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1280175%2Fa67e6296-986b-4f40-ac21-345dd688529b.png</url>
      <title>DEV Community: Repro Dev</title>
      <link>https://dev.to/reprodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reprodev"/>
    <language>en</language>
    <item>
      <title>EU AI Act Content Labelling: Fake Around And Find Out</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Thu, 06 Aug 2026 10:00:00 +0000</pubDate>
      <link>https://dev.to/reprodev/eu-ai-act-content-labelling-fake-around-and-find-out-3b85</link>
      <guid>https://dev.to/reprodev/eu-ai-act-content-labelling-fake-around-and-find-out-3b85</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj2ohm1a0xicl5i3ludo8.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj2ohm1a0xicl5i3ludo8.png" alt="EU AI Act Content Labelling: Fake Around And Find Out" width="799" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this week's Thursday Thinkpiece we take a look at the recent EU AI Act and how it's changing the way the internet and businesses market themselves in this ever changing climate.&lt;/p&gt;

&lt;p&gt;There’s a place where creativity meets corporate interests. A place where selling a product or vertical slice of yourself is the goal.The place I speak of is a little place we call Social Media.&lt;/p&gt;

&lt;p&gt;On Social Media, you can be anything you want to be. You can turn yourself into an expert on any topic or industry. This is a place where you can run a whole business on vibes and journeys. A place where realism isn’t the name of the game but where a curated version of yourself can exist separate to you. You can deflect criticism quite easily but this is usually by just ignoring the “haters” who are just jealous of you of course. Money isn’t always the goal but AI has helped to turn everyone into a writer, artist or music megastar with nothing but a pocket full of dreams and a prompt full of hope.&lt;/p&gt;

&lt;p&gt;I can say I’ve leant on using Gen-AI to help me structure my thoughts and even to try and make something fit a more rigid structure. It’s not because I can’t write, it's more because it’s a skill I haven’t been able to practice properly for a while. It failed because that probably didn’t help to really bring forward what I was trying to achieve. It doesn’t know me, it just “knows” what I think I should be. It’s kind of the main reason why these think pieces even exist.&lt;/p&gt;

&lt;p&gt;As someone who loves to write, edit video, draw and play music in an analogue and sometimes digital fashion. I don’t want to take away anyone’s ability to express themselves. I can love Bob Dylan before he went electric and after. It doesn’t mean I’m amazing at any of these things but whatever I put on the page comes from my unique lens of the world. I then sprinkled in some inspiration from what has gone before. That’s it. However, the future of Gen AI trying to replace human ingenuity isn’t something far away on the horizon of civilization anymore.&lt;/p&gt;

&lt;p&gt;It’s here. But I digress. In its most basic form, Gen-AI. Well it’s just a tool.&lt;/p&gt;

&lt;p&gt;On Sunday August 2nd 2026, The EU AI Act started officially applying but it actually came into force on August 1st 2024 for those taking notes. It shifted what was thought to be a dream for those who didn’t necessarily fit the archetype of the tortured artist. To try and larp like one even if deep down they truly are. It’s a shortcut which now comes with up to a 15 million Euro price tag for those who don’t disclose it clearly, or 3% worldwide annual turnover whichever hurts them more. This is where FAFO stops being a bit of internet vulgarity and starts meaning Fake Around And Find Out.&lt;/p&gt;

&lt;p&gt;15 million euros could be thought of as a rounding error to a big tech company like Meta. 3% of global turnover well that’s gonna sting Zuckerburg and co more than the loss made from the Metaverse.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Generative AI?
&lt;/h3&gt;

&lt;p&gt;Generative AI is the synthetic output of large language models that have been trained on almost the whole of human histories’ art, music and literature to produce something which can only be described as an uncanny valley of humanity. This output can be in illustrated flyers for businesses, funny video shorts featuring animated pieces of fruit cheating on each other on YouTube and TikTok or as banal as social media posts on LinkedIn and X.&lt;/p&gt;

&lt;p&gt;It ticks all the boxes of what went before it and in many cases is probably the best way of doing things for efficiency and speed for individuals or small teams. The application of this technology is seemingly infinite and is not going away any time soon.&lt;/p&gt;

&lt;p&gt;What began as a way to save some time writing an email has now become the way to fully write, voice and produce a song with near studio level production. I’m not here to say it’s bad or that people should be penalised for using it as that is very Pre-ChatGPT thinking. The bottle this genie lives in was smashed to pieces many years ago. It’s not going back in. The wishes however now come with a bit of a catch.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the EU AI Act?
&lt;/h3&gt;

&lt;p&gt;The EU AI Act first hit the headlines in 2023 (which I’ll come back to shortly) it seemed broad and a bit of a nothing burger way back when. This is how all legislation is initially drafted.&lt;/p&gt;

&lt;p&gt;Back in November 2022, when many of us early adopters signed up to the free OpenAI Playground I played around with it in its most basic form before ChatGPT Plus became a thing. Plenty of “at capacity” messages which I’m sure a lot of you remember and it was very basic and fiddly to set up. It was pay as you go and I was very careful in staying within very small limits.&lt;/p&gt;

&lt;p&gt;Then in February 2023 when ChatGPT Plus launched I was lucky to already have an account and credit card attached so I just bit the bullet to have the subscription to have a play around and get around the self imposed and technical limits. It was fun. Honestly, I mainly used it for shopping lists and asking stupid questions. I tried more ambitious things but it wasn’t really there yet. It wasn’t much more than that but organising my life as the goal here. It was very slow so it didn’t have the same kind of impact and I was deep into coming off a few years of learning how to use programming languages like Powershell and Python. At this point coding tasks were a lot easier to just do by hand and I had already caught the programming bug hard so hobbled things together from online courses and copious amounts of Stack Exchange posts. Those were the dark days indeed or maybe most fulfilling depending on how you look at it.&lt;/p&gt;

&lt;p&gt;Many people didn’t even know what Generative AI “content” was at that point. It wasn’t really usable or a thing until much deeper into 2023. This was mainly as it hadn’t really been defined fully yet and the edges were still pretty rough. It was years away in our minds. We were in the early days of chatbots and ChatGPT coming to take over the academic fields first and then coding. Governments around the world weren’t massively interested in trying to keep up with the technological changes speeding by but in the EU this was a different story.&lt;/p&gt;

&lt;p&gt;The EU AI Act covered a lot which I won’t go into but deepfakes were a major concern back then. Celebrities were worried their likeness would be used at best, to promote the wrong brand and at worst into more nefarious adult avenues. The broad outline was there to also protect the average citizen and state official from suffering a similar or worse fate.&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually changed on August 2nd 2026?
&lt;/h3&gt;

&lt;p&gt;Fast forward to August 2nd 2026 and this is now EU Law specifically Article 50 of this long sprawling document is the key change. Businesses have to become compliant by December 2nd 2026. This timeline and window is shocking but exists for a reason to try and allow those who may have started their business in the beforetimes a chance to align themselves closer to the new guidelines. This includes the marking and detection obligation of this content that they now face. There are some exceptions for things like satire especially if disclosure ruins the joke. Thanks Europe, I definitely owe you a stein of beer for that one and so do the Lego AI bros from Iran.&lt;/p&gt;

&lt;p&gt;This doesn’t just affect people like me in the UK though. We're bound by EU law of course even if we’re not officially a part of them any more. That does kind of make me sad but I don’t want to get into politics as that in itself would take us way off track. The main point though is this will also apply, just the same to other companies from around the world that trade here either physically or digitally. It mainly hits those in the marketing game and small to medium businesses who may not even really know about it.&lt;/p&gt;

&lt;p&gt;Again, this was still brought into law to in essence to fight the industry of deepfake technology which now is almost imperceptible from reality. We could have a whole other debate on the “someone please think of the children” when it comes to laws being brought in around technology so let’s put that to one side here even though I think it’s important. The main change is that these items now have to be labelled if they are to be used, especially if they are going to be used to inform, sell a product or try to educate. It’s probably for the best really.&lt;/p&gt;

&lt;p&gt;This is where things get a bit messy and of course there have been no actual test cases yet so it’s interesting to ponder on. It’s a very human trait. For those who want to read the actual letter of the law you can go here.&lt;/p&gt;

&lt;p&gt;Luckily the EU has been kind enough, if you could call it, to give us the actual labels to use and to allow some exceptions. Think of them as Food Warning labels and they definitely are going to make some people think a bit differently on the content they consume. I’ve pasted this below from the guidance from which makes it a bit easier to digest.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not all AI-generated or manipulated content needs to be labelled. The disclosure requirement under the AI Act covers only AI-generated or manipulated content. The icons support compliance with Article 50(4) of the AI Act, which requires deployers of AI systems to disclose:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Deep fakes - AI-generated or manipulated image, audio, or video content that resembles existing persons, objects, places, entities or events and would falsely appear to a person to be authentic or truthful.&lt;/li&gt;
&lt;li&gt;AI-generated or manipulated text published to inform the public on matters of public interest, which did not undergo human review or editorial control and where editorial responsibility was not assumed by any legal or natural person.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://digital-strategy.ec.europa.eu/en/policies/eu-icons-labelling-ai-generated-content" rel="noopener noreferrer"&gt;Link to Labelling and EU Gen AI Icons&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Making Gen-AI Iconic
&lt;/h3&gt;

&lt;p&gt;The icons are the thing that is really the major change here. I’ve already seen on LinkedIn content with the AI-Generated logo on videos this week. They now have this new watermark where only last week they didn’t. It was obvious they weren’t real to begin with but now they have to actually slap it on there to cover their arse for compliance purposes.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8buqhn7vp3skpqm07tk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8buqhn7vp3skpqm07tk.png" alt="EU AI Act Content Labelling: Fake Around And Find Out" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now many will say good riddance to the AI-Slop but it’s not as black and white as that and really topics like this never really are. I won’t even go into the Seems Like AI Slop button on LinkedIn as that’s a whole other piece coming later down the road.&lt;/p&gt;

&lt;p&gt;Let’s do a quick experiment for fun.&lt;/p&gt;

&lt;p&gt;Here’s an image that I made using Google Nano Banana&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fib6mra88q3fqcwtjnedh.webp" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fib6mra88q3fqcwtjnedh.webp" alt="EU AI Act Content Labelling: Fake Around And Find Out" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a camera on a desk and I mean it did a really good job at making that camera on a desk. If I threw this up and didn’t say it was Gen-AI most would just think it was a stock image or maybe something from the Creative Commons free to use image library.&lt;/p&gt;

&lt;p&gt;However, these images contain watermarks that would give incorrect metadata so I can just use some simple python to strip the Exif Metadata and if I was really cheeky could even inject my own and voila this would seem to be the real deal.&lt;/p&gt;

&lt;p&gt;The funniest part is I just asked Google Gemini how to do this as well so the whole idea of the metadata being the way to truly catch people out is probably not going to work. Plus it’s kind of still baked into a tool that many use every day.&lt;/p&gt;

&lt;p&gt;In short, I made the image using Generative AI and then stripped out the important watermark data it’s now supposed to have to say it was created using that same Generative AI.&lt;/p&gt;

&lt;p&gt;The real test and way to become compliant is that now companies will have to either disclose it via the tags we just removed (C2PA Tags for technical resilience) and the EU Mandated Labels with a short paragraph on which AI tool this was created from if used for a blog or video for example.&lt;/p&gt;

&lt;p&gt;This is of course voluntary disclosure but if they want to challenge this and get called out on it then they in this case they would have to show their human work on how this picture was composed to start with.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Maybe they need to document and take copious notes of the people they hired to take that photo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maybe they need to have the receipt of the camera that it was taken with but in practice is this really something anyone is ready for.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pictures taken on an iPhone or Android phone have essentially become non-documentarial evidence and we’ll probably see a rise in people taking actual written notes and pictures on actual film with a real DSLR camera to try and be 100% protected.&lt;/p&gt;

&lt;p&gt;This of course is not really going to work in a real life scenario and so a lot of this comes down to the voluntary disclosure of this information to the public via the icons.&lt;/p&gt;

&lt;p&gt;It’s not just going to affect the bigger fish in the corporate pond but also smaller creators who are just taking their first real dip.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about you, eh?
&lt;/h3&gt;

&lt;p&gt;What about me, eh? Well I think the below screenshot should help understand where I am in this.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1oh0337evptnh0xdyuv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1oh0337evptnh0xdyuv.png" alt="EU AI Act Content Labelling: Fake Around And Find Out" width="526" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is a comment that came from a subreddit where I posted my Plex Vs Jellyfin Article and I’ve probably not done the best job explaining in the comments but I like to try and remain accountable to myself and you when I feel like I’ve made a mistake. It’s also been a long time since I’ve written essays to deadline so cut me a little slack here. Also, maybe you can learn from my mistakes as I make them. Either way let’s take a quick laugh at me for once.&lt;/p&gt;

&lt;p&gt;I had a lot of time to think about this comment and I still stand by the original article not being AI-Slop. It took a lot honestly a few weeks to plan out in time between my day job and to write. As I got ready to release it the Jellyfin founder exodus happened which changed it slightly and I was trying to do quick research with Gemini.&lt;/p&gt;

&lt;p&gt;That was a bad but honest mistake as my workflow during draft stage these days involves me asking an LLM what it thinks of my draft. I then redraft taking a few notes from what is essentially my AI editor for its “thoughts”. I mainly look for the tone and if it’s been out there before or if it’s a genuine unique take. This was as I got annoyed with AI detectors calling my original pieces AI written even a few percent and I tried to understand why.&lt;/p&gt;

&lt;p&gt;This is just to be clear it doesn’t write it for me and on that occasion I likely gave the AI too much credit to be my academic buddy or smart tutor. I should have been a bit clearer but hey working to your own self imposed deadline isn’t an excuse any time. It just means I should be better with my own time management.&lt;/p&gt;

&lt;p&gt;I appreciate the honest feedback on my content to try and improve my writing especially as I do feel like I throw myself onto the page a lot of the time. It gives me that weird sense of personal attachment to something I really shouldn’t. Since then I have gone back to what I know I should have listened to all the time when I put something out.&lt;/p&gt;

&lt;p&gt;This silly human. This relatively silly human called me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Taking the L
&lt;/h3&gt;

&lt;p&gt;I still run it through an AI checker to make sure it’s not me just acting like a robot but I try to ignore it as a bad thing or I’d go insane. I want to try and make sure my writing remains me and being able to manually buck the trends of the usual cliche should for now be enough to keep that particular wolf from the door. Well, that phrase has added at least 1% added to the AI detector but it’s now much more of an afterthought to make sure I’m doing my own due diligence to be true to myself.&lt;/p&gt;

&lt;p&gt;However, once it’s out there then anyone should have the opportunity to be able to challenge what I wrote or even how I wrote it. That’s the true human spirit at work and I’m sure I’ve pissed all over someone’s hard work before myself. I should be held to the same kind of criticism and also be able to take the L when I’ve cheated myself or my audience. In this case I would have actually been protected from not having to do any kind of disclosure but that’s not me. I’m very much trying to call myself out before anyone else does as that’s growth in action.&lt;/p&gt;

&lt;p&gt;I felt that this was something I need to add as an important personal part of this article. It’s that when we mess up, we need to own it, learn and move forward and not put on a facade or blame anyone else for our shortcomings. There may be things out of my control but also I should be able to try and roll with the punches. It’s also why I welcome honest constructive feedback and not mud slinging because it’s not good for anyone and can cause people to do silly things in the world of clout chasing and the wider business world.&lt;/p&gt;

&lt;p&gt;I personally want to deeply thank that user for their balanced and honest feedback because that’s truly how the tech world works too, mostly. I also want to again thank those that corrected me or found something interesting on any platform. This is how we all get a chance to be involved in a real non judgemental conversation. It’s the way the tech community itself grows and stops people from trying to rewrite history to suit their own current narrative. Especially when it’s usually pretty transparent to begin with.&lt;/p&gt;

&lt;p&gt;Again, I digress but as we now speed into a world where reality may be imperceptible from fiction it’s something we should really hold ourselves accountable for. It builds real trust in a world where it’s hard to trust anything and back stories feel malleable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enough about your sob story, buddy. Tell me why the labelling matters?
&lt;/h3&gt;

&lt;p&gt;I first heard this particular nugget of information about something slightly off topic but related in the excellent The Rest is Entertainment podcast fronted by Richard Osman and Marina Hyde linked below which YouTube has decided to be part of my recommended feed each week for a few years now. I’m happy they did.&lt;/p&gt;

&lt;p&gt;This episode covers how 39% of people in the USA define themselves as a content creator according to statistics by Luminate, which is weird but feels prescient and current. It also explains how most of them are now broken and/or flat broke as the saturation reaches a fever point in online media like never before. It’s a great piece to watch.&lt;/p&gt;

&lt;p&gt;This could mean that a large section of the USA could be affected by this directly even if they aren’t particularly a business per se or getting started.&lt;/p&gt;

&lt;p&gt;Marina talks about a conversation she had with the CEO of Unilever at around the 4 minute mark which really caught my attention.&lt;/p&gt;

&lt;p&gt;She mentioned that Unilever are now paying smaller content creators for their ad campaigns. It’s much cheaper and feels more real, increasing their reach and overall ROI. They are pretty much at the forefront of advertising with almost 4 Billion people touching one of their products every day according to Marina’s retelling of this encounter.&lt;/p&gt;

&lt;p&gt;Definitely give it a watch for how the future of online marketing is changing before our eyes. They usually talk about Pop Culture as a whole and the inner machinations therein. I think it’s kinda neat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=xNLWE-uzWoM" rel="noopener noreferrer"&gt;The Rest Is Entertainment -&lt;br&gt;&lt;br&gt;
How Content Creation Is Destroying The Hierarchy of Work&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Have We Been Here Before?
&lt;/h3&gt;

&lt;p&gt;With that tangent out of the way as it shows how prevalent and important disclosure is on the reputational side of things already.&lt;/p&gt;

&lt;p&gt;I want to move onto where we’ve seen this kind of legislation happen before with a real world example from my memory banks but bolstered by some old-fashioned journalism. I personally remember this being a big deal almost 20 years ago but may be new to others with very similar parallels to the whole EU AI Labelling.&lt;/p&gt;

&lt;p&gt;Back in 2007, there was an ad campaign run by L’Oreal where they published adverts on both TV and in print magazine form with everyone’s favourite latina Movie Star, Penelope Cruz. The advert claimed that their new Telescopic mascara could give you up to 60% longer lashes. This then showed the star with lashes that were apparently a result of this brand new make-up technology. I have long lashes but that’s an amazing achievement and usually something like this would go straight in the “Who Cares” pile of history.&lt;/p&gt;

&lt;p&gt;In the UK though, we are born to complain about everything not just limited to the weather. That and we like tea and to queue, a lot. In equal measure.&lt;/p&gt;

&lt;p&gt;In this case an eagle-eyed member of the public had a sneaking suspicion that Cruz was wearing false lashes and it wasn’t the mascara’s doing. They sent off a complaint to the UK based Advertising Standards Authority (ASA). The ASA shockingly upheld the complaint with the below reported statement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"We concluded that, in the absence of a disclaimer stating that Penelope Cruz was wearing some individual false lashes added to her natural lashes, and because the ad did not make clear that the claim referred to an increase in the 'appearance' of lash length, the ads could mislead.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was reported they then ordered L’Oreal to actually add a disclaimer whenever one of their models wore false lashes in simple terms. Even though this was only bound to the one company in question, L'Oreal, it set a precedent within the whole beauty industry not by Law but by convention.&lt;/p&gt;

&lt;p&gt;This was the ASA full instruction to L’Oreal and is a very interesting piece of case law.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"all future advertisements featuring models wearing false eyelashes"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://marketinglaw.osborneclarke.com/retailing/cruz-eyelash-furore/" rel="noopener noreferrer"&gt;Cruz-Eyelash-Furore - Marketinglaw&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Right, so did they learn their lesson?
&lt;/h3&gt;

&lt;p&gt;In 2009, only 2 years later L’Oreal were again in hot water with X-Factor and former Girls Aloud star, Cheryl Cole and their Elvive Shampoo. This time they actually did put up a disclaimer to add that the hair was “styled with some natural extensions”. It was for less than 2 seconds. Of a 30-second long advert. In the print version in magazines it was printed about 2mm high of a full page ad. A literal blink and you could miss it or crumple and you can conceal it.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faqzygpk9e3899ae4l57g.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faqzygpk9e3899ae4l57g.jpg" alt="EU AI Act Content Labelling: Fake Around And Find Out" width="460" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On this occasion a whole 13 to 40 people, depending on which reporting you look at. It’s kind of mixed as the ASA records are no longer available directly so we can only truly go off newspaper reports. According to the reports, these people sent in a complaint to the ASA with the same kind of complaint that the ad was misleading.&lt;/p&gt;

&lt;p&gt;This time however, the ASA went ahead and rejected all 13 of these individual complaints. We’ll go with 13 for argument’s sake. It was reported everywhere and I briefly remember on the news that the ASA said the disclaimer was “clear and legible”. I happened to watch the news a lot and it was kind of everywhere.&lt;/p&gt;

&lt;p&gt;That’s the surface answer. It isn’t the whole one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time to do some digging
&lt;/h3&gt;

&lt;p&gt;When you look deeper at this story now, as The Sunday Times did back then when they reported on it, well it feels like there’s more here. One of the aforementioned 13 complaints came from a television producer by the name of Daisy Goodwin. She did also write for the paper on occasion so there may be a bit of sensationalism at play. According to the article, she actually received a response personally from the ASA via one of those old-fashioned bits of communication called a letter. This is where all the quotes online seem to have come from and not an actual press release. Thanks Google-fu.&lt;/p&gt;

&lt;p&gt;I’ve linked the article on the wayback machine here below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://web.archive.org/web/20110810194947/http://women.timesonline.co.uk/tol/life_and_style/women/beauty/article6926911.ece" rel="noopener noreferrer"&gt;The Sunday Time Article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Daisy was quoted as saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“My daughter, aged nine, has been saying, "Please can we buy the shampoo&lt;br&gt;&lt;br&gt;
because I want to look like Cheryl Cole". But her hair is not her own. The&lt;br&gt;&lt;br&gt;
reason her hair looks fabulous is because of hair extensions. &lt;strong&gt;I didn't even&lt;br&gt;&lt;br&gt;
see the reference to them in the ad.&lt;/strong&gt; ”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Also really funny now knowing why so many are against Gen AI to begin with&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Women are being taken for a ride. It is not the same as having your own hair. It's bonkers.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Yes Daisy it is bonkers. As bonkers as the ads now for Temu products that show bath bombs with almost very deceptive results which have very disappointing real world results.&lt;/p&gt;

&lt;p&gt;Daisy as a professional television producer didn’t even see that disclaimer and she was shut down by the ASA. Crazy parallels here.&lt;/p&gt;

&lt;p&gt;The ASA wrote this back according to the article&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A problem would only arise if the ad did not make clear that she is wearing these extensions. It is also worth noting that the hair extensions are made from natural hair and have been treated with the products being advertised.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  But wait, it gets weirder still
&lt;/h3&gt;

&lt;p&gt;The Sunday Times then went on to fact check this claim making this even more confusing by getting a statement from Cheryl’s hairdresser.&lt;/p&gt;

&lt;p&gt;Cheryl Cole’s hairdresser Julain Guyonnet goes on to say in short that he had put in artificial-fibre extensions or fake hair in for her about four weeks earlier while she was in Notting Hill as she had actually damaged her hair through previous glue usage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"She is very nice and down-to-earth. She didn't tell me she was doing the adverts. She used to use human hair but the glue damaged her hair."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They then went to L’Oreal for a statement who said they actually didn’t know where they were real or artificial human extensions.&lt;/p&gt;

&lt;p&gt;Their statement read:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Cheryl has worn hair extensions for some time. They are part of her look and are cared for in the same way as normal hair."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Confused. Yeah I am too.&lt;/p&gt;

&lt;p&gt;Then the Daily Mail went to the stylist Simon Forbes, who actually invented hair extensions 30 years previously and the owner of the Antenna salon in Kensington to give their opinion in the same article.&lt;/p&gt;

&lt;p&gt;This may help give his take a bit more credence before I dip back into the Wayback Machine article&lt;/p&gt;

&lt;p&gt;&lt;a href="https://domehairproducts.com/2020/10/27/where-it-all-begun/" rel="noopener noreferrer"&gt;History of The Hair Extension&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Simon Forbes, owner of the Antenna salon in Kensington, central London who is credited with inventing extensions almost 30 years ago, said Cole's hair could not be called natural. "It is either second-hand hair or artificial. Cheryl looks great because of her extensions and L'Oréal are bathing in that light."”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So. The regulator in this instance (ASA) went about clearing the advertiser (marketing from a company) as the advertiser (marketing from a company) could not actually confirm it didn’t fake the hair. Then an independent expert who actually invented that kind of fake hair contradicted the regulator.&lt;/p&gt;

&lt;p&gt;It makes your head spin and your hair stand on end but it’s interesting to look at the similarities especially as the window for compliance starts to close.&lt;/p&gt;

&lt;p&gt;AI-Icons are voluntarily self applied and to be self-declared by the company that uses them. It’s not 2009 anymore and everyone is a cyber-detective and armchair sleuth in waiting. Hand waving these claims away I’m not sure would work now but this example from 20 years ago is still something to note.&lt;/p&gt;

&lt;p&gt;I also urge you to check out this piece on The Guardian website which is Daisy's Editoral Piece from around the same time&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.theguardian.com/culture/2009/nov/24/cheryl-cole-hair-advertisement" rel="noopener noreferrer"&gt;Daisy Guardian Column Piece&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why should we care about synthetic content?
&lt;/h3&gt;

&lt;p&gt;Because everything mentioned above is just the small version. Disclaimers, icons, metadata, whether anyone bothered to check the hair. All just processes.&lt;/p&gt;

&lt;p&gt;The bigger version is what's actually being disclosed.&lt;/p&gt;

&lt;p&gt;It started with writing. Then video, then music, until being creative became less of a learnt skill and more of a throw of the dice at the casino.&lt;/p&gt;

&lt;p&gt;Hoping that you get what you want but settling for what you get when the tokens run out and it's time to clock out for the day.&lt;/p&gt;

&lt;p&gt;This isn't to discount the ideas people had to throw at it to begin with, but fast forward to 2026 and Gen-AI has replaced a lot of the things that were foundations of the human experience. Foundations of the pain, pleasure, joy and sadness of the individual or the group.&lt;/p&gt;

&lt;p&gt;Which is why I reckon we've all quietly turned into Deckard.&lt;/p&gt;

&lt;p&gt;In Blade Runner, he sits people down with a Voight-Kampff machine and asks synthetics questions designed to upset them. Then watches for the blush, the pupil, that unmistakable involuntary flicker in the iris. It was never really a test for synthetics. It was a test for empathy, built on the idea that a replicant couldn't feel the thing being asked about.&lt;/p&gt;

&lt;p&gt;We all run our own version now in a slighly different way. Every post, every image, every article that lands in our feed. Squinting at it and trying to work out if there's a person in there.&lt;/p&gt;

&lt;p&gt;This is very melodramatic but that's sort of the point, because it comes from the heart and that's the bit the maths hasn't worked out yet.&lt;/p&gt;

&lt;p&gt;Let’s wrap this up as we’ve gone way off topic&lt;/p&gt;

&lt;p&gt;We’ve talked about a lot this week from stripping metadata to EU AI Icon labelling and eyelashes and hair for some reason.&lt;/p&gt;

&lt;p&gt;For me, I’ll try to be more upfront when I’ve used an LLM to produce any part of my articles to hopefully make it easier to understand and keep me honest throughout. Not because I’m worried about the EU AI labelling affecting me but more to keep building the trust between me and you the reader. Or listener if you’re listening to this for some reason. I mean screen readers do exist too.&lt;/p&gt;

&lt;p&gt;My article thumbnails are “handmade” using Photoshop, mainly because I’m old and stubborn. I write in Markdown because I think I’m smart and that’s how the Ghost Blogging platform and many others expect the content. Moving forward I’m going to try and be using things like Google Docs more often because spell check isn’t frowned upon yet. I’ll be using Google, DuckDuckGo and even Bing for my research but if I use any LLM for the research I’ll be double, triple and quadruple checking my work.&lt;/p&gt;

&lt;p&gt;I’ll only use it to make sure I’m not misremembering and also potentially in cases like the second ASA when other blog articles are the only source and I can’t get to documents that no longer exist. I think that’s fair but feel free to give me a good rollicking if you think that’s a cop-out.&lt;/p&gt;

&lt;p&gt;Thank the lord for the Wayback Machine, may it live as long as it can.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are you actually going to end this?
&lt;/h3&gt;

&lt;p&gt;I want to close with this. It looks like L'Oreal did this way back when because they thought about the risk. Because to L'Oreal the risk was worth it.&lt;/p&gt;

&lt;p&gt;Plenty of companies and creators will likely make that same call with this as well. The icon will get smaller and smaller and become just another thing on top of Gen-AI content like a little bit of furniture that we stop paying attention to. That’s how it went 20 years ago and likely will go this time round.&lt;/p&gt;

&lt;p&gt;The only bit that survives is less corporate and more reputational. Were you one of the honest ones when nobody was forcing you to be?&lt;/p&gt;

&lt;p&gt;For me and many others out there we’ll keep letting you know. Just be careful you’re not one of those that fake around and find out.&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;

</description>
      <category>thursdaythinkpiece</category>
      <category>euaiact</category>
      <category>generativeai</category>
      <category>techpolicy</category>
    </item>
    <item>
      <title>Apprenticeships : How You Can Get Into Tech In The UK And USA For Free And Get Paid</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Thu, 30 Jul 2026 05:25:48 +0000</pubDate>
      <link>https://dev.to/reprodev/apprenticeships-how-you-can-get-into-tech-in-the-uk-and-usa-for-free-and-get-paid-4apd</link>
      <guid>https://dev.to/reprodev/apprenticeships-how-you-can-get-into-tech-in-the-uk-and-usa-for-free-and-get-paid-4apd</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk2a9fsjgh34ziq00gasy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk2a9fsjgh34ziq00gasy.png" alt="Apprenticeships : How You Can Get Into Tech In The UK And USA For Free And Get Paid" width="799" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This week's Thursday Thinkpiece, we take a look at something which hit the news this week in the UK around the Digital Literacy future of young people getting into technology. However, even though this route may just be for the young I'll give you some some real ways you can get into the tech industry around the world while getting paid and gaining experience along the way at any age.&lt;/p&gt;

&lt;p&gt;Let's be real for a minute: if you look at how people try to break into tech over in the US, the entry-level competition numbers from official industry research like the &lt;a href="https://www.comptia.org/content/research" rel="noopener noreferrer"&gt;CompTIA State of the Tech Workforce Report&lt;/a&gt; are absolute madness, with recruiters receiving over 400 applications per entry-level role and applicant-to-interview rates plummeting to just 2%.&lt;/p&gt;

&lt;p&gt;Workforce data for the Class of 2026 shows fresh US computer science grads walking off the stage with average debt load between $37,000 and $55,000 hanging over their heads, part of a staggering $1.75 Trillion national student debt mountain. Over in the UK, official higher education statistics from the &lt;a href="https://commonslibrary.parliament.uk/research-briefings/cbp-8924/" rel="noopener noreferrer"&gt;UK Parliament House of Commons Library&lt;/a&gt; show it's not much different: tuition fees capped at £9,250 a year plus maintenance loans mean a standard 3-year UK computer science degree leaves Class of 2026 graduates facing upwards of £45,000 to £50,000 in debt.&lt;/p&gt;

&lt;p&gt;My current favourite example, which is pretty much a meme within the tech community, are listings looking for 10 years of experience in Claude Code when the product was only released in 2024. That's right up there with a recent one I saw looking for 5+ years of experience in ChatGPT. That's more a symptom of the chaotic AI space we're currently in and the proliferation of recruiters using CoPilot to generate job ads, but it's still hilarious.&lt;/p&gt;

&lt;p&gt;The sad truth is that most of those recruiters are also using AI to filter candidates out unless they have a certain certification or experience level on their CV before a human even gets a chance to read it, which is funny and scary in equal measure. It's a vicious cycle where AI gatekeeping stops people from getting experience, and then other AI tools filter those same people out for not having experience!&lt;/p&gt;

&lt;p&gt;P.S. I do know people who will hire you without a degree or experience, but they're few and far between. They tend to be in smaller organisations or friends of friends, so they're not really a viable option for most people. Also I'm a big proponent of AI usage (and let's face it, it's not going anywhere) but when it starts filtering out potential candidates for jobs before humans even get a chance to see their CV, we need to have a serious conversation about it.&lt;/p&gt;

&lt;p&gt;What happens next on both sides of the Atlantic? They hit a brick wall of job posts demanding three years of commercial experience just to get an initial screening call, which is a ridiculous ask for entry-level positions.&lt;/p&gt;

&lt;p&gt;To bridge that gap in the US, thousands end up taking unpaid or low-stipend summer internships in places like San Francisco or New York (where rent alone eats you alive). You spend months grinding away, pulling late nights and running coffee runs, praying a real job offer pops up at the end of it. Most of the time? You're just providing free corporate labour without any guarantee of a contract. Also, what if you don't have $10k+ saved up to afford living in SF or NYC? Then you're really stuck unless you're lucky enough to have family who can support you, which, let's face it, isn't an option for most people either.&lt;/p&gt;

&lt;p&gt;Over here in the UK though, the conversation around avoiding that debt cycle is taking a very different turn.&lt;/p&gt;

&lt;p&gt;Major education policy changes over the last few days have put vocational technical training front and centre. Recent reporting from &lt;a href="https://www.theguardian.com/education/apprenticeships" rel="noopener noreferrer"&gt;The Guardian&lt;/a&gt;, &lt;a href="https://www.linkedin.com/news/story/pupils-to-get-technical-training-7430236/" rel="noopener noreferrer"&gt;LinkedIn News coverage on technical training for pupils&lt;/a&gt; and latest &lt;a href="https://www.gov.uk/government/organisations/department-for-education" rel="noopener noreferrer"&gt;Department for Education policy directives&lt;/a&gt; outline plans to introduce technical pathways directly to pupils starting in Year 10 (aged 14 to 15, equivalent to 9th grade High School Freshmen in the US).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpode63jrxn46gsudz9du.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpode63jrxn46gsudz9du.png" alt="Apprenticeships : How You Can Get Into Tech In The UK And USA For Free And Get Paid" width="551" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Andy Burnham (Mayor of Greater Manchester) on LinkedIn:&lt;br&gt;&lt;br&gt;
"For too long, our education system has treated technical routes as a secondary choice. The Manchester Baccalaureate (MBacc) and early technical pathways give young people clear choices, employer-backed skills and direct routes into high-skilled careers without crippling debt."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The story prompted some major discussion in the office and fellow tech professionals on LinkedIn in the past week. Though mostly around the surrounding politics of the British Labour Party leadership battle rather than the practical content. Political debates aren't what this blog is about, and I don't really get too involved in all of that anyway. What makes this story genuinely fascinating is where the policy debate itself is unfolding. New UK Prime Minister Andy Burnham is actively using LinkedIn to lay out policy visions, championing early technical routes and regional skills frameworks.&lt;/p&gt;

&lt;p&gt;In time, platforms like TikTok may well become a great shop window for your career, though part of the reluctance in the UK is simply because consumer social media apps aren't fully understood by senior leadership yet. Right now, companies might be willing to market on consumer platforms, but leadership usually shuts them down as places for serious hiring, even if rank-and-file staff consume content there daily.&lt;/p&gt;

&lt;p&gt;In fact, recruiters actively scan candidate socials for anything that could trigger corporate liability and companies enforce strict social media policies to protect their brand. By the time you reach a second-stage interview, employers increasingly run digital footprint scans to weed out anything that might embarrass the organisation down the line. When senior political leadership publishes education strategy directly on professional networks like LinkedIn, it signals where real career building and enterprise decisions actually take place.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flipwspejaek28sji3zw2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flipwspejaek28sji3zw2.png" alt="Apprenticeships : How You Can Get Into Tech In The UK And USA For Free And Get Paid" width="799" height="524"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;To be completely transparent? I didn't actually take the apprenticeship route myself when breaking into IT.&lt;/p&gt;

&lt;p&gt;In fact, early on I held the exact same snobbery that plenty of people carry: assuming apprenticeships were strictly meant for manual trades like plumbing or bricklaying, and certainly weren't well respected in corporate tech environments.&lt;/p&gt;

&lt;p&gt;That bias completely evaporated about seven months into my very first IT job. My company brought on our first technical apprentice from a local 6th form college and I was asked to help mentor him.&lt;/p&gt;

&lt;p&gt;He was just a regular tech kid: playing Fortnite by night and handling user phone calls and laptop builds by day. He was even given subsidised travel to get into the office and the sheer cost of the Cisco, CompTIA and vendor certs he was picking up while earning a real wage was genuinely mindblowing to me. Seeing how quickly he built live production confidence and grew into a capable engineer without taking on a single penny of university debt opened my eyes completely.&lt;/p&gt;

&lt;p&gt;Over the years, having worked on and off as a corporate technical trainer delivering everything from enterprise SharePoint rollouts to C-suite executive briefings, I've spent years engaging with people across the entire corporate spectrum. From total beginners taking their very first steps and intermediate technicians upskilling on tools, to C-suite executives navigating IT strategy, one thing is abundantly clear: abstract lectures without real workplace context fail learners every single time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The News Story and the UK Policy Shift
&lt;/h2&gt;

&lt;p&gt;The government policy push to introduce technical modules to 14-year-olds in Year 10 is designed to build true parity of esteem between academic degrees and vocational qualifications. Society is finally recognising that configuring a server rack or securing a cloud tenant carries just as much economic value as sitting in a university lecture hall.&lt;/p&gt;

&lt;p&gt;Look, this system didn't appear overnight. The UK has a long history of vocational training that stretches back centuries.&lt;/p&gt;

&lt;p&gt;Formal indentured apprenticeships were first codified in law under the 1563 Statute of Artificers, requiring seven years under a master craftsman. According to historical analysis from the &lt;a href="https://commonslibrary.parliament.uk/research-briefings/cbp-8924/" rel="noopener noreferrer"&gt;UK Parliament House of Commons Library&lt;/a&gt;, this guild system powered traditional industries for centuries. As heavy manufacturing declined in the mid-20th century, the Thatcher administration launched the Youth Training Scheme (YTS) in 1983 to tackle rising youth unemployment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1563: Statute of Artificers ──► 7-year traditional craft indentures under master craftsmen
1983: Youth Training Scheme ──► Government YTS launched in response to 1980s youth unemployment
1993: Modern Apprenticeships ──► Shift to NVQs, legally binding employee contracts and real wages
2017: Apprenticeship Levy ──► 0.5% tax on £3M+ employer paybills funding enterprise tech training
2026: Technical Path Reform ──► Year 10 technical routes, regional mayor oversight and parity of esteem

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While YTS had plenty of flaws and became notorious in popular culture for sending teenagers on errand runs and tea duty, it established an essential precedent: vocational education was a public responsibility requiring structured workplace integration.&lt;/p&gt;

&lt;p&gt;In 1993, Modern Apprenticeships replaced vague time-served models with National Vocational Qualifications (NVQs). Crucially? It established that apprentices were employees entitled to a written contract, fair pay and structured off-the-job training.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Apprenticeship Levy, QA and Degree-Level Pathways
&lt;/h2&gt;

&lt;p&gt;The modern framework reached full maturity with the introduction of the &lt;a href="https://www.gov.uk/guidance/pay-apprenticeship-levy" rel="noopener noreferrer"&gt;GOV.UK Apprenticeship Levy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Under this legislation, UK employers with an annual paybill over £3 million contribute 0.5% into a digital account accessed via the &lt;a href="https://www.apprenticeships.gov.uk" rel="noopener noreferrer"&gt;GOV.UK Apprenticeship Service&lt;/a&gt;. That funding is strictly earmarked for accredited technical training and endpoint assessments. Enterprise tech companies, finance hubs and public sector bodies suddenly had millions of pounds earmarked strictly for upskilling staff and hiring new technical talent.&lt;/p&gt;

&lt;p&gt;This policy driver created specialised training providers like &lt;a href="https://www.qa.com/apprenticeships/" rel="noopener noreferrer"&gt;QA Apprenticeships&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Providers like QA deliver structured Level 3 (A-Level equivalent) all the way to Level 6 and Level 7 (BSc and MSc Master's level) &lt;a href="https://www.ucas.com/apprenticeships/degree-apprenticeships" rel="noopener noreferrer"&gt;UCAS Degree Apprenticeships&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One of the biggest misconceptions about modern UK apprenticeships is that they're strictly meant for 16 to 18-year-old school leavers. That couldn't be further from the truth. Modern tech schemes are open to candidates of all ages.&lt;/p&gt;

&lt;p&gt;If you're a 30-something career switcher working in hospitality, retail or administration and wanting to pivot into cloud engineering or DevOps, an apprenticeship pathway is tailor-made for you. You don't have to quit your job to accumulate student loans for a second degree, nor do you have to work for free. You join an organisation as a paid employee, earn a competitive salary from day one, and have 100% of your training and vendor certs funded via the employer's Levy account. It's a win-win scenario for both you and the employer.&lt;/p&gt;

&lt;p&gt;I personally was involved with helping a career switcher as the designated buddy and he'd just come from being made redundant at a supermarket. Now I know this sounds crazy but his wife was in labour as he had his second stage interview with us in a hospital across the road. However, he still turned up, did the interview and ultimately got the job and ran over there to meet his new baby. He's now doing brilliantly for himself, with a well-paying job, no debt, and a loving family. So never say never, eh?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
| UK DEGREE APPRENTICESHIP MATRIX |
+-------------------+--------------------+--------------------+---------------------+
| Qualification | Academic Level | Cost to Learner | Outcome |
+-------------------+--------------------+--------------------+---------------------+
| Level 3 Advanced | A-Level Equivalent | £0 (Levy Funded) | Certs + Work Exp |
| Level 4 Higher | Higher Nat. Dip. | £0 (Levy Funded) | Infrastructure/SRE |
| Level 6 Degree | Full BSc (Hons) | £0 (Levy Funded) | Debt-Free Degree |
| Level 7 Master's | Full MSc Degree | £0 (Levy Funded) | Senior Architecture |
+-------------------+--------------------+--------------------+---------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of sitting in a lecture hall analysing outdated textbook theories, a QA tech apprentice spends four days a week configuring enterprise infrastructure, automating CI/CD pipelines, managing Proxmox hypervisors or auditing CloudWatch logs. The fifth day is spent in instructor-led modules, building real-world projects alongside vendor certs from AWS, Microsoft, Cisco and CompTIA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Global Benchmarks: Swiss VET, German Dual Systems and US RAPs
&lt;/h2&gt;

&lt;p&gt;The UK earn-while-you-learn framework doesn't exist in isolation. As workforce research from &lt;a href="https://www.forbes.com/" rel="noopener noreferrer"&gt;Forbes&lt;/a&gt; demonstrates, tech apprenticeships are rapidly outperforming traditional degree-only screening for enterprise engineering roles.&lt;/p&gt;

&lt;p&gt;Germany and Switzerland have long set the global benchmark for vocational education through their dual-education systems: the &lt;a href="https://www.bmftr.bund.de/" rel="noopener noreferrer"&gt;&lt;em&gt;Duale Ausbildung&lt;/em&gt; managed by the German BMBF&lt;/a&gt; and the &lt;a href="https://www.sbfi.admin.ch/en/education" rel="noopener noreferrer"&gt;Swiss VET framework overseen by SERI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;According to official statistics from the &lt;a href="https://www.sbfi.admin.ch/" rel="noopener noreferrer"&gt;Swiss State Secretariat for Education, Research and Innovation (SERI)&lt;/a&gt;, over two-thirds of young people in Switzerland choose a vocational apprenticeship over a standard university track. Apprentices work inside companies like UBS and Swisscom as paid, valued team members. The model is so effective that the US Department of Labor signed bilateral agreements with Switzerland to adapt its employer-led framework.&lt;/p&gt;

&lt;p&gt;Across Asia, Australia, Southern Europe and South Asia, vocational technical frameworks are also expanding rapidly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Australia:&lt;/strong&gt; The &lt;a href="https://www.apprenticeships.gov.au/" rel="noopener noreferrer"&gt;Australian Apprenticeships Incentive System managed by DEWR&lt;/a&gt; and Vocational Education and Training in Schools (VETiS) integrate technical qualification modules directly into secondary school studies, pairing paid enterprise work with national certificates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;India:&lt;/strong&gt; The &lt;a href="https://www.msde.gov.in/" rel="noopener noreferrer"&gt;National Apprenticeship Promotion Scheme (NAPS) under MSDE&lt;/a&gt; provides direct government stipend support to employers hiring tech apprentices, driving massive digital skills uptake across India's technology sector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pakistan:&lt;/strong&gt; The &lt;a href="https://navttc.gov.pk/" rel="noopener noreferrer"&gt;National Vocational and Technical Training Commission (NAVTTC)&lt;/a&gt; runs national youth skill initiatives that connect young technicians directly with industrial and IT apprenticeships to boost employability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portugal:&lt;/strong&gt; Overseen by the &lt;a href="https://www.iefp.pt/" rel="noopener noreferrer"&gt;Instituto do Emprego e Formação Profissional (IEFP)&lt;/a&gt;, Portugal's &lt;em&gt;Cursos de Aprendizagem&lt;/em&gt; provide dual technical-academic qualifications with paid training stipends, forming a key pillar of Lisbon's growing European tech hub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Japan:&lt;/strong&gt; Japan's renowned &lt;a href="https://www.mext.go.jp/en/" rel="noopener noreferrer"&gt;KOSEN Colleges of Technology overseen by MEXT&lt;/a&gt; recruit 15-year-old students into 5-year intensive practical engineering programmes, producing highly sought-after practical technical graduates who power Japan's industrial and IT infrastructure.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
| GLOBAL VOCATIONAL TECH MODELS |
+-------------------+--------------------+--------------------+---------------------+
| Country | System Name | Primary Mechanism | Key Characteristic |
+-------------------+--------------------+--------------------+---------------------+
| United Kingdom | Apprenticeship Levy| 0.5% Employer Tax | Level 3-7 Degrees |
| Switzerland | Swiss VET System | Dual-Education | 65%+ Youth Choice |
| Germany | Duale Ausbildung | Company + School | National Standards |
| United States | DOL Registered Apps| Corporate RAPs | IBM New Collar etc. |
| Australia | Australian Apps | DEWR VETiS | School + Work Certs |
| India | NAPS (MSDE) | Stipend Support | Enterprise Scale |
| Pakistan | NAVTTC | Youth Skill Progs | National IT Training|
| Portugal | IEFP Aprendizagem | Dual Tech-Academic | Paid Tech Hub Track |
| Japan | KOSEN (MEXT) | 5-Yr Tech Colleges | Hands-on Engineers |
+-------------------+--------------------+--------------------+---------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Across the Atlantic, major US tech corporations launched &lt;a href="https://www.apprenticeship.gov/" rel="noopener noreferrer"&gt;Registered Apprenticeship Programs (RAPs) backed by the US Department of Labor&lt;/a&gt;. Programs like &lt;a href="https://www.ibm.com/careers/us-en/" rel="noopener noreferrer"&gt;IBM's New Collar Apprenticeship initiative&lt;/a&gt; recruit candidates based on technical aptitude rather than university branding. Non-profit intermediaries like &lt;a href="https://apprenticareers.org/" rel="noopener noreferrer"&gt;Apprenti Careers&lt;/a&gt; have expanded earn-while-you-learn models across US tech hubs, though US programs still lack the centralized tax driver of the UK Levy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-Directed Launchpads: Homelabs and Hackathons
&lt;/h2&gt;

&lt;p&gt;What if you haven't secured your first technical role or apprenticeship yet? How do you stand out when your CV lacks formal commercial experience?&lt;/p&gt;

&lt;p&gt;Let's be clear about something crucial here: formal commercial experience isn't a prerequisite to build or share niche technical knowledge.&lt;/p&gt;

&lt;p&gt;When I say "homelab", I don't mean you need the biggest, beefiest, most expensive enterprise rack in the world. You can spin up a Windows Server VM with just 2GB of RAM on an old spare desktop and get yourself started. You don't even need physical hardware in your living room: you can create a free account on Microsoft Azure, leverage a generous allocation of free monthly credits, and build real cloud infrastructure directly in the cloud.&lt;/p&gt;

&lt;p&gt;Sourcing hardware can feel tough when you're starting out, which is why an apprenticeship or vocational course gets you so much further by providing access to real kit. But if you show genuine engagement, engineers like myself and people who know far more than me will gladly hand down old decommissioned tech for you to play with. It's that raw passion and tenacity that sets you apart.&lt;/p&gt;

&lt;p&gt;The internet is packed with incredible free learning repositories if you know where to look. Read technical blogs where the conclusion isn't just &lt;em&gt;"If you found this interesting, come try our product!"&lt;/em&gt;, as that's a weird old marketing trick you will see plastered all over the web. If it's organic or they provide actual alternatives to their product that's usually a sign they are actually trying to help you learn and that the content's in good faith to start with.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/" rel="noopener noreferrer"&gt;Microsoft Learn&lt;/a&gt; is one of the absolute best free technical documentation hubs in existence. It can be boring as hell and dry to read at first, but when you are trying to convince a senior engineer or hiring manager that you understand a topic, citing official Microsoft Learn documentation or an authoritative technical forum post will shoot your credibility straight to the top.&lt;/p&gt;

&lt;p&gt;Similarly, outstanding educators like &lt;a href="https://www.youtube.com/@ntfaqguy" rel="noopener noreferrer"&gt;John Savill's Technical Training Channel&lt;/a&gt; offer masterclass-level education completely for free. His famous Azure Cram Session series gives you deep, structured, compressed technical learning without putting anything behind a paywall. He is successful for a reason: he shares immense value openly, and the comments section under his videos is pure gold for real-world engineering insights.&lt;/p&gt;

&lt;p&gt;Beyond documentation and YouTube, authentic learning resources pop up across community spaces every day. I recently came across a brilliant resource on Reddit that provides massive value for free, or just $10 a month, which feels like an absolute steal for what is delivered. Even over on LinkedIn, I've connected with an authentic creator whose approach is inspiring: they produce niche cybersecurity content, walking through existing learning platforms and demonstrating how to use them effectively. Lately, they have created what looks like a specialised learning platform that gamifies learning for one of the fundamental Microsoft exams, making dry documentation genuinely engaging.&lt;/p&gt;

&lt;p&gt;If you're really tenacious and have a spare £60 in the UK or $60 in the US for an exam voucher, having a recognised Microsoft fundamentals qualification under your belt gives you tangible proof of capability to show off to employers. The MS900 is pretty much a gimme for most people and the AZ900 will definitely take a bit of study but isn't out of your reach. They're awesome assets if you don't happen to take the apprenticeship or vocational route. Personally, I would stay well away from taking unpaid internships or grinding at a startup for peanuts: if you're that passionate and driven, just build the infrastructure yourself. At this time, AI will help you to build out anything you want and you shouldn't be afraid to adopt what will be a tool you'll likely use in the real world more than you may think: it's a great leveller and should allow you to punch above your weight in no time.&lt;/p&gt;

&lt;p&gt;Speaking of certifications, if you are looking for exam guidance early on, vendor-neutral options like &lt;a href="https://www.comptia.org/certifications/a" rel="noopener noreferrer"&gt;CompTIA A+&lt;/a&gt;, &lt;a href="https://www.comptia.org/certifications/network" rel="noopener noreferrer"&gt;CompTIA Network+&lt;/a&gt; or &lt;a href="https://www.comptia.org/certifications/security" rel="noopener noreferrer"&gt;CompTIA Security+&lt;/a&gt; are fantastic entry points. Starting with vendor-neutral certs gives you a broad foundational understanding without locking you into a single cloud or OS ecosystem, allowing you to specialise later while broadening the entry-level roles you qualify for right now.&lt;/p&gt;

&lt;p&gt;Summertime is the perfect opportunity to dive into this, whether you've just finished High School in the US or are preparing to start Sixth Form or College in the UK. Working a part-time job in fast food, retail or hospitality is actually the single best way to brace yourself for day-to-day IT support. It prepares you for the inevitable repetition and boredom that comes with entry-level ticketing, teaching you how to handle hearing the exact same question fifty times a day and how to hold your tongue when the same user submits the exact same ticket for the third time this week. Combine that service industry composure with self-taught homelab knowledge and bam! You've got the exact combination of soft skills and technical initiative that gets your foot firmly inside the door.&lt;/p&gt;

&lt;p&gt;When I started out, it took two months of searching (including a one-week stint in an Amazon Warehouse) before landing a public sector temp role that extended into a permanent job. During the pandemic, I worked remotely in a restricted Tier 1 banking role before taking a public-private compliance contract that gave me my first taste of cloud infrastructure and Second Line responsibilities.&lt;/p&gt;

&lt;p&gt;By the time I landed my first remote MSP role as an adult career switcher, it came down to a final choice between two candidates. The hiring manager explicitly told me my self-directed homelab was the exact tie-breaker that won me the job over the other applicant. Though advertised as First Line support, it functioned as a Tier 1/2 hybrid role (where I didn't set foot in the physical office until two months in). By that point, I was automating legacy billing systems, learning the dynamics between Sales and Pre-Sales and presenting as the technical resource scaling massive deployment and data projects. That's what unprompted building actually delivers: immediate operational credibility and respect from senior engineers on day one.&lt;/p&gt;

&lt;p&gt;Here's a quick, actionable tip if you're trying to break in right now: set up a clean LinkedIn profile early and learn how to conduct yourself professionally in the business world. Posting brief updates on what you're learning, homelabs you're spinning up or certs you're working toward builds documented social proof on the exact platform where recruiters, hiring managers and business owners are actively watching.&lt;/p&gt;

&lt;p&gt;Self-directed homelabbing, personal infrastructure projects and free community hackathons provide that exact proof of capability.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
| THE SELF-TAUGHT COMPETENCY LAUNCHPAD |
+-------------------+-----------------------------------+---------------------------+
| Hands-on Activity | Technical &amp;amp; Operational Skills | Resume &amp;amp; Interview Value |
+-------------------+-----------------------------------+---------------------------+
| Minecraft Server | Port forwarding, Java heap, Linux | User management, SLA/uptime|
| Homelab &amp;amp; Docker | Self-hosting, reverse proxies, DNS| Infrastructure ownership |
| Free Hackathons | Git, sprint scoping, teamwork | Project management &amp;amp; MVP |
+-------------------+-----------------------------------+---------------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hosting a Minecraft server on a spare desktop for your mates is an underrated system administration masterclass. You configure static IP assignments, port forwarding, Java heap allocations, Linux systemd services and automated backups. You deal directly with live users who ping you the moment latency spikes.&lt;/p&gt;

&lt;p&gt;Even better, learning basic scripting inside Minecraft gives you a massive head start on Object-Oriented Programming (OOP). Grasping core OOP concepts as early as you can (understanding objects, methods, parameters and event loops) will translate directly into basically any enterprise system down the road. It keeps you completely vendor-agnostic, building a universal engineering mindset long before you decide which specific cloud or tech stack to specialise in.&lt;/p&gt;

&lt;p&gt;Being vendor-agnostic is more critical right now than many entry-level engineers realise. While most MSPs and commercial IT firms have historically operated as strict Microsoft houses, there's a massive industry shift toward Linux happening under the hood. Driven by 2024 digital sovereignty directives like the &lt;a href="https://commission.europa.eu/index_en" rel="noopener noreferrer"&gt;European Union open-source and Linux infrastructure push&lt;/a&gt;, public sector bodies and enterprise teams are actively reducing single-vendor lock-in.&lt;/p&gt;

&lt;p&gt;A high-profile example unfolded in 2024 when retail giant Tesco announced its decision to migrate away from VMware across thousands of store edge environments, as highlighted by tech reporting from &lt;a href="https://www.theregister.com/virtualization/2026/06/17/tesco-is-sprinting-to-quit-vmware-and-broadcom-despite-rapid-migration-risks/5256133" rel="noopener noreferrer"&gt;The Register&lt;/a&gt;. Following Broadcom's VMware licensing overhauls, major enterprise networks and local IT providers are increasingly bypassing legacy Hyper-V and migrating hypervisor workloads straight to open-source, Linux-based platforms like &lt;a href="https://www.proxmox.com/en/proxmox-virtual-environment" rel="noopener noreferrer"&gt;Proxmox Virtual Environment (Proxmox VE)&lt;/a&gt;. If you master Linux fundamentals alongside Windows, you instantly position yourself ahead of candidates locked into a single ecosystem.&lt;/p&gt;

&lt;p&gt;Similarly, joining after-school clubs or local UK Maker communities gives you an incredibly welcoming space to experiment with a huge variety of hardware and tools. If you're still in secondary school, go speak to your IT teacher: teachers love to champion interested students and will gladly build you up. Back when I was in secondary school, our IT teacher actually let the Sixth Formers help run the school's tech department as system administrators. I remember being in absolute awe at how much real technical responsibility someone just a few years older than me was holding. That hands-on experience gave those Sixth Formers an almost instant foothold in real IT jobs when they left school, and many of them have gone on to achieve amazing things across the tech industry.&lt;/p&gt;

&lt;p&gt;What if you deal with social anxiety or simply don't have access to local in-person clubs? There are fantastic, welcoming spaces for you online. Joining Discord communities, technical forums, Reddit subreddits or platforms like Hacker News allows you to connect with like-minded individuals on the exact same wavelength. In these online spaces, your age, geographic location or financial situation won't stand in your way: more often than not, they're friendly, supportive environments where a passion for building and learning is all that matters.&lt;/p&gt;

&lt;p&gt;Taking part in free local hackathons or online open-source projects forces you to collaborate under real deadlines. You learn Git workflow hygiene, rapid project scoping and presenting a working MVP. Demonstrating tangible proof of work on GitHub will always trump passive course consumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience: Production Reality and Enterprise Gatekeeping
&lt;/h2&gt;

&lt;p&gt;When I was asked to mentor our first team apprentice seven months into my IT career, I quickly realised how much faster live production experience builds real capability compared to theoretical study.&lt;/p&gt;

&lt;p&gt;Having sat on the recruitment and interview side of the table for years since then, my perspective has evolved completely. Early in your career, it's easy to view corporate experience requirements as unfair "gatekeeping", but sitting on the interviewer side of the desk, you realise that demanding commercial experience isn't about shutting doors: it's just workplace reality.&lt;/p&gt;

&lt;p&gt;On the flip side, I have put candidates through who had no formal technical knowledge at all, but came from a service industry background or possessed intangible potential. Being polite, truly thankful, willing to listen and eager to ask questions will take you remarkably far. At Tier 1 level, remember that you're not being hired for expert technical knowledge: you're being hired for your raw potential, soft skills and overall workplace maturity.&lt;/p&gt;

&lt;p&gt;By all means, briefly mention that you work on your own self-directed projects in your spare time to show initiative, but don't try to over-flex advanced technical knowledge. Honestly, if you walk into a Tier 1 job interview spouting a string of enterprise buzzwords but freeze during the customer roleplay, you'll end up scuppering your chances completely. Trust is earned over time.&lt;/p&gt;

&lt;p&gt;In a live operational environment, Active Directory access is something you're typically trusted with after about six months of proven reliability in the role. Claiming in an entry-level interview that you can already perform advanced domain admin tasks can actually work against you more than it helps. It may help you out in the second stage technical part but it's not really the route you should take to succeed.&lt;/p&gt;

&lt;p&gt;Spinning up your own Windows Server instance in a homelab with 2GB of RAM and building an Active Directory domain is fantastic self-directed learning: that's the exact kind of initiative that helps elevate you from Tier 1 toward a solid Tier 2 technician. Just maybe keep it to yourself to start with.&lt;/p&gt;

&lt;p&gt;There may well come a point where you end up knowing more than your teacher or surprising your senior colleagues with your niche knowledge. But that happens when you're inside the role, not when you're knocking on the door.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
| ENTERPRISE GATEKEEPING &amp;amp; TIME-IN-GRADE REALITY |
+-------------------+-----------------------------------+---------------------------+
| Academic Myth | Fresh degree = Immediate access to| High salary, domain admin |
| | core enterprise infrastructure | rights on week one |
+-------------------+-----------------------------------+---------------------------+
| Enterprise | Mainframe &amp;amp; AD systems guarded by | Must build 3-4 years of |
| Operational | security vetting &amp;amp; senior trust; | proven trust &amp;amp; vetting |
| Reality | no day-one root access granted | before touching core systems|
+-------------------+-----------------------------------+---------------------------+
| Apprenticeship | Earn real wage while building | 3-4 years time-in-grade |
| Advantage | time-in-grade and security vetting| + zero debt + certs |
+-------------------+-----------------------------------+---------------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enterprise security runs on vetting, time-in-grade and earned trust. Access to core identity controllers or production infrastructure requires three to four years of proven workplace reliability.&lt;/p&gt;

&lt;p&gt;This is precisely why a Level 4 to Level 7 apprenticeship is so powerful. An apprentice builds 3-4 years of actual commercial experience, workplace maturity and consistent delivery on live systems while earning a competitive salary, giving hiring managers the exact proof they look for on the recruitment side of the table, without taking on student loan debt or complaining about gatekeeping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling Out Fully Paywalled Platforms and Parasocial Hype
&lt;/h2&gt;

&lt;p&gt;Please don't misunderstand my critique here. Calling out restrictive paywalls isn't a hit piece: the internet was built on freedom of information.&lt;/p&gt;

&lt;p&gt;In facr, everyone has to start somewhere and you don't need decades of corporate credentials to share useful technical knowledge. There's a world of difference between legitimate educators who put out loads of real, high-value, long-form content for free (where a paid platform is just the logical, optional next step for extra structure on a specialised topic) and creators who lock every single scrap of basic info behind a paywall from day one.&lt;/p&gt;

&lt;p&gt;The problem starts when unaccredited middle-men charge thousands or hundreds upfront or push monthly recurring revenue (MRR) subscriptions while claiming "you don't need a degree or experience."&lt;/p&gt;

&lt;p&gt;Even over here in the UK, certain "pay-for-experience" schemes operate by charging thousands of pounds to eager job seekers in exchange for promised commercial placements. During my initial tech search, I almost fell foul of one of these expensive schemes myself when trying to get my foot in the door.&lt;/p&gt;

&lt;p&gt;This isn't just one or two bad apples: this is a systemic issue that affects people across all industries. Whether someone's trying to break into the tech industry, find a job in finance, get hired in healthcare or launch a career in a trade, the problem of underpayment, non-payment or paying for your own entry-level experience is pervasive. It's been going on for decades, but it's become especially prominent in the tech industry in recent years. It recently even extended into Content Creation sphere with the Kai Streamer University debacle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+-----------------------------------------------------------------------------------+
| ACCREDITED PATHWAYS vs UNACCREDITED PAYWALLS |
+-------------------+-----------------------------------+---------------------------+
| Feature | Accredited Apprenticeship Pathways| Fully Paywalled Bootcamps |
+-------------------+-----------------------------------+---------------------------+
| Cost to Candidate | £0 (Employer Levy Funded) | £50-£300/mo or £5k Upfront|
| Credentials | Government &amp;amp; University Accredited| Unrecognised Digital Badge|
| Work Experience | Live Production Infrastructure | Isolated Sandbox Exercises|
| Industry Trust | Recognised by Senior Engineers | Tolerate in Squeezes Only |
+-------------------+-----------------------------------+---------------------------+

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It becomes especially hard for job seekers to think critically when creators mix personal hardship or sob stories into a parasocial relationship, making followers feel almost indebted to buy their products just to enrich them.&lt;/p&gt;

&lt;p&gt;When recurring revenue dries up, pay attention to how these platforms pivot toward one-off lifetime licences. They'll use formulaic flex posts like &lt;em&gt;"I built X by age 22 without a degree or experience"&lt;/em&gt; to manufacture an artificial villain to rally against. If the villain is Education then frankly that's a bad start. If you're having trouble landing a role without a degree or experience, it usually means you need to refine your interview technique, adjust your overall approach or you're simply having a run of bad luck in a tight market. The current social media trend of weaponising survivorship bias to prove you're an expert at something because you happened to get hired isn't helpful to real job seekers. When real engineers ask hard technical questions, executive fragility kicks in. If they have angry social media videos made to get their audience to attack people, stir the pot, call people "copycats" or send empty legal threats to silence criticism or scare people into submission, then you know there's something up. That's not how business in good faith works and in the UK incitement to harrass or violence is a legally recognisable crime.&lt;/p&gt;

&lt;p&gt;Try a quick experiment yourself at home (or sneakily at work if you get a spare minute). Prompt any modern LLM with this query:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"I'm thinking of running an educational SaaS product with a large online following. Give me a roadmap on how to monetise my audience and batch produce viral content"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hit enter and you'll see their exact strategic playbook handed to you in seconds. If you want a good laugh, try asking the LLM to present the response in the style of a specific tech influencer you know and you might be surprised at how accurate it is.&lt;/p&gt;

&lt;p&gt;Where it gets problematic is convincing eager candidates that an unaccredited course guarantees a job, while quietly pocketing their fees. Focus on genuine skill building, support transparent creators and hold training providers accountable when they sell unrealistic promises. If it leads to you preparing for a real interview, being able to point to tangible projects on GitHub, getting comfortable with technical systems, building your professional network and learning real, transferable skills - then you're onto a winner. That's what truly matters in the long run. Putting a gamified leaderboard placing on your LinkedIn will get you laughed at before it gets you hired.&lt;/p&gt;

&lt;p&gt;I'm not hating on them or trying to steer you away from these platforms. I'm just saying, make you remember that critical thinking is paramount in the tech industry and you want the best chance to succeed in actual reality not future faking fiction. Don't let them make you their financial product. As I've mentioned the market is flooded with candidates right now so to stand out you need to come back down to Earth where most of us live.&lt;/p&gt;

&lt;p&gt;I thought I'd mention this only as I see more and more of these popping up and it's disconcerting to see how many exist now and the weird marketing paths they take. I also mention this as having personal experience almost duped in real life by similar situations which has been echoed to me by other professionals almost as a rite of passage. It's truly troubling to see this now happening on the internet too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reclaiming the Dignity of Vocational Tech Pathways
&lt;/h2&gt;

&lt;p&gt;At the end of the day, there are many valid routes into technology. The rigid idea that you must hold a university degree or years of prior commercial experience is a really myopic viewpoint in a massively nuanced conversation.&lt;/p&gt;

&lt;p&gt;Unfortunately, that myth tends to be parroted most loudly by people living in small towns with sparse local tech markets and limited regional opportunities. That isn't said to minimise anyone's personal experience or geographic struggles, as local job markets can be genuinely tough. However, turning that frustration into a core personality trait and insisting to new learners that breaking in is impossible without a degree is pretty dangerous. It creates self-fulfilling defeatism when there are actionable routes open right now.&lt;/p&gt;

&lt;p&gt;I know I'm making a strawman argument here and painting probably a lot of truly honest, trustworthy and helpful people in a bad light but it's an important distinction to make. Apologies to anyone I've offended with this analogy and this wasn't meant to attack just get a point across. This just seems to be me saying the quiet part out loud as this becomes more common place.&lt;/p&gt;

&lt;p&gt;Here in the UK as it's the start of the summer holidays a lot of people may fall victim to this and I wanted to make sure that those with no money at all can get a fair chance at the massive opportunities that are available right now. Make an informed decision as best you can for the kind of role you're after and the kind of path you want to go down. You'll know it when you see it and trust your gut.&lt;/p&gt;

&lt;p&gt;You'll be able to make the right decision for you, if you take the time to do your research and think critically about what you're doing. If it feels like you're funding someone elses dream rather than your own, then maybe take a second to think about whether that's the right path for you into employment.&lt;/p&gt;

&lt;p&gt;Your journey is your own journey and everyone's path is completely different. As the new PM says, for far too long people have been told there is only one route to success but that's balderdash.&lt;/p&gt;

&lt;p&gt;Get whatever you can for free online from legitimate documentation, YouTube series from people who care and community hubs. Grab real-world face time and phone time with customers in retail or service roles, building soft skills that simply cannot be replicated anywhere else. Take full advantage of structured pathways like the upcoming UK Digital Literacy schemes and employer-funded Level 3 to Level 7 Degree Apprenticeships if you're a little older to get your foot in the door and your bum on the seat.&lt;/p&gt;

&lt;p&gt;You earn a wage. You get your certifications paid for. You live without the looming shadow of unpayable debt. Most importantly, you build real skills on live infrastructure from day one with people who want you to succeed. Of course your mileage may vary and it's all just a crap shoot.&lt;/p&gt;

&lt;p&gt;Calling out unreliable shortcuts isn't about pulling up the ladder behind us: it's about pointing candidates toward genuine, proven routes that will work forever for new entrants into the industry. It isn't experience that stops you getting in. It's hubris and not having the job seeking experience you get from just getting rejected over and over again. It's not about suffering as the market is harder than ever to get into and that's just a fact. It's never easy getting a job, so be prepared to be rejected many times before landing your dream role, but never give up hope and keep pushing forward.&lt;/p&gt;

&lt;p&gt;Now, if anyone reading this is tempted to say &lt;em&gt;"hey old man, stop shouting at clouds, that hiring experience was years ago"&lt;/em&gt;, let me stop you right there. This isn't ancient history from a bygone era: it's happening right now in live recruitment calls and real workplace interviews taking place today.&lt;/p&gt;

&lt;p&gt;I'm not sharing this for some kind of social media flex or to pose as an untouchable authority on hiring, but having actually recruited candidates just like the people reading this gives me a grounded, practical insight. It wouldn't matter if I had one month or six years in that role. It's not about experience. It's about having filtered through CVs personally, set up and designed the practical roleplays and interview structures that hired successful candidates. This isn't an experience flex. It's just real-world context that I'm sure many reading this in similar positions to me will resonate with.&lt;/p&gt;

&lt;p&gt;I welcome thoughtful, real discussion over this from whichever platform you happened to find this on. A quick shout-out and genuine thank you to the folks over at &lt;a href="https://hackernoon.com/u/reprodev" rel="noopener noreferrer"&gt;HackerNoon&lt;/a&gt; as well as the community on &lt;a href="https://news.ycombinator.com/" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/SysAdminBlogs/" rel="noopener noreferrer"&gt;&lt;code&gt;/r/SysAdminBlogs&lt;/code&gt;&lt;/a&gt; for giving us all the platform to have these open discussions in public. You'll probably find me down in the comments under the handle &lt;code&gt;reprodev&lt;/code&gt; as I always enjoy a good chinwag and a change to have my viewpoint challenged. Feel free to share what you truly think, or reach out directly via the contact section on the site.&lt;/p&gt;

&lt;p&gt;See you next week for another Thursday Thinkpiece&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;

</description>
      <category>thursdaythinkpiece</category>
      <category>technicalapprentices</category>
      <category>breakintotech</category>
      <category>ukapprenticeshiplevy</category>
    </item>
    <item>
      <title>The Corporate Creep of Plex: Why It May Be Time to Move to Jellyfin (And the Open-Source Reality)</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Fri, 24 Jul 2026 08:48:13 +0000</pubDate>
      <link>https://dev.to/reprodev/the-corporate-creep-of-plex-why-it-may-be-time-to-move-to-jellyfin-and-the-open-source-reality-2ncj</link>
      <guid>https://dev.to/reprodev/the-corporate-creep-of-plex-why-it-may-be-time-to-move-to-jellyfin-and-the-open-source-reality-2ncj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Starting this week we're beginning a new series I'd like to call the &lt;strong&gt;Thursday Thinkpiece&lt;/strong&gt;. Some things that have been noodling around in my brain for some time with some of it fit to print.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For over a decade, &lt;a href="https://www.plex.tv/" rel="noopener noreferrer"&gt;Plex&lt;/a&gt; was the main gateway into home media servers for tech enthusiasts, DIYers, and homelabbers alike. If you're unfamiliar with it, think of Plex as your own private, self-hosted Netflix or Spotify. You don't need an expensive server rack or a dedicated lab to run it: you can easily install the server software on an old spare laptop, an unused desktop PC, a simple NAS, or even an external hard drive plugged into a Raspberry Pi holding your personal movie, TV show, and music files. Plex then automatically organizes your libraries, pulls in poster artwork and movie details, and streams your content seamlessly across a huge range of devices. Whether on LG webOS, Samsung Tizen, Apple TV, Roku, Fire TV, iOS, Android, or game consoles, Plex made it insanely easy for anyone in the house to log in and watch or listen to their content instantly.&lt;/p&gt;

&lt;p&gt;My own media streaming journey actually started way back in &lt;strong&gt;late 2002 / 2003&lt;/strong&gt; with the early days of &lt;strong&gt;XBMC (Xbox Media Center)&lt;/strong&gt; running on the original modded Xbox console. Back then, managing a home media center meant spending endless hours manually scraping artwork, tweaking NFO files, and messing around with XML settings. But as life got busier, I simply didn't have the time to go deep into the metadata side of things anymore. That's when I switched to Plex, because it &lt;em&gt;just worked&lt;/em&gt; straight out of the box without a lot of messing around.&lt;/p&gt;

&lt;p&gt;Having relied on Plex for years after making that transition from XBMC, I bought a &lt;strong&gt;Lifetime Plex Pass&lt;/strong&gt; for &lt;strong&gt;$74.99 USD (~£54 GBP)&lt;/strong&gt; during a sale in &lt;strong&gt;February 2021&lt;/strong&gt;, right in the middle of the pandemic lockdowns. Being stuck at home meant spending a lot more time refining my at-home services, and that era became the turning point where I truly threw myself into self-hosting and expanded my setup. Buying the lifetime pass felt right: it was a way of giving back to a project that kept my household entertainment running smoothly after years of free use, while also unlocking Plex Pass features like hardware-accelerated GPU transcoding, mobile sync, and intro skipping.&lt;/p&gt;

&lt;p&gt;But over the last few years, the atmosphere surrounding Plex has shifted. The software has experienced a slow shift toward &lt;strong&gt;corporate creep&lt;/strong&gt; (or "enshittification"), where a company slowly prioritizes corporate deals and advertising over its original core users. &lt;/p&gt;

&lt;p&gt;As a long-time self-hoster who values complete control over my hardware and setup, watching this change has been an eye-opening lesson in tech ownership. It shows why it may be time to move to &lt;strong&gt;Jellyfin&lt;/strong&gt; for true system freedom, while also examining the open-source reality of what it takes to support community alternatives long-term.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. From Personal Server to Ad-Supported Distributor
&lt;/h2&gt;

&lt;p&gt;Plex’s core business model has pivoted. Originally, they sold server software via the Plex Pass. Today, Plex’s main focus is becoming a centralized, ad-supported free streaming service (competing with PlutoTV or Tubi) backed by major studio licensing deals.&lt;/p&gt;

&lt;p&gt;To be fair, sponsored content and Free Ad-supported Streaming TV (FAST) channels are great for casual viewers who don't host their own media. Having free movies and live channels available out-of-the-box adds genuine convenience for millions of users. However, these commercial content deals have subtly shifted Plex's focus away from its original mission: serving your own personal media seamlessly.&lt;/p&gt;

&lt;p&gt;Open the default Plex app on a new device today, and your personal server’s libraries are buried. Instead, the home screen's populated by Plex’s own free ad-supported movies, sponsored TV channels, and commercial rows. While you can hide these in the settings, the fact that a self-hosted server defaults to pushing external ad-supported media shows where Plex’s engineering priorities and corporate revenue now lie.&lt;/p&gt;

&lt;h3&gt;
  
  
  Studio Pressure &amp;amp; Corporate Alignment: Crackdowns and Remote Watch Passes
&lt;/h3&gt;

&lt;p&gt;As Plex partnered with major Hollywood studios to license free streaming content, corporate pressure mounted to clean up its platform and align with commercial streaming standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Commercial Host Crackdown:&lt;/strong&gt; Plex began aggressively targeting accounts selling access to commercial Plex servers. This escalated into blanket bans on major cloud hosting providers (like banning entire Hetzner and OVH server IP ranges) and purging accounts tied to paid library sharing. While stopping illegal server sales makes sense legally, banning entire data center IP ranges also hurt regular homelabbers who simply hosted their own private servers off-site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscription Gating &amp;amp; Remote Watch Passes:&lt;/strong&gt; To satisfy content partners and monetize out-of-home viewers, Plex introduced new subscription friction like &lt;strong&gt;Remote Watch Passes&lt;/strong&gt; (requiring remote viewers or server owners to pay for out-of-home playback) while tightening how Lifetime Plex Pass benefits apply across shared accounts. What was once seamless, open sharing among family has increasingly been restructured into gated corporate tiers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. The Centralized Authentication Trap
&lt;/h2&gt;

&lt;p&gt;From a system control standpoint, Plex has a single point of failure that breaks the fundamental promise of owning your server: &lt;strong&gt;Centralized Authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you log in to your Plex server, you don't authenticate locally against your host database. Instead, your app redirects to &lt;code&gt;Plex.tv&lt;/code&gt; to log in via their central servers, which then sends a key back to unlock access to your local hardware.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Outage Risk:&lt;/strong&gt; Recurring authentication outages tracked on &lt;a href="https://status.plex.tv/" rel="noopener noreferrer"&gt;Status.Plex.tv&lt;/a&gt;, as well as major incidents covered by high-authority tech publications like &lt;a href="https://www.bleepingcomputer.com/news/security/plex-notifies-users-of-a-data-breach-demands-password-reset/" rel="noopener noreferrer"&gt;BleepingComputer&lt;/a&gt; and &lt;a href="https://www.howtogeek.com/791851/why-plex-should-work-offline-and-how-to-fix-it/" rel="noopener noreferrer"&gt;How-To Geek&lt;/a&gt;, have showed just how risky this setup is. When Plex's cloud infrastructure experiences downtime or DNS disruptions, thousands of users worldwide (including paying Plex Pass subscribers) find themselves locked out of their own local servers sitting right in their living rooms, unable to stream local files unless they've already set up offline network settings in advance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Data Collection Concern:&lt;/strong&gt; Every time a user opens your Plex app, they're talking to Plex's central servers. Plex collects data on when you watch, what device you stream on, and what items exist in your watchlists.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compare this to &lt;strong&gt;Jellyfin&lt;/strong&gt;: authentication's 100% local. Your Jellyfin server is an independent, self-contained unit. If the internet connection drops or central servers fail, your local login and local streaming remain completely unaffected. You're retaining total freedom over your own hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Scope Creep and Feature Churn: Improved Downloads vs. Deprecated Features
&lt;/h2&gt;

&lt;p&gt;Plex's feature development roadmap has been a mixed bag of great technical fixes alongside frustrating feature removals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Good: Mobile Downloads Finally Work:&lt;/strong&gt; To Plex's credit, core features like &lt;strong&gt;Mobile Downloads (Sync)&lt;/strong&gt;, which were notoriously buggy and unreliable for years, have recently seen dedicated engineering focus and now work vastly better and more reliably across iOS and Android devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Bad: Deprecated Features Like Watch Together:&lt;/strong&gt; Conversely, users frequently face the frustration of beloved features being pulled out from under them. Features like &lt;strong&gt;Watch Together&lt;/strong&gt;, which became an essential lifeline during the pandemic for synchronized remote viewing with friends and family, have been phased out or removed, leaving long-time users disappointed when tools they relied on disappear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social Additions:&lt;/strong&gt; Meanwhile, features like &lt;strong&gt;Plex Discover&lt;/strong&gt; (which directs users to commercial streaming services) and &lt;strong&gt;Social Activity Feeds&lt;/strong&gt; pull engineering attention toward engagement metrics and data collection, further drifting away from the core mission of managing personal local media.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The Open-Source Response: Why Jellyfin Wins (And My Recommendation for Newcomers)
&lt;/h2&gt;

&lt;p&gt;This corporate shift is exactly why &lt;a href="https://jellyfin.org/" rel="noopener noreferrer"&gt;Jellyfin&lt;/a&gt; (forked from Emby when Emby went closed-source in 2018) won the hearts of the homelab community.&lt;/p&gt;

&lt;p&gt;I've spun up Jellyfin in my own homelab alongside Plex to test its performance, client apps, and local reliability. Jellyfin is built on a simple, refreshing premise: &lt;strong&gt;It's your server, your media, and your data.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No Central Account:&lt;/strong&gt; You don't register an account with a central server. User accounts are created locally on your hardware.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zero Tracking:&lt;/strong&gt; There aren't any corporate tracking metrics, ad rows, or forced discoverability features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Free Native Hardware Transcoding:&lt;/strong&gt; Premium features that Plex charges for (like GPU hardware transcoding for smooth playback) are completely free in Jellyfin.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Client Ecosystem Trade-Off: Corporate Standard vs. Scattered Community Apps
&lt;/h3&gt;

&lt;p&gt;A realistic comparison between the two platforms also comes down to client availability and app stability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Plex's Unbeatable Reach:&lt;/strong&gt; Because Plex operates as a commercial company with dedicated app development teams, they maintain rock-solid native apps across virtually every Smart TV app store worldwide (LG webOS, Samsung Tizen, Apple TV, Roku, Fire TV, PlayStation, Xbox). Non-technical family members can download the app and start watching instantly without tinkering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jellyfin's Scattered Client Reality:&lt;/strong&gt; Jellyfin has client apps (such as Android TV, Swiftfin for iOS/Apple TV, Roku, and web interfaces), but because there isn't a single company managing them, client development is split across separate volunteer projects. As a result, apps aren't always rock-solid or feature-complete on every screen. A video file that plays smoothly on Android TV might crash on a Smart TV app wrapper, and native apps aren't always easily available on older TV app stores.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;My Advice for Newcomers:&lt;/strong&gt; If you're getting into self-hosting today and building your first home server, &lt;strong&gt;I strongly suggest starting with &lt;a href="https://jellyfin.org/" rel="noopener noreferrer"&gt;Jellyfin&lt;/a&gt;&lt;/strong&gt;. You avoid corporate bloat, mandatory cloud logins, and paywalled features right out of the box; just keep in mind which TV devices your household uses.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Open-Source Reality Check: Burnout, Governance, and the July 2026 Leadership Shakeup
&lt;/h2&gt;

&lt;p&gt;While Jellyfin represents the gold standard for true system control and personal freedom, open source isn't immune to crises of its own.&lt;/p&gt;

&lt;p&gt;In July 2026, the Jellyfin project experienced a massive leadership transition when several core maintainers, including Project Leader &lt;strong&gt;Joshua Boniface&lt;/strong&gt;, Core Team Member &lt;strong&gt;Anthony Lavado&lt;/strong&gt;, and Co-founder &lt;strong&gt;Andrew Rabert&lt;/strong&gt;, announced their departures within days of each other. &lt;/p&gt;

&lt;p&gt;This high-profile exit highlighted a growing challenge across open-source software:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Maintainer Burnout:&lt;/strong&gt; Supporting millions of users as an unpaid side project takes a heavy mental toll. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unrealistic Expectations:&lt;/strong&gt; As homelab setups grow in popularity, volunteer developers increasingly face demanding end-user expectations, with users expecting unpaid volunteers to act like 24/7 paid support teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The AI-Generated PR Deluge:&lt;/strong&gt; Modern maintainers face a flood of low-quality, AI-generated code submissions that clutter issue trackers, forcing maintainers to spend hours auditing unverified code instead of building features.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This news is an important reality check for homelabbers. When proprietary platforms like Plex restrict system freedom, we turn to open-source alternatives. But open source only survives if the community actively supports it.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Early Adopter Reality: Why I Still Use Plex (And Why I Run Jellyfin in Parallel)
&lt;/h2&gt;

&lt;p&gt;Looking at both sides of the coin reveals an important truth: self-hosting isn't an all-or-nothing choice. &lt;/p&gt;

&lt;p&gt;As an early adopter who built my setup around Plex over nearly a decade, &lt;strong&gt;I still use Plex every single day&lt;/strong&gt;. For an existing setup that's running smoothly, the classic homelab rule applies: &lt;strong&gt;if it ain't broke, don't fix it&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;I've set up Jellyfin myself alongside Plex in my homelab, and I run both servers in parallel. I follow Jellyfin's development closely, and one day, when the client app ecosystem and project maturity reach the right point, I may very well flick the switch and migrate 100%. But full migration isn't for me just yet; Plex remains my primary daily driver.&lt;/p&gt;

&lt;p&gt;This sentiment shift isn't unique to my homelab either. Even &lt;strong&gt;Linus Sebastian from Linus Tech Tips (LTT)&lt;/strong&gt;, historically one of Plex's biggest supporters online, slowly started complaining more about Plex's trajectory. On &lt;em&gt;The WAN Show&lt;/em&gt; and LTT videos, Linus voiced growing frustration over cloud authentication lockouts, corporate pivots, and software bloat. Eventually, Linus Tech Tips went on to produce dedicated video content showcasing open-source alternatives like &lt;strong&gt;Jellyfin&lt;/strong&gt;, showing how widespread the desire for self-hosted alternatives has become across tech culture.&lt;/p&gt;

&lt;p&gt;When I bought my Lifetime Plex Pass back in February 2021 for &lt;strong&gt;$74.99 (~£54 GBP)&lt;/strong&gt;, the math made complete sense. Over the last 5.5 years (roughly 66 months of continuous daily use), that initial purchase works out to just &lt;strong&gt;~£9.80 per year&lt;/strong&gt; (or roughly &lt;strong&gt;82p / $1.13 per month&lt;/strong&gt;). &lt;/p&gt;

&lt;p&gt;And chief among the tools justifying that purchase is &lt;strong&gt;Plexamp&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Plexamp is an absolute masterpiece of audio engineering. By self-hosting my music collection and streaming it via Plexamp, whether listening on mobile devices, home audio systems, or in the car via Android Auto and Apple CarPlay, &lt;strong&gt;I was able to completely stop paying for monthly subscriptions to Spotify and Amazon Music&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;At ~£10.99/month ($11.99/month) for a commercial music streaming subscription, Plexamp paid for my Lifetime Pass within five months. Over 5.5 years, it's saved me well over &lt;strong&gt;£700 ($900)&lt;/strong&gt; in recurring music streaming bills.&lt;/p&gt;

&lt;p&gt;To Plex's credit, they've been remarkably good at adding value to the Lifetime Pass over the years, rolling out tools like Plexamp, intro skipping, hardware transcoding, and mobile downloads without asking early pass holders for another penny. Even if Plex eventually alters its terms down the road, I've undoubtedly gotten my money's worth out of that $75 purchase, and many other long-time users feel the exact same way.&lt;/p&gt;

&lt;p&gt;But it raises a bigger question for the tech industry: &lt;strong&gt;Is a one-time lifetime license model actually sustainable long-term?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;History shows how rare it is for tech companies to honor lifetime promises forever as cloud infrastructure costs and investor pressures grow. Major tech media coverage highlights how lifetime deals have been altered or revoked across the industry before:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TiVo:&lt;/strong&gt; Sold popular "Lifetime Service" passes for DVRs, but as reported by &lt;a href="https://www.theverge.com/2020/1/9/21058097/tivo-edge-lifetime-service-subscription-transfer-discount" rel="noopener noreferrer"&gt;The Verge&lt;/a&gt;, TiVo eventually phased out hardware lines, shut down guide data servers, and left legacy devices non-functional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SiriusXM:&lt;/strong&gt; Sold $500 "Lifetime" satellite radio subscriptions, but restricted device transfers and added hidden fees, resulting in a major nationwide class-action lawsuit detailed by &lt;a href="https://www.courthousenews.com/siriusxm-subscribers-clinch-class-action-settlement/" rel="noopener noreferrer"&gt;Courthouse News&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LogMeIn:&lt;/strong&gt; Famously eliminated its popular "free for life" remote access tier with just seven days' notice to force users onto paid plans, as covered by &lt;a href="https://techcrunch.com/2014/01/21/logmein-drops-its-free-remote-desktop-app-giving-users-seven-days-to-upgrade-to-a-paid-account/" rel="noopener noreferrer"&gt;TechCrunch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evernote &amp;amp; Malwarebytes:&lt;/strong&gt; Malwarebytes grandfathered early lifetime keys before shifting strictly to annual plans, while Evernote stripped features out of legacy accounts to push users into new paid tiers, as reported by &lt;a href="https://www.theverge.com/2023/11/29/23981446/evernote-free-plan-note-notebook-limits" rel="noopener noreferrer"&gt;The Verge&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The MRR Trap: Can Chasing Subscriptions Go On Forever?
&lt;/h3&gt;

&lt;p&gt;In today's software landscape, both solo developers and massive tech corporations are hyper-focused on securing &lt;strong&gt;Monthly Recurring Revenue (MRR)&lt;/strong&gt;. To chase predictable recurring cash flow, companies increasingly rely on sneaky tactics: locking existing local features behind paywalls, adding unexpected subscription gates, and quietly changing terms of service to turn one-time buyers into permanent renters.&lt;/p&gt;

&lt;p&gt;It raises a critical question for both creators and consumers: &lt;strong&gt;Can this endless pursuit of MRR through sneaky tactics really go on forever?&lt;/strong&gt; When software transitions from serving users to extracting monthly rent for hardware sitting in your own living room, it creates a deep trust deficit that drives users straight to open-source alternatives.&lt;/p&gt;

&lt;p&gt;When a company realizes one-time lifetime payments can't fund perpetual development and server hosting, they inevitably pivot toward ad networks, locked feature tiers, or price hikes, which is precisely what we're watching unfold with Plex today.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem Today: Huge Price Increases &amp;amp; Eroding Value
&lt;/h3&gt;

&lt;p&gt;However, what made financial sense in 2021 looks completely unrecognizable today. Historically, prospective homelabbers knew they could rely on Plex's regular annual sales events, such as Black Friday, Cyber Monday, February anniversary sales, Pro Days, or targeted email promo codes offering lifetime passes for $75 to $90. For years, standard community advice for newcomers was simple: &lt;em&gt;"Just hold off and wait for the Black Friday sale."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Many users held off for months or years expecting those familiar discounts to return. But people were caught completely off-guard when Plex silently ended those sales events and instead hit the community with massive price hikes, covered across major tech media outlets like &lt;a href="https://appleinsider.com/articles/26/07/01/plex-pass-lifetime-subscription-skyrockets-to-749" rel="noopener noreferrer"&gt;AppleInsider&lt;/a&gt; and official &lt;a href="https://support.plex.tv/articles/201844396-what-is-plex-pass/" rel="noopener noreferrer"&gt;Plex Pass documentation&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Lifetime Pass:&lt;/strong&gt; Historically $119.99 USD (and $75–$90 during sales), Plex first increased it to $249.99, before skyrocketing the &lt;strong&gt;Lifetime Plex Pass to an eye-watering $749.99 USD (~£595+ GBP)&lt;/strong&gt; in July 2026.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New 5-Year Tier:&lt;/strong&gt; Alongside the $750 lifetime price tag, Plex introduced a &lt;strong&gt;5-Year Pass at $249.99 USD&lt;/strong&gt;, effectively shifting what was once a true lifetime purchase into an expensive multi-year subscription cycle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Monthly Alternative:&lt;/strong&gt; Granted, you don't have to pay $750 up-front, as Plex still offers a monthly subscription at &lt;strong&gt;$6.99 / £6.99 per month&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But that brings us to a fundamental question for self-hosters: &lt;strong&gt;Should you really have to pay a recurring monthly rent to a third-party company just to access and unlock features (like GPU hardware transcoding) on hardware you bought and own in your own home?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Asking a new user to pay &lt;strong&gt;$750 up-front&lt;/strong&gt; (or shell out $6.99 every single month indefinitely) for software that increasingly buries your personal media below ad-supported FAST channels, pushes commercial studio content, and locks your local server out during cloud authentication outages feels really hard to justify. When Jellyfin provides native GPU hardware transcoding, local multi-user auth, and full media streaming for &lt;strong&gt;$0&lt;/strong&gt;, the reason to buy into Plex today just isn't there anymore for anyone starting fresh.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pragmatic Verdict: Complete System Freedom &amp;amp; Active Stewardship
&lt;/h2&gt;

&lt;p&gt;The debate between Plex and Jellyfin isn't about rigid tech dogma; it's about practical utility and freedom. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;If you're starting out today:&lt;/strong&gt; Go with &lt;a href="https://jellyfin.org/" rel="noopener noreferrer"&gt;Jellyfin&lt;/a&gt;. It gives you total control over your hardware without cloud gatekeeping or corporate ad clutter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you're a long-time Plex Pass user:&lt;/strong&gt; There's zero shame in keeping Plex as your daily driver while running Jellyfin alongside it in your homelab. Running both in parallel lets you enjoy tools like &lt;strong&gt;Plexamp&lt;/strong&gt; today while positioning your infrastructure to flick the switch over completely when Jellyfin reaches full client maturity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, we can't treat open-source projects as "free enterprise software." If we want alternatives like Jellyfin to thrive alongside commercial tools, tech enthusiasts, DIYers, and homelabbers must actively contribute back, whether through financial sponsorship, documentation improvements, code reviews, or setting healthy community boundaries. If you enjoy using Jellyfin or want to help the maintainers out, consider &lt;a href="https://jellyfin.org/docs/general/contributing/direct-donations/" rel="noopener noreferrer"&gt;donating to the Jellyfin project&lt;/a&gt; to help support ongoing development and infrastructure.&lt;/p&gt;

&lt;p&gt;At the end of the day, I really like Plex, and to be clear, Plex isn't evil. They're walking a tough corporate tightrope, trying to serve millions of different users while remaining as legally compliant as possible with major Hollywood studios and copyright regulations. Managing a commercial business at that scale is no easy feat, and Plex may very well surprise us all down the road as they continue evolving. &lt;/p&gt;

&lt;p&gt;I've used Plex for a decade, and I'll continue using it as my primary daily driver alongside Jellyfin. But open-source projects like Jellyfin still deserve their flowers. Having a robust, community-driven alternative is vital for healthy competition overall: it keeps commercial platforms honest, prevents total vendor lock-in, and guarantees that homelabbers always have a path to complete system freedom. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Having both options running in your homelab is the ultimate win, and it's up to us to support the open-source community that makes it possible.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list over at &lt;a href="https://reprodev.com" rel="noopener noreferrer"&gt;reprodev.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Capo2Keys : A Tool for Converting Guitar Chord Charts for Piano</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Thu, 19 Feb 2026 16:21:11 +0000</pubDate>
      <link>https://dev.to/reprodev/capo2keys-a-tool-for-converting-guitar-chord-charts-for-piano-1ac1</link>
      <guid>https://dev.to/reprodev/capo2keys-a-tool-for-converting-guitar-chord-charts-for-piano-1ac1</guid>
      <description>&lt;p&gt;Well hello, it's been a hot minute since I've last posted on this blog but so much has gone on since my last post about Docker almost 2 years ago. I've not had as much free time but I've been busy working on a bunch of new articles and coding ideas.&lt;/p&gt;

&lt;p&gt;Plus thanks to the almost daily advances of AI, it's meant that I can now tackle projects in a much more efficient and productive way. &lt;br&gt;
With that out of the way, here's a little something I vibe-coded while I was procrastinating over something else and wanted to see how AI would stack up as a coding partner.&lt;/p&gt;

&lt;p&gt;I took up learning the piano towards the end of 2024 but have played guitar for much longer than that. I loved being able to pick up the guitar with a capo and play songs from Chord sheets on the internet. The main problem being that my music theory was not good enough to be able to easily transpose these to Piano especially when those chord sheets have lyrics.&lt;/p&gt;

&lt;p&gt;I was able to get ChatGPT to transpose a lot of these by copying and pasting in the content that it converted and I would then convert these to a PDF manually. It was a tedious process that worked quite well until it didn't anymore.&lt;/p&gt;

&lt;p&gt;As we got the end of November 2025, songs were failing due to errors that first didn't make sense as some worked and some didn't. This seemed to be combination of copyright issues with the song lyrics and that due to that sometimes ChatGPT would either choke, give me one verse or tell me that it wasn't designed to do this in an error message.&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%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNWJldmZiYjBjdjJpOWUzcjFranNyZ2R6cGlzdmxmbmc5Y3FiNnB4MiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F3orieZ7x4y7SN1EsIU%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="100%" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExNWJldmZiYjBjdjJpOWUzcjFranNyZ2R6cGlzdmxmbmc5Y3FiNnB4MiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F3orieZ7x4y7SN1EsIU%2Fgiphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that out of the way, here's a little something I vibe-coded while I was procrastinating over something else and wanted to see how AI would stack up as a coding partner. &lt;/p&gt;


&lt;h2&gt;
  
  
  Capo2Keys
&lt;/h2&gt;

&lt;p&gt;Introducing Capo2Keys, a GUI tool built in Flask but deployed as a Docker container with Web UI to help convert and then export, guitar capo chord charts into piano-ready keys as a PDF and TXT file, all while preserving lyrics and chord structure.&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%2Fyidteepn6xz86v2m3d9z.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%2Fyidteepn6xz86v2m3d9z.png" alt="Capo2Keys Logo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/reprodev" rel="noopener noreferrer"&gt;
        reprodev
      &lt;/a&gt; / &lt;a href="https://github.com/reprodev/Capo2Keys" rel="noopener noreferrer"&gt;
        Capo2Keys
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Tool to convert guitar capo chord charts into piano-ready keys while preserving lyrics and chord structure. Flask-based Web UI with a Docker version for ease of deployment
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Capo2Keys&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Convert guitar capo chord charts into piano-ready keys while preserving lyrics and chord structure.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/reprodev/Capo2Keys/docs/assets/Capo2KeysSmallV01.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freprodev%2FCapo2Keys%2Fdocs%2Fassets%2FCapo2KeysSmallV01.png" alt="Capo2Keys Logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Capo2Keys provides a Docker-first Flask WebUI, a CLI mode for scripts, and an optional desktop app build from the same codebase.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Transpose by capo value (&lt;code&gt;0-11&lt;/code&gt; semitones)&lt;/li&gt;
&lt;li&gt;Keep lyrics and chord formatting intact&lt;/li&gt;
&lt;li&gt;Generate both &lt;code&gt;.txt&lt;/code&gt; and &lt;code&gt;.pdf&lt;/code&gt; outputs&lt;/li&gt;
&lt;li&gt;Conflict-safe output naming (&lt;code&gt;suffix&lt;/code&gt; or &lt;code&gt;overwrite&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Archive view grouped by song set&lt;/li&gt;
&lt;li&gt;Docker deployment + GHCR image publishing&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Screenshots&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Generator View&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/reprodev/Capo2Keys/docs/assets/01-Capo2KeysGeneratorV01.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freprodev%2FCapo2Keys%2Fdocs%2Fassets%2F01-Capo2KeysGeneratorV01.png" alt="Generator View 01"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pick Your Capo from 0 to 11 (0 to Apply No Capo)&lt;/li&gt;
&lt;li&gt;Fill in the Song Title and Your Artist (Title by Song Artist)&lt;/li&gt;
&lt;li&gt;Copy and Paste your Capo Chords&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/reprodev/Capo2Keys/docs/assets/02-Capo2KeysGeneratorV01.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freprodev%2FCapo2Keys%2Fdocs%2Fassets%2F02-Capo2KeysGeneratorV01.png" alt="Generator View 02"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Generate Tranpostion&lt;/strong&gt; to generate your Guitar Capo Chords tranposed to Piano Chords with all the lyrics&lt;/li&gt;
&lt;li&gt;Download Your PDF or TXT File from here or click &lt;strong&gt;Browse Archive&lt;/strong&gt; to view all your generated Piano Chords&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/reprodev/Capo2Keys/docs/assets/03-Capo2KeysGeneratorV01.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Freprodev%2FCapo2Keys%2Fdocs%2Fassets%2F03-Capo2KeysGeneratorV01.png" alt="Generator View 03"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Archive View&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Browse the Archive…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/reprodev/Capo2Keys" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;As I couldn't find anything else out there to do this and so Capo2Keys (originally named Chordbox and then CapoToKeys) was created.&lt;/p&gt;

&lt;p&gt;I used Codex from ChatGPT in Visual Studio Code on Windows to a bit of vibe-coding. The plan was to have this realised as a Docker container that I could spin up when I needed and an accompanying Python application as proof of concept for a Desktop version.&lt;/p&gt;

&lt;p&gt;This is also my first time using GitHub actions with GitHub secrets (GitHub PAT) to build a Docker image that I can now pull using a Docker Compose or Docker Run command just like some of my favourite Docker based applications.&lt;/p&gt;

&lt;p&gt;I hope you get as much use out of this as I do and feel free to make suggestions to make this more useful to everyone.&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%2Fmedia3.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYm12aHlicmQ1N3NoNGllOGM1enE4bWRhZzMwZXplOHE0MTk5bTdiciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F3ofT5VtuDqvC1QSsWk%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="100%" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYm12aHlicmQ1N3NoNGllOGM1enE4bWRhZzMwZXplOHE0MTk5bTdiciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2F3ofT5VtuDqvC1QSsWk%2Fgiphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Transpose by capo value (0-11&amp;nbsp;semitones)&lt;/li&gt;
&lt;li&gt;Keep lyrics and chord formatting intact&lt;/li&gt;
&lt;li&gt;Generate both&amp;nbsp;.txt&amp;nbsp;and&amp;nbsp;.pdf&amp;nbsp;outputs&lt;/li&gt;
&lt;li&gt;Conflict-safe output naming (suffix&amp;nbsp;or&amp;nbsp;overwrite)&lt;/li&gt;
&lt;li&gt;Archive view grouped by song set&lt;/li&gt;
&lt;li&gt;Docker deployment with Docker Compose file + GHCR image publishing&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;For now I'd suggest that you use the Docker version as the Python version works but can bring up a security alert on Windows. Not malicious but can be annoying.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker Desktop on Windows or WSL (or both)&lt;/li&gt;
&lt;li&gt;Docker installed on Linux&lt;/li&gt;
&lt;li&gt;Docker installed on MacOS&lt;/li&gt;
&lt;li&gt;Python (For the Desktop Version)&lt;/li&gt;
&lt;li&gt;Some Guitar Chords with or without Capo you want to play on Piano&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Instructions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Docker Run
&lt;/h3&gt;

&lt;p&gt;This is the quickest and easiest way to get started for you to try it out. You can do it in one command below to get started.&lt;/p&gt;

&lt;p&gt;You can copy and run the below in your terminal and it'll be up and running.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker pull ghcr.io/reprodev/capo2keys:latest&lt;br&gt;
docker run -d \&lt;br&gt;
  --name capo2keys \&lt;br&gt;
  -p 4506:4506 \&lt;br&gt;
  -v "./data:/data" \&lt;br&gt;
  ghcr.io/reprodev/capo2keys:latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="http://localhost:4506" rel="noopener noreferrer"&gt;http://localhost:4506&lt;/a&gt; in your browser on the machine you've run the command on to get to the WebUI.&lt;/p&gt;

&lt;p&gt;Extra technical details for those who may find it interesting with a breakdown of this command line by line to explaining how it works.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls the latest Docker Image from the GitHub Container Registry (GHCR) which is built by GitHub actions when the code is changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;docker pull ghcr.io/reprodev/capo2keys:latest&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Runs the downloaded image in detached mode so you don't have to keep the terminal session and it runs in the background&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;docker run -d \&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sets the name of the new container as capo2keys&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;--name capo2keys \&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set the exposed port (the one you would connect to, on the left), this case 4506 and it's internal port (the port that Docker uses internally on it's Docker Network) on the right, in this case also 4506.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;-p 4506:4506 \&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sets the volume where the data will be stored on the host machine for a bind mount on the left, in this case a folder inside where this is run called ./data on the left and the one it refers to in docker on the right /data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;-v "./data:/data" \&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;This states the name and location of the docker image if you haven't pulled it yet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;ghcr.io/reprodev/capo2keys:latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There are other methods for using Docker Compose and the Python Desktop version but I'll only focus on the Docker Run version so we can get down to actually using this application.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to use Capo2Keys
&lt;/h2&gt;

&lt;p&gt;-Go ahead and run it using the method you've chosen, we're looking at the Docker Run version. &lt;/p&gt;

&lt;p&gt;-Run the command and then point your browser to &lt;a href="http://localhost:4506" rel="noopener noreferrer"&gt;http://localhost:4506&lt;/a&gt; to get to the main WebUI that we call the Generator&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%2Fz5qbyo4l7n01wqb64qn8.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%2Fz5qbyo4l7n01wqb64qn8.png" alt="01-Capo2KeysGeneratorV01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy and paste the chords you need and add the Capo Number Position that it would be played on a guitar with.&lt;/li&gt;
&lt;li&gt;As a bonus you can also keep the capo at 0 to keep the chords and lyrics unchanged if you're looking to archive some rare music to PDF.&lt;/li&gt;
&lt;/ul&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%2Fenu4l2x4zx7oc213pc4a.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%2Fenu4l2x4zx7oc213pc4a.png" alt="02-Capo2KeysGeneratorV01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Generate Composition&lt;/li&gt;
&lt;/ul&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%2Fumtjevrgduk7ca9s4h35.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%2Fumtjevrgduk7ca9s4h35.png" alt="03-Capo2KeysGeneratorV01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This will produce a TXT and PDF version which you can download straight this page using the buttons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can use the Clear button to clear all text boxes and paste in another chord sheet if you like.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To download your previous chords or view them in browser straight away then click Browse Archive to head to the Archive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F2qbsd3pvjimgw8dx7jtt.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%2F2qbsd3pvjimgw8dx7jtt.png" alt="04-Capo2KeysArchiveV01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;From here the files are grouped in pairs of TXT and PDF so you can either view from the list or download here as well.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you want to delete some you used the wrong capo on or just to do a little spring cleaning you can use the trashcan next to the group you want to remove and it'll delete them from the archive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fgjbambenz2ahcq3g9tgr.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%2Fgjbambenz2ahcq3g9tgr.png" alt="05-Capo2KeysArchiveV01"&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%2Fxn220k189vrlibosx3is.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%2Fxn220k189vrlibosx3is.png" alt="06-Capo2KeysArchiveV01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click Back to Generator in the top right to go back to the Main Menu and paste some more chords.&lt;/li&gt;
&lt;/ul&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%2Fhfmjbk0ya8xbvz3exln9.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%2Fhfmjbk0ya8xbvz3exln9.png" alt="01-Capo2KeysGeneratorV01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That wraps up how to run and then use the Capo2Keys application and the first of some new applications I've been developing on my GitHub. Feel free to check out my other projects on there and submit your bugs or suggestions in the repository.&lt;/p&gt;




&lt;p&gt;This was a great project to start learning more about how to use AI to help with designing, coding, testing and then finally deploying an application from idea to working prototype in just an hour or so.&lt;/p&gt;

&lt;p&gt;Personally, I've also learnt a bunch about how Git can be used to develop across multiple machines and the importance of version control.&lt;/p&gt;

&lt;p&gt;There's more to come from the AI revolution but right now it's letting sparks of an idea come to life in record time.&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%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYXRpdWRhZzg3dzg3bDI3NXVmYm83bzF4NzF6eTV5eGxxOHNneHhuZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FtczJoRU7XwBS8%2Fgiphy.gif" class="article-body-image-wrapper"&gt;&lt;img width="100%" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fv1.Y2lkPTc5MGI3NjExYXRpdWRhZzg3dzg3bDI3NXVmYm83bzF4NzF6eTV5eGxxOHNneHhuZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw%2FtczJoRU7XwBS8%2Fgiphy.gif"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Check out &lt;a href="https://reprodev.com" rel="noopener noreferrer"&gt;https://reprodev.com&lt;/a&gt; for more guides, tutorials and self hosted tips.&lt;/p&gt;

&lt;p&gt;For more code examples and ongoing projects you can tap into my Github&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/reprodev" rel="noopener noreferrer"&gt;https://github.com/reprodev&lt;/a&gt;&lt;/p&gt;




</description>
      <category>development</category>
      <category>chatgpt</category>
      <category>learning</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Get Started with Docker - Part 5: Watchtower : How to Update Docker Containers and Images The Easy Way</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Fri, 22 Mar 2024 15:10:19 +0000</pubDate>
      <link>https://dev.to/reprodev/get-started-with-docker-part-5-watchtower-how-to-update-docker-containers-and-images-the-easy-way-296l</link>
      <guid>https://dev.to/reprodev/get-started-with-docker-part-5-watchtower-how-to-update-docker-containers-and-images-the-easy-way-296l</guid>
      <description>&lt;p&gt;At this point in the Get Started with Docker series you should have a few useful services running in containers.&lt;/p&gt;

&lt;p&gt;The flexibility of using Docker Compose files or Docker Run commands lets you easily deploy these using either Portainer or the Docker Command Line Interface (Docker CLI). You can set and forget them for the most part and just reap the benefits of your self hosted services.&lt;/p&gt;

&lt;p&gt;But there's one thing that we can't avoid and that's those pesky application updates.&lt;/p&gt;

&lt;p&gt;You can do these manually by using the Docker Command line to download the new docker image, stop, remove and then redeploy your containers. This can become quite a boring and manual task depending on the number of containers you're running. It can also be a minefield depending on how you deployed them in the first place with custom environment options or volume bind options.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmcyYXc0eXNmcTM2cWZhYzViem92YXo4ZzFqZWc4eXBnZnBlZWhzZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26BkNefkzMeK3qx9K/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbmcyYXc0eXNmcTM2cWZhYzViem92YXo4ZzFqZWc4eXBnZnBlZWhzZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26BkNefkzMeK3qx9K/giphy.gif" width="350" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of doing all of that, we can use a handy Docker container.&lt;/p&gt;

&lt;p&gt;This will check for updates, update, stop and remove all of the Docker images and containers for us. The Docker container we'll be using is &lt;strong&gt;Watchtower&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;We'll be&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Looking at What Watchtower is&lt;/li&gt;
&lt;li&gt;  Going to the project page for Portainer for our build and install instructions&lt;/li&gt;
&lt;li&gt;  SSH into the host machine where Docker is installed&lt;/li&gt;
&lt;li&gt;  Spin up and deploy our Watchtower Docker Container&lt;/li&gt;
&lt;li&gt;  Updating only one or more specific containers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is Watchtower?
&lt;/h2&gt;

&lt;p&gt;Watchtower is a way to automate the process of updating the Docker base images of running Docker containers.&lt;/p&gt;

&lt;p&gt;By default, Watchtower will run in the background, checking the current Docker base images of all containers against the latest version on the Docker Image registry every 5 minutes.&lt;/p&gt;

&lt;p&gt;It will then download all the latest images locally and gracefully shut down all the corresponding containers that need the update.&lt;/p&gt;

&lt;p&gt;Finally, Watchtower will start back up all of the containers it shut down using the new Docker base image. Most importantly they will be started with all the settings they were running before they shut down, automatically.&lt;/p&gt;

&lt;p&gt;Using command line arguments, this microservice can be set to exclude certain containers that are mission critical and can be ran once without running in the background.&lt;/p&gt;




&lt;h2&gt;
  
  
  Watchtower Project Page
&lt;/h2&gt;

&lt;p&gt;The Watchtower GitHub page has the most up to date information on this project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/containrrr/watchtower" rel="noopener noreferrer"&gt;https://github.com/containrrr/watchtower&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watchtower has been released under Apache 2.0 License which allows the code to be reused as part of pretty much any project even if it's closed source and proprietary.&lt;/p&gt;

&lt;p&gt;There is also a bigger breakdown of the features, development and some further information linked below on the developer's online Knowledgebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://containrrr.dev/watchtower/introduction/" rel="noopener noreferrer"&gt;Watchtower Containrr Knowledgebase&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Let's get started with Watchtower
&lt;/h2&gt;

&lt;p&gt;In this guide, we're going to run Watchtower using the just once option instead of letting it check every 5 minutes. This way you can pick a maintenance window and time each week to run it.&lt;/p&gt;

&lt;p&gt;We're going to be using the Raspberry Pi from earlier which currently had Whoogle, Pi-hole and Nginx Proxy Manager.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please Note: Once run you'll have a brief period of downtime of a few seconds to minutes for the containers that are shut being upgraded. Make sure you know this before running this against containers that are mission critical.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  SSH into your Docker install&lt;/li&gt;
&lt;/ul&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%2Fwz4n3ou32w1fj0bywsz2.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%2Fwz4n3ou32w1fj0bywsz2.png" alt="Watchtower 01" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Run the Docker Run command to run Watchtower once
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Wait for Watchtower to start running and the logs to start outputting&lt;/li&gt;
&lt;/ul&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%2Fy87vkvjr3e8y8tstnj6i.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%2Fy87vkvjr3e8y8tstnj6i.png" alt="Watchtower 02" width="800" height="358"&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%2Fuq0rj3mtdmwnrrbuk7az.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%2Fuq0rj3mtdmwnrrbuk7az.png" alt="Watchtower 03" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Go and make a coffee as Watchtower does it's magic&lt;/li&gt;
&lt;/ul&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%2F37k3fb7iff0emziv8eff.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%2F37k3fb7iff0emziv8eff.png" alt="Watchtower 04" width="800" height="358"&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%2Fltkwfhx9zike5psg30n8.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%2Fltkwfhx9zike5psg30n8.png" alt="Watchtower 05" width="800" height="358"&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%2F1pl6bdkwgj54zvmhhbds.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%2F1pl6bdkwgj54zvmhhbds.png" alt="Watchtower 06" width="800" height="358"&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%2Fwua9gzv30pk48he2dzjw.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%2Fwua9gzv30pk48he2dzjw.png" alt="Watchtower 07" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Enjoy your newly updated containers with updated base images&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Command Line Arguments
&lt;/h2&gt;

&lt;p&gt;When you update all of the running containers on a Docker host this could actually be quite disruptive depending on the services you are running.&lt;/p&gt;

&lt;p&gt;You may also want to run this on remote hosts if you want to automate things further.&lt;/p&gt;

&lt;p&gt;Here are a few useful examples of how to use Command Line Arguments with Watchtower and the Docker Run command&lt;/p&gt;

&lt;h3&gt;
  
  
  Updating a single container
&lt;/h3&gt;

&lt;p&gt;By adding the name of the containers you want to target as a command line argument only the named container will be updated by Watchtower&lt;/p&gt;

&lt;p&gt;The example below would only update &lt;strong&gt;whoogle&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once whoogle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Updating multiple named containers
&lt;/h3&gt;

&lt;p&gt;By adding the name of the more than one container as a command line argument with spaces in between them will make sure that only these are updated by Watchtower ignoring all the others.&lt;/p&gt;

&lt;p&gt;This example would only update nginx-proxy-manager and whoogle&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once nginx-proxy-manager whoogle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Updating Remote Hosts
&lt;/h3&gt;

&lt;p&gt;If you want to update the containers and images on a remote host then you can do this by using one of the 2 commands below.&lt;/p&gt;

&lt;p&gt;Using this method may not always work and you may need to do some network troubleshooting if you run into trouble which is outside the scope of this guide.&lt;/p&gt;

&lt;p&gt;To get this working, you will need to have Docker installed on the machine you're using to be able to send the Docker commands to the remote host.&lt;/p&gt;

&lt;p&gt;In this example, we'll use the ip address 192.168.0.23 as our remote host. We'll run the command on the other machine to run this.&lt;/p&gt;

&lt;p&gt;The below 2 will check containers on the remote host every 5 minutes as default using the default exposed port of 2375 for the Docker Daemon.&lt;/p&gt;

&lt;p&gt;I've also changed the name of the container to make sure that this isn't the same as the normal Watchtower container if you're already running it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d \
  --name watchtowerremote \
  containrrr/watchtower --host "tcp://192.168.0.23:2375"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d \
  --name watchtowerremote \
  -e DOCKER_HOST="tcp://192.168.0.23:2375" \
  containrrr/watchtower
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 2 commands below would do this as a Run Once similar to the way that they are done in the rest of the guide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm \
  --name watchtowerremote \
  containrrr/watchtower --host "tcp://192.168.0.23:2375"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm \
  --name watchtowerremote \
  -e DOCKER_HOST="tcp://192.168.0.23:2375" \
  containrrr/watchtower
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations, you've now taken another step into the world of Docker by automating one of the most common parts of a Docker set up.&lt;/p&gt;

&lt;p&gt;If you're a bit more confident you can run this in the background on a set time interval to update your containers but my advice would be to set aside some time each week to do this manually to start with. Watchtower will make process a lot easier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNThvZ3hydjVwNDhpOWU3NG16NWpvYWFmcjZrZmxwencwdnl5M3pzZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l0G17pPez0HTCjHzO/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNThvZ3hydjVwNDhpOWU3NG16NWpvYWFmcjZrZmxwencwdnl5M3pzZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l0G17pPez0HTCjHzO/giphy.gif" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Get Started with Docker - Part 4: Portainer : How To Deploy Containers The Easy Way</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Sun, 10 Mar 2024 12:36:53 +0000</pubDate>
      <link>https://dev.to/reprodev/get-started-with-docker-part-4-portainer-how-to-deploy-containers-the-easy-way-3jd1</link>
      <guid>https://dev.to/reprodev/get-started-with-docker-part-4-portainer-how-to-deploy-containers-the-easy-way-3jd1</guid>
      <description>&lt;p&gt;If you've been following along so far then you've already managed to get Docker installed on your system and your first Docker container service deployed.&lt;/p&gt;

&lt;p&gt;A lot of Docker management can be done through the command line and a lot of people like working with docker compose files and docker run commands in the terminal but this can start to get overly complicated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExcjBlYnZqcWF4OTlnbXhsNW05MGR0aWJ1cTQ1YTdoMXJlMndwOTBsYiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Gh5lck3oM8H1zivsRI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExcjBlYnZqcWF4OTlnbXhsNW05MGR0aWJ1cTQ1YTdoMXJlMndwOTBsYiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Gh5lck3oM8H1zivsRI/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started out by using &lt;strong&gt;Portainer&lt;/strong&gt; which was a great way to get started with lists of community maintained, curated apps to install with a simple point and click web browser based dashboard. Making it easy to try out loads of different containers quickly from one of theses lists or your own without having to use the terminal.&lt;/p&gt;




&lt;p&gt;In this guide, we'll spin up one of the most best ways to manage, deploy and mantain your docker containers from an easy to use Web UI.&lt;/p&gt;

&lt;p&gt;We'll be&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Looking at What Portainer is&lt;/li&gt;
&lt;li&gt;  Going to the project page for Portainer for our build and install instructions&lt;/li&gt;
&lt;li&gt;  SSH into the host machine where Docker is installed&lt;/li&gt;
&lt;li&gt;  Creating a Docker Volume for Portainer Data&lt;/li&gt;
&lt;li&gt;  Spin up and deploy our Portainer Docker Container&lt;/li&gt;
&lt;li&gt;  Configure New Portainer Environment&lt;/li&gt;
&lt;li&gt;  What Are Stacks&lt;/li&gt;
&lt;li&gt;  Set up the Portainer App Store (App Templates)&lt;/li&gt;
&lt;li&gt;  Customise and deploy a stack from the Portainer App Store&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Portainer?
&lt;/h2&gt;

&lt;p&gt;Portainer is a lightweight management toolset that allows you to easily build, manage, and maintain Docker and Kubernetes environments.&lt;/p&gt;

&lt;p&gt;Once deployed and connected to your docker network, you will have a running web service that you can access to help see your running Docker containers.&lt;/p&gt;

&lt;p&gt;You can click into your running containers to check out the logs, stop, start or change variables to redeploy.&lt;/p&gt;

&lt;p&gt;The main attraction though is the list of ready to use Docker Containers that are included by default but can be added to by custom XML files in the Settings.&lt;/p&gt;

&lt;p&gt;There are some drawbacks with managing containers you have deployed using Docker Compose but you can always redeploy in Portainer if you want to manage everything from here.&lt;/p&gt;




&lt;h2&gt;
  
  
  Portainer Project Page
&lt;/h2&gt;

&lt;p&gt;Portainer is available to license for Business Use but we'll be using the Community Edition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/portainer/portainer/" rel="noopener noreferrer"&gt;Portainer Github&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  SSH into Docker Install
&lt;/h2&gt;

&lt;p&gt;In this guide we're using a Raspberry Pi running Ubuntu Server Minimal. If you need help with setting that up with docker on your Raspberry Pi then check out the guide below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/reprodev/get-started-with-docker-part-2a-raspberry-pi-linux-install-guide-4hl9"&gt;Get Started with Docker - Part 2a - Raspberry Pi Linux Install Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alternatively, you can run the same commands on WSL using Docker Desktop on a Windows machine if you prefer with the guide below&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/reprodev/get-started-with-docker-part-2b-windows-11-install-guide-wsl-and-docker-desktop-edition-2o2f"&gt;Get Started with Docker - Part 2b - Windows Docker Desktop Install Guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1vZDUwOTFxZWZueWN4bWNxcmlkZzR5cWs3ODVnNGpnMmNuZjBzNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zaezT79s3Ng7C/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZG1vZDUwOTFxZWZueWN4bWNxcmlkZzR5cWs3ODVnNGpnMmNuZjBzNCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/zaezT79s3Ng7C/giphy.gif" width="500" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's go ahead and Create a Docker Volume for Portainer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create a Docker Volume for Portainer
&lt;/h2&gt;

&lt;p&gt;A Docker Volume let's containers store things like settings, databases and config files persistently on the host machine independent of the containers lifecycle.&lt;/p&gt;

&lt;p&gt;This let's Portainer keep those settings even if the container is destroyed and recreated e.g. if a new Portainer image has been released or the host machine is rebooted.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXRod3R4ejQ1emJ5NTJpMThxY3dobHV2MjU3MmY3c3lpa2l3MnAwdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1zKRlTFQ278PtPtrV2/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXRod3R4ejQ1emJ5NTJpMThxY3dobHV2MjU3MmY3c3lpa2l3MnAwdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/1zKRlTFQ278PtPtrV2/giphy.gif" width="498" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To create a Docker Volume for Portainer we can use the &lt;strong&gt;Docker Volume&lt;/strong&gt; command&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%2Fg9ica96vm9z6qltkwerq.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%2Fg9ica96vm9z6qltkwerq.png" alt="PortainerInstall01" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker volume create portainer_data&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%2Fo4h6zngspm67eefhhgha.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%2Fo4h6zngspm67eefhhgha.png" alt="PortainerInstall02" width="800" height="340"&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%2Fdhakjsjgpgamf9nktqon.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%2Fdhakjsjgpgamf9nktqon.png" alt="PortainerInstall03" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then we can deploy Portainer using the below Docker run command, referencing the "portainer_data" Docker Volume we've just created&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest&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%2F2lxrim9v04tvwmt31s3k.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%2F2lxrim9v04tvwmt31s3k.png" alt="PortainerInstall04" width="800" height="340"&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%2Fmpe4rsul5cs2rbwlig82.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%2Fmpe4rsul5cs2rbwlig82.png" alt="PortainerInstall05" width="800" height="340"&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%2F2mxtwz2szj5oud98ahl3.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%2F2mxtwz2szj5oud98ahl3.png" alt="PortainerInstall06" width="800" height="340"&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%2Fqaro2q2fldxrzh8wj1k7.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%2Fqaro2q2fldxrzh8wj1k7.png" alt="PortainerInstall07" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a browser and connect to the IP address of your Docker installation and port 9000&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%2F1a9cb8nbcuu81xv3szq7.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%2F1a9cb8nbcuu81xv3szq7.png" alt="PortainerInstall08" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The admin username will already be filled in for you so go ahead and set up a password this account and make sure you make a note of this too somewhere safe.&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%2Fxxsrw1wos3h0uulw7ay2.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%2Fxxsrw1wos3h0uulw7ay2.png" alt="PortainerInstall09a" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can untick the Allow collection of anonymous statistics if you don't want to send anything to Portainer&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%2Fb4xw7hizqkhsa1bnw037.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%2Fb4xw7hizqkhsa1bnw037.png" alt="PortainerInstall09b" width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create user&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This will bring you to the Portainer &lt;strong&gt;Quick Setup Wizard&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%2Fie64kfw2he7ux9uhefve.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%2Fie64kfw2he7ux9uhefve.png" alt="PortainerInstall10" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Get Started&lt;/strong&gt; to proceed using the local environment Portainer is running in.&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%2Fvz3mixgv0zmo7tbswslw.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%2Fvz3mixgv0zmo7tbswslw.png" alt="PortainerInstall11" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;local&lt;/strong&gt; to explore our local Docker environment.&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%2F8k3hq369w4r0383hqxt8.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%2F8k3hq369w4r0383hqxt8.png" alt="PortainerInstall14" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will bring us to the &lt;strong&gt;Portainer Dashboard&lt;/strong&gt; for our currently running containers, images, volumes, networks and stacks running in Docker.&lt;/p&gt;

&lt;p&gt;The current running container, image and volume is &lt;strong&gt;Portainer&lt;/strong&gt; itself.&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%2Fdod6ejm4setvuxobbbgl.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%2Fdod6ejm4setvuxobbbgl.png" alt="PortainerInstall15" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're now ready to start using &lt;strong&gt;Portainer&lt;/strong&gt; and stacks.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Stacks
&lt;/h2&gt;

&lt;p&gt;Portainer deploys Docker Networks, Containers and Services using a similar set up to Docker Compose YML files using Stacks.&lt;/p&gt;

&lt;p&gt;These digital recipe files contain everything needed to start a service like OrganizrV2, a Dashboard for all your self-hosted services or Plex, a self hosted Netflix style Media Server for all your home media.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWFxenBtNGpxeXVoejYwOGFzaDluYXdlanN5M28xeHc1NW1mZ21zMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10u6gt11vnm812/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWFxenBtNGpxeXVoejYwOGFzaDluYXdlanN5M28xeHc1NW1mZ21zMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/10u6gt11vnm812/giphy.gif" width="500" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can then configure the stack to use the settings that you want and even deploy different versions using the same stack by changing a few variables e.g. the config folder and IP address.&lt;/p&gt;

&lt;p&gt;We'll focus more on the manual stack setup in another blog article soon, as in this guide we're going to use a more automated way of doing this.&lt;/p&gt;

&lt;p&gt;To try this out we're going to install a privacy-focused version of Google called Whoogle on your server using a custom Portainer App Template List.&lt;/p&gt;




&lt;h2&gt;
  
  
  Add a custom Portainer App Template List
&lt;/h2&gt;

&lt;p&gt;The most powerful feature in Portainer is the large list of curated images that can be added to make trying out new services or applications and then removing them a breeze.&lt;/p&gt;

&lt;p&gt;The default list already contains some services to get started.&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%2Fcvauxsd4nwhznymjsl9p.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%2Fcvauxsd4nwhznymjsl9p.png" alt="Portainer App Template 01" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're going to add a new custom list that includes a lot more than the inbuilt list from the Github Portainer Templates by Qballjos&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Qballjos/portainer_templates" rel="noopener noreferrer"&gt;Github Portainer Templates by Qballjos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the &lt;strong&gt;Dashboard&lt;/strong&gt; menu on the left we're going to scroll down to the &lt;strong&gt;Settings&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%2Fksqsqhfdlb6oxtkkofuo.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%2Fksqsqhfdlb6oxtkkofuo.png" alt="Portainer App Template 02" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a &lt;strong&gt;JSON&lt;/strong&gt; file already filled in here with the current default list of stacks from Portainer&lt;/p&gt;

&lt;p&gt;Paste the below line in there&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[https://raw.githubusercontent.com/Qballjos/portainer_templates/master/Template/template.json]&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%2Fbctdaqmy33fah1k6ahcf.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%2Fbctdaqmy33fah1k6ahcf.png" alt="Portainer App Template 03" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Press Save to Apply the settings to your &lt;strong&gt;App Templates&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%2Fkqof5b45osc243icrhpg.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%2Fkqof5b45osc243icrhpg.png" alt="Portainer App Template 04" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We've now got a combined and curated list of the most popular and useful self hosted services and applications to choose from, right inside Portainer.&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%2Fcx7sfxdps89lbe4ydh78.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%2Fcx7sfxdps89lbe4ydh78.png" alt="Whoogle Portainer Install 01" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Think of it as a free Portainer App Store to search for and start up services in a few clicks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZW95aDBxYWNkaGlxZDc5cDBsbzdvcHAxcjIzM3IzdzBxZnI2cXJ3aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ugOMVsKh9pMWxji7w4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZW95aDBxYWNkaGlxZDc5cDBsbzdvcHAxcjIzM3IzdzBxZnI2cXJ3aSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ugOMVsKh9pMWxji7w4/giphy.gif" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Customise and deploy a stack from App Templates
&lt;/h2&gt;

&lt;p&gt;One of the reason's many people choose to self-host is to be able to stop giving their digital data and online habits to online services like Google and Meta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOG5ydG1zaHc0YnF2ZXFkN2JoYTkzNTYyd3QwOHc3aHptNjdvempoaSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Zkf1NYy2aQXs7fQaKP/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOG5ydG1zaHc0YnF2ZXFkN2JoYTkzNTYyd3QwOHc3aHptNjdvempoaSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Zkf1NYy2aQXs7fQaKP/giphy.gif" width="480" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're going to self host our own search engine using Google but without having to give up our digital privacy using &lt;a href="https://whoogle.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Whoogle&lt;/strong&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%2Fcx7sfxdps89lbe4ydh78.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%2Fcx7sfxdps89lbe4ydh78.png" alt="Whoogle Portainer Install 01" width="800" height="411"&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%2Fgithub.com%2Fbenbusby%2Fwhoogle-search" 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%2Fgithub.com%2Fbenbusby%2Fwhoogle-search" alt="https://github.com/benbusby/whoogle-search" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;App Templates&lt;/strong&gt; if you're not already there and scroll down or search for &lt;strong&gt;Whoogle&lt;/strong&gt; in the list.&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%2Fj062bvrmpz2ul53d4i84.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%2Fj062bvrmpz2ul53d4i84.png" alt="Whoogle Portainer 01" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Whoogle&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%2Fdfw8pbzm2re6xa462f7q.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%2Fdfw8pbzm2re6xa462f7q.png" alt="Whoogle Portainer 02" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will bring you to the &lt;strong&gt;App Template&lt;/strong&gt; setup with the default name &lt;strong&gt;whoogle&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%2F261cj7p0pqd6v0h9xbb3.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%2F261cj7p0pqd6v0h9xbb3.png" alt="Whoogle Portainer 03" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will also have the network set to &lt;strong&gt;bridge&lt;/strong&gt; as default which we'll leave for now&lt;/p&gt;

&lt;p&gt;Scroll down and click the &lt;strong&gt;Plus&lt;/strong&gt; sign to the left of &lt;strong&gt;Advanced Options&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%2Fk52vhlbfiulj8c5qu00j.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%2Fk52vhlbfiulj8c5qu00j.png" alt="Whoogle Portainer 04" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For our &lt;strong&gt;Port mapping&lt;/strong&gt;, we'll leave the default &lt;strong&gt;host&lt;/strong&gt; port we connect to as &lt;strong&gt;5001&lt;/strong&gt; and &lt;strong&gt;container&lt;/strong&gt; port of &lt;strong&gt;5000&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this tutorial, we're going to use the &lt;strong&gt;auto&lt;/strong&gt; function for &lt;strong&gt;Volume mapping&lt;/strong&gt; instead of the &lt;strong&gt;bind&lt;/strong&gt; function to create a local volume on the host automatically&lt;/p&gt;

&lt;p&gt;Scroll down to &lt;strong&gt;Actions&lt;/strong&gt; and click &lt;strong&gt;Deploy the container&lt;/strong&gt; to go ahead and start up our service&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%2Fdmmkl7qa2nfz28kkknct.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%2Fdmmkl7qa2nfz28kkknct.png" alt="Whoogle Portainer 06" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll be brought back to the &lt;strong&gt;Containers&lt;/strong&gt; Page with your new service getting ready to start.&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%2Felnm7rwgsud7sxqyon8w.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%2Felnm7rwgsud7sxqyon8w.png" alt="Whoogle Portainer 07" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refresh the Page and you should see the State should turn green and show as &lt;strong&gt;running&lt;/strong&gt; or in our case &lt;strong&gt;healthy&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%2Fa6cf6gd74zwy8bl7c8ws.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%2Fa6cf6gd74zwy8bl7c8ws.png" alt="Whoogle Portainer 11" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a new tab in your browser and go to your Server IP address and port 5001&lt;/p&gt;

&lt;p&gt;For our example it's the below&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://192.168.0.23:5001&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will bring you to the &lt;strong&gt;Whoogle&lt;/strong&gt; home page which is hosted on your server.&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%2Fz7hbaa58qgiehxyriud2.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%2Fz7hbaa58qgiehxyriud2.png" alt="Whoogle Portainer 12" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the configuration options for some really interesting ways to search.&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%2F7k9nwtp7udcluaa9khsz.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%2F7k9nwtp7udcluaa9khsz.png" alt="Whoogle Portainer 13" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or just do your first search without giving Google your browsing data along the way&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%2Flkws0mvnb561mp5gyecd.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%2Flkws0mvnb561mp5gyecd.png" alt="Whoogle Portainer 14" width="800" height="411"&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%2F9g1uxz0boeg3ch1w08et.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%2F9g1uxz0boeg3ch1w08et.png" alt="Whoogle Portainer 15" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, you've deployed your first self hosted service in a container using &lt;strong&gt;Portainer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can deploy almost everyone of those services on the list using this same method so get exploring and try out some of those complicated services you always wanted to without all the hassle.&lt;/p&gt;

&lt;p&gt;Next up we're going to start getting fancy by forwarding custom hostnames using Nginx Proxy Manager and Pi-Hole's Local DNS feature.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOXFuZzl4NWd0MzlqbWE4azRudnV2ZTRveTBqdnpxOG9yajhnODh0biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26Ff29tMYBOScmQEM/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExOXFuZzl4NWd0MzlqbWE4azRudnV2ZTRveTBqdnpxOG9yajhnODh0biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26Ff29tMYBOScmQEM/giphy.gif" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;For more Docker Compose files check out &lt;strong&gt;ReproDev Recipes&lt;/strong&gt; on GitHub with Docker Compose files for you to try out&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/reprodev/reprodev-recipes/tree/main" rel="noopener noreferrer"&gt;GitHub - reprodev/reprodev-recipes: ReproDev Recipes is a repository of code snippets and docker compose files from reprodev.com&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Check out the guide below if you want more information on What Docker is and how to get started&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/reprodev/get-started-with-docker-part-1-an-intro-to-docker-3b81"&gt;Get Started with Docker - Part 1 : An Intro to Docker&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Get Started with Docker - Part 3: Pi-Hole</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Sun, 03 Mar 2024 10:30:00 +0000</pubDate>
      <link>https://dev.to/reprodev/get-started-with-docker-part-3-pi-hole-j40</link>
      <guid>https://dev.to/reprodev/get-started-with-docker-part-3-pi-hole-j40</guid>
      <description>&lt;p&gt;You've set up Docker on your operating system and device of choice. You're ready to start spinning up containers and seeing what Docker is all about.&lt;/p&gt;

&lt;p&gt;In this guide, we'll spin up one of the most useful services in a container and a great introduction to the Docker ecosystem.&lt;/p&gt;

&lt;p&gt;We'll be&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Looking at what Pi-Hole is&lt;/li&gt;
&lt;li&gt;  Going to the project page for Pi-Hole for our build and install instructions&lt;/li&gt;
&lt;li&gt;  Using Notepad++ on a Windows Laptop to create a custom Docker Compose with Environmental Variables&lt;/li&gt;
&lt;li&gt;  Setting up a folder on our machine for Docker to locally store our config files and other persistent data&lt;/li&gt;
&lt;li&gt;  Using the Nano Text Editor on our Docker machine to create our docker-compose.yml file&lt;/li&gt;
&lt;li&gt;  Spin up and deploy our Pi-Hole Docker Container&lt;/li&gt;
&lt;li&gt;  Login to our Pi-Hole with a custom password&lt;/li&gt;
&lt;li&gt;  Connect our Windows Machine and Android Phone so they use the Pi-Hole for their DNS to provide the ad-blocking function&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's a PiHole?
&lt;/h2&gt;

&lt;p&gt;In short, the PiHole intercepts requests to the internet and blocks domains based on the sites listed in it's block list.&lt;/p&gt;

&lt;p&gt;By default, there are about 100,000 entries which is enough for most people to get decent protection from malicious websites and ads.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExaHJzMTZtaHQwczR5ZGk0bXJ5dGJ3Yjh2bW13Ymowb3IxZG5odXBjZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/njYrp176NQsHS/giphy-downsized-large.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExaHJzMTZtaHQwczR5ZGk0bXJ5dGJ3Yjh2bW13Ymowb3IxZG5odXBjZyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/njYrp176NQsHS/giphy-downsized-large.gif" width="480" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will speed up your network and make it safer overall by stopping unwanted traffic at the source with some extra added benefits.&lt;/p&gt;

&lt;p&gt;We'll look at how to increase this with number with third party block lists later on in this guide.&lt;/p&gt;




&lt;h2&gt;
  
  
  PiHole Project Page
&lt;/h2&gt;

&lt;p&gt;You can find a Docker version of most software and applications usually on their main website.&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%2Floxjifvj436o4a0sxugu.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%2Floxjifvj436o4a0sxugu.png" alt="Pihole Website 01" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pi-hole.net" rel="noopener noreferrer"&gt;https://pi-hole.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will usually link you to a project page on Docker Hub, GitHub or their own website to get further information and build instructions.&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%2Folh4ism7wu37cizxyhrq.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%2Folh4ism7wu37cizxyhrq.png" alt="Pihole Website 02" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Customise a Docker Compose file
&lt;/h2&gt;

&lt;p&gt;One of the best things about Docker is that a lot of the images are set up with customisation in mind.&lt;/p&gt;

&lt;p&gt;Using Environmental Variables you can start the Docker container with certain settings such as a different port number or paths to Docker config folders.&lt;/p&gt;

&lt;p&gt;As we found on the website here is the default docker-compose.yml for PiHole&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3"

# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    # For DHCP it is recommended to remove these ports and instead add: network_mode: "host"
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "67:67/udp" # Only required if you are using Pi-hole as your DHCP server
      - "80:80/tcp"
    environment:
      TZ: 'America/Chicago'
      # WEBPASSWORD: 'set a secure password here or it will be random'
    # Volumes store your data between container upgrades
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    cap_add:
      - NET_ADMIN # Required if you are using Pi-hole as your DHCP server, else not needed
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We're going to make a few changes to this so that it works for our setup.&lt;/p&gt;


&lt;h2&gt;
  
  
  Notepad++ Text Editor
&lt;/h2&gt;

&lt;p&gt;We can use a text editor to make changes to the Docker Compose file as a quick and easy way to experiment.&lt;/p&gt;

&lt;p&gt;Personally I use Notepad++ as my text editor in Windows to help me to edit the Docker Compose file ready to be pasted into the terminal later.&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%2Fdgdlgyd3rspdy9ayl7i7.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%2Fdgdlgyd3rspdy9ayl7i7.png" alt="NotePad++ Docker Compose File" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can download it from here but if you don't want to install anything than you can use the trusty Notepad app built into Windows.&lt;/p&gt;


&lt;h2&gt;
  
  
  Set the container name
&lt;/h2&gt;

&lt;p&gt;In this section we're going to set the container name to be pihole&lt;/p&gt;

&lt;p&gt;We're also going to set the image we're going to download as the pi-hole image from the pihole repository.&lt;/p&gt;

&lt;p&gt;We'll use the latest tag to get the latest version of this image when we deploy the container.&lt;/p&gt;

&lt;p&gt;As an extra bonus we're also going to define the hostname as &lt;strong&gt;reprodevpihole&lt;/strong&gt; which will be used by this pi-hole instance. This will make management easier if you're running a few pi-holes.&lt;/p&gt;

&lt;p&gt;You can change this to one which makes sense for you.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    hostname: reprodevpihole
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Set the Ports and DNS
&lt;/h2&gt;

&lt;p&gt;In this section we're going to set the networking for this Docker container.&lt;/p&gt;

&lt;p&gt;I've found that you may have issues with your device resolving DNS or other Docker containers if you install Pihole on something like a Raspberry Pi.&lt;/p&gt;

&lt;p&gt;We can add the environmental variables for DNS and define these as 127.0.0.1, to use the local device to resolve and 8.8.8.8 to use Google servers to resolve as a backup.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    dns:
      - 127.0.0.1
      - 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;To help devices connect to use this as a DNS then it's also best that we define the IP of the device we are installing this on for Port 53.&lt;/p&gt;

&lt;p&gt;In this example it's 192.168.0.90 so that has been added to the lines for port 53.&lt;/p&gt;

&lt;p&gt;Go ahead and replace this with your own IP address as needed.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ports:
      - "192.168.0.90:53:53/tcp"
      - "192.168.0.90:53:53/udp"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Finally the port to connect to the Pihole Admin has been defined as 1010 on the host to map onto port 80 in the docker container.&lt;/p&gt;

&lt;p&gt;You can change this to one of your choosing by changing the number on the left to an unused port.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      - "67:67/udp"
      - "1010:80/tcp"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The ports section should now look like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    ports:
      - "192.168.0.90:53:53/tcp"
      - "192.168.0.90:53:53/udp"
      - "67:67/udp"
      - "1010:80/tcp"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The whole networking section should now look like this&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    dns:
      - 127.0.0.1
      - 8.8.8.8
    ports:
      - "192.168.0.90:53:53/tcp"
      - "192.168.0.90:53:53/udp"
      - "67:67/udp"
      - "1010:80/tcp"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Docker Networking can get quite complicated and we'll look at this in more detail at a later date.&lt;/p&gt;

&lt;p&gt;For now this should work for you to get started&lt;/p&gt;


&lt;h2&gt;
  
  
  Set the Environment Variables
&lt;/h2&gt;

&lt;p&gt;Setting the Environment Variables for a Docker container can help to speed up and create containers customised to your use case.&lt;/p&gt;
&lt;h3&gt;
  
  
  Set the Time Zone
&lt;/h3&gt;

&lt;p&gt;You can define the time zone using the &lt;strong&gt;TZ&lt;/strong&gt; variable in most docker compose files to make sure they work correctly.&lt;/p&gt;

&lt;p&gt;You can find a list of them here but for this example we've changed it to '&lt;strong&gt;Europe/London'&lt;/strong&gt; to match my settings&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment:
  TZ: 'Europe/London'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Replace your own time zone here to make sure it matches the city closest to your time zone.&lt;/p&gt;
&lt;h3&gt;
  
  
  Set the Web Admin Password
&lt;/h3&gt;

&lt;p&gt;You can also define the password that will be used to access the PiHole Admin later on.&lt;/p&gt;

&lt;p&gt;Make sure that you change the WEBPASSWORD environment variable in the docker compose file to a random secure password.&lt;/p&gt;

&lt;p&gt;e.g. from this one&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      WEBPASSWORD: 'a5up3r53cr3tpa33'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;to this one&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      WEBPASSWORD: 'yourownpassword'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This will be the password you use to access the PiHole Admin later on so make a note of it or comment it out.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    # WEBPASSWORD: 'a5up3r53cr3tpa33'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If you comment it out then one will be set randomly on first boot and you'll be able to find it in the terminal output from the logs.&lt;/p&gt;


&lt;h2&gt;
  
  
  Set the Docker Data Volume Paths
&lt;/h2&gt;

&lt;p&gt;The default for most Docker Compose files is to save the config files needed by the container in the running container for testing.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  volumes:
  - './etc-pihole:/etc/pihole'
  - './etc-dnsmasq.d:/etc/dnsmasq.d'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We need to replace the paths on the left with the location of the Pihole folder we created earlier to store this Docker Compose YAML file.&lt;/p&gt;

&lt;p&gt;The new volumes file for this example will now look like this.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  volumes:
  - '/home/reprodev/Files/AppData/Config/pihole/etc-pihole:/etc/pihole'
  - '/home/reprodev/Files/AppData/Config/pihole/etc-dnsmasq.d:/etc/dnsmasq.d'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's all of our changes to this file as the rest can stay the same.&lt;/p&gt;


&lt;h2&gt;
  
  
  Pihole Docker Compose File
&lt;/h2&gt;

&lt;p&gt;We've finally got our own customised YAML file for Pihole that we can use on any machine that has Docker installed.&lt;/p&gt;

&lt;p&gt;The one below is based on the one in our guide so yours may look a little different to this one in a few places.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: "3"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    hostname: piholevm
    dns:
      - 127.0.0.1
      - 8.8.8.8
    ports:
      - "192.168.0.90:53:53/tcp"
      - "192.168.0.90:53:53/udp"
      - "67:67/udp"
      - "1010:80/tcp"
    environment:
      TZ: 'Europe/London'
      WEBPASSWORD: 'a5up3r53cr3tpa33'
    volumes:
      - '/home/reprodev/Files/AppData/Config/pihole/etc-pihole:/etc/pihole'
      - '/home/reprodev/Files/AppData/Config/pihole/etc-dnsmasq.d:/etc/dnsmasq.d'
    cap_add:
      - NET_ADMIN
    restart:
      unless-stopped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Other than changing a few variables as needed, we have our own custom Docker Compose file for Pihole.&lt;/p&gt;

&lt;p&gt;We can now use this any time we want to spin up a docker container for Pihole with the settings we have added.&lt;/p&gt;

&lt;p&gt;Now that we have our customised Docker Compose file we need to get this saved into our Pihole Config folder.&lt;/p&gt;


&lt;h2&gt;
  
  
  Login to a Linux Shell
&lt;/h2&gt;

&lt;p&gt;To install Pihole and deploy the Docker container we'll need to login to a Linux Shell.&lt;/p&gt;

&lt;p&gt;Follow the instructions below to open the Linux Shell&lt;/p&gt;
&lt;h3&gt;
  
  
  If you're using Windows (WSL with Docker Desktop)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Open a Terminal and &lt;strong&gt;"Run as administrator"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fv6ik7jl3e6l5vfab5l0u.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%2Fv6ik7jl3e6l5vfab5l0u.png" alt="Login to Linux Shell 01" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the &lt;strong&gt;wsl&lt;/strong&gt; command to open a WSL shell
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl
&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%2F9xuajdf4gi33jzkmw6mw.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%2F9xuajdf4gi33jzkmw6mw.png" alt="Login to Linux Shell 02" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will open up a command prompt to the Linux distro you are installed alongside the Windows Subsystem for Linux.&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%2Fdwejddy4iwmyh30xov9j.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%2Fdwejddy4iwmyh30xov9j.png" alt="Login to Linux Shell 03" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  If you're using Linux (Raspberry Pi OS and more)
&lt;/h3&gt;

&lt;p&gt;Then just&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open a terminal&lt;/li&gt;
&lt;/ul&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%2Fs8e3wrvgxka8e57koa56.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%2Fs8e3wrvgxka8e57koa56.png" alt="Login to Linux Shell 04" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 This is where the Linux and Raspberry Pi users can rejoin as these commands will now be the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Type &lt;strong&gt;cd&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to change directory back to your Linux user home directory&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd
&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%2F1kca62twnx0rqhwyjtrd.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%2F1kca62twnx0rqhwyjtrd.png" alt="Login to Linux Shell 05" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the &lt;strong&gt;pwd&lt;/strong&gt; command to check which folder you are currently in&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pwd
&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%2Fkejbfvub471skjo04kgo.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%2Fkejbfvub471skjo04kgo.png" alt="Login to Linux Shell 06" width="800" height="404"&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%2Fw2h41z3aqdawfu73nl2y.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%2Fw2h41z3aqdawfu73nl2y.png" alt="Login to Linux Shell 07" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should be in /home/(yourusername)&lt;/p&gt;


&lt;h2&gt;
  
  
  Set up your Docker Config folders
&lt;/h2&gt;

&lt;p&gt;As this may be your first Docker container you'll need to settle on a folder structure for Docker to store the config files and folders outside of Docker.&lt;/p&gt;

&lt;p&gt;In this guide and for most of our guides we'll be using the following folder to store all of our config files.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/$yourusername/docker/Files/AppData/Config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It’s best that we start with a folder structure to make it easier to organise and back up the data volumes. This is the folder structure I’m currently using between my different machines running docker.&lt;/p&gt;

&lt;p&gt;Once you've started, you can then use this structure for all your Docker config folders. You just need to replace the name of the application or service.&lt;/p&gt;

&lt;p&gt;We'll use this folder later on but for now let's go and get our instructions for the PiHole Docker container&lt;/p&gt;


&lt;h3&gt;
  
  
  Make Docker Persistent Config Directories
&lt;/h3&gt;

&lt;p&gt;We can now start to make up the folders for Docker, to store it's config files to persist and save.&lt;/p&gt;

&lt;p&gt;These folders will be stored outside of the docker container and won't be deleted when the container is destroyed or recreated.&lt;/p&gt;

&lt;p&gt;Type &lt;strong&gt;cd&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to change directory back to your Linux user home directory&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd
&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%2Frmr1nycx45fgmuxa3cqn.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%2Frmr1nycx45fgmuxa3cqn.png" alt="Docker Persistent 01" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the &lt;strong&gt;pwd&lt;/strong&gt; command to check which folder you are currently in&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pwd
&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%2Fhzv99bro4xneae99kg71.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%2Fhzv99bro4xneae99kg71.png" alt="Docker Persistent 02" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should be in /home/(yourusername)&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/reprodev/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run the below commands one at a time, to create the folder structure&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir docker
cd docker
mkdir Files
cd Files
mkdir AppData
cd AppData
mkdir Config
cd Config
&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%2Fxi24z3lmi5mhsnd702mz.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%2Fxi24z3lmi5mhsnd702mz.png" alt="Docker Persistent 03" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the below commands to create the Pihole config folder&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir pihole
cd pihole
&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%2Fon0dnrjwru9ycdib2m46.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%2Fon0dnrjwru9ycdib2m46.png" alt="Docker Persistent 04" width="800" height="403"&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%2Fsj5i1x4d0xzyfg5mjzwl.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%2Fsj5i1x4d0xzyfg5mjzwl.png" alt="Docker Persistent 05" width="800" height="403"&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%2Fbnsq4kon9itewhwo8pt7.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%2Fbnsq4kon9itewhwo8pt7.png" alt="Docker Persistent 06" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We should now be in the pihole directory we just created.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/reprodev/docker/Files/AppData/Config/pihole
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run the &lt;strong&gt;pwd&lt;/strong&gt; command to check which folder you're currently in&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pwd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We can now create our Docker Compose YAML file.&lt;/p&gt;

&lt;p&gt;You can use the newly created Config folder to store all of your docker config files in future and easily find them all in one place.&lt;/p&gt;


&lt;h2&gt;
  
  
  Use Nano Text Editor to create the Docker Compose YAML File
&lt;/h2&gt;

&lt;p&gt;Before we can run our Docker container we need to get the Docker Compose YAML file text we customised, into a place where Docker can find it.&lt;/p&gt;

&lt;p&gt;We can use Nano to do this.&lt;/p&gt;
&lt;h3&gt;
  
  
  Open Nano Text Editor
&lt;/h3&gt;

&lt;p&gt;Linux has a few text editors to choose from and just like my preference for Notepad++ in Windows. I have the same preference for Nano editor over the other popular editors like Vim.&lt;/p&gt;

&lt;p&gt;This is just my personal preference as I find it the easiest to use but feel free to use your Linux Text Editor of choice.&lt;/p&gt;

&lt;p&gt;We're going to use the Nano Text Editor as it's built into Ubuntu, which is in turn the default Linux distribution installed as part of Windows Subsystem for Linux (WSL) install.&lt;/p&gt;

&lt;p&gt;This means it will also be part of the Raspberry Pi OS and Ubuntu if you're running Linux on bare metal or as a virtual machine.&lt;/p&gt;

&lt;p&gt;We should still be in the &lt;strong&gt;pihole&lt;/strong&gt; folder we created in the last step. We can open Nano and create a blank file to write in at the same time.&lt;/p&gt;

&lt;p&gt;Run the below command to make the Docker Compose YAML file&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nano docker-compose.yml
&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%2F7x13y3xbwzv6eugco6xh.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%2F7x13y3xbwzv6eugco6xh.png" alt="Nano Editor 01" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will open Nano and create a blank file called docker-compose.yml&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%2Fc3fe5qlppv8016whppqg.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%2Fc3fe5qlppv8016whppqg.png" alt="Nano Editor 02" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can now paste the Docker Compose file contents we customised earlier in Notepad++&lt;/p&gt;

&lt;p&gt;Open up Notepad++ and select all the text and copy it to the clipboard. You can either use the normal keyboard shortcuts or right click to copy like normal.&lt;/p&gt;

&lt;p&gt;Go back to the Nano and Right Click to paste all of the text into the blank file.&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%2Falpqxp1fenuf38r176ap.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%2Falpqxp1fenuf38r176ap.png" alt="Nano Editor 03" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The formatting should be correct and you can scroll up and down to make any corrections if you need to.&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%2Fs432yz1dpqy4jjhw18aq.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%2Fs432yz1dpqy4jjhw18aq.png" alt="Nano Editor 04" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you're happy with the text then use the keyboard shortcut below to save the file&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl+S
&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%2Fyo0zpm2hvtxvrul1k1v5.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%2Fyo0zpm2hvtxvrul1k1v5.png" alt="Nano Editor 05" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use the below keyboard shortcut to exit Nano and return to the Linux command line&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl+X
&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%2Fjd6z26l8riqez1b6d6gu.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%2Fjd6z26l8riqez1b6d6gu.png" alt="Nano Editor 06" width="800" height="375"&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%2Fwl0kjyzsiyhgwk6ippdo.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%2Fwl0kjyzsiyhgwk6ippdo.png" alt="Nano Editor 07" width="800" height="375"&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%2F9mzurqu73p6lw46jzal7.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%2F9mzurqu73p6lw46jzal7.png" alt="Nano Editor 08" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The docker-compose.yml is also linked below in the ReproDev Recipes Github :&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/reprodev" rel="noopener noreferrer"&gt;
        reprodev
      &lt;/a&gt; / &lt;a href="https://github.com/reprodev/reprodev-recipes" rel="noopener noreferrer"&gt;
        reprodev-recipes
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ReproDev Recipes is a repository of code snippets and docker compose files from reprodev.com
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Welcome to ReproDev Recipes!&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;This repository contains a collection of code snippets and examples that provide step-by-step instructions for solving common programming problems.&lt;/h2&gt;
&lt;/div&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;This is a companion piece to guides and articles on &lt;a href="https://reprodev.com" rel="nofollow noopener noreferrer"&gt;ReproDev.com&lt;/a&gt;
&lt;/h2&gt;
&lt;/div&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;This repository is licensed under the MIT License. See the LICENSE file for details.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;To use ReproDev Recipes, simply browse the repository and select the recipe that best matches your needs. Each recipe is located in its own folder, and includes a detailed README file with instructions and code snippets.&lt;/p&gt;

&lt;p&gt;You are free to use, modify, and distribute the code in this repository, as long as you include a copy of the MIT License in your project.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;If you would like to contribute to ReproDev Recipes, we welcome your pull requests! To get started, simply fork the repository, create a new branch for your changes, and submit a pull request with a clear…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/reprodev/reprodev-recipes" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;h2&gt;
  
  
  Spin Up and Deploy Your Container
&lt;/h2&gt;

&lt;p&gt;Well we've done all the hard work so we're finally ready to spin up and deploy the container.&lt;/p&gt;

&lt;p&gt;Make sure you are in the same folder as your docker-compose.yml file and run the below command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&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%2Fx8uwhaho4zudxyd9rgps.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%2Fx8uwhaho4zudxyd9rgps.png" alt="Deploy Pihole 01" width="800" height="375"&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%2F6a4rchabkf7enx1nv618.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%2F6a4rchabkf7enx1nv618.png" alt="Deploy Pihole 02" width="800" height="375"&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%2Fud1rll1nceu91sv97rq1.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%2Fud1rll1nceu91sv97rq1.png" alt="Deploy Pihole 03" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will start up the Docker container in detached mode so it's time to grab a coffee as this may take 5 to 10 minutes depending on your system.&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%2Fzvb55vnu17jxtp9b0v2g.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%2Fzvb55vnu17jxtp9b0v2g.png" alt="Deploy Pihole 04" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you're back to the command line then your Docker container has been deployed and should be running.&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%2Fb59am2i68915wku01bp7.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%2Fb59am2i68915wku01bp7.png" alt="Deploy Pihole 05" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can check this by running the below command&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps
&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%2Ft59s7ogx0wkkbb48yumy.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%2Ft59s7ogx0wkkbb48yumy.png" alt="Deploy Pihole 06" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will check all running docker containers and we should be able to see &lt;strong&gt;pihole&lt;/strong&gt; as one of the running containers&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%2Fwlh0a36e8mp2eg85bzdd.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%2Fwlh0a36e8mp2eg85bzdd.png" alt="Deploy Pihole 07" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're on Windows using Docker Desktop you'll see this running in the Containers section as well.&lt;/p&gt;

&lt;p&gt;You can stop, delete or even use command line to directly interact with a running Docker container from here.&lt;/p&gt;

&lt;p&gt;It's also a good place to get the same stats you'd get from the command line such as uptime and docker hostnames at a quick glance.&lt;/p&gt;

&lt;p&gt;We can now go to the IP of our Docker machine using the 1010/admin and we should see the PiHole login page.&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%2F7z59ogs8in4e1bjgfvw7.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%2F7z59ogs8in4e1bjgfvw7.png" alt="Deploy Pihole 08" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's no username but there is a password.&lt;/p&gt;

&lt;p&gt;The password will be the same one that you set in the Docker Compose file earlier.&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%2Ftuslscp9hebuoyw4bzca.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%2Ftuslscp9hebuoyw4bzca.png" alt="Deploy Pihole 09" width="656" height="706"&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%2Fhhxzfb78h2d2xwy49duh.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%2Fhhxzfb78h2d2xwy49duh.png" alt="Deploy Pihole 10" width="627" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you can login and see this page then you've successfully installed Pihole.&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%2Fw1zd1bz22fsm96pstilx.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%2Fw1zd1bz22fsm96pstilx.png" alt="Deploy Pihole 11" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's go ahead and start adding some clients so we can start using it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Adding Clients to the Pihole
&lt;/h2&gt;

&lt;p&gt;We should now have Pihole deployed with the default adlist but we haven’t got any machines using this yet.&lt;/p&gt;

&lt;p&gt;You can use Pihole to replace the DNS for your whole network by changing the DNS settings in your router.&lt;/p&gt;

&lt;p&gt;That does depend on you being able to change those settings and usually it's easier to do this on each device you're using while you're getting to grips with it.&lt;/p&gt;

&lt;p&gt;Especially if you have other people on the network who may not appreciate you adding their favourite site to your blocklist or it's down for maintenance.&lt;/p&gt;
&lt;h3&gt;
  
  
  Joining a client using DNS replacement
&lt;/h3&gt;

&lt;p&gt;To join one of your devices to the running Pihole we have to change the DNS setting on the device in the Network settings.&lt;/p&gt;

&lt;p&gt;To get a device to use the Pi-Hole as it’s DNS for ad blocking then we need to set the DNS for a device on the network to use the IP Address of the device running Pihole e.g. 192.168.0.177&lt;/p&gt;

&lt;p&gt;On Windows 11, you can do this by going to Network and Internet settings&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%2Ftcjv66ffchaf8gijpc8c.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%2Ftcjv66ffchaf8gijpc8c.png" alt="Add Client Win11 01" width="373" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find the network connection in this case it's HomeWifi and click Wi-Fi in the list&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%2Fk4omxwa27sdjvkty903i.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%2Fk4omxwa27sdjvkty903i.png" alt="Add Client Win11 02" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click properties on your Wifi&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%2Fops0r2aqrl9ule469x1o.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%2Fops0r2aqrl9ule469x1o.png" alt="Add Client Win11 03" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Edit Next to your DNS or IP assignment if you want to set a Static IP which we'll be doing&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%2Fatvtor2u92c7txi6qlqa.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%2Fatvtor2u92c7txi6qlqa.png" alt="Add Client Win11 04" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is currently set to the Google DNS servers of 8.8.8.8 and 8.8.4.4. We're going to change this.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Change the IP Settings&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Click the dropdown to Manual and make sure the Preferred DNS is set to the same IP address as your Pi-Hole e.g. 192.168.0.177. Make sure you click Save.&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%2F3y25kfco6owiupo8q7rh.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%2F3y25kfco6owiupo8q7rh.png" alt="Add Client Win11 05" width="429" height="967"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Change just the DNS settings&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Click the dropdown to change from Auto to Manual and change the preferred DNS to your Pi-Hole IP address.&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%2Fwf68k1wqvqrasxnzu521.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%2Fwf68k1wqvqrasxnzu521.png" alt="Add Client Win11 06" width="410" height="667"&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%2F3d0nnj64maaz7cvn5rto.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%2F3d0nnj64maaz7cvn5rto.png" alt="Add Client Win11 07" width="379" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to google.com and run a search for whatever you want on that machine. It may take a second longer than normal but go to a website from the search results.&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%2Fh8hfgfk2tnyvpwit5vsf.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%2Fh8hfgfk2tnyvpwit5vsf.png" alt="Check Working 01" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, go back to the PiHole and you should see some Hits and Blocked traffic.&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%2F6e7g4s27su3shs1y8208.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%2F6e7g4s27su3shs1y8208.png" alt="Check Working 02" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If there's nothing showing then check your DNS on the device, disconnect the wifi or restart and try again.&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%2Fwynse3cwxj5ju9v1noc5.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%2Fwynse3cwxj5ju9v1noc5.png" alt="Check Working 03" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can add each of your devices now to this DNS in the same way like your mobile phones, Smart TV and other internet devices to stop tracking, ads and much more.&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%2F7z2721mgmr9ej8d3dtg0.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%2F7z2721mgmr9ej8d3dtg0.png" alt="Check Working 04" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, you've deployed Pihole in a Docker container with your own custom Docker Compose file and connected up a device to use it for it's DNS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeW5oOWRqeWpoMDU4cG00dGNzbGx6Njg2NGd3Yndwb3ZneDZ1NzBjeiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xT1Ra2Ik3FEyvw526c/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeW5oOWRqeWpoMDU4cG00dGNzbGx6Njg2NGd3Yndwb3ZneDZ1NzBjeiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xT1Ra2Ik3FEyvw526c/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a future guide, we'll be looking at how we can use the Local DNS feature in Pihole with NGINX Proxy Manager to access your local services with a name and not an IP address.&lt;/p&gt;

&lt;p&gt;Next up, we'll be looking at another way to deploy and manage Docker Containers using a GUI interface.&lt;/p&gt;

&lt;p&gt;We're going to install a local service using Docker that will let us choose from a list of different Docker containers. This service will then deploy it for us without having to use the command line.&lt;/p&gt;



&lt;p&gt;In Part 4, we 're going to be looking into Portainer and how we can use it to simplify the Docker experience.&lt;/p&gt;



&lt;p&gt;For more Docker Compose files check out &lt;strong&gt;ReproDev Recipes&lt;/strong&gt; on GitHub with Docker Compose files for you to try out yourself&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/reprodev" rel="noopener noreferrer"&gt;
        reprodev
      &lt;/a&gt; / &lt;a href="https://github.com/reprodev/reprodev-recipes" rel="noopener noreferrer"&gt;
        reprodev-recipes
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      ReproDev Recipes is a repository of code snippets and docker compose files from reprodev.com
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Welcome to ReproDev Recipes!&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;This repository contains a collection of code snippets and examples that provide step-by-step instructions for solving common programming problems.&lt;/h2&gt;
&lt;/div&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;This is a companion piece to guides and articles on &lt;a href="https://reprodev.com" rel="nofollow noopener noreferrer"&gt;ReproDev.com&lt;/a&gt;
&lt;/h2&gt;
&lt;/div&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;License&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;This repository is licensed under the MIT License. See the LICENSE file for details.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;To use ReproDev Recipes, simply browse the repository and select the recipe that best matches your needs. Each recipe is located in its own folder, and includes a detailed README file with instructions and code snippets.&lt;/p&gt;

&lt;p&gt;You are free to use, modify, and distribute the code in this repository, as long as you include a copy of the MIT License in your project.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;If you would like to contribute to ReproDev Recipes, we welcome your pull requests! To get started, simply fork the repository, create a new branch for your changes, and submit a pull request with a clear…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/reprodev/reprodev-recipes" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;





&lt;p&gt;Check out the guide below if you want more information on What Docker is and how to get started&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/reprodev" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F1280175%2Fa67e6296-986b-4f40-ac21-345dd688529b.png" alt="reprodev"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/reprodev/get-started-with-docker-part-1-an-intro-to-docker-3b81" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Get Started with Docker - Part 1 : An Intro to Docker&lt;/h2&gt;
      &lt;h3&gt;Repro Dev ・ Feb 23 '24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#docker&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>tutorial</category>
      <category>pihole</category>
    </item>
    <item>
      <title>GIPHY Linker : An easier way to embed GIFs into your blog</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Fri, 01 Mar 2024 10:30:00 +0000</pubDate>
      <link>https://dev.to/reprodev/giphy-linker-an-easier-way-to-embed-gifs-into-your-blog-17bo</link>
      <guid>https://dev.to/reprodev/giphy-linker-an-easier-way-to-embed-gifs-into-your-blog-17bo</guid>
      <description>&lt;p&gt;One of my main reasons for starting a blog was to practice me some Markdown and HTML.&lt;/p&gt;

&lt;p&gt;In theory this is a great idea but when I've learnt something interesting when moving over articles from my personal blog to my Dev.To blog.&lt;/p&gt;

&lt;p&gt;My personal blog is built on the Ghost CRM and can handle embeds from sites with iFrames natively by using Markdown and a bit of extra HTML.&lt;/p&gt;

&lt;p&gt;Dev.To handles this slightly differently so when I started posting on here I came up against a little trouble.&lt;/p&gt;

&lt;p&gt;I found a guide from 2020 by Tomo Ernst, which I add to my reading list and was going back and forth to look to get the syntax and wrap around code I needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/timo_ernst/how-to-add-giphy-gifs-into-dev-to-posts-17jd"&gt;https://dev.to/timo_ernst/how-to-add-giphy-gifs-into-dev-to-posts-17jd&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the code below which uses the direct share link from GIPHY.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$html = "&amp;amp;lt;img width=`"100%`" style=`"width:100%`" src=`"YOURGIPHYSHAREDLINK`"&amp;amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I spent a while manually writing out the lines of code to convert my built up GIPHY addiction or if I wanted to post something new.&lt;/p&gt;

&lt;p&gt;Then I realised. Wait a second. This can be automated. In Powershell.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeHB0bGcwNzR3YWFndDBxaTg1N2pib2E0anhma2hzcml3aDE0aXZiYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26uf6e111xR91QxLa/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeHB0bGcwNzR3YWFndDBxaTg1N2pib2E0anhma2hzcml3aDE0aXZiYyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/26uf6e111xR91QxLa/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  GIPHY Linker
&lt;/h2&gt;

&lt;p&gt;Introducing GIPHY-Linker, a GUI tool built in Powershell to automatically create the correct embed from the Copy GIF Link to use in your Dev.To blog and much more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/reprodev/GIPHY-Linker/" rel="noopener noreferrer"&gt;https://github.com/reprodev/GIPHY-Linker/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can use this tool to convert GIPHY.com GIF Sharing links into a line of Markdown with HTML code for blogs and some Markdown editors.&lt;/p&gt;

&lt;p&gt;This will save you time and frustration for when you get in a writing flow.&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%2F1tfk3th1b6phfbtmj5u3.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%2F1tfk3th1b6phfbtmj5u3.png" alt="00-Giphy-Linker" width="482" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For now this tool is Windows only, sorry Linux family but that's in the works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Windows machine&lt;/li&gt;
&lt;li&gt;  Unrestricted Execution Policy in Powershell&lt;/li&gt;
&lt;li&gt;  GIPHY link or just a GIF link&lt;/li&gt;
&lt;li&gt;  Blog or Markdown Editor&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Instructions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Download the .PS1 file from GitHub and Run With Powershell&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to giphy.com or your fave GIF site and find a GIF&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fewi0p0m9jt6h4nch2c9q.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%2Fewi0p0m9jt6h4nch2c9q.png" alt="01-Giphy-Linker" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Click Share on the GIF and copy the 'Copy GIF Link'&lt;/li&gt;
&lt;/ul&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%2Fd2jduf48mqhfuinumdg1.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%2Fd2jduf48mqhfuinumdg1.png" alt="02-Giphy-Linker" width="800" height="530"&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%2F1geiwu5bioodz8y5ysls.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%2F1geiwu5bioodz8y5ysls.png" alt="03-Giphy-Linker" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Paste the link into the box in GIPHY Linker&lt;/li&gt;
&lt;/ul&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%2Fdwk2gepklf42tkbf0ct1.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%2Fdwk2gepklf42tkbf0ct1.png" alt="04-Giphy-Linker" width="482" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Click 'Convert into Markdown with HTML' to create the HTML code for your Blog with your chosen GIF&lt;/li&gt;
&lt;/ul&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%2Fuhrt9pr7hfels7zno0az.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%2Fuhrt9pr7hfels7zno0az.png" alt="05-Giphy-Linker" width="482" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Use 'Copy HTML' to copy the link to your clipboard&lt;/li&gt;
&lt;/ul&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%2Fsh9vhmyxfiymp9ruuc3z.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%2Fsh9vhmyxfiymp9ruuc3z.png" alt="06-Giphy-Linker" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Paste your HTML line of code into your blog like normal&lt;/li&gt;
&lt;/ul&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%2F8en1e2riotq6jhq0ps1v.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%2F8en1e2riotq6jhq0ps1v.png" alt="07-Giphy-Linker" width="800" height="654"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Use 'Clear' to reset the form and start again&lt;/li&gt;
&lt;/ul&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%2F7p2vk3vv7bese6ph56pz.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%2F7p2vk3vv7bese6ph56pz.png" alt="08-Giphy-Linker" width="482" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  - Meme without having to worry so much
&lt;/h2&gt;

&lt;p&gt;This project is the first of a few possibly useful to me and maybe useful to you tools I'll be releasing on my GitHub and here on Dev.To. You'll also be able to find them by using the Portfolio tags on my site.&lt;/p&gt;

&lt;p&gt;Hopefully, you'll get some use out of this and as long as you are using Windows, Powershell and an Unrestricted Execution Policy you can run it.&lt;/p&gt;

&lt;p&gt;This tool is based on some other GUI clipboard tools I've made in Powershell over the past few years. It now takes pride of place in my blogging toolkit for my Dev.To blog and beyond.&lt;/p&gt;

&lt;p&gt;Lazyness and automation wins again.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeHM5em54OTUzdmIzMjBudWc4bGc5ZXA5NWQyYmh4MGxnYzJyN2oyOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/HzPtbOKyBoBFsK4hyc/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeHM5em54OTUzdmIzMjBudWc4bGc5ZXA5NWQyYmh4MGxnYzJyN2oyOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/HzPtbOKyBoBFsK4hyc/giphy.gif" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;

</description>
      <category>coding</category>
      <category>automation</category>
      <category>html</category>
      <category>markdown</category>
    </item>
    <item>
      <title>Get Started with Docker - Part 2b: Windows 11 Install Guide (WSL and Docker Desktop Edition)</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Thu, 29 Feb 2024 10:30:00 +0000</pubDate>
      <link>https://dev.to/reprodev/get-started-with-docker-part-2b-windows-11-install-guide-wsl-and-docker-desktop-edition-2o2f</link>
      <guid>https://dev.to/reprodev/get-started-with-docker-part-2b-windows-11-install-guide-wsl-and-docker-desktop-edition-2o2f</guid>
      <description>&lt;p&gt;Running Docker on Windows can be a bit trickier than on Linux but on the flipside can be easier to maintain.&lt;/p&gt;

&lt;p&gt;Docker on Windows was mine and many other people’s first step into the Docker ecosystem.&lt;/p&gt;

&lt;p&gt;In this guide, we'll install &lt;strong&gt;Docker&lt;/strong&gt; onto a Windows 11 machine using &lt;strong&gt;Docker Desktop&lt;/strong&gt; and &lt;strong&gt;WSL2 (Windows Subsystem for Linux)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’re going to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Install &lt;strong&gt;WSL (Windows Subsystem for Linux)&lt;/strong&gt; and the default &lt;strong&gt;Ubuntu&lt;/strong&gt; distribution using &lt;strong&gt;Windows PowerShell&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Update &lt;strong&gt;WSL1&lt;/strong&gt; to &lt;strong&gt;WSL2&lt;/strong&gt; (if on Windows 10)&lt;/li&gt;
&lt;li&gt;  Install &lt;strong&gt;Docker&lt;/strong&gt; and all it’s required components like &lt;strong&gt;Docker Compose&lt;/strong&gt; using &lt;strong&gt;Docker Desktop&lt;/strong&gt; for Windows&lt;/li&gt;
&lt;li&gt;  Download a &lt;strong&gt;Docker Image&lt;/strong&gt; and run a test &lt;strong&gt;Docker Container&lt;/strong&gt; using the &lt;strong&gt;WSL&lt;/strong&gt; Shell&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If you're looking to get this installed on Linux especially the Raspberry Pi then check out our &lt;a href="https://dev.to/reprodev/get-started-with-docker-part-2a-raspberry-pi-linux-install-guide-4hl9"&gt;*&lt;strong&gt;&lt;em&gt;"Get Started with Docker - Part 2a : Raspberry Pi Install Guide"&lt;/em&gt;&lt;/strong&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What’s WSL?
&lt;/h2&gt;

&lt;p&gt;The Windows Subsystem for Linux (WSL) is a full Linux distribution that runs underneath the Windows 10 and 11 operating system. Once installed you can log into a WSL shell using your terminal and send Linux commands like you were using a Linux machine. Machines like a Raspberry Pi.&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%2Fzp96l7gs4h9a7l2hbsku.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%2Fzp96l7gs4h9a7l2hbsku.jpg" alt="Pimp My Windows OS Xzibit Meme" width="622" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real advantage to this is that you don’t need to use another application like VMWare Workstation to spin up a Linux Virtual Machine. It's also a great way to learn Linux command line. &lt;/p&gt;

&lt;p&gt;You can get more information on WSL in general from the official Microsoft Learn article linked below if you want to learn more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://learn.microsoft.com/en-us/windows/wsl/install" rel="noopener noreferrer"&gt;Install WSL with Microsoft Learn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExazduZ2w5ZXBuanl0Znd4NWNiNGlqOWU4cWs0NTZkcndzcDR1ajk4ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3ov9jDkkI1i8ZEgP7y/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExazduZ2w5ZXBuanl0Znd4NWNiNGlqOWU4cWs0NTZkcndzcDR1ajk4ZSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3ov9jDkkI1i8ZEgP7y/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can run Docker on Windows without installing WSL by using Hyper-V for Virtualization. However, you’ll get much better performance and compatibility overall if you use the WSL2 backend.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❓ Please Note: If your machine currently has Hyper-V installed and enabled then be aware this guide will switch off Hyper-V&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;We’re going to use &lt;strong&gt;Windows PowerShell&lt;/strong&gt; to get this installed in just one command&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click the &lt;strong&gt;Start Menu&lt;/strong&gt; and type &lt;strong&gt;‘powershell&lt;/strong&gt;' to find the app in the list&lt;/li&gt;
&lt;li&gt;  Left click &lt;strong&gt;“Run as administrator”&lt;/strong&gt; in the right hand menu to open this up as &lt;strong&gt;Administrator&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F5z0sbn8q4e8ta4yrtiqd.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%2F5z0sbn8q4e8ta4yrtiqd.png" alt="WSL Install 01" width="800" height="784"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click &lt;strong&gt;Yes&lt;/strong&gt; on the &lt;strong&gt;User Account Control&lt;/strong&gt; notification to continue&lt;/li&gt;
&lt;/ul&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%2F24zjxikenhtfk1jicbws.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%2F24zjxikenhtfk1jicbws.png" alt="WSL Install 02" width="502" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click &lt;strong&gt;Yes&lt;/strong&gt; on the &lt;strong&gt;User Account Control&lt;/strong&gt; notification to open &lt;strong&gt;PowerShell&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fsj5h7qtf00r7oio4ipvx.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%2Fsj5h7qtf00r7oio4ipvx.png" alt="WSL Install 03" width="503" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You now have a &lt;strong&gt;Windows PowerShell&lt;/strong&gt; command prompt running as an &lt;strong&gt;Administrator&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Ffkjhx2zqhact76nt8x7l.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%2Ffkjhx2zqhact76nt8x7l.png" alt="WSL Install 04" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the below command and &lt;strong&gt;Press Enter&lt;/strong&gt; to start the install
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --install
&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%2Fbea4kczk5qvjzeeo1vxq.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%2Fbea4kczk5qvjzeeo1vxq.png" alt="WSL Install 05" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This command will enable a few optional &lt;strong&gt;Windows&lt;/strong&gt; features automatically&lt;/li&gt;
&lt;li&gt;  First up, it will install and enable the &lt;strong&gt;Virtual Machine Platform&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fsa2xc8xcv3rj9cjjzldr.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%2Fsa2xc8xcv3rj9cjjzldr.png" alt="WSL Install 06" width="800" height="382"&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%2Fvdphu1asyvb50j9ys5eh.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%2Fvdphu1asyvb50j9ys5eh.png" alt="WSL Install 07" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Then it will install and enable the &lt;strong&gt;Windows Subsystem for Linux&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fxdc042acd7s4rara9t28.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%2Fxdc042acd7s4rara9t28.png" alt="WSL Install 08" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Finally, it'll install and download the Default Linux distribution provided by &lt;strong&gt;Microsoft&lt;/strong&gt; for WSL&lt;/li&gt;
&lt;li&gt;  The Default distribution at time of writing is &lt;strong&gt;Ubuntu 22.04.01 LTS&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fd9fu3v4y98ahcmagxc2w.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%2Fd9fu3v4y98ahcmagxc2w.png" alt="WSL Install 09" width="800" height="382"&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%2F9bu7x6wumdpem0ffv1y0.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%2F9bu7x6wumdpem0ffv1y0.png" alt="WSL Install 10" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Restart&lt;/strong&gt; your machine from the &lt;strong&gt;Start Menu&lt;/strong&gt; to complete the install&lt;/li&gt;
&lt;/ul&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%2Frpi0hnyvs1bs9lwlfkyg.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%2Frpi0hnyvs1bs9lwlfkyg.png" alt="WSL Install 11" width="800" height="873"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You’ll get a screen saying saying &lt;strong&gt;“Configuring Windows”&lt;/strong&gt; or &lt;strong&gt;“Adding Features"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Once rebooted, go ahead and log back in to &lt;strong&gt;Windows&lt;/strong&gt; to continue the installation.&lt;/li&gt;
&lt;li&gt;  Wait a few minutes and a command prompt window will pop up up like below with a title e.g. &lt;strong&gt;Ubuntu&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&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%2Fg95puy0tcd1djlplwsr9.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%2Fg95puy0tcd1djlplwsr9.png" alt="WSL Install 12" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This will launch &lt;strong&gt;Ubuntu&lt;/strong&gt; for the first time.&lt;/li&gt;
&lt;li&gt;  You'll need to set a &lt;strong&gt;Username&lt;/strong&gt; and &lt;strong&gt;password&lt;/strong&gt; for your WSL installation.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 This can be different from your *&lt;strong&gt;&lt;em&gt;Windows&lt;/em&gt;&lt;/strong&gt;* *&lt;strong&gt;&lt;em&gt;username&lt;/em&gt;&lt;/strong&gt;* as they are not connected but there's no issue if they are the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  In this example, we'll set the &lt;strong&gt;UNIX username&lt;/strong&gt; as &lt;strong&gt;reprodev&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  Type your &lt;strong&gt;username&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to continue&lt;/li&gt;
&lt;/ul&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%2F7743w14paxg910qf3xuu.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%2F7743w14paxg910qf3xuu.png" alt="WSL Install 13" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Set a &lt;strong&gt;New password&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F67xkx5jtf4jizam5xzq8.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%2F67xkx5jtf4jizam5xzq8.png" alt="WSL Install 14" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Retype&lt;/strong&gt; the &lt;strong&gt;New password&lt;/strong&gt; to confirm&lt;/li&gt;
&lt;/ul&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%2F8x8rdqvxmyy4h5123at6.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%2F8x8rdqvxmyy4h5123at6.png" alt="WSL Install 15" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Press Enter&lt;/strong&gt; and as long as the passwords match, then it'll be updated&lt;/li&gt;
&lt;li&gt;  You'll get a message with &lt;strong&gt;"Installation successful!"&lt;/strong&gt; to wrap up the &lt;strong&gt;Ubuntu&lt;/strong&gt; setup in &lt;strong&gt;WSL&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F121m6s5cvv8ycgpgbs7y.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%2F121m6s5cvv8ycgpgbs7y.png" alt="WSL Install 16" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  After a minute or so you'll be taken to the &lt;strong&gt;Ubuntu&lt;/strong&gt; command line&lt;/li&gt;
&lt;/ul&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%2Ff7l8ivqdf7xcz2twit40.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%2Ff7l8ivqdf7xcz2twit40.png" alt="WSL Install 17" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  We'll be getting more familiar with this soon but for now type the below command to &lt;strong&gt;exit&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to close this window
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exit
&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%2Frpcurfzkqtuevqr5cobh.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%2Frpcurfzkqtuevqr5cobh.png" alt="WSL Install 18" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Check and Test the WSL Installation
&lt;/h2&gt;

&lt;p&gt;Before we get onto the Docker Desktop installation we need to take a moment to check that WSL and Ubuntu have installed correctly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open up &lt;strong&gt;Windows PowerShell&lt;/strong&gt; again as an &lt;strong&gt;Administrator&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F3k1dh7fs8mgafv4le592.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%2F3k1dh7fs8mgafv4le592.png" alt="WSL Install 19" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the below command to confirm that &lt;strong&gt;WSL&lt;/strong&gt; has been installed correctly
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --status
&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%2F1zs18ohg0xizkdkndj5j.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%2F1zs18ohg0xizkdkndj5j.png" alt="WSL Install 20" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You should see the &lt;strong&gt;Default&lt;/strong&gt; &lt;strong&gt;Distribution&lt;/strong&gt; as &lt;strong&gt;Ubuntu&lt;/strong&gt; and the &lt;strong&gt;Default&lt;/strong&gt; &lt;strong&gt;Version 2 for WSL&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fxkkz46hrfjfazynxxzyq.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%2Fxkkz46hrfjfazynxxzyq.png" alt="WSL Install 21" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ2phejN3MGg2dG9ud21weDVweTY1a2VhM3N3ZTZ0NzFyZzMzdWx4aCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xT5LMHEcVODxAwrxW8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ2phejN3MGg2dG9ud21weDVweTY1a2VhM3N3ZTZ0NzFyZzMzdWx4aCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/xT5LMHEcVODxAwrxW8/giphy.gif" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, we're halfway there. We’ve installed Linux on Windows using Windows PowerShell on Windows 11.&lt;/p&gt;




&lt;h2&gt;
  
  
  Update WSL1 to WSL2 (For Windows 10)
&lt;/h2&gt;

&lt;p&gt;The latest version of Windows Subsystem for Linux is WSL2, if you don’t update now you’ll get an error when starting Docker Desktop later on.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If you're using Windows 11, then you can skip ahead to the next section to install Docker Desktop as you'll have WSL2 set as default.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;If you're using Windows 10 then you may have to update your WSL version manually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXlhdDlkcXA2eXR3ZDBxaGJ1OGx4c2tndWZsMWNkZDhtZ3NrdDR1ciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2dbYSHcl7k5tZCu5Co/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXlhdDlkcXA2eXR3ZDBxaGJ1OGx4c2tndWZsMWNkZDhtZ3NrdDR1ciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/2dbYSHcl7k5tZCu5Co/giphy.gif" width="480" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the below command and run as an &lt;strong&gt;Administrator&lt;/strong&gt; in &lt;strong&gt;Windows PowerShell&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Press Enter&lt;/strong&gt; to start the update.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl --update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Once completed you'll need to reboot and then you can install &lt;strong&gt;Docker Desktop&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Install Docker on Windows with Docker Desktop
&lt;/h2&gt;

&lt;p&gt;Now that we've installed WSL2 on Windows, we can get started on the Docker part of this installation and get those containers running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWNpb2Jnemxvenpxd3U5bjJ6cXBwMmZ0YWE3YjJjZXVvdGN6engwOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3o6MbjG9edmvKzqzte/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWNpb2Jnemxvenpxd3U5bjJ6cXBwMmZ0YWE3YjJjZXVvdGN6engwOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3o6MbjG9edmvKzqzte/giphy.gif" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open a Web Browser, go to &lt;a href="https://docker.com" rel="noopener noreferrer"&gt;&lt;strong&gt;Docker.com&lt;/strong&gt;&lt;/a&gt; and download the latest &lt;strong&gt;Docker Desktop for Windows&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Flsx9n8n54v7q3qlar5xw.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%2Flsx9n8n54v7q3qlar5xw.png" alt="Docker Desktop Windows 11 Install 01" width="684" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click the button on the Homepage to start the download of "&lt;strong&gt;Docker Desktop Installer.exe"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fz3hbrilgipe6d1calu23.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%2Fz3hbrilgipe6d1calu23.png" alt="Docker Desktop Windows 11 Install 02" width="421" height="161"&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%2Fb5karnv53sry174qf9ij.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%2Fb5karnv53sry174qf9ij.png" alt="Docker Desktop Windows 11 Install 03" width="387" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open your Downloads folder and double click the executable once finished downloading.&lt;/li&gt;
&lt;/ul&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%2Fofo6en8ckxe3ny1g5p8a.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%2Fofo6en8ckxe3ny1g5p8a.png" alt="Docker Desktop Windows 11 Install 04" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click &lt;strong&gt;Yes&lt;/strong&gt; on the &lt;strong&gt;User Account Control&lt;/strong&gt; window to start the install&lt;/li&gt;
&lt;/ul&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%2Fdvhuu6054u5zei9o8t9k.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%2Fdvhuu6054u5zei9o8t9k.png" alt="Docker Desktop Windows 11 Install 05" width="563" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This installation of &lt;strong&gt;Docker Desktop&lt;/strong&gt; should take about 5 minutes but you may just have time to get a drink.&lt;/li&gt;
&lt;/ul&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%2F89cg4fosmyfgvc55djsa.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%2F89cg4fosmyfgvc55djsa.png" alt="Docker Desktop Windows 11 Install 06" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Make sure you have "&lt;strong&gt;Use WSL 2 instead of Hyper-V"&lt;/strong&gt; and &lt;strong&gt;"Add shortcut to desktop"&lt;/strong&gt; ticked in this &lt;strong&gt;Configuration&lt;/strong&gt; window&lt;/li&gt;
&lt;li&gt;  Click &lt;strong&gt;Ok&lt;/strong&gt; to continue.&lt;/li&gt;
&lt;/ul&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%2Fslx4v8lc75m1gzdgaugq.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%2Fslx4v8lc75m1gzdgaugq.png" alt="Docker Desktop Windows 11 Install 07" width="800" height="553"&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%2Fzlxm5u01uj4tazk3kdwx.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%2Fzlxm5u01uj4tazk3kdwx.png" alt="Docker Desktop Windows 11 Install 08" width="800" height="553"&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%2Fp7q1y656z3l44u9h9xny.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%2Fp7q1y656z3l44u9h9xny.png" alt="Docker Desktop Windows 11 Install 09" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Once the Installation has completed, click the &lt;strong&gt;"Close and restart"&lt;/strong&gt; button to reboot Windows.&lt;/li&gt;
&lt;/ul&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%2Fq4v0y3fm60l8bmd69a49.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%2Fq4v0y3fm60l8bmd69a49.png" alt="Docker Desktop Windows 11 Install 10" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This &lt;strong&gt;Restart&lt;/strong&gt; will take a lot longer than normal as it will be applying all of the features we enabled earlier.&lt;/li&gt;
&lt;li&gt;  If you didn't get a coffee before I'd definitely suggest getting one now as this will take a while&lt;/li&gt;
&lt;/ul&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%2F13izsjx271piw6qxdawi.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%2F13izsjx271piw6qxdawi.png" alt="Docker Desktop Windows 11 Install 11" width="392" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Once you've rebooted and logged back in, you'll see a new shortcut on your Desktop for &lt;strong&gt;Docker Desktop&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Double click this to open up &lt;strong&gt;Docker Desktop&lt;/strong&gt; for the first time on this machine.&lt;/li&gt;
&lt;/ul&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%2Fx22lb2i58dqhhar1tve1.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%2Fx22lb2i58dqhhar1tve1.png" alt="Docker Desktop Windows 11 Install 12" width="213" height="204"&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%2Fp763hwedvlaa9pd8934o.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%2Fp763hwedvlaa9pd8934o.png" alt="Docker Desktop Windows 11 Install 13" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Go ahead and click &lt;strong&gt;Accept&lt;/strong&gt; to start up the program after you've read the &lt;strong&gt;Docker Subscription Service Agreement&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&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%2Ffdod5lvjpj01w6sieo8m.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%2Ffdod5lvjpj01w6sieo8m.png" alt="Docker Desktop Windows 11 Install 14" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This will open up &lt;strong&gt;Docker Desktop&lt;/strong&gt; for the first time.&lt;/li&gt;
&lt;li&gt;  Untick "Show weekly tips" to stop this window from opening every time you load up the application.&lt;/li&gt;
&lt;/ul&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%2Fwoyvxi483gtpsa35b940.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%2Fwoyvxi483gtpsa35b940.png" alt="Docker Desktop Windows 11 Install 15" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You can pick your Role from the dropdown and tick the boxes related to why you are using Docker Desktop. Click &lt;strong&gt;Continue&lt;/strong&gt; once you've made your choice.&lt;/li&gt;
&lt;li&gt;  This is just optional so you can just click &lt;strong&gt;Skip&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F7ood26wwr7xkrigh6eiy.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%2F7ood26wwr7xkrigh6eiy.png" alt="Docker Desktop Windows 11 Install 16" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This will start up the &lt;strong&gt;Docker Engine&lt;/strong&gt; for the first time.&lt;/li&gt;
&lt;li&gt;  This first time could take up to 10 minutes to load depending on your hardware and any other applications open at the time&lt;/li&gt;
&lt;li&gt;  You are now at in the &lt;strong&gt;Containers&lt;/strong&gt; menu section of &lt;strong&gt;Docker Desktop&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fifllcmetf3ztk68awkap.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%2Fifllcmetf3ztk68awkap.png" alt="Docker Desktop Windows 11 Install 17" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Right now there is nothing here. Click &lt;strong&gt;Dismiss&lt;/strong&gt; in the bottom right to get into the rest of the program&lt;/li&gt;
&lt;li&gt;  This page will normally show any currently running or recently closed &lt;strong&gt;Docker Containers&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fgizb9bf5szkn0lsx7nz4.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%2Fgizb9bf5szkn0lsx7nz4.png" alt="Docker Desktop Windows 11 Install 18" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click &lt;strong&gt;Images&lt;/strong&gt; on the left to see where your Docker Images will be downloaded to&lt;/li&gt;
&lt;/ul&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%2Fcrfx5d88vmctb7syqr1z.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%2Fcrfx5d88vmctb7syqr1z.png" alt="Docker Desktop Windows 11 Install 19" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Click &lt;strong&gt;Volumes&lt;/strong&gt; on the left to see where your created Docker Volumes will be usually found&lt;/li&gt;
&lt;/ul&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%2Fmkzuykr7cajh9ki25k6a.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%2Fmkzuykr7cajh9ki25k6a.png" alt="Docker Desktop Windows 11 Install 20" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing your Docker Installation - Hello World
&lt;/h2&gt;

&lt;p&gt;We should now have &lt;strong&gt;WSL 2, Ubuntu&lt;/strong&gt; and &lt;strong&gt;Docker Desktop&lt;/strong&gt; installed on Windows.&lt;/p&gt;

&lt;p&gt;Let's check it's all working by running our first test &lt;strong&gt;Docker container&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open up a &lt;strong&gt;Windows PowerShell&lt;/strong&gt; terminal and make sure you &lt;strong&gt;Run as Administrator&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F5ksdt8tizv39u0aajupu.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%2F5ksdt8tizv39u0aajupu.png" alt="Docker Desktop Windows 11 Install 21" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the below command &lt;strong&gt;wsl&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to open a WSL shell
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wsl
&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%2Fe2xa3snk674bp89af1zk.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%2Fe2xa3snk674bp89af1zk.png" alt="Docker Desktop Windows 11 Install 22" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This will let you interact with the Ubuntu distro running under WSL&lt;/li&gt;
&lt;/ul&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%2Fa7optazwlq188deaiimv.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%2Fa7optazwlq188deaiimv.png" alt="Docker Desktop Windows 11 Install 23" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the below command and &lt;strong&gt;Press Enter&lt;/strong&gt; to check for any running containers
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps
&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%2Fifxfdye94sh7bz8dv2m6.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%2Fifxfdye94sh7bz8dv2m6.png" alt="Docker Desktop Windows 11 Install 24" width="800" height="262"&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%2F9f3wz5smwxi2z699bezw.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%2F9f3wz5smwxi2z699bezw.png" alt="Docker Desktop Windows 11 Install 25" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  As you can see there are currently no running containers at the moment&lt;/li&gt;
&lt;li&gt;  To test use the below command to run the &lt;strong&gt;Docker Container&lt;/strong&gt; for &lt;strong&gt;Hello-World&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run hello-world
&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%2F9yxt99zq27ydc53za3mc.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%2F9yxt99zq27ydc53za3mc.png" alt="Docker Desktop Windows 11 Install 26" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The &lt;strong&gt;Docker Image&lt;/strong&gt; will be downloaded locally, run the container and output a message in the terminal when successful.&lt;/li&gt;
&lt;/ul&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%2F1lqp4cvo0cmo6g3k00gk.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%2F1lqp4cvo0cmo6g3k00gk.png" alt="Docker Desktop Windows 11 Install 27" width="800" height="416"&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%2Fb9n65epgsmex3vgduvcw.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%2Fb9n65epgsmex3vgduvcw.png" alt="Docker Desktop Windows 11 Install 28" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The &lt;strong&gt;Hello-World&lt;/strong&gt; code has been executed and the &lt;strong&gt;Docker Container&lt;/strong&gt; has been destroyed.&lt;/li&gt;
&lt;li&gt;  If you open up &lt;strong&gt;Docker Desktop&lt;/strong&gt; and now check the &lt;strong&gt;Containers&lt;/strong&gt; section you'll see the container we just ran.&lt;/li&gt;
&lt;li&gt;  It will have a random name which may be different to yours but the Image will be &lt;strong&gt;hello-world&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2F082hs436mbv3sziz6h3d.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%2F082hs436mbv3sziz6h3d.png" alt="Docker Desktop Windows 11 Install 29" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If you open the &lt;strong&gt;Images&lt;/strong&gt; section you'll see the &lt;strong&gt;hello-world&lt;/strong&gt; image in there now, ready to run without downloading again&lt;/li&gt;
&lt;/ul&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%2F144en3sg27eswf37kscp.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%2F144en3sg27eswf37kscp.png" alt="Docker Desktop Windows 11 Install 30" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This container didn't create a &lt;strong&gt;Docker Volume&lt;/strong&gt; so this section is still empty for now&lt;/li&gt;
&lt;/ul&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%2Fcq7jgwchqqfgfxukf65a.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%2Fcq7jgwchqqfgfxukf65a.png" alt="Docker Desktop Windows 11 Install 31" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Congratulations, you've finally installed Docker on Windows using the WSL 2 backend and even ran a test container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In our next guide, we’ll set up our first Docker Container on the Raspberry Pi 4 to help block ads and malicious websites on your whole network, Pi-Hole.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzFwMWdhdGk1aHM2OGJtMXhveXB6ZWloN2JjcnNlcmhxaHRpeHdyOSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l2SqanTUtVa0SW45G/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYzFwMWdhdGk1aHM2OGJtMXhveXB6ZWloN2JjcnNlcmhxaHRpeHdyOSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l2SqanTUtVa0SW45G/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Next time on Get Started with Docker - Part 3: Pi-Hole&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>tutorial</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Get Started with Docker - Part 2a : Raspberry Pi &amp; Linux Install Guide</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Tue, 27 Feb 2024 20:31:34 +0000</pubDate>
      <link>https://dev.to/reprodev/get-started-with-docker-part-2a-raspberry-pi-linux-install-guide-4hl9</link>
      <guid>https://dev.to/reprodev/get-started-with-docker-part-2a-raspberry-pi-linux-install-guide-4hl9</guid>
      <description>&lt;p&gt;Running Docker is pretty straightforward on Linux and makes using a Raspberry Pi, in my opinion a lot easier. It's really helpful when trying to squeeze out every last bit of performance from the lil computer that can.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're looking to install this on Windows then click the link below for our Windows Setup Guide : "Get Started with Docker - Part 2b: Windows Install Guide" - &lt;strong&gt;Coming Soon&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Personally, I’ve found &lt;strong&gt;Raspberry Pi OS&lt;/strong&gt; to be most the stable distribution when using the Pi. You can of course use your preferred Linux flavour like Ubuntu, Fedora etc as the operating system for your Pi.&lt;/p&gt;

&lt;p&gt;In this guide, we'll install &lt;strong&gt;Docker&lt;/strong&gt; onto a Raspberry Pi 4B 4GB using &lt;strong&gt;Raspberry Pi OS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We're going to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Update your Raspberry Pi and Raspberry Pi OS Linux&lt;/li&gt;
&lt;li&gt;  Install Docker and all it’s required components using the convenience script&lt;/li&gt;
&lt;li&gt;  Install Docker Compose&lt;/li&gt;
&lt;li&gt;  Add your Pi user to the Docker group&lt;/li&gt;
&lt;li&gt;  Test the installation with your first test Docker Container&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNzFxZHNnNTQ5cHl5OTU5ZjhvZXNjazY0eHA0YjhxNzVtYmpxNTBjZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/IAJBKTMu3NSbm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNzFxZHNnNTQ5cHl5OTU5ZjhvZXNjazY0eHA0YjhxNzVtYmpxNTBjZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/IAJBKTMu3NSbm/giphy.gif" width="400" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 If you want to know how to "Set up Your Raspberry Pi with Raspberry Pi OS" then check out the below Beginner's Guide to Get Started and then you can continue along with the rest of the guide below - &lt;strong&gt;Coming Soon&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Using GUI or SSH?
&lt;/h2&gt;

&lt;p&gt;In my case I like to use SSH to connect from another machine, as it uses less resources than the GUI.&lt;/p&gt;

&lt;p&gt;Using SSH means you don't have to have a monitor plugged into your Pi to run commands which can help devices like the Pi Zero.&lt;/p&gt;

&lt;p&gt;You’re welcome to use the commands in this guide either in the terminal using the GUI, or connecting via SSH.&lt;/p&gt;

&lt;p&gt;This guide will also assume that you've connected to your Pi using SSH once already and know it's IP address or can find it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMWM0c2wxZGhxd2trYzQycXQ0dGp0dnJ4ZWR2MDM0Y2J0dWNodXplMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/bi6RQ5x3tqoSI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMWM0c2wxZGhxd2trYzQycXQ0dGp0dnJ4ZWR2MDM0Y2J0dWNodXplMiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/bi6RQ5x3tqoSI/giphy.gif" width="450" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First, let's make sure the Pi's updated.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;The example IP address for the Pi in this guide, is *&lt;strong&gt;&lt;em&gt;192.168.0.177&lt;/em&gt;&lt;/strong&gt;* but yours will probably be different so please replace that below as needed.&lt;/p&gt;

&lt;p&gt;We're also going to be using the username *&lt;strong&gt;&lt;em&gt;pi&lt;/em&gt;&lt;/strong&gt;* in this guide but if you've changed yours then please replace it for the username &amp;gt;as needed to.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Update Your Pi
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYm81OXV2NG91emtseDdqN3RyMWZva293Z2J5bXpqcDVldnY2cGJjdiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Fn7EouKtFLHXhWKgFI/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYm81OXV2NG91emtseDdqN3RyMWZva293Z2J5bXpqcDVldnY2cGJjdiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Fn7EouKtFLHXhWKgFI/giphy.gif" width="480" height="272"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Connect to your &lt;strong&gt;Pi&lt;/strong&gt; using &lt;strong&gt;SSH&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open up &lt;strong&gt;Windows Terminal&lt;/strong&gt; and enter the below with your username and IP Address&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh pi@192.168.0.177
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You'll then be prompted for your &lt;strong&gt;password&lt;/strong&gt; to login.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run an &lt;strong&gt;update&lt;/strong&gt; and &lt;strong&gt;upgrade&lt;/strong&gt; on the &lt;strong&gt;Pi&lt;/strong&gt; using the sudo command below&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update &amp;amp;amp;&amp;amp;amp; sudo apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This will take a few minutes depending on your internet connection and the last time your Pi was updated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type &lt;strong&gt;"Y"&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to continue and install the updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Installing the updates will take a lot longer than checking for them so this is the perfect time to grab a coffee and come back later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once updated you'll come back to the command line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type the below command to reboot your PI to commit the updates, wait for it to start back up and connect again by using SSH for the next step.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Please Note: If your Pi hangs, become unresponsive and doesn’t reboot here. Then you may need to disconnect the power cable from the back of the Pi, wait about 15 seconds and reconnect it. This will power cycle the Pi and shouldn’t damage anything but may be the only way to get it to fully reboot as a last resort.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;Docker on &lt;strong&gt;Raspberry Pi OS&lt;/strong&gt; is officially supported and that means we can use an install script to automate most of the setup, provided by 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbhejpiz64909mqxrwpd.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%2Fwbhejpiz64909mqxrwpd.png" alt="Docker Hub Image 01" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Once you've updated and rebooted then connect back to the Pi using SSH&lt;/li&gt;
&lt;/ul&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%2Fesud3utqrerrftsmxcdg.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%2Fesud3utqrerrftsmxcdg.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Credit to this article from &lt;a href="https://pimylifeup.com/raspberry-pi-docker/" rel="noopener noreferrer"&gt;PiMyLife&lt;/a&gt; for the suggestion of piping the script directly into the terminal using the below one liner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmMyemdrdThqbmRkY3hkc2poaTFvN2MyMXh1b2twaGpldngwNXE3MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/jUL2CIAKP9gOKmYMFC/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmMyemdrdThqbmRkY3hkc2poaTFvN2MyMXh1b2twaGpldngwNXE3MCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/jUL2CIAKP9gOKmYMFC/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  I'd also suggest adding on the &lt;strong&gt;sudo command&lt;/strong&gt; at the beginning as I've had some issues with the &lt;strong&gt;curl&lt;/strong&gt; command failing to download on an Azure Ubuntu VM installation.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo curl -sSL https://get.docker.com | sh
&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%2F67wt4ola3gifadpxenrr.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%2F67wt4ola3gifadpxenrr.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This will take a lot longer than the previous update took earlier and the script will download all files and dependencies needed for your &lt;strong&gt;Docker&lt;/strong&gt; installation.&lt;/li&gt;
&lt;/ul&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%2Fvaw6pn3y8g4sbsqwwnw2.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%2Fvaw6pn3y8g4sbsqwwnw2.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You may want to grab another coffee and let the script do it's work&lt;/li&gt;
&lt;/ul&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%2Fxx0pbkt5xm1imskc6hou.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%2Fxx0pbkt5xm1imskc6hou.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You now have &lt;strong&gt;Docker&lt;/strong&gt; with the &lt;strong&gt;Docker Engine&lt;/strong&gt; installed on your &lt;strong&gt;Raspberry Pi&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Type the below line and &lt;strong&gt;Press Enter&lt;/strong&gt; to check for any running docker containers
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo docker ps
&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%2Fqm0vm6o7k6hzmjhpa2p3.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%2Fqm0vm6o7k6hzmjhpa2p3.png" width="800" height="370"&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%2Fhh6u5jwgujvt3ka3t2pa.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%2Fhh6u5jwgujvt3ka3t2pa.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc3pubmwzb3dkOG9iMnBlM3p5OGFrbjNzdHM5ODd5dXh3bWVyMXdnayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3nlnWnTYCRxPnzMihQ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExc3pubmwzb3dkOG9iMnBlM3p5OGFrbjNzdHM5ODd5dXh3bWVyMXdnayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3nlnWnTYCRxPnzMihQ/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Install Docker Compose
&lt;/h2&gt;

&lt;p&gt;You’ve almost got all of the basic components for Docker installed but if you want to use &lt;strong&gt;Docker Compose&lt;/strong&gt; YAML files then you’ll need to have &lt;strong&gt;Docker Compose&lt;/strong&gt; installed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type the below command and &lt;strong&gt;Press Enter&lt;/strong&gt; to get it installed
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install docker-compose
&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%2F8tgv769a55qi0hm244ef.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%2F8tgv769a55qi0hm244ef.png" alt="I" width="800" height="370"&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%2F60n9ud2psjeh8sty83wy.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%2F60n9ud2psjeh8sty83wy.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Type &lt;strong&gt;"Y"&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to continue and install the updates.&lt;/li&gt;
&lt;/ul&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%2Fmqlgj46rxov1jk4dvn96.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%2Fmqlgj46rxov1jk4dvn96.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This will remove any extra parts to &lt;strong&gt;Docker&lt;/strong&gt; that were installed using the Automated script and also install what we need to get &lt;strong&gt;Docker Compose&lt;/strong&gt; running.&lt;/li&gt;
&lt;/ul&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%2Fuqd67u2f3t55p86jvcad.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%2Fuqd67u2f3t55p86jvcad.png" width="800" height="370"&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%2Fttvagg4rc4808adpui5b.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%2Fttvagg4rc4808adpui5b.png" width="800" height="370"&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%2Fitg4g31i1868qbs2ecls.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%2Fitg4g31i1868qbs2ecls.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Once that’s installed, you can check your &lt;strong&gt;Docker Compose&lt;/strong&gt; version with the below command.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo docker-compose version
&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%2Fwy6pvuuuv7orzixe0ia8.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%2Fwy6pvuuuv7orzixe0ia8.png" width="800" height="370"&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%2Fsxmvn7r6v4puu5arml3x.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%2Fsxmvn7r6v4puu5arml3x.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Then type "&lt;strong&gt;clear"&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to clear the terminal for our next step.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clear
&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%2F9ft34qs55wdfipije9vh.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%2F9ft34qs55wdfipije9vh.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we’ve installed &lt;strong&gt;Docker, Docker Engine&lt;/strong&gt; and &lt;strong&gt;Docker Compose&lt;/strong&gt;, we need to set up our &lt;strong&gt;Docker&lt;/strong&gt; permissions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Add Pi User to Docker
&lt;/h2&gt;

&lt;p&gt;You've now got &lt;strong&gt;Docker&lt;/strong&gt; installed but when you try to run a &lt;strong&gt;Docker&lt;/strong&gt; command you get a permissions issue.&lt;/p&gt;

&lt;p&gt;We have a few options here.&lt;/p&gt;

&lt;p&gt;You can add &lt;strong&gt;sudo&lt;/strong&gt; before every command, &lt;strong&gt;su -&lt;/strong&gt; to become root or add the Pi user to the &lt;strong&gt;Docker&lt;/strong&gt; group.&lt;/p&gt;

&lt;p&gt;We’re going to go for the third option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXRyYmtpOG1nb2ZlcnR4d2dncHVpeW0yMnFsNnJnbTFtc3lwaGs3ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3otPoIohp3elV46VEY/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMXRyYmtpOG1nb2ZlcnR4d2dncHVpeW0yMnFsNnJnbTFtc3lwaGs3ZCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3otPoIohp3elV46VEY/giphy.gif" width="480" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open a New Terminal or if you're continuing from our last step it should look like this&lt;/li&gt;
&lt;/ul&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%2Fmq87ugnmqm3yz8jj1jjs.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%2Fmq87ugnmqm3yz8jj1jjs.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If you &lt;strong&gt;HAVEN'T&lt;/strong&gt; used the convenience script then you need to create the docker group first using the below command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;sudo groupadd docker&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If you &lt;strong&gt;HAVE&lt;/strong&gt; used the convenience script then type the below line and &lt;strong&gt;Press Enter&lt;/strong&gt; to add the &lt;strong&gt;Pi&lt;/strong&gt; user to the &lt;strong&gt;Docker&lt;/strong&gt; group.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod -aG docker pi
&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%2F6t3ssghmam30m3t9onq7.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%2F6t3ssghmam30m3t9onq7.png" width="800" height="370"&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%2F7cejsqqn28waetarpjsl.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%2F7cejsqqn28waetarpjsl.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  To apply the changes you’ll need to log out and back in via SSH.&lt;/li&gt;
&lt;li&gt;  Type &lt;strong&gt;"logout"&lt;/strong&gt; and &lt;strong&gt;Press Enter&lt;/strong&gt; to logout
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;logout
&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%2Fzehigvixg5xbrnksrxpa.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%2Fzehigvixg5xbrnksrxpa.png" width="800" height="370"&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%2Fj43ggjga1zzqk4012vi7.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%2Fj43ggjga1zzqk4012vi7.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡Please Note: If you're using a VM then you'll probably need to reboot the VM for your user changes to apply&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;  Connect back to Log back in, using the &lt;strong&gt;Pi&lt;/strong&gt; user and &lt;strong&gt;password&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&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%2Fcanb9qwyjmbhgghff7g1.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%2Fcanb9qwyjmbhgghff7g1.png" width="800" height="370"&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%2Fr9ohlajz701hkodmrc45.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%2Fr9ohlajz701hkodmrc45.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Run the below command to see which &lt;strong&gt;groups&lt;/strong&gt; the &lt;strong&gt;Pi&lt;/strong&gt; user is currently a member of
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;groups
&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%2Focn79f4ch6yhvw78xgq1.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%2Focn79f4ch6yhvw78xgq1.png" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You should see &lt;strong&gt;docker&lt;/strong&gt; as one of the groups listed for Pi with a line similar to this in the terminal output.&lt;/li&gt;
&lt;/ul&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%2Fw1h1t2mexwq6f28rywir.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%2Fw1h1t2mexwq6f28rywir.png" width="800" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  We need to apply the changes to the running &lt;strong&gt;Docker Service.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  We can do this by restarting that service only, without restarting the whole Pi&lt;/li&gt;
&lt;li&gt;  Run the below command and &lt;strong&gt;Press Enter&lt;/strong&gt; to restart the &lt;strong&gt;docker&lt;/strong&gt; service
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo service docker restart
&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%2F939m1ki84ya9d5x29xsz.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%2F939m1ki84ya9d5x29xsz.png" width="800" height="379"&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%2F70owxa3uuuv9zil6l32f.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%2F70owxa3uuuv9zil6l32f.png" width="800" height="379"&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%2Fpi8ntefmpiwtaeku3mls.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%2Fpi8ntefmpiwtaeku3mls.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Run the below &lt;strong&gt;docker&lt;/strong&gt; command to check for running containers again. This time without using &lt;strong&gt;sudo&lt;/strong&gt; before it
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps
&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%2Fvb0o8v8p64dvk08ka7rx.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%2Fvb0o8v8p64dvk08ka7rx.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, the Pi user is now part of the &lt;strong&gt;docker&lt;/strong&gt; group.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZmZ6M3FoNmI0OG5jOHFzOWM1YnVtMHBsZDY2eHRkbG10aDFrN3RzciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Ln9YwHWf9jwb3eKHMD/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZmZ6M3FoNmI0OG5jOHFzOWM1YnVtMHBsZDY2eHRkbG10aDFrN3RzciZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/Ln9YwHWf9jwb3eKHMD/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This means you can now run &lt;strong&gt;docker&lt;/strong&gt; commands without running &lt;strong&gt;sudo&lt;/strong&gt; or being logged in as root.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing your Docker Installation - Hello World
&lt;/h2&gt;

&lt;p&gt;We should now have &lt;strong&gt;Docker&lt;/strong&gt; and &lt;strong&gt;Docker Compose&lt;/strong&gt; installed. In addition, the &lt;strong&gt;Pi&lt;/strong&gt; user should be able to use Docker commands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  To test this all out run the below command in your terminal
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run hello-world
&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%2Fkw4s37h1wa7qm6mj9vea.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%2Fkw4s37h1wa7qm6mj9vea.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  This should then download the "&lt;strong&gt;hello world&lt;/strong&gt;" docker image from &lt;strong&gt;Docker Hub&lt;/strong&gt;, create the container locally and output some text to the terminal.&lt;/li&gt;
&lt;/ul&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%2Fyc56km9fiw6jf4h50sg9.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%2Fyc56km9fiw6jf4h50sg9.png" width="800" height="379"&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%2Fe4940f7ti8b6pfsc9w4u.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%2Fe4940f7ti8b6pfsc9w4u.png" width="800" height="379"&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%2Fjamrz3ypq55iz3shni0b.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%2Fjamrz3ypq55iz3shni0b.png" width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  If you look in the output you'll see this message and then a brief explanation of what this just did.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello from Docker!
This message shows that your installation appears to be working correctly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Congratulations, you've successfully set up Docker on your Raspberry Pi. We're finally ready to spin up some applications and services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExdGxmd2N4NGxwYXgyM3k1bTZqN2g4cmh5OG1lb240dTExam93MTRncyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/lcEktA2AJUqDm/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExdGxmd2N4NGxwYXgyM3k1bTZqN2g4cmh5OG1lb240dTExam93MTRncyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/lcEktA2AJUqDm/giphy.gif" width="500" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next up, in Get Started with Docker : Part 2b - We'll be looking at installing Docker and Docker Desktop on a Windows machine using WSL.&lt;/p&gt;

&lt;p&gt;__&lt;/p&gt;

&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>raspberrypi</category>
    </item>
    <item>
      <title>Get Started with Docker - Part 1 : An Intro to Docker</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Fri, 23 Feb 2024 20:48:45 +0000</pubDate>
      <link>https://dev.to/reprodev/get-started-with-docker-part-1-an-intro-to-docker-3b81</link>
      <guid>https://dev.to/reprodev/get-started-with-docker-part-1-an-intro-to-docker-3b81</guid>
      <description>&lt;p&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/a&gt; is a great way to run your self hosted applications and services on many different operating systems and types of hardware.&lt;/p&gt;

&lt;p&gt;It's one of the easiest ways to get into self-hosting your own applications and a great way to learn without breaking things in the rest of your system.&lt;/p&gt;

&lt;p&gt;In this series we're going to run through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What Docker is and how it works?&lt;/li&gt;
&lt;li&gt;  How to get Docker installed on a Raspberry Pi or Windows Machine?&lt;/li&gt;
&lt;li&gt;  How to run your first Docker container?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is Docker?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZmRkeWo5a2ZvMXlxNHZ1ZDZrbTZpN3cwN3ZvcnBycWM2YjliY2cwbCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OnJLRvXvAmvPW/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZmRkeWo5a2ZvMXlxNHZ1ZDZrbTZpN3cwN3ZvcnBycWM2YjliY2cwbCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/OnJLRvXvAmvPW/giphy.gif" width="500" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; uses the &lt;strong&gt;Docker Engine&lt;/strong&gt; to create containers that hold everything needed to run a particular piece of code or a executable program on almost any computer.&lt;/p&gt;

&lt;p&gt;These containers are run independently from the rest of the machine similar to a virtual machine but with a lot less power needed.&lt;/p&gt;

&lt;p&gt;The containers are isolated from the rest of the machine and can be run locally, remotely or in the cloud as their filesystem is self contained.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Containers
&lt;/h2&gt;

&lt;p&gt;Containers can be used to run almost any piece of software like a File Server, Web Browser or Full Operating System.&lt;/p&gt;

&lt;p&gt;Here's an explanation from Docker themselves.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings." - *&lt;strong&gt;&lt;em&gt;What is a Container? | Docker.com&lt;/em&gt;&lt;/strong&gt;*&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What is a Container? | Docker&lt;/p&gt;

&lt;p&gt;A container is a unit of software that packages code and its dependencies so the application runs quickly and reliably across computing environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/resources/what-container/" rel="noopener noreferrer"&gt;https://www.docker.com/resources/what-container/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These containers can be destroyed and then re-created quickly with the choice of either storing the data for the config to use again or reset to start fresh.&lt;/p&gt;

&lt;p&gt;This allows you to upgrade or replace running containers with little to almost no down time, individually or all at once.&lt;/p&gt;

&lt;p&gt;This can make keeping your infrastructure rolling along a lot easier and without anyone really noticing you've changed anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbW93OHliMzN5amwzbjVwM2V3aWppNm5yamprNXM2c2xma2JsOWhkNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9x6fPJVGpq9HO/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbW93OHliMzN5amwzbjVwM2V3aWppNm5yamprNXM2c2xma2JsOWhkNiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/9x6fPJVGpq9HO/giphy.gif" width="446" height="266"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Images
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker Images&lt;/strong&gt; are created by members of the community, software companies and Docker themselves.&lt;/p&gt;

&lt;p&gt;Think of them as a shrunk down version of the program you would normally download to install an application like Chrome.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Docker Image&lt;/strong&gt; contains a specific set of instructions and files to create the environment needed to run a program or execute code.&lt;/p&gt;

&lt;p&gt;There's a whole catalogue of different images that you can download from the official &lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Docker Hub&lt;/strong&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%2Fr2htlpfig4egqd0ggsao.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%2Fr2htlpfig4egqd0ggsao.png" alt="Docker Hub 01" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are images for everything from a Website CRM application like Ghost, which is what this blog is running on to a full Ubuntu Operating system.&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%2Fvk6pcc585c99496598v2.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%2Fvk6pcc585c99496598v2.png" alt="Docker Hub 02" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These images have everything in one package and run across several different environments with only a few variables needed to be changed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbHNyMDc0eTBsNTFhMzk2bW05MzR0bm1jMnQ1emFra3RwcGsydW9haiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l3mZ8u9RJ4A9kPlK0/giphy-downsized-large.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbHNyMDc0eTBsNTFhMzk2bW05MzR0bm1jMnQ1emFra3RwcGsydW9haiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l3mZ8u9RJ4A9kPlK0/giphy-downsized-large.gif" width="384" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are also different versions for different hardware architectures and you'll find more information and install instructions from the developer on their project pages.&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%2F1r1tvt9foe6544aq1rd1.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%2F1r1tvt9foe6544aq1rd1.png" alt="Docker Hub 03" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Compose
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; files are the final part of the ecosystem you'll need to get familiar with when using Docker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2g0MDNueHRvczRjemNmYnVqNHgxbGJwOXgwamR2NmZvMzYxeTE3cyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/34ZNcoaN5u4hi/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2g0MDNueHRvczRjemNmYnVqNHgxbGJwOXgwamR2NmZvMzYxeTE3cyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/34ZNcoaN5u4hi/giphy.gif" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are YAML files with the .yml extension that contain the specific instructions needed to create the environment to run the Docker Image.&lt;/p&gt;

&lt;p&gt;These will download the image, if you don't have it already locally so can be shared or used to run on another machine quickly. Most importantly it will run the same way every-time in a predictable, efficient way. The &lt;strong&gt;Docker Compose&lt;/strong&gt; file is created using a text editor like Notepad++ in Windows or Nano/Vim in Linux.&lt;/p&gt;

&lt;p&gt;Here's is an example of one that would spin up the docker version of Nginx Proxy Manager.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format &amp;amp;lt;host-port&amp;amp;gt;:&amp;amp;lt;container-port&amp;amp;gt;
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP

    # Uncomment the next line if you uncomment anything in the section
    # environment:
      # Uncomment this if you want to change the location of
      # the SQLite DB file within the container
      # DB_SQLITE_FILE: "/data/database.sqlite"

      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can usually find the &lt;strong&gt;Docker Compose&lt;/strong&gt; file on the project page on &lt;strong&gt;Docker Hub&lt;/strong&gt; or &lt;strong&gt;GitHub&lt;/strong&gt; when you get an image if you're looking for more to try out.&lt;/p&gt;

&lt;p&gt;You can also find a whole load of example Docker Compose files here for inspiration and to run once you've got the Docker Engine installed.&lt;/p&gt;

&lt;p&gt;GitHub - docker/awesome-compose: Awesome Docker Compose samples&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/docker/awesome-compose" rel="noopener noreferrer"&gt;https://github.com/docker/awesome-compose&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These are ran using the &lt;strong&gt;docker command&lt;/strong&gt; below usually unless stated otherwise. This runs the container in detached mode so you can continue to use the terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Docker Run
&lt;/h2&gt;

&lt;p&gt;You can use a &lt;strong&gt;Docker Compose&lt;/strong&gt; file or instead just a &lt;strong&gt;Docker Run Command&lt;/strong&gt; to start running an application.&lt;/p&gt;

&lt;p&gt;Here's how to run &lt;strong&gt;NGINX Proxy Manager&lt;/strong&gt; using the &lt;strong&gt;Docker Run Command&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d \
    --name=nginx-proxy-manager \
    --restart unless-stopped \
    -p 8181:8181 \
    -p 8080:8080 \
    -p 4443:4443 \
    -v /docker/appdata/nginx-proxy-manager:/config:rw \
    jlesage/nginx-proxy-manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you copy and paste the above into a terminal then it will run &lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt; just like the &lt;strong&gt;Docker Compose&lt;/strong&gt; file.&lt;/p&gt;

&lt;p&gt;This may come in handy on systems where you can't easily navigate to the correct folder but can run Docker commands. It's also a very quick way to spin up containers for testing.&lt;/p&gt;

&lt;p&gt;Now you've had a quick Intro to Docker, we're ready to install this to the operating system and device of your choice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExdGJ1OHg1eTQ5Mzd4OXcyeWFrajU4MmJyeDg0bmV2OWFkaXRqc25hNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/z8gtBVdZVrH20/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExdGJ1OHg1eTQ5Mzd4OXcyeWFrajU4MmJyeDg0bmV2OWFkaXRqc25hNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/z8gtBVdZVrH20/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Engine
&lt;/h2&gt;

&lt;p&gt;To use &lt;strong&gt;Docker&lt;/strong&gt; you need to install the &lt;strong&gt;Docker Engine&lt;/strong&gt; on your chosen Operating system which will set up everything in the background to get things running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbnhzY2N4dmM2MmZycWl3OG50Zm1zY3d0dWQzZW1jeWE4aXRyeTl3cCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l2JefbKQ8JWybbyP6/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExbnhzY2N4dmM2MmZycWl3OG50Zm1zY3d0dWQzZW1jeWE4aXRyeTl3cCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/l2JefbKQ8JWybbyP6/giphy.gif" width="480" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Raspberry Pi (Linux)
&lt;/h3&gt;

&lt;p&gt;The Raspberry Pi 4 is a powerful machine for it’s small form factor and makes the perfect candidate for experimenting with Docker.&lt;/p&gt;

&lt;p&gt;Linux is the best overall operating system and platform for Docker in my humble opinion for performance and learning potential. I'm running Docker on a Raspberry Pi 4, Raspberry Pi 3, Raspberry Pi Zero and through a Linux VM on my Windows Desktop.&lt;/p&gt;

&lt;p&gt;There's a simple script provided directly by Docker themselves that you can run to automate the installation process&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%2F176hpev6g9mhtb2xyo0s.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%2F176hpev6g9mhtb2xyo0s.png" alt="Docker Convenience Script" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the flipside, it can be a bit daunting if you're unfamiliar with Linux when it comes to troubleshooting. This can be a great way to learn the OS as a whole.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHdmM2JzczM5c2N2OXJmYjRwZnQxZmdzazQ1M2dxNm84bWJ2aWVrdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3og0ICG4WxdKSRzE3K/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExcHdmM2JzczM5c2N2OXJmYjRwZnQxZmdzazQ1M2dxNm84bWJ2aWVrdCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3og0ICG4WxdKSRzE3K/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll go over the install in a future guide in this series and it'll be linked here&lt;/p&gt;




&lt;h3&gt;
  
  
  Windows 11
&lt;/h3&gt;

&lt;p&gt;This can also be run on Windows machine by installing Docker Desktop which give you a GUI to manage your containers.&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%2Ff21cx0z3ghwyz66jbqud.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%2Ff21cx0z3ghwyz66jbqud.png" alt="Docker Desktop Windows" width="800" height="432"&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%2Fzejt8t1f3fyr3r9bfm6n.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%2Fzejt8t1f3fyr3r9bfm6n.png" alt="Docker Desktop Windows Download" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It has a few quirks and specific ways in which the file paths work for the containers compared to Linux.&lt;/p&gt;

&lt;p&gt;This was the way I first started using Docker. It taught me a lot of the fundamentals and being in Windows can make it easier to troubleshoot. I personally still use Docker Desktop on my own Windows Laptop for using Docker on the go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker Desktop&lt;/strong&gt; on Windows will give you the option to use WSL2 (Windows Subsystem for Linux). This is a full Linux installation running under the hood of Windows and lets you use Linux commands for Docker just like a full VM.&lt;/p&gt;

&lt;p&gt;To get the best performance of our &lt;strong&gt;Docker&lt;/strong&gt; on Windows you should get WSL2 but it's optional.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExM2l0aXhoMXIyYnNnOHVhcDN6emFsa2swaWQ2c2d4ZnZxcXMwYmh1biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/AliO819Kp3aus/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExM2l0aXhoMXIyYnNnOHVhcDN6emFsa2swaWQ2c2d4ZnZxcXMwYmh1biZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/AliO819Kp3aus/giphy.gif" width="320" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll go over the install in a future guide in this series and it'll be linked here&lt;/p&gt;




&lt;p&gt;Congratulations, that's the nuts and bolts of Docker but in the rest of this series we're going to go through exactly how to install Docker on Linux (Raspberry Pi) and Windows for those of you who want to try it out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNnZkY2R5NmY3MmNteGZ2enpiajdxazR4ejd0b2Vib3F0bTF1N3NiNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/UZA15w44oCT1m/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNnZkY2R5NmY3MmNteGZ2enpiajdxazR4ejd0b2Vib3F0bTF1N3NiNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/UZA15w44oCT1m/giphy.gif" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Join us next time for Part 2a - How to Install Docker on a Raspberry Pi using Linux&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/reprodev/get-started-with-docker-part-2a-raspberry-pi-linux-install-guide-4hl9"&gt;Part 2a - How to Install Docker on a Raspberry Pi using Linux&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content. Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;




</description>
      <category>docker</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Is the reign of Esxi as the Hypervisor of choice for learning at home, virtually over?</title>
      <dc:creator>Repro Dev</dc:creator>
      <pubDate>Thu, 22 Feb 2024 02:23:45 +0000</pubDate>
      <link>https://dev.to/reprodev/is-the-reign-of-esxi-as-the-hypervisor-of-choice-for-learning-at-home-virtually-over-3bnn</link>
      <guid>https://dev.to/reprodev/is-the-reign-of-esxi-as-the-hypervisor-of-choice-for-learning-at-home-virtually-over-3bnn</guid>
      <description>&lt;p&gt;You've probably heard of virtualization and virtual machines. You may have even wanted to spin something up yourself at home to try it out.&lt;/p&gt;

&lt;p&gt;Virtualization lets you use a single piece of hardware's resources to act like several different pieces of physical hardware e.g one physical server acting like 5 smaller virtual servers.&lt;/p&gt;

&lt;p&gt;Confusing yes but also very useful.&lt;/p&gt;

&lt;p&gt;Virtual machines can be run inside an operating system like Windows using something like &lt;a href="https://www.virtualbox.org/" rel="noopener noreferrer"&gt;Oracle Virtualbox&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Virtualbox let's you run these VMs alongside your normal programs when you need to but you can run into performance and compatibility issues.&lt;/p&gt;

&lt;p&gt;The more efficient way to do this is through a Bare Metal Hypervisor like Esxi. This allows you manage your resources and virtual machines more effectively without all the extra bloat of a full OS.&lt;/p&gt;

&lt;p&gt;Plus it's a bit closer to how this would work in a real production server environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Esxi?
&lt;/h2&gt;

&lt;p&gt;The vSphere Hypervisor (Esxi) from VM Ware is a Bare Metal Hypervisor that is installed onto a physical server. Once installed this is used instead of an OS like Windows and allows you to run multiple Virtual Machines on a single piece of server hardware.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vmware.com/uk/products/esxi-and-esx.html" rel="noopener noreferrer"&gt;https://www.vmware.com/uk/products/esxi-and-esx.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The software has a simple Management web dashboard that you can connect to from a browser, with quick access to all of your VMs. You can start, stop, copy, monitor, troubleshoot and edit them as you need all in one place.&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%2Fu6htjynm27b6xu95ofly.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%2Fu6htjynm27b6xu95ofly.png" alt="vSphereEsxi Dashboard" width="640" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The real pull though is that you used to be able to get perpetual licenses for free to try out the software. It's closed source and so you have to go to Esxi for your updates directly.&lt;/p&gt;

&lt;p&gt;This lets anybody run a single Esxi host without all of the more advanced options that that are only available with the more expensive paid licenses in V-Sphere.&lt;/p&gt;

&lt;p&gt;If you want to cluster your hosts for High Availability failover or to share those resources between hosts you'll need one of those paid licenses.&lt;/p&gt;

&lt;p&gt;I was able to get hands on experience in my own home lab with the free VM Ware evaluation licence myself. Playing around with this, I was able to then use those skills in my day-to-day job through practice outside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the need to change?
&lt;/h2&gt;

&lt;p&gt;Well, since the purchase of VMWare as a whole by Broadcom many ways in which the software is licensed and sold is being revised.&lt;/p&gt;

&lt;p&gt;There's panic that prices will now start to sky-rocket for licenses to use Esxi in businesses by the new owners of VM Ware.&lt;/p&gt;

&lt;p&gt;Broadcom have stated they have plans to deal directly with their top 2000 VM Ware Customers thus pivoting away from just releasing updates for everyone.&lt;/p&gt;

&lt;p&gt;Things are still are still in flux around the topic but I like any excuse to try out new software. I'm now looking at the other options that would work for me.&lt;/p&gt;

&lt;p&gt;I'd like to try and use something that would be used in an Enterprise environment so I can learn at home to use as work.&lt;/p&gt;

&lt;p&gt;With that in mind I've narrowed my picks down to just 3 choices&lt;/p&gt;

&lt;h2&gt;
  
  
  Proxmox
&lt;/h2&gt;

&lt;p&gt;First up, it's Proxmox and probably the one you've most likely already heard of.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.proxmox.com/" rel="noopener noreferrer"&gt;https://www.proxmox.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I built my current Esxi host in March 2023 moved over from another host pretty much starting from scratch. At the time I looked into Proxmox but couldn't really see this being used in businesses.&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%2Fwuao8zfs8mq0cnuaanal.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%2Fwuao8zfs8mq0cnuaanal.png" alt="ProxMox Dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Delving deeper they do actually have an Enterprise license but being based in Europe might be a bit of a barrier for those companies in the states when it comes to that support.&lt;/p&gt;

&lt;p&gt;The main benefits for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open-Source and Free for Personal Use&lt;/li&gt;
&lt;li&gt;  Linux Based System (It's just Debian and I like a bit of Debian)&lt;/li&gt;
&lt;li&gt;  Container support built in&lt;/li&gt;
&lt;li&gt;  Lots of Community online support in Guides, Forums, other users&lt;/li&gt;
&lt;li&gt;  Great looking Web Dashboard Interface built in&lt;/li&gt;
&lt;li&gt;  Simple and free way to cluster the hosts&lt;/li&gt;
&lt;li&gt;  Simple way to schedule and perform backups&lt;/li&gt;
&lt;li&gt;  Live migrations of running VMs&lt;/li&gt;
&lt;li&gt;  Can be set up with High-Availability for failover and redundancy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main cons for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Enterprise support could be tricky due to time difference&lt;/li&gt;
&lt;li&gt;  Proxmox can take a little time to learn for specific functions&lt;/li&gt;
&lt;li&gt;  Nested virtualization can be an issue e.g. Hyper V in a VM&lt;/li&gt;
&lt;li&gt;  Potential issues with passing through graphics cards&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  XCP-NG
&lt;/h2&gt;

&lt;p&gt;This is the one that really caught my eye as it looked the most like Esxi and the project seemed to be based on Citrix XenServer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xcp-ng.org/" rel="noopener noreferrer"&gt;https://xcp-ng.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Released in March 2018 after a successful KickStarter by the original founder of Xen Orchestra, Oliver Lambert. It's built off the base of several different Linux Distributions including CentOS and other tech stacks.&lt;/p&gt;

&lt;p&gt;It's slightly different in that you need to have a running VM or somewhere else on the network to run it's Management dashboard software called Xen Orchestra.&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%2F0nlcqu3n1toalumkco39.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%2F0nlcqu3n1toalumkco39.png" alt="Xen Orchestra Dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xen-orchestra.com/" rel="noopener noreferrer"&gt;https://xen-orchestra.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main benefits for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Open-Source and Free for Personal Use&lt;/li&gt;
&lt;li&gt;  Linux Based System&lt;/li&gt;
&lt;li&gt;  Container support built in&lt;/li&gt;
&lt;li&gt;  Lots of Community online support in Guides, Forums, other users&lt;/li&gt;
&lt;li&gt;  Great looking Web Dashboard Interface To Manage Many Hosts&lt;/li&gt;
&lt;li&gt;  Simple and free way to cluster the hosts&lt;/li&gt;
&lt;li&gt;  Nested Virtualization works&lt;/li&gt;
&lt;li&gt;  Simple way to schedule and perform backups&lt;/li&gt;
&lt;li&gt;  Live Migrations of running VMs&lt;/li&gt;
&lt;li&gt;  Big install and user base&lt;/li&gt;
&lt;li&gt;  Great Enterprise support packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main cons for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Not a big fan of having to use a VM on the machine for the Xen Orchestra Management dashboard&lt;/li&gt;
&lt;li&gt;  The GUI doesn't have much information in default overviews&lt;/li&gt;
&lt;li&gt;  Uses yum for packages instead of apt which I would need to learn&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  VM Ware Esxi
&lt;/h2&gt;

&lt;p&gt;In a shock twist, I actually made Esxi my third choice.&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%2Fsr8stdb9asukd3xp3v2n.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%2Fsr8stdb9asukd3xp3v2n.png" alt="vSphereEsxi Dashboard 02" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've managed to keep the current Esxi host on an old Dell XPS 8930 Desktop running for 188 continuous days without a reboot before I had a powercut due to a flood.&lt;/p&gt;

&lt;p&gt;I'm already very familiar with it and in my opinion with the some customers getting multi-year renewals means there will still be people using this for years to come.&lt;/p&gt;

&lt;p&gt;The main benefits for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Free for Personal Use&lt;/li&gt;
&lt;li&gt;  Container support built in&lt;/li&gt;
&lt;li&gt;  Lots of Community online support in Guides, Forums, other users&lt;/li&gt;
&lt;li&gt;  Great looking Web Dashboard Interface In Built to manager VMs&lt;/li&gt;
&lt;li&gt;  Nested Virtualization works&lt;/li&gt;
&lt;li&gt;  Big install and user base&lt;/li&gt;
&lt;li&gt;  Great Enterprise support packages if you pay for them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The main cons for me are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Getting an evaluation license for new installs is now almost impossible&lt;/li&gt;
&lt;li&gt;  Enterprise support renewals could be tricky now moving forwards&lt;/li&gt;
&lt;li&gt;  Potential issues with passing through graphics cards&lt;/li&gt;
&lt;li&gt;  No more patches for free license users&lt;/li&gt;
&lt;li&gt;  What other surprises may come from Broadcom&lt;/li&gt;
&lt;li&gt;  Will customers reject the new pricing scheme making it obsolete&lt;/li&gt;
&lt;li&gt;  Closed source so development is only done by the VM Ware Team&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing Thoughts
&lt;/h2&gt;

&lt;p&gt;Now, for those who've just built an Esxi box for the first time.&lt;/p&gt;

&lt;p&gt;First, up well done, that wasn't an easy install and I don't think there's really any rush to move to something else just yet.&lt;/p&gt;

&lt;p&gt;For me, I'll be staying on my single Esxi host for a little while longer while I weigh up the options.&lt;/p&gt;

&lt;p&gt;I'm also interested to see what else I've missed before I take the plunge.&lt;/p&gt;

&lt;p&gt;Esxi has worked for me till now and sometimes if it ain't broke, don't fix it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/4QF3DLl5JuYnjR2YzG/giphy-downsized-large.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/4QF3DLl5JuYnjR2YzG/giphy-downsized-large.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Don't forget to explore the rest of our website as we build out more content.&lt;/p&gt;

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

&lt;p&gt;Stay tuned for more tutorials, tips, and tricks to help you make tech work for you.&lt;/p&gt;

&lt;p&gt;If you want to stay up-to-date with regular updates, make sure to subscribe to our free mailing list.&lt;/p&gt;




</description>
      <category>discuss</category>
      <category>virtualmachine</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
