如何在Debian 9上安装和使用Docker
<div class="c-markdown J-articleContent"><h2><strong>介绍</strong></h2>
<p>Docker是一个简化<em>容器中</em>应用程序进程管理过程的应用程序。容器允许您在资源隔离的进程中运行应用程序。它们与虚拟机类似,但容器更便携,更加资源友好,并且更依赖于主机操作系统。</p>
<p>在本教程中,您将在Debian 9上安装和使用Docker Community Edition(CE)。您将安装Docker本身,使用容器和映像,并将映像推送到Docker存储库。</p>
<h2><strong>先决条件</strong></h2>
<p>要学习本教程,您需要具备以下条件:</p>
<ul class="ul-level-0">
<li>一个Debian 9服务器按照Debian 9初始服务器设置指南设置,没有服务器的同学可以在这里购买,不过我个人更推荐您使用<strong>免费</strong>的腾讯云开发者实验室进行试验,学会安装后再购买服务器。</li>
<li>一个具有sudo权限的非root用户。</li>
<li>在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。</li>
<li>如果您希望创建自己的图像并将其推送到Docker Hub,则可以使用Docker Hub上的帐户,如步骤7和8所示。</li>
</ul>
<h2><strong>第1步 - 安装Docker</strong></h2>
<p>官方Debian存储库中提供的Docker安装包可能不是最新版本。为了确保我们获得最新版本,我们将从官方Docker存储库安装Docker。为此,我们将添加一个新的包源,从Docker添加GPG密钥以确保下载有效,然后安装该包。</p>
<p>首先,更新现有的包列表:</p>
<pre class="prism-token tokenlanguage-javascript">sudo apt update</pre>
<p>接下来,安装一些允许<code>apt</code>使用包通过HTTPS的必备软件包:</p>
<pre class="prism-token tokenlanguage-javascript">sudo apt install apt<span class="token operator">-transport<span class="token operator">-https ca<span class="token operator">-certificates curl gnupg2 software<span class="token operator">-properties<span class="token operator">-common</span></span></span></span></span></pre>
<p>然后将官方Docker存储库的GPG密钥添加到您的系统:</p>
<pre class="prism-token tokenlanguage-javascript">curl <span class="token operator">-fsSL https<span class="token punctuation">:<span class="token operator">/<span class="token operator">/download<span class="token punctuation">.docker<span class="token punctuation">.com<span class="token operator">/linux<span class="token operator">/debian<span class="token operator">/gpg <span class="token operator">| sudo apt<span class="token operator">-key add <span class="token operator">-</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>将Docker存储库添加到APT源:</p>
<pre class="prism-token tokenlanguage-javascript">sudo add<span class="token operator">-apt<span class="token operator">-repository <span class="token string">"deb https://download.docker.com/linux/debian $(lsb_release -cs) stable"</span></span></span></pre>
<p>接下来,使用新添加的repo中的Docker包更新包数据库:</p>
<pre class="prism-token tokenlanguage-javascript">sudo apt update</pre>
<p>确保您要从Docker repo而不是默认的Debian repo安装:</p>
<pre class="prism-token tokenlanguage-javascript">apt<span class="token operator">-cache policy docker<span class="token operator">-ce</span></span></pre>
<p>虽然Docker的版本号可能不同,但您会看到这样的输出:</p>
<pre class="prism-token tokenlanguage-javascript">docker<span class="token operator">-ce<span class="token punctuation">:
Installed<span class="token punctuation">: <span class="token punctuation">(none<span class="token punctuation">)
Candidate<span class="token punctuation">: <span class="token number">18.06<span class="token punctuation">.<span class="token number">1<span class="token operator">~ce<span class="token operator">~<span class="token number">3<span class="token operator">-<span class="token number">0<span class="token operator">~debian
Version table<span class="token punctuation">:
<span class="token number">18.06<span class="token punctuation">.<span class="token number">1<span class="token operator">~ce<span class="token operator">~<span class="token number">3<span class="token operator">-<span class="token number">0<span class="token operator">~debian <span class="token number">500
<span class="token number">500 https<span class="token punctuation">:<span class="token operator">/<span class="token operator">/download<span class="token punctuation">.docker<span class="token punctuation">.com<span class="token operator">/linux<span class="token operator">/debian stretch<span class="token operator">/stable amd64 Packages</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>请注意,<code>docker-ce</code>未安装,但安装的候选者来自Debian 9(<code>stretch</code>)的Docker存储库。</p>
<p>最后,安装Docker:</p>
<pre class="prism-token tokenlanguage-javascript">sudo apt install docker<span class="token operator">-ce</span></pre>
<p>现在应该安装Docker,守护进程启动,并启用进程启动进程。检查它是否正在运行:</p>
<pre class="prism-token tokenlanguage-javascript">sudo systemctl status docker</pre>
<p>输出应类似于以下内容,表明该服务处于活动状态并正在运行:</p>
<pre class="prism-token tokenlanguage-javascript">● docker<span class="token punctuation">.service <span class="token operator">- Docker Application Container Engine
Loaded<span class="token punctuation">: <span class="token function">loaded <span class="token punctuation">(<span class="token operator">/lib<span class="token operator">/systemd<span class="token operator">/system<span class="token operator">/docker<span class="token punctuation">.service<span class="token punctuation">; enabled<span class="token punctuation">; vendor preset<span class="token punctuation">: enabled<span class="token punctuation">)
Active<span class="token punctuation">: <span class="token function">active <span class="token punctuation">(running<span class="token punctuation">) since Thu <span class="token number">2018<span class="token operator">-<span class="token number">07<span class="token operator">-<span class="token number">05 <span class="token number">15<span class="token punctuation">:<span class="token number">08<span class="token punctuation">:<span class="token number">39 UTC<span class="token punctuation">; 2min 55s ago
Docs<span class="token punctuation">: https<span class="token punctuation">:<span class="token operator">/<span class="token operator">/docs<span class="token punctuation">.docker<span class="token punctuation">.com
Main PID<span class="token punctuation">: <span class="token number">21319 <span class="token punctuation">(dockerd<span class="token punctuation">)
CGroup<span class="token punctuation">: <span class="token operator">/system<span class="token punctuation">.slice<span class="token operator">/docker<span class="token punctuation">.service
├─<span class="token number">21319 <span class="token operator">/usr<span class="token operator">/bin<span class="token operator">/dockerd <span class="token operator">-H fd<span class="token punctuation">:<span class="token operator">/<span class="token operator">/
└─<span class="token number">21326 docker<span class="token operator">-containerd <span class="token operator">--config <span class="token operator">/<span class="token keyword">var<span class="token operator">/run<span class="token operator">/docker<span class="token operator">/containerd<span class="token operator">/containerd<span class="token punctuation">.toml</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>现在安装Docker不仅可以为您提供Docker服务(守护程序),还可以为您提供<code>docker</code>命令行实用程序或Docker客户端。我们将在本教程后面探讨如何使用该<code>docker</code>命令。</p>
<h2><strong>第2步 - 在没有Sudo的情况下执行Docker命令(可选)</strong></h2>
<p>默认情况下,该<code>docker</code>命令只能由<strong>root</strong>用户或<strong>docker</strong>组中的用户运行,该用户在Docker的安装过程中自动创建。如果您尝试运行该<code>docker</code>命令而不使用<code>sudo</code>或不在<strong>docker</strong>组中作为前缀,您将获得如下输出:</p>
<pre class="prism-token tokenlanguage-javascript">docker<span class="token punctuation">: Cannot connect to the Docker daemon<span class="token punctuation">. Is the docker daemon running on <span class="token keyword">this host<span class="token operator">?<span class="token punctuation">.
See <span class="token string">'docker run --help'<span class="token punctuation">.</span></span></span></span></span></span></span></pre>
<p>如果要在运行<code>docker</code>命令时避免键入<code>sudo</code>,请将用户名添加到<code>docker</code>组中:</p>
<pre class="prism-token tokenlanguage-javascript">sudo usermod <span class="token operator">-aG docker $<span class="token punctuation">{USER<span class="token punctuation">}</span></span></span></pre>
<p>要应用新的组成员身份,请注销服务器并重新登录,或键入以下内容:</p>
<pre class="prism-token tokenlanguage-javascript">su <span class="token operator">- $<span class="token punctuation">{USER<span class="token punctuation">}</span></span></span></pre>
<p>系统将提示您输入用户密码以继续。</p>
<p>通过键入以下内容确认您的用户现已添加到<strong>docker</strong>组:</p>
<pre class="prism-token tokenlanguage-javascript">id <span class="token operator">-nG
sammy sudo docker</span></pre>
<p>如果您需要将用户添加到您未登录的<code>docker</code>组中,请使用以下方式明确声明该用户名:</p>
<pre class="prism-token tokenlanguage-javascript">sudo usermod <span class="token operator">-aG docker username</span></pre>
<p>本文的其余部分假定您以<strong>docker</strong>组中的用户身份运行该<code>docker</code>命令。如果您选择不这样做,请使用<code>sudo</code>在前面添加命令。</p>
<p>让我们接下来探讨<code>docker</code>命令。</p>
<h2><strong>第3步 - 使用Docker命令</strong></h2>
<p>使用<code>docker</code>包括传递一系列选项和命令,后跟参数。语法采用以下形式:</p>
<pre class="prism-token tokenlanguage-javascript">docker <span class="token punctuation"> <span class="token punctuation"> <span class="token punctuation"></span></span></span></span></span></span></pre>
<p>要查看所有可用的子命令,请键入:</p>
<pre class="prism-token tokenlanguage-javascript">docker</pre>
<p>从Docker 18开始,可用子命令的完整列表包括:</p>
<pre class="prism-token tokenlanguage-javascript">
attach Attach local standard input<span class="token punctuation">, output<span class="token punctuation">, and error streams to a running container
build Build an image <span class="token keyword">from a Dockerfile
commit Create a <span class="token keyword">new <span class="token class-name">image <span class="token keyword">from a container's changes
cp Copy files<span class="token operator">/folders between a container and the local filesystem
create Create a <span class="token keyword">new <span class="token class-name">container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events <span class="token keyword">from the server
exec Run a command <span class="token keyword">in a running container
<span class="token keyword">export Export a container's filesystem <span class="token keyword">as a tar archive
history Show the history <span class="token keyword">of an image
images List images
<span class="token keyword">import Import the contents <span class="token keyword">from a tarball to create a filesystem image
info Display system<span class="token operator">-wide information
inspect Return low<span class="token operator">-level information on Docker objects
kill Kill one or more running containers
load Load an image <span class="token keyword">from a tar archive or STDIN
login Log <span class="token keyword">in to a Docker registry
logout Log out <span class="token keyword">from a Docker registry
logs Fetch the logs <span class="token keyword">of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping <span class="token keyword">for the container
ps List containers
pull Pull an image or a repository <span class="token keyword">from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command <span class="token keyword">in a <span class="token keyword">new <span class="token class-name">container
save Save one or more images to a tar <span class="token function">archive <span class="token punctuation">(streamed to STDOUT by <span class="token keyword">default<span class="token punctuation">)
search Search the Docker Hub <span class="token keyword">for images
start Start one or more stopped containers
stats Display a live stream <span class="token keyword">of <span class="token function">container<span class="token punctuation">(s<span class="token punctuation">) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes <span class="token keyword">of a container
unpause Unpause all processes within one or more containers
update Update configuration <span class="token keyword">of one or more containers
version Show the Docker version information
wait Block until one or more containers stop<span class="token punctuation">, then print their exit codes</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>要查看特定命令可用的选项,请键入:</p>
<pre class="prism-token tokenlanguage-javascript">docker docker<span class="token operator">-subcommand <span class="token operator">--help</span></span></pre>
<p>要查看有关Docker的系统范围信息,请使用:</p>
<pre class="prism-token tokenlanguage-javascript">docker info</pre>
<p>让我们探讨其中的一些命令。我们将从处理图像开始。</p>
<h2><strong>第4步 - 使用Docker镜像</strong></h2>
<p>Docker容器是从Docker镜像构建的。默认情况下,Docker从Docker Hub中获取这些映像,Docker Hub是由Docker管理的Docker注册表,Docker项目背后的公司。任何人都可以在Docker Hub上托管他们的Docker镜像,因此您需要的大多数应用程序和Linux发行版都将在那里托管图像。</p>
<p>要检查您是否可以从Docker Hub访问和下载图像,请键入:</p>
<pre class="prism-token tokenlanguage-javascript">docker run hello<span class="token operator">-world</span></pre>
<p>输出将指示Docker正常工作:</p>
<pre class="prism-token tokenlanguage-javascript">Unable to find image <span class="token string">'hello-world:latest' locally
latest<span class="token punctuation">: Pulling <span class="token keyword">from library<span class="token operator">/hello<span class="token operator">-world
9db2ca6ccae0<span class="token punctuation">: Pull complete
Digest<span class="token punctuation">: sha256<span class="token punctuation">:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status<span class="token punctuation">: Downloaded newer image <span class="token keyword">for hello<span class="token operator">-world<span class="token punctuation">:latest
Hello <span class="token keyword">from Docker<span class="token operator">!
This message shows that your installation appears to be working correctly<span class="token punctuation">.
<span class="token operator">...</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>Docker最初无法在本地找到<code>hello-world</code>图像,因此它从Docker Hub下载了图像,Docker Hub是默认存储库。下载映像后,Docker从映像创建了一个容器,并在容器中执行了应用程序,显示了该消息。</p>
<p>您可以通过使用命令 <code>search</code>子命令和 <code>docker</code> 命令来搜索Docker Hub上可用的图像。例如,要搜索Ubuntu映像,请键入:</p>
<pre class="prism-token tokenlanguage-javascript">docker search ubuntu</pre>
<p>该脚本将对Docker Hub进行爬网,并返回名称与搜索字符串匹配的所有图像的列表。在这种情况下,输出将类似于:</p>
<pre class="prism-token tokenlanguage-javascript">NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian<span class="token operator">-based Linux operating sys… <span class="token number">8320 <span class="token punctuation">
dorowu<span class="token operator">/ubuntu<span class="token operator">-desktop<span class="token operator">-lxde<span class="token operator">-vnc Ubuntu <span class="token keyword">with openssh<span class="token operator">-server and NoVNC <span class="token number">214 <span class="token punctuation">
rastasheep<span class="token operator">/ubuntu<span class="token operator">-sshd Dockerized SSH service<span class="token punctuation">, built on top <span class="token keyword">of offi… <span class="token number">170 <span class="token punctuation">
consol<span class="token operator">/ubuntu<span class="token operator">-xfce<span class="token operator">-vnc Ubuntu container <span class="token keyword">with <span class="token string">"headless" VNC session… <span class="token number">128 <span class="token punctuation">
ansible<span class="token operator">/ubuntu14<span class="token number">.04<span class="token operator">-ansible Ubuntu <span class="token number">14.04 LTS <span class="token keyword">with ansible <span class="token number">95 <span class="token punctuation">
ubuntu<span class="token operator">-upstart Upstart is an event<span class="token operator">-based replacement <span class="token keyword">for th… <span class="token number">88 <span class="token punctuation">
neurodebian NeuroDebian provides neuroscience research s… <span class="token number">53 <span class="token punctuation">
1and1internet<span class="token operator">/ubuntu<span class="token number">-16<span class="token operator">-nginx<span class="token operator">-php<span class="token operator">-phpmyadmin<span class="token operator">-mysql<span class="token number">-5 ubuntu<span class="token number">-16<span class="token operator">-nginx<span class="token operator">-php<span class="token operator">-phpmyadmin<span class="token operator">-mysql<span class="token number">-5 <span class="token number">43 <span class="token punctuation">
ubuntu<span class="token operator">-debootstrap debootstrap <span class="token operator">--variant<span class="token operator">=minbase <span class="token operator">--components<span class="token operator">=m… <span class="token number">39 <span class="token punctuation">
nuagebec<span class="token operator">/ubuntu Simple always updated Ubuntu docker images w… <span class="token number">23 <span class="token punctuation">
tutum<span class="token operator">/ubuntu Simple Ubuntu docker images <span class="token keyword">with SSH access <span class="token number">18
i386<span class="token operator">/ubuntu Ubuntu is a Debian<span class="token operator">-based Linux operating sys… <span class="token number">13
1and1internet<span class="token operator">/ubuntu<span class="token number">-16<span class="token operator">-apache<span class="token operator">-php<span class="token number">-7.0 ubuntu<span class="token number">-16<span class="token operator">-apache<span class="token operator">-php<span class="token number">-7.0 <span class="token number">12 <span class="token punctuation">
ppc64le<span class="token operator">/ubuntu Ubuntu is a Debian<span class="token operator">-based Linux operating sys… <span class="token number">12
eclipse<span class="token operator">/ubuntu_jdk8 Ubuntu<span class="token punctuation">, JDK8<span class="token punctuation">, Maven <span class="token number">3<span class="token punctuation">, git<span class="token punctuation">, curl<span class="token punctuation">, nmap<span class="token punctuation">, mc<span class="token punctuation">, … <span class="token number">6 <span class="token punctuation">
darksheer<span class="token operator">/ubuntu Base Ubuntu Image <span class="token operator">-- Updated hourly <span class="token number">4 <span class="token punctuation">
codenvy<span class="token operator">/ubuntu_jdk8 Ubuntu<span class="token punctuation">, JDK8<span class="token punctuation">, Maven <span class="token number">3<span class="token punctuation">, git<span class="token punctuation">, curl<span class="token punctuation">, nmap<span class="token punctuation">, mc<span class="token punctuation">, … <span class="token number">4 <span class="token punctuation">
1and1internet<span class="token operator">/ubuntu<span class="token number">-16<span class="token operator">-nginx<span class="token operator">-php<span class="token number">-5.6<span class="token operator">-wordpress<span class="token number">-4 ubuntu<span class="token number">-16<span class="token operator">-nginx<span class="token operator">-php<span class="token number">-5.6<span class="token operator">-wordpress<span class="token number">-4 <span class="token number">3 <span class="token punctuation">
pivotaldata<span class="token operator">/ubuntu A quick freshening<span class="token operator">-up <span class="token keyword">of the base Ubuntu doc… <span class="token number">2
1and1internet<span class="token operator">/ubuntu<span class="token number">-16<span class="token operator">-sshd ubuntu<span class="token number">-16<span class="token operator">-sshd <span class="token number">1 <span class="token punctuation">
ossobv<span class="token operator">/ubuntu Custom ubuntu image <span class="token keyword">from <span class="token function">scratch <span class="token punctuation">(based on o… <span class="token number">0
smartentry<span class="token operator">/ubuntu ubuntu <span class="token keyword">with smartentry <span class="token number">0 <span class="token punctuation">
1and1internet<span class="token operator">/ubuntu<span class="token number">-16<span class="token operator">-healthcheck ubuntu<span class="token number">-16<span class="token operator">-healthcheck <span class="token number">0 <span class="token punctuation">
pivotaldata<span class="token operator">/ubuntu<span class="token operator">-gpdb<span class="token operator">-dev Ubuntu images <span class="token keyword">for GPDB development <span class="token number">0
paasmule<span class="token operator">/bosh<span class="token operator">-tools<span class="token operator">-ubuntu Ubuntu based bosh<span class="token operator">-cli <span class="token number">0 <span class="token punctuation">
<span class="token operator">...</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>在<strong>OFFICIAL</strong>列中,<strong>OK</strong>表示由项目后面的公司构建和支持的图像。确定要使用的映像后,可以使用<code>pull</code>子命令将其下载到计算机。</p>
<p>执行以下命令将官方<code>ubuntu</code>映像下载到您的计算机:</p>
<pre class="prism-token tokenlanguage-javascript">docker pull ubuntu</pre>
<p>您将看到以下输出:</p>
<pre class="prism-token tokenlanguage-javascript">Using <span class="token keyword">default tag<span class="token punctuation">: latest
latest<span class="token punctuation">: Pulling <span class="token keyword">from library<span class="token operator">/ubuntu
6b98dfc16071<span class="token punctuation">: Pull complete
4001a1209541<span class="token punctuation">: Pull complete
6319fc68c576<span class="token punctuation">: Pull complete
b24603670dc3<span class="token punctuation">: Pull complete
97f170c87c6f<span class="token punctuation">: Pull complete
Digest<span class="token punctuation">: sha256<span class="token punctuation">:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d
Status<span class="token punctuation">: Downloaded newer image <span class="token keyword">for ubuntu<span class="token punctuation">:latest</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>下载映像后,可以使用带有<code>run</code>子命令的下载映像运行容器。正如您在<code>hello-world</code>示例中看到的,如果在使用<code>run</code>子命令执行<code>docker</code>时未下载图像,则Docker客户端将首先下载图像,然后使用它运行容器。</p>
<p>要查看已下载到计算机的图像,请键入:</p>
<pre class="prism-token tokenlanguage-javascript">docker images</pre>
<p>输出应类似于以下内容:</p>
<pre class="prism-token tokenlanguage-javascript">REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 16508e5c265d <span class="token number">13 days ago <span class="token number">84<span class="token punctuation">.1MB
hello<span class="token operator">-world latest 2cb0d9787c4d <span class="token number">7 weeks ago <span class="token number">1<span class="token punctuation">.85kB</span></span></span></span></span></span></span></pre>
<p>正如您将在本教程后面看到的那样,用于运行容器的图像可以被修改并用于生成新图像,然后可以将其上载(<em>推送</em>是技术术语)到Docker Hub或其他Docker注册表。</p>
<p>我们来看看如何更详细地运行容器。</p>
<h2><strong>第5步 - 运行Docker容器</strong></h2>
<p>在您在上一步中运行的<code>hello-world</code>容器是一类容器的例子,那就是发出测试消息后运行并且退出的容器。容器可以比这更有用,它们可以是交互式的。毕竟,它们类似于虚拟机,但是时属于资源更加友好型的。</p>
<p>举个例子,让我们使用Ubuntu的最新图像运行一个容器。<strong>-i</strong>和<strong>-t</strong>开关的组合为您提供了对容器的交互式shell访问:</p>
<pre class="prism-token tokenlanguage-javascript">docker run <span class="token operator">-it ubuntu</span></pre>
<p>您的命令提示符应该更改以反映您现在正在容器内工作的事实,并应采用以下形式:</p>
<pre class="prism-token tokenlanguage-javascript">root@d9b100f2f636<span class="token punctuation">:<span class="token operator">/#</span></span></pre>
<p>请注意命令提示符中的容器ID。在这个例子中,它是<code>d9b100f2f636</code>。稍后您需要该容器ID以在要删除容器时标识容器。</p>
<p>现在您可以在容器内运行任何命令。例如,让我们更新容器内的包数据库。您不需要使用<code>sudo</code>来为任何命令添加前缀,因为您以<strong>root</strong>用户身份在容器内操作:</p>
<pre class="prism-token tokenlanguage-javascript">apt update</pre>
<p>然后在其中安装任何应用程序。我们安装Node.js:</p>
<pre class="prism-token tokenlanguage-javascript">apt install nodejs</pre>
<p>这将从官方Ubuntu存储库中安装容器中的Node.js. 安装完成后,验证是否已安装Node.js:</p>
<pre class="prism-token tokenlanguage-javascript">node <span class="token operator">-v</span></pre>
<p>您将看到终端中显示的版本号:</p>
<pre class="prism-token tokenlanguage-javascript">v8<span class="token number">.10<span class="token punctuation">.<span class="token number">0</span></span></span></pre>
<p>您在容器内进行的任何更改仅适用于该容器。</p>
<p>要退出容器,请在提示符处键入 <code>exit</code> 。</p>
<p>让我们看看下一步管理我们系统上的容器。</p>
<h2><strong>第6步 - 管理Docker容器</strong></h2>
<p>使用Docker一段时间后,您的计算机上将有许多活动(运行)和非活动容器。要查看<strong>活动的</strong>,请使用:</p>
<pre class="prism-token tokenlanguage-javascript">docker ps</pre>
<p>您将看到类似于以下内容的输出:</p>
<pre class="prism-token tokenlanguage-javascript">CONTAINER ID IMAGE COMMAND CREATED </pre>
<p>在本教程中,您启动了两个容器; 一个来自<code>hello-world</code>图像,另一个来自<code>ubuntu</code>图像。两个容器都不再运行,但它们仍然存在于您的系统上。</p>
<p>要查看所有容器 - 活动和非活动,请 使用<code>-a</code>开关运行<code>docker ps</code>:</p>
<pre class="prism-token tokenlanguage-javascript">docker ps <span class="token operator">-a</span></pre>
<p>您将看到类似于此的输出:</p>
<pre class="prism-token tokenlanguage-javascript">d9b100f2f636 ubuntu <span class="token string">"/bin/bash" About an hour ago <span class="token function">Exited <span class="token punctuation">(<span class="token number">0<span class="token punctuation">) <span class="token number">8 minutes ago sharp_volhard
01c950718166 hello<span class="token operator">-world <span class="token string">"/hello" About an hour ago <span class="token function">Exited <span class="token punctuation">(<span class="token number">0<span class="token punctuation">) About an hour ago festive_williams</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>要查看您创建的最新容器,请将其传递给<code>-l</code>交换机:</p>
<pre class="prism-token tokenlanguage-javascript">docker ps <span class="token operator">-l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9b100f2f636 ubuntu <span class="token string">"/bin/bash" About an hour ago <span class="token function">Exited <span class="token punctuation">(<span class="token number">0<span class="token punctuation">) <span class="token number">10 minutes ago sharp_volhard</span></span></span></span></span></span></span></pre>
<p>要启动已停止的容器,请使用<code>docker start</code>,后跟容器ID或容器名称。让我们启动基于Ubuntu的容器,其ID为 <code>d9b100f2f636</code>:</p>
<pre class="prism-token tokenlanguage-javascript">docker start d9b100f2f636</pre>
<p>容器将启动,您可以使用<code>docker ps</code>来查看其状态:</p>
<pre class="prism-token tokenlanguage-javascript">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9b100f2f636 ubuntu <span class="token string">"/bin/bash" About an hour ago Up <span class="token number">8 seconds sharp_volhard</span></span></pre>
<p>要停止正在运行的容器,请使用<code>docker stop</code>,后跟容器ID或名称。这次,我们将使用Docker分配容器的名称,即<code>sharp_volhard</code>:</p>
<pre class="prism-token tokenlanguage-javascript">docker stop sharp_volhard</pre>
<p>一旦您决定不再需要容器,请使用该<code>docker rm</code>命令将其删除,再次使用容器ID或名称。使用该<code>docker ps -a</code>命令查找与<code>hello-world</code>映像关联的容器的容器ID或名称,然后将其删除。</p>
<pre class="prism-token tokenlanguage-javascript">docker rm festive_williams</pre>
<p>您可以使用<code>--name</code>开关启动一个新容器并为其命名。您还可以使用该<code>--rm</code>开关创建一个在停止时自行删除的容器。有关这些选项和其他选项的更多信息,请参阅该<code>docker run help</code>命令。</p>
<p>容器可以转换为可用于构建新容器的映像。让我们来看看它是如何工作的。</p>
<h2><strong>步骤7 - 将容器中的更改提交到Docker镜像</strong></h2>
<p>当您启动Docker镜像时,您可以像使用虚拟机一样创建,修改和删除文件。您所做的更改仅适用于该容器。您可以启动和停止它,但是一旦使用该<code>docker rm</code>命令销毁它,更改将永久丢失。</p>
<p>本节介绍如何将容器的状态保存为新的Docker镜像。</p>
<p>在Ubuntu容器中安装Node.js后,您现在有一个运行图像的容器,但容器与您用来创建它的图像不同。但是您可能希望稍后重新使用此Node.js容器作为新映像的基础。</p>
<p>然后使用以下命令将更改提交到新的Docker镜像实例。</p>
<pre class="prism-token tokenlanguage-javascript">docker commit <span class="token operator">-m <span class="token string">"What you did to the image" <span class="token operator">-a <span class="token string">"Author Name" container_id repository<span class="token operator">/new_image_name</span></span></span></span></span></pre>
<p>该<strong>-m</strong>开关是提交信息,可以帮助你和其他人知道你所做的修改,而<strong>-a</strong>用于指定作者。当您启动交互式Docker会话时,<code>container_id</code>是您在本教程前面提到的那个。除非您在Docker Hub上创建了其他存储库,否则<code>repository</code>通常是您的Docker Hub用户名。</p>
<p>例如,对于用户<strong>sammy</strong>,使用容器ID <code>d9b100f2f636</code>,命令将是:</p>
<pre class="prism-token tokenlanguage-javascript">docker commit <span class="token operator">-m <span class="token string">"added Node.js" <span class="token operator">-a <span class="token string">"sammy" d9b100f2f636 sammy<span class="token operator">/ubuntu<span class="token operator">-nodejs</span></span></span></span></span></span></pre>
<p>当你<em>提交</em>的图像,新的图像在您的计算机上本地保存。在本教程的后面,您将学习如何将映像推送到Docker Hub之类的Docker注册表,以便其他人可以访问它。</p>
<p>再次列出Docker图像将显示新图像以及从中派生的旧图像:</p>
<pre class="prism-token tokenlanguage-javascript">docker images</pre>
<p>你会看到这样的输出:</p>
<pre class="prism-token tokenlanguage-javascript">REPOSITORY TAG IMAGE ID CREATED SIZE
sammy<span class="token operator">/ubuntu<span class="token operator">-nodejs latest 7c1f35226ca6 <span class="token number">7 seconds ago 179MB
ubuntu latest 113a43faa138 <span class="token number">4 weeks ago <span class="token number">81<span class="token punctuation">.2MB
hello<span class="token operator">-world latest e38bc07ac18e <span class="token number">2 months ago <span class="token number">1<span class="token punctuation">.85kB</span></span></span></span></span></span></span></span></span></span></pre>
<p>在此示例中,<code>ubuntu-nodejs</code>是新图像,它是从Docker Hub 的现有<code>ubuntu</code>图像派生的。尺寸差异反映了所做的变化。在此示例中,更改是NodeJS已安装。因此,下次需要使用预先安装了NodeJS的Ubuntu运行容器时,您可以使用新映像。</p>
<p>您还可以从<code>Dockerfile</code>构建映像,这样可以在新映像中自动安装软件。但是,这超出了本教程的范围。</p>
<p>现在让我们与他人分享新图像,以便他们可以从中创建容器。</p>
<h2><strong>步骤8 - 将Docker镜像推送到Docker存储库</strong></h2>
<p>从现有映像创建新映像之后的下一个逻辑步骤是与您选择的几个朋友,Docker Hub上的整个世界或您可以访问的其他Docker注册表共享它。要将映像推送到Docker Hub或任何其他Docker注册表,您必须在那里拥有一个帐户。</p>
<p>本节介绍如何将Docker镜像推送到Docker Hub。</p>
<p>要推送图像,请先登录Docker Hub。</p>
<pre class="prism-token tokenlanguage-javascript">docker login <span class="token operator">-u docker<span class="token operator">-registry<span class="token operator">-username</span></span></span></pre>
<p>系统将提示您使用Docker Hub密码进行身份验证。如果您指定了正确的密码,则身份验证应该成功。</p>
<p><strong>注意:</strong>如果Docker注册表用户名与用于创建映像的本地用户名不同,则必须使用注册表用户名标记映像。对于上一步中给出的示例,您可以键入:</p>
<pre class="prism-token tokenlanguage-javascript">docker tag sammy<span class="token operator">/ubuntu<span class="token operator">-nodejs docker<span class="token operator">-registry<span class="token operator">-username<span class="token operator">/ubuntu<span class="token operator">-nodejs</span></span></span></span></span></span></pre>
<p>然后你可以使用以下方法推送自己的图像</p>
<pre class="prism-token tokenlanguage-javascript">docker push docker<span class="token operator">-registry<span class="token operator">-username<span class="token operator">/docker<span class="token operator">-image<span class="token operator">-name</span></span></span></span></span></pre>
<p>要将<code>ubuntu-nodejs</code>图像推送到<strong>sammy</strong>存储库,命令将是:</p>
<pre class="prism-token tokenlanguage-javascript">docker push sammy<span class="token operator">/ubuntu<span class="token operator">-nodejs</span></span></pre>
<p>上传图像时,该过程可能需要一些时间才能完成,但完成后,输出将如下所示:</p>
<pre class="prism-token tokenlanguage-javascript">The push refers to a repository <span class="token punctuation">
e3fbbfb44187<span class="token punctuation">: Pushed
5f70bf18a086<span class="token punctuation">: Pushed
a3b5c80a4eba<span class="token punctuation">: Pushed
7f18b442972b<span class="token punctuation">: Pushed
3ce512daaf78<span class="token punctuation">: Pushed
7aae4540b42d<span class="token punctuation">: Pushed
<span class="token operator">...</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>将图像推送到注册表后,它应该列在您帐户的仪表板上,如下图所示。</p>
<div class="image-block"><img src="https://ask.qcloudimg.com/http-save/1221478/lbmy9gyigl.png?imageView2/2/w/1620" alt=""></div>
<p>如果推送尝试导致此类错误,那么您可能没有登录:</p>
<pre class="prism-token tokenlanguage-javascript">OutputThe push refers to a repository <span class="token punctuation">
e3fbbfb44187<span class="token punctuation">: Preparing
5f70bf18a086<span class="token punctuation">: Preparing
a3b5c80a4eba<span class="token punctuation">: Preparing
7f18b442972b<span class="token punctuation">: Preparing
3ce512daaf78<span class="token punctuation">: Preparing
7aae4540b42d<span class="token punctuation">: Waiting
unauthorized<span class="token punctuation">: authentication required</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<p>登录<code>docker login</code>并重复推送尝试。然后验证它是否存在于Docker Hub存储库页面上。</p>
<p>您现在可以使用<code>docker pull sammy/ubuntu-nodejs</code>将图像拉到新计算机并使用它来运行新容器。</p>
<h2><strong>结论</strong></h2>
<p>在本教程中,您安装了Docker,使用了图像和容器,并将修改后的图像推送到Docker Hub。</p>
<p>更多Docker教程请前往腾讯云+社区学习更多知识。</p>
<hr>
<blockquote>
<p>参考文献:《How to Install and Use Docker on Debian 9》</p>
</blockquote>
</div>
<div class="col-article-source">
<p>原创声明,本文系作者授权云+社区发表,未经许可,不得转载。</p>
<p>如有侵权,请联系 yunjia_community@tencent.com 删除。</p>
</div>
<div class="col-article-time">编辑于 2018-11-05</div>
<div class="col-article-tags">Docker容器unity存储开发者实验室
<div class="extra-part">
<div class="com-operations"><span class="com-i-warn">举报</span></div>
</div>
</div>
<div class="com-widget-operations">
<div class="main-cnt"><span class="com-i-like"><span class="text">5</span></span></div>
<div class="extra-cnt"><span class="com-opt-text share-text"><span class="com-opt-text share-text">分享</span></span>
<ul class="com-share-options">
<li>
<div class="c-bubble-trigger">
<div class="c-bubble c-bubble-left ">
<div class="c-bubble-inner">
<div class="qr-img" title="https://cloud.tencent.com/developer/article/1360720"><img src="data:image/png;base64,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" alt="Scan me!"></div>
<p class="qr-txt"> </p>
</div>
</div>
</div>
</li>
<li>
<div class="c-bubble-trigger"> </div>
</li>
<li>
<div class="c-bubble-trigger"> </div>
</li>
<li>
<div class="c-bubble-trigger"> </div>
</li>
</ul>
<div class="c-bubble-trigger com-widget-qr"><button class="scan-btn">扫描二维码</button>
<div class="c-bubble c-bubble-left ">
<div class="c-bubble-inner">
<div class="qr-img"><img src="https://imgcache.qq.com/open_proj/proj_qcloud_v2/community/portal/css/img/wechat-qr.jpg" alt=""></div>
<p class="qr-txt"> </p>
<p class="qr-txt"> </p>
</div>
</div>
</div>
</div>
</div>
<div class="com-media col-column-media shortcut">
<h3 class="com-media-title">云计算教程系列</h3>
<div class="col-column-media-datas"><span class="col-column-media-data">729 篇文章<span class="com-split dot"><span class="col-column-media-data">315 人订阅</span></span></span></div>
<button class="c-btn col-column-media-btn c-btn" type="button">订阅专栏</button>
<div class="col-column-media-bd">
<ul class="col-2-disorder-list">
<li>如何在Debian 9上设置时间同步</li>
<li>如何在Debian 9上安装Node.js.</li>
<li>如何使用Node.js和Github Webhooks保持远程项目同步</li>
<li>如何在Debian 9上安装Python 3并设置编程环境</li>
<li>如何在Debian 9上安装最新的MySQL</li>
</ul>
</div>
</div>
</div>
<div id="MySignature" role="contentinfo">
转自:http://Www.CnBlogs.Com/WebEnh/<hr>
<table style="border-style: none; display: inline;">
<tbody><tr><td align="center" width="275" valign="bottom">本博客Android APP 下载</td></tr><tr><td align="center" valign="bottom"><img alt src="https://images.cnblogs.com/cnblogs_com/webenh/873908/o_2016_08_28_0037217469.png" title="下载本 WebEnh博客 安卓APP" height="256"></td></tr></tbody></table>
<table style="border-style: none; display: inline;">
<tbody><tr><td align="center" width="275" valign="bottom">支持我们就给我们点打赏</td></tr>
<tr><td align="center"><img src="http://files.cnblogs.com/files/webenh/FjXt_fBbH264PdA-RRx8XD9p9BQJ1.gif" height="256"></td></tr>
</tbody></table>
<table style="border-style: none; display: inline;">
<tbody><tr><td align="center" width="275" valign="bottom">支付宝打赏 支付宝扫一扫二维码</td></tr>
<tr><td align="center"><img src="http://files.cnblogs.com/files/webenh/ialipay.gif" title="支付宝打赏" height="256"></td></tr>
</tbody></table>
<table style="border-style: none; display: inline;">
<tbody><tr><td align="center" width="275" valign="bottom">微信打赏 微信扫一扫二维码</td></tr>
<tr><td align="center"><img src="http://files.cnblogs.com/files/webenh/iweixin.gif" title="微信打赏" height="256"></td></tr>
</tbody></table>
<br>
如果想下次快速找到我,记得点下面的关注哦!<br><br>
来源:https://www.cnblogs.com/webenh/p/11321273.html
頁:
[1]