eolas/neuron/d0ed26d0-cdc8-4643-8c09-445408195f9b/.neuron/output/Docker_containers.html

69 lines
16 KiB
HTML
Raw Normal View History

2024-10-20 19:00:04 +01:00
<!DOCTYPE html><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type" /><meta content="width=device-width, initial-scale=1" name="viewport" /><!--replace-start-0--><!--replace-start-5--><!--replace-start-8--><title>Docker containers - My Zettelkasten</title><!--replace-end-8--><!--replace-end-5--><!--replace-end-0--><link href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.8.7/dist/semantic.min.css" rel="stylesheet" /><link href="https://fonts.googleapis.com/css?family=Merriweather|Libre+Franklin|Roboto+Mono&amp;display=swap" rel="stylesheet" /><!--replace-start-1--><!--replace-start-4--><!--replace-start-7--><link href="https://raw.githubusercontent.com/srid/neuron/master/assets/neuron.svg" rel="icon" /><meta content="We launch a container by running, e.g" name="description" /><meta content="Docker containers" property="og:title" /><meta content="My Zettelkasten" property="og:site_name" /><meta content="article" property="og:type" /><meta content="Docker_containers" property="neuron:zettel-id" /><meta content="Docker_containers" property="neuron:zettel-slug" /><meta content="containerization" property="neuron:zettel-tag" /><meta content="docker" property="neuron:zettel-tag" /><script type="application/ld+json">[]</script><style type="text/css">body{background-color:#eeeeee !important;font-family:"Libre Franklin", serif !important}body .ui.container{font-family:"Libre Franklin", serif !important}body h1, h2, h3, h4, h5, h6, .ui.header, .headerFont{font-family:"Merriweather", sans-serif !important}body code, pre, tt, .monoFont{font-family:"Roboto Mono","SFMono-Regular","Menlo","Monaco","Consolas","Liberation Mono","Courier New", monospace !important}body div.z-index p.info{color:#808080}body div.z-index ul{list-style-type:square;padding-left:1.5em}body div.z-index .uplinks{margin-left:0.29999em}body .zettel-content h1#title-h1{background-color:rgba(33,133,208,0.1)}body nav.bottomPane{background-color:rgba(33,133,208,2.0e-2)}body div#footnotes{border-top-color:#2185d0}body p{line-height:150%}body img{max-width:100%}body .deemphasized{font-size:0.94999em}body .deemphasized:hover{opacity:1}body .deemphasized:not(:hover){opacity:0.69999}body .deemphasized:not(:hover) a{color:#808080 !important}body div.container.universe{padding-top:1em}body div.zettel-view ul{padding-left:1.5em;list-style-type:square}body div.zettel-view .pandoc .highlight{background-color:#ffff00}body div.zettel-view .pandoc .ui.disabled.fitted.checkbox{margin-right:0.29999em;vertical-align:middle}body div.zettel-view .zettel-content .metadata{margin-top:1em}body div.zettel-view .zettel-content .metadata div.date{text-align:center;color:#808080}body div.zettel-view .zettel-content h1{padding-top:0.2em;padding-bottom:0.2em;text-align:center}body div.zettel-view .zettel-content h2{border-bottom:solid 1px #4682b4;margin-bottom:0.5em}body div.zettel-view .zettel-content h3{margin:0px 0px 0.4em 0px}body div.zettel-view .zettel-content h4{opacity:0.8}body div.zettel-view .zettel-content div#footnotes{margin-top:4em;border-top-style:groove;border-top-width:2px;font-size:0.9em}body div.zettel-view .zettel-content div#footnotes ol > li > p:only-of-type{display:inline;margin-right:0.5em}body div.zettel-view .zettel-content aside.footnote-inline{width:30%;padding-left:15px;margin-left:15px;float:right;background-color:#d3d3d3}body div.zettel-view .zettel-content .overflows{overflow:auto}body div.zettel-view .zettel-content code{margin:auto auto auto auto;font-size:100%}body div.zettel-view .zettel-content p code, li code, ol code{padding:0.2em 0.2em 0.2em 0.2em;background-color:#f5f2f0}body div.zettel-view .zettel-content pre{overflow:auto}body div.zettel-view .zettel-content dl dt{font-weight:bold}body div.zettel-view .zettel-content blockquote{background-color:#f9f9f9;border-left:solid 10px #cccccc;margin:1.5em 0px 1.5em 0px;padding:0.5em 10px 0.5em 10px}body div.zettel-view .zettel-content.raw{background-color:#dddddd}body .ui.label.zettel-tag{color:#000000}body .ui.label.zettel-tag a{color:#000000}body nav.bottomPane ul.backlinks > li{padding
async=""
id="MathJax-script"
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"
></script>
<link
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism.min.css"
rel="stylesheet"
/><link rel="preconnect" href="https://fonts.googleapis.com" /><link
rel="preconnect"
href="https://fonts.gstatic.com"
crossorigin
/><link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Serif:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet"
/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/components/prism-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js"></script>
<style>
body .ui.container,
body ul {
font-family: "IBM Plex Sans" !important;
}
body blockquote {
border-left-width: 3px !important;
font-style: italic;
}
.headerFont,
.ui.header,
body h1,
h2,
h3,
h4,
h5,
h6 {
font-family: "IBM Plex Sans Condensed" !important;
}
body p {
line-height: 1.4;
}
.monoFont,
body code,
pre,
tt {
font-family: "IBM Plex Mono" !important;
font-size: 12px !important;
line-height: 1.4 !important;
}
</style>
<!--replace-end-7--><!--replace-end-4--><!--replace-end-1--></head><body><div class="ui fluid container universe"><!--replace-start-2--><!--replace-start-3--><!--replace-start-6--><div class="ui text container" id="zettel-container" style="position: relative"><div class="zettel-view"><article class="ui raised attached segment zettel-content"><div class="pandoc"><h1 id="title-h1">Docker containers</h1><h2 id="launch-a-container">Launch a container</h2><p>We launch a container by running, e.g</p><pre><code class="sh language-sh">docker run hello-world</code></pre><p>Docker looks for the <code>hello-world</code> image in order to start the container. If it cannot find it, it will fetch the image from DockerHub.</p><p>(<code>docker run</code> assumes you are saying “run image in container” but you can specify other Docker objects such as networks.)</p><p>The <code>docker run</code> command is actually a composite of the following two commands:</p><pre><code class="sh language-sh">docker create --name [my_container_name] hello-world
docker start [my_container]</code></pre><p>Here is an applied example:</p><pre><code class="language-none">docker run --name my-container debian /bin/echo &quot;Hello, world&quot;</code></pre><p>This creates and runs a container from the Debian image and executes <code>/bin/echo</code> inside of it. Once you have run the above line, if the process is successful it will exit. The container will stop running but it will remain in memory. Nothing will be output (no “Hello, world”), because when you run it, you are <em>outside</em> of the container.</p><h2 id="launch-a-container-as-a-daemon">Launch a container as a daemon</h2><p>You can also run a container as a <a>daemon</a>. In this mode, the container will run in the background and detach from the console. For example:</p><pre><code class="sh language-sh">docker run -d debian /bin/sh -c /bin/sh -c &quot;while true; do echo &#39;Hello!&#39;; sleep 1; done&quot;</code></pre><p>Inside the container, this will echo “Hello!” every second in an infinite loop whilst the daemon is active.</p><p>The above command will not actually output anything. Instead it wil ouput the container ID, e.g:</p><pre><code class="language-none">2749d796cbd64e9cf57307329e792587c39d8244f2377e62d78f3f3f77eecdb4</code></pre><p>You can use this to access the log for the container. When you do so, you will then see the output:</p><pre><code class="sh language-sh">docker log 2749
hello
hello
hello
...</code></pre><p>(We could also use the container name to reference the container, if we launched it with the <code>--name</code> param.)</p><h2 id="stopping-a-container">Stopping a container</h2><pre><code class="language-none">docker stop 2749</code></pre><p>There will be a delay because it shuts down gracefully. It sends a SIGINT to the process in the container with PID 1 (i.e the root or parent process for the container).</p><p><code>stop</code> will keep the container in memory. This means you can still refer bak to the logs and that it can be restarted.</p><p>Instead of <code>stop</code>, if you were to use:</p><pre><code class="language-none">docker rm 2749</code></pre><p>The container will be stopped and deleted. The logs are deleted and the container cannot be recovered.</p><p>We can also tell Docker to immediately remove a container after it exits:</p><pre><code class="language-none">docker run --rm [image]</code></pre><h2 id="interacting-with-containers">Interacting with containers</h2><p>In the examples so far the container is a closed box. You dont have a terminal through which you can interact with the container as you would with an OS. You can only start the container and view its activities by accessing the logs.</p><p>For images that have an OS we can use <code>-i -t</code> to launch a terminal in interactive mode.</p><pre><code class="sh language-sh">docker run -i -t debian /bin/bash
root@0022da12f2f2:/# ls
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
root@0022da12f2f2:/# whoami
root
root@0022da12f2f2:/# ls usr/
bin games include lib libexec local sbin share src</code></pre><p>Note that it defaults to the root user.</p><p>Containers are lightweight and should only contain the minium environment needed to run an application. For this reason OSs that are included in an image are often very stripped-back and many programs and processes will not be there by default. (Although you could install a package manager and install the commands you need.)</p><p>The previous command launches the container and enters into it with a terminal. If a container is already running, you can enter into it in terminal mode with <code>exec</code>:</p><pre><code class="language-none">docker exec -i -t my_container bash</code></pre><p>If a container is running in detached mode we can attach to the main process with <code>docker attach</code></p><pre><code class="language-none">docker attach my_container</code></pre><h2 id="container-lifecycle">Container lifecycle</h2><p><img src="/static/container-lifecycle.png" /></p><p>All containers have a lifecycle represented by five distinct states. Each state has an associated command:</p><ul><li>created<ul><li><code>docker create</code>, <code>docker run</code></li></ul></li><li>running</li><li>paused<ul><li><code>docker pause</code>, <code>docker unpause</code></li></ul></li><li>stopped<ul><li><code>docker stop</code>, <code>docker kill</code></li></ul></li><li>removed<ul><li><code>docker rm</code></li></ul></li></ul><h2 id="main-container-commands">Main container commands</h2><pre><code class="sh language-sh">docker create # create container from image
docker run # create and start container from image
docker run --name # add custom name for container
docker ps # list currently active containers
docker ps -a # list all containers (inactive and active)
docker logs # display a container log
docker stop # stop a running container
docker start # starts a stopped (exited) container
docker rm # remove a stopped (exited) container</code></pre><h2 id="container-troubleshooting">Container troubleshooting</h2><p>Lots of diagnostic output:</p><pre><code class="language-none">docker inspect container_name</code></pre><p>List processes (from outside):</p><pre><code class="language-none">docker top container_name</code></pre><p>View logs</p><pre><code class="language-none">docker logs container_name</code></pre></div></article><nav class="ui attached segment deemphasized bottomPane" id="neuron-tags-pane"><div><span class="ui basic label zettel-tag" title="Tag">containerization</span><span class="ui basic label zettel-tag" title="Tag">docker</span></div></nav><nav class="ui bottom attached icon compact inverted menu blue" id="neuron-nav-bar"><!--replace-start-9--><!--replace-end-9--><a class="right item" href="impulse.html" title="Open Impulse"><i class="wave square icon"></i></a></nav></div></div><!--replace-end-6--><!--replace-end-3--><!--replace-end-2--><div class="ui center aligned container footer-version"><div class="ui tiny image"><a href="https://neuron.zettel.page"><img alt="logo" src="https://raw.githubusercontent.com/srid/neuron/master/assets/neuron.svg" title="Generated by Neuron 1.9.35.3" /></a></div></div></div></body></html>