{"id":471,"date":"2026-10-14T15:51:01","date_gmt":"2026-10-14T15:51:01","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2016\/02\/23\/how-to-get-bash-or-ssh-into-a-running-container-in-background-mode\/"},"modified":"2026-10-14T15:51:01","modified_gmt":"2026-10-14T15:51:01","slug":"how-to-get-bash-or-ssh-into-a-running-container-in-background-mode","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-get-bash-or-ssh-into-a-running-container-in-background-mode\/","title":{"rendered":"How to Access a Running Docker Container Shell: docker exec vs docker attach"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">This guide explains how to open an interactive shell inside a running Docker container for troubleshooting and operational tasks. You will learn a safe step-by-step workflow, the difference between <strong>docker exec<\/strong> and <strong>docker attach<\/strong>, and why SSH is usually unnecessary for containers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2016-02-23; fully revised and updated.<\/em><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2016\/02\/bash-or-ssh-into-a-running-1-1.png\" alt=\"Open a shell in a running Docker container\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Quick workflow for container shell access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For most debugging work on a running container, use <strong>docker exec -it<\/strong>. It starts a new process inside the container and avoids coupling your terminal session to the container\u2019s main process.<\/p>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Identify container] --> B{Container running}\n    B -- no --> C[Start container]\n    B -- yes --> D[Choose access method]\n    C --> D\n    D --> E[Use docker exec for new shell]\n    D --> F[Use docker attach for main process]\n    E --> G[Exit shell]\n    F --> G\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Find the target container and start it if needed<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">List running containers first. If the target container is stopped, start it before attempting shell access.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">docker ps\ndocker ps -a<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">docker start <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container_id_or_name<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 2: Choose the right access method<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>docker exec<\/strong> and <strong>docker attach<\/strong> are not interchangeable. Pick based on whether you need a <em>new shell process<\/em> or direct interaction with the container\u2019s main process.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Creates a new process?<\/th><th>Best for<\/th><th>Important caveat<\/th><\/tr><\/thead><tbody><tr><td>docker exec -it &lt;container&gt; \/bin\/bash<\/td><td>Yes<\/td><td>Opening a fresh interactive shell for debugging<\/td><td>Requires a shell binary in the image (use \/bin\/sh if bash is missing)<\/td><\/tr><tr><td>docker attach &lt;container&gt;<\/td><td>No<\/td><td>Interacting with or observing the main process stream<\/td><td>You are tied to PID 1 behavior; exiting can impact container lifecycle depending on process design<\/td><\/tr><tr><td>SSH into container<\/td><td>Usually not applicable<\/td><td>Legacy workflows only<\/td><td>Needs SSH server setup, keys, and exposed port; increases complexity and attack surface<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Open a new shell with docker exec (recommended)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use container ID or name. Try <strong>\/bin\/bash<\/strong> first; if unavailable, fall back to <strong>\/bin\/sh<\/strong>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">docker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container_id<\/span>&gt;<\/span> \/bin\/bash\ndocker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container_name<\/span>&gt;<\/span> \/bin\/bash\n\ndocker exec -it <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container_id_or_name<\/span>&gt;<\/span> \/bin\/sh<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If you specifically need to connect to the running main process stream instead, use attach:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">docker attach <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container_id_or_name<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Step 4: Exit safely<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">From an exec-created shell, leave with <strong>exit<\/strong>. This ends only that shell process, not the container itself.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\"><span class=\"hljs-keyword\">exit<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">When using <strong>docker attach<\/strong>, remember you are connected to the container\u2019s main process I\/O. Detach behavior and impact depend on how that process is configured.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Linux permissions and sudo<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Whether you need <strong>sudo<\/strong> for Docker commands depends on host setup. If your user is not in the Docker group, commands may fail with permission errors.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">sudo usermod -aG docker $USER\nnewgrp docker<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Prefer <strong>docker exec -it<\/strong> for day-to-day troubleshooting.<\/li><li>Avoid adding SSH servers to application containers unless there is a clear operational requirement.<\/li><li>Use container <strong>names<\/strong> for readability, but keep IDs handy for scripts.<\/li><li>If <strong>\/bin\/bash<\/strong> fails, retry with <strong>\/bin\/sh<\/strong>.<\/li><li>Be careful with <strong>docker attach<\/strong>: it connects to the main process and can affect runtime behavior.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Need a shell inside a running container that is already in detached mode? This updated guide shows the correct workflow, compares docker exec and docker attach, and explains when SSH does and does not make sense.<\/p>\n","protected":false},"author":1,"featured_media":3196,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[2],"tags":[1196,137,1194,567,545,321,1195,896,1197],"class_list":["post-471","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorised","tag-background","tag-bash","tag-container","tag-docker","tag-how","tag-mode","tag-running-container","tag-ssh","tag-ssh-into-a-container"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/471","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=471"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/471\/revisions"}],"predecessor-version":[{"id":79356,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/471\/revisions\/79356"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3196"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=471"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=471"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=471"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}