{"id":3100,"date":"2025-12-19T14:13:28","date_gmt":"2025-12-19T14:13:28","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/12\/19\/from-the-captains-chair-igor-aleksandrov\/"},"modified":"2025-12-19T14:13:28","modified_gmt":"2025-12-19T14:13:28","slug":"from-the-captains-chair-igor-aleksandrov","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/12\/19\/from-the-captains-chair-igor-aleksandrov\/","title":{"rendered":"From the Captain\u2019s Chair: Igor Aleksandrov"},"content":{"rendered":"<p><em>Docker Captains are leaders from the developer community that are both experts in their field and are passionate about sharing their Docker knowledge with others. \u201cFrom the Captain\u2019s Chair\u201d is a blog series where we get a closer look at one Captain to learn more about them and their experiences.<\/em><\/p>\n<p><em>Today we are interviewing Igor Aleksandrov. Igor is the CTO and co-founder of JetRockets, a Ruby on Rails development agency based in NYC, bringing over 20 years of software engineering experience and a deep commitment to the Rails ecosystem since 2008. He\u2019s an open-source contributor to projects like the Crystal programming language and Kamal, a regular conference speaker sharing expertise on different topics from container orchestration to migration from React to Hotwire.<\/em><\/p>\n<h2 class=\"wp-block-heading\"><strong>Can you share how you first got involved with Docker?\u00a0What inspired you to become a Docker Captain?<\/strong><\/h2>\n<p>Looking back at my journey to becoming a Docker Captain, it all started with a very practical problem that many Rails teams face: dependency hell.\u00a0<\/p>\n<p>By 2018, JetRockets had been building Ruby on Rails applications for years. I\u2019d been working with Rails since version 2.2 back in 2009, and we had established solid development practices. But as our team grew and our projects became more complex, we kept running into the same frustrating issues:<\/p>\n<ul class=\"wp-block-list\">\n<li>\u201cIt works on my machine\u201d became an all-too-common phrase during deployments<\/li>\n<li>Setting up new developer environments was a time-consuming process fraught with version mismatches<\/li>\n<li>Our staging and production environments occasionally behaved differently despite our best efforts<\/li>\n<li>Managing system-level dependencies across different projects was becoming increasingly complex<\/li>\n<\/ul>\n<p>We needed a unified way to manage application dependencies that would work consistently across development, staging, and production environments.<\/p>\n<p>Unlike many teams that start with Docker locally and gradually move to production, we decided to implement Docker in production and staging first. This might sound risky, but it aligned perfectly with our goal of achieving true environment parity.<\/p>\n<p>We chose our first Rails application to containerize and started writing our first Dockerfile. Those early Dockerfiles were much simpler than the highly optimized ones we create today, but they solved our core problem: every environment now ran the same container with the same dependencies.<\/p>\n<p>Even though AWS Beanstalk has never been a developer friendly solution, the goal was reached \u2013 we had achieved true environment consistency, and the mental overhead of managing different configurations across environments had virtually disappeared.<\/p>\n<p>That initial Docker adoption in 2018 sparked a journey that would eventually lead to me becoming a Docker Captain. What began with a simple need for dependency management evolved into deep expertise in container optimization, advanced deployment strategies with tools like Kamal, and ultimately contributing back to the Docker community.<\/p>\n<p>Today, I write extensively about Rails containerization best practices, from image slimming techniques to sophisticated CI\/CD pipelines. But it all traces back to that moment in 2019 when we decided to solve our dependency challenges with Docker.<\/p>\n<h2 class=\"wp-block-heading\"><strong>What are some of your personal goals for the next year?<\/strong><\/h2>\n<p>I want to speak at more conferences and meetups, sharing the expertise I\u2019ve built over the years. Living in the Atlanta area, I would like to become more integrated into the local tech community. Atlanta has such a vibrant IT scene, and I think there\u2019s a real opportunity to contribute here. Whether that\u2019s organizing Docker meetups, participating in Rails groups, or just connecting with other CTOs and technical leaders who are facing similar challenges.<\/p>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=1561530935  fetchpriority=\"high\" decoding=\"async\" width=\"1280\" height=\"959\" src=\"https:\/\/www.docker.com\/app\/uploads\/2025\/12\/IgorAleksandrov1.jpeg\" class=\"fade-in attachment-full size-full\" alt=\"IgorAleksandrov1\" title=\"- IgorAleksandrov1\" \/>\n        <\/div>\n\n<h2 class=\"wp-block-heading\"><strong>If you weren\u2019t working in tech, what would you be doing instead?<\/strong><\/h2>\n<p>If I weren\u2019t working in tech, I think I\u2019d be doing woodworking. There\u2019s something deeply satisfying about creating things with your hands, and woodworking offers that same creative problem-solving that draws me to programming \u2013 except you\u2019re working with natural materials and traditional tools instead of code.<\/p>\n<p>I truly enjoy working with my hands and seeing tangible results from my efforts. In many ways, building software and building furniture aren\u2019t that different \u2013 you\u2019re taking raw materials, applying craftsmanship and attention to detail, and creating something functional and beautiful.<\/p>\n<p>If not woodworking, I\u2019d probably pursue diving. I\u2019m already a PADI certified rescue diver, and I truly like the ocean. There\u2019s something about the underwater world that\u2019s entirely different from our digital lives \u2013 it\u2019s peaceful, challenging, and always surprising. Getting my diving instructor certification and helping others discover that underwater world would be incredibly rewarding.<\/p>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=1716491250  fetchpriority=\"high\" decoding=\"async\" width=\"3480\" height=\"2610\" src=\"https:\/\/www.docker.com\/app\/uploads\/2025\/12\/IgorAleksandrov2-scaled.jpg\" class=\"fade-in attachment-full size-full\" alt=\"IgorAleksandrov2 scaled\" title=\"- IgorAleksandrov2 scaled\" \/>\n        <\/div>\n\n<h2 class=\"wp-block-heading\"><strong>Can you share a memorable story from collaborating with the Docker community?<\/strong><\/h2>\n<p>One of the most rewarding aspects of being a Docker Captain is our regular Captains meetings, and honestly, I enjoy each one of them. These aren\u2019t just typical corporate meetings \u2013 they\u2019re genuine collaborations with some of the most passionate and knowledgeable people in the containerization space.<\/p>\n<p>What makes these meetings special is the diversity of perspectives. You have Captains from completely different backgrounds \u2013 some focused on enterprise Kubernetes deployments, others working on AI, developers like me optimizing Rails applications, and people solving problems I\u2019ve never even thought about.<\/p>\n<h2 class=\"wp-block-heading\"><strong>What\u2019s your favorite Docker product or feature right now, and why?<\/strong><\/h2>\n<p>Currently, I\u2019m really excited about the Build Debugging feature that was recently integrated into VS Code. As someone who spends a lot of time optimizing Rails Dockerfiles and writing about containerization best practices, this feature has been a game-changer for my development workflow.<\/p>\n<p>When you\u2019re crafting complex multi-stage builds for Rails applications \u2013 especially when you\u2019re trying to optimize image size, manage build caches, and handle dependencies like Node.js and Ruby gems \u2013 debugging build failures used to be a real pain.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Can you walk us through a tricky technical challenge you solved recently?<\/strong><\/h2>\n<p>Recently, I was facing a really frustrating development workflow issue that I think many Rails developers can relate to. We had a large database dump file, about 150GB,\u00a0that we needed to use as a template for local development. The problem was that restoring this SQL dump into PostgreSQL was taking up to an hour every time we needed to reset our development database to a clean state.<\/p>\n<p>For a development team, this was killing our productivity. Every time someone had to test a migration rollback, debug data-specific issues, or just start fresh, they\u2019d have to wait an hour for the database restore. That\u2019s completely unacceptable.<\/p>\n<p>Initially, we were doing what most teams do: running <code>pg_restore<\/code> against the SQL dump file directly. But with a 150GB database, this involves PostgreSQL parsing the entire dump, executing thousands of INSERT statements, rebuilding indexes, and updating table statistics. It\u2019s inherently slow because the database engine has to do real work.<\/p>\n<p>I realized the bottleneck wasn\u2019t the data itself \u2013 it was the database restoration process. So I wrote a Bash script that takes an entirely different approach:<\/p>\n<ol class=\"wp-block-list\">\n<li><strong>Create a template volume<\/strong>: Start with a fresh Docker volume and spin up a PostgreSQL container<\/li>\n<li><strong>One-time restoration<\/strong>: Restore the SQL dump into this template database (this still takes an hour, but only once)<\/li>\n<li><strong>Volume snapshot<\/strong>: Use a BusyBox container to copy the entire database volume at the filesystem level<\/li>\n<li><strong>Instant resets<\/strong>: When developers need a fresh database, just copy the template volume to a new working volume<\/li>\n<\/ol>\n<p>The magic is in step 4. Instead of restoring from SQL, we\u2019re essentially copying files at the Docker volume level. This takes seconds instead of an hour because we\u2019re just copying the already-processed PostgreSQL data files.<\/p>\n<p>Docker volumes are just filesystem directories under the hood. PostgreSQL stores its data in a very specific directory structure with data files, indexes, and metadata. By copying the entire volume, we\u2019re getting a perfect snapshot of the database in its \u201cready to use\u201d state.<\/p>\n<p>The script handles all the orchestration \u2013 creating volumes, managing container lifecycles, and ensuring the copied database starts up cleanly. What used to be a one-hour reset cycle is now literally 5-10 seconds. Developers can experiment freely, test destructive operations, and reset their environment without hesitation. It\u2019s transformed how our team approaches database-dependent development.<\/p>\n<h2 class=\"wp-block-heading\"><strong>What\u2019s one Docker tip you wish every developer knew?<\/strong><\/h2>\n<p>If something looks weird in your Dockerfile, you are doing it wrong. This is the single most important lesson I\u2019ve learned from years of optimizing Rails Dockerfiles. I see this constantly when reviewing other developers\u2019 container setups \u2013 there\u2019s some convoluted RUN command, a bizarre COPY pattern, or a workaround that just feels off.<\/p>\n<p>Your Dockerfile should read like clean, logical instructions. If you find yourself writing something like:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; gutter: false; title: ; notranslate\">\nRUN apt-get update &amp;amp;&amp;amp; apt-get install -y wget &amp;amp;&amp;amp; \n    wget some-random-script.sh &amp;amp;&amp;amp; chmod +x some-random-script.sh &amp;amp;&amp;amp; \n    .\/some-random-script.sh &amp;amp;&amp;amp; rm some-random-script.sh\n<\/pre>\n<\/div>\n<p>\u2026you\u2019re probably doing it wrong.<\/p>\n<p>The best Dockerfiles are almost boring in their simplicity and clarity. Every line should have a clear purpose, and the overall flow should make sense to anyone reading it. If you\u2019re adding odd hacks, unusual file permissions, or complex shell gymnastics, step back and ask why.<\/p>\n<p>This principle has saved me countless hours of debugging. Instead of trying to make unusual things work, I\u2019ve learned to redesign the approach. Usually, there\u2019s a cleaner, more standard way to achieve what you\u2019re trying to do.<\/p>\n<h2 class=\"wp-block-heading\"><strong>If you could containerize any non-technical object in real life, what would it be and why?<\/strong><\/h2>\n<p>If I could containerize any non-technical object, it would definitely be knowledge itself. Imagine being able to package up skills, experiences, and expertise into portable containers that you could load and unload from your mind as needed. As someone who\u2019s constantly learning new technologies and teaching others, I\u2019m fascinated by how we acquire and transfer knowledge. Currently, if I want to dive deep into a new programming language like I did with Crystal, or master a deployment tool like Kamal, it takes months of dedicated study and practice.<\/p>\n<p>But what if knowledge worked like Docker containers? You could have a \u201cRuby 3.3 expertise\u201d container, a \u201cAdvanced Kubernetes\u201d container, or even a \u201cWoodworking joinery techniques\u201d container. Need to debug a complex Rails application? Load the container. Working on a diving certification course? Swap in the marine biology knowledge base.<\/p>\n<p>The real power would be in the consistency and portability \u2013 just like how Docker containers ensure your application runs the same way everywhere, knowledge containers would give you the same depth of understanding regardless of context. No more forgetting syntax, no more struggling to recall that one debugging technique you learned years ago.<\/p>\n<p>Plus, imagine the collaborative possibilities. Experienced developers could literally package their hard-earned expertise and share it with the community. It would democratize learning in the same way Docker democratized deployment.<\/p>\n<p>Of course, the human experience of learning and growing would be lost, but from a pure efficiency standpoint? That would be incredible.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Where can people find you online? (talks, blog posts, or open source projects, etc)<\/strong><\/h2>\n<p>I am always active in X (<a href=\"https:\/\/x.com\/igor_alexandrov\" rel=\"nofollow\">@igor_alexandrov<\/a>) and on <a href=\"https:\/\/www.linkedin.com\/in\/igor-aleksandrov\/\" rel=\"nofollow noopener\" target=\"_blank\">LinkedIn<\/a>. I try to give at least 2-3 talks at tech conferences and meetups each year, and besides this, I have my personal blog.<\/p>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=1023618430  data-opt-src=\"https:\/\/www.docker.com\/app\/uploads\/2025\/12\/IgorAleksandrov3-scaled.jpg\"  decoding=\"async\" width=\"2320\" height=\"3480\" src=\"data:image/svg+xml,%3Csvg%20viewBox%3D%220%200%20100%%20100%%22%20width%3D%22100%%22%20height%3D%22100%%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Crect%20width%3D%22100%%22%20height%3D%22100%%22%20fill%3D%22transparent%22%2F%3E%3C%2Fsvg%3E\" class=\"fade-in attachment-full size-full\" alt=\"IgorAleksandrov3 scaled\" title=\"- IgorAleksandrov3 scaled\" \/>\n        <\/div>\n\n<h2 class=\"wp-block-heading\">Rapid Fire Questions<\/h2>\n<h3 class=\"wp-block-heading\">Cats or Dogs?<\/h3>\n<p>Dogs<\/p>\n<h3 class=\"wp-block-heading\">Morning person or night owl?<\/h3>\n<p>Both<\/p>\n<h3 class=\"wp-block-heading\">Favorite comfort food?<\/h3>\n<p>Dumplings<\/p>\n<h3 class=\"wp-block-heading\">One word friends would use to describe you?<\/h3>\n<p>Perfectionist<\/p>\n<h3 class=\"wp-block-heading\">A hobby you picked up recently?<\/h3>\n<p>Cycling<\/p>","protected":false},"excerpt":{"rendered":"<p>Docker Captains are leaders from the developer community that are both experts in their field and are passionate about sharing [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3101,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[4],"tags":[],"class_list":["post-3100","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=3100"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3100\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/3101"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=3100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=3100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=3100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}