Docker

容器是Docker的又一核心概念

简单的说,容器是独立运行的一个或一组应用,以及他们的运行太环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统和运行在上面的应用。接下来记录一下如何管理一个容器,包括创建、启动和停止等

启动容器

启动容器有两种方式,一是基于镜像创建一个容器并启动,二是将终止状态的容器重新启动。

1、 新建并启动:我们可以使用docker run命令新建一个容器并将其启动

root@ubuntu:~# docker run ubuntu:16.04 /bin/echo 'Hello World'
Hello World

上面命令输出了内容之后,立马停止了容器,以至于我们根本不知道是否启动了容器。我们可以使用docker ps -a命令来查看所有的容器:

root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
e3efbefb34cd        ubuntu:16.04        "/bin/echo 'Hello Wo…"   7 seconds ago       Exited (0) 5 seconds ago                       priceless_mcnulty

可以看到,这就是我们刚刚创建并启动的容器!我们还可以使用如下命令启动一个Bash终端,允许用户与之交互:

root@ubuntu:~# docker run -it ubuntu:16.04 /bin/bash
root@d52e9924901b:/# date
Sun Jul  1 00:43:09 CST 2018

如此,我们就可以在其上面进行一连串的命令输入操作了

使用docker run来创建容器时,Docker在后台的操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库中下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池分配一个IP给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

2、 启动已终止容器:可以使用docker container start命令,将一个已经停止的容器重新启动运行

首先我们使用docker ps -a来获取当前宿主机上存在的容器:

root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
a148c6fec026        ubuntu:16.04        "bash"              3 minutes ago       Exited (0) 10 seconds ago                       goofy_swanson

然后,我们获取到容器的ID,将其传入到docker container start命令中,将此容器启动起来:

root@ubuntu:~# docker container start d52e9924901b

此时,我们输入docker ps命令,发现此容器是已启动状态的:

root@ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a148c6fec026        ubuntu:16.04        "bash"              4 minutes ago       Up 2 seconds                            goofy_swanson

但是,这仅仅只是将其启动起来了,如果我们还需要进入交互式终端,我们可以使用docker exec命令,并指定一个Bash,如下:

root@ubuntu:~# docker exec -it a148c6fec026 /bin/bash
root@a148c6fec026:/# 

值得注意的是,docker ps只会列出正在运行的容器,而docker ps -a会列出所有的容器,包括正在运行的和已经停止的容器

后台运行容器

更多的时候,需要让Docker在后台运行,而不是把当前执行的命令的结果直接输出在当前宿主机下,此时我们可以使用docker run命令,并添加-d参数来实现:

root@ubuntu:~# docker run -d ubuntu:16.04 /bin/sh -c "while true; do echo hello docker; sleep 1; done"
59a9f0e30fda31c1799f622da6d56d0723c2bab5313f01f50e855fdbea21f00d

此时,容器会在后台运行,不会把输出的结果打印到宿主机上面。使用-d参数运行容器之后,会返回一个容器的ID的给我们,我们可以通过docker container ls来查看容器的信息:

root@ubuntu:~# docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
59a9f0e30fda        ubuntu:16.04        "/bin/sh -c 'while t…"   2 minutes ago       Up 2 minutes                            inspiring_elion

如果想要知道后台运行的容器所执行的命令输出的内容,我们可以使用docker container logs命令来查看。比如,我们想查看刚刚那个容器所输出的内容,我们在命令后面加上容器的ID即可,如下:

root@ubuntu:~# docker container logs 59a9f0e30fda
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
hello docker
...

终止容器

我们可以使用docker container stop命令来停止一个容器。例如我们将刚刚那个容器停止,传入它的容器ID即可,如下:

root@ubuntu:~# docker container stop 59a9f0e30fda

值得注意的是,docker container ls只列出正在运行的容器,我们如果需要查看已经停止的容器,只需要在结尾添加-a参数即可。如此并可列出当前宿主机存在的所有容器,包括正在运行与已经停止的容器,如下:

root@ubuntu:~# docker container ls -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
59a9f0e30fda        ubuntu:16.04        "/bin/sh -c 'while t…"   31 minutes ago      Exited (137) 2 minutes ago                       inspiring_elion

在上面已经提到,对于已经停止的容器,我们可以使用docker container start命令来重新启动它!!!另外,我们还需知道另外一个命令:docker container restart重启容器的命令,命令会将一个运行态的容器停止,然后重新启动它!

进入容器

在使用-d参数时,容器会进入后台!但是,有的时候我们需要进入其交互式终端,对其进行一些命令输入操作,此时,我们可以使用docker attach命令或者docker exec命令来实现:

  • docker attach

首先,我们新在后台启动一个容器:

root@ubuntu:~# docker run -dit ubuntu:16.04 bash
98ba6098afe1bc1f79893f4f3eca166b091cfeafcb544584b7fd09b7d12f41ef

此时再使用docker container ls命令来查看容器的信息:

root@ubuntu:~# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
98ba6098afe1        ubuntu:16.04        "bash"              52 seconds ago      Up 50 seconds                           cranky_mccarthy

使用docker attach命令,进入容器交互式环境:

root@ubuntu:~# docker attach 98ba6098afe1
root@98ba6098afe1:/# 
  • docker exec

同样,新在后台启动一个容器:

root@ubuntu:~# docker run -dit ubuntu:16.04 bash
ea0cda7fe8d75b309e6f911a1acb9f062945a58661e8b389979d6ea7960626df

此时再使用docker container ls命令来查看容器的信息:

root@ubuntu:~# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
ea0cda7fe8d7        ubuntu:16.04        "bash"              About a minute ago   Up About a minute                       quirky_liskov

使用docker exec命令,进入交互式环境,值得注意的是,须指定-i-t参数和Shell的名称,如下:

root@ubuntu:~# docker exec -it ea0cda7fe8d7
root@ea0cda7fe8d7:/# 

使用docker execdocker attach命令时,应注意:docker attach命令进入交互式环境时,使用exit命令退出之后,容器即可终止,而docker exec命令则不会!所以这两种命令,更加推荐使用docker exec!

导出和导入容器

  • 导出容器:如果要导出某个容器到本地,我们可以使用docker export命令

首先,我们使用docker container ls -a查看以下当前宿主机上存在的所有容器列表:

root@ubuntu:~# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ea0cda7fe8d7        ubuntu:16.04        "bash"              11 minutes ago      Up 11 minutes                           quirky_liskov

下面,我们将容器ID为ea0cda7fe8d7的容器导出为test.tar,如下:

root@ubuntu:~# docker export ea0cda7fe8d7 > test.tar

此时,会在当前目录下生成一个test.tar名称的容器快照文件

  • 导入容器:我们可以使用docker import命令导入一个容器快照文件生成一个镜像

我们将刚刚生成的容器快照文件test.tar导入,命令如下:

root@ubuntu:~# cat test.tar | docker import - test/ubuntu:v1.0
sha256:048bcf083eb80925b246e161ed58dd03a3c071ebb6b31961034dacbc8f63efbd

导入成功之后,会在控制台中输出摘要信息。此时我们使用docker image ls命令来查看当前宿主机上的镜像列表:

root@ubuntu:~# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         v1.0                048bcf083eb8        7 seconds ago       85.9MB
ubuntu              16.04               5e8b97a2a082        3 weeks ago         114MB

我们刚刚导入生成的镜像已经显示在列表之中了!此外,我们还可以通过指定URL或者目录来导入,如下:

docker import http://example.com/exampleimage.tgz example/imagerepo

导入本地容器快照,我们还可以使用docker load命令!

删除容器

我们可以使用docker container rm命令来删除一个处于终止状态的容器,例如:

root@ubuntu:~# docker container rm ea0cda7fe8d7
Error response from daemon: You cannot remove a running container ea0cda7fe8d75b309e6f911a1acb9f062945a58661e8b389979d6ea7960626df. Stop the container before attempting removal or force remove

此时,报了一个错误,说此容器正在运行,删除容器须先终止掉它!我们使用docker container stop命令来终止此容器,然后再删除它:

root@ubuntu:~# docker container stop ea0cda7fe8d7
ea0cda7fe8d7
root@ubuntu:~# docker container rm ea0cda7fe8d7
ea0cda7fe8d7

在上面,我们知道可以使用docker container ls -a来查看当前宿主机上存在的所有容器,包括正在运行和已经停止的容器。如果当前宿主机上存在很多已经停止的容器,一个一个删除未免太过麻烦,此时我们可以使用docker container prune命令来清除所有处于终止状态的容器:

root@ubuntu:~# docker container prune

更多命令

命令 说明
docker container ls 列出正在运行的容器
docker ps 列出正在运行的容器
docker container ls -a 列出所有的容器
docker ps -a 列出所有的容器
docker container start 启动容器
docker start 启动容器
docker container stop 停止容器
docker stop 停止容器
docker container restart 重启容器
docker restart 重启容器
docker container rm 删除容器
docker rm 删除容器
docker container logs 打印容器的标准输出
docker logs 打印容器的标准输出

分别传入--help参数查看它们的用法,发现docker container ls命令与docker ps命令效果是一样的!docker container startdocker start效果是一样的!docker container stopdocker stop效果是一样的!docker container restartdocker restart效果是一样的!docker container rmdocker rm效果是一样的!docker container logsdocker logs效果是一样的!

(0)

相关推荐

  • 如何在Linux上创建,列出和删除Docker容器

    本篇文章介绍的内容是关于在Linux机器上创建,列出和删除docker容器,下面我们来看具体的内容. 1.启动Docker容器 使用下面的命令启动新的Docker容器.这将启动一个新的容器,并为你提供 ...

  • Docker入门与简单使用

    前言: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上.近几年来,Docker 在国内发展的如火 ...

  • 看完这篇,Docker你就入门了

    素小暖OSC OSC开源社区 昨天 在计算机技术日新月异的今天, Docker在国内发展的如火如荼,特别是在一线互联网公司,Docker的使用是十分普遍的,在理解docker之前,我们先熟悉两个概念, ...

  • Docker定时备份MySQL数据到七牛云

    前言:我Linux服务器安装了docker,docker容器跑了springboot项目,用到了mysql数据库.所以必须准备程序,数据备份功能,万一哪天系统挂了,数据丢了,我可以随时恢复.因为没钱开 ...

  • .NET之Docker部署详细流程

    dotNET跨平台 今天 以下文章来源于鹏祥 ,作者AZRNG 开篇语 自己从头开始走一遍docker部署.net的流程,作为一种学习总结,以及后续会写一些在该基础之上的文章. 本次示例环境:vs20 ...

  • Docker 兴衰记:关于开源的一些思考

    Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet ...

  • (40条消息) 云原生的 WebAssembly 能取代 Docker 吗?

    WebAssembly 是一个可移植.体积小.加载快并且兼容 Web 的全新格式.由于 WebAssembly 具有很高的安全性,可移植性,效率和轻量级功能,因此它是应用程序安全沙箱方案的理想选择.现 ...

  • 创建用于AI和机器学习的Docker容器

    容器技术(例如Docker)极大地简化了依赖性管理和软件的可移植性.在本系列文章中,我们将探讨Docker在机器学习(ML)场景中的用法. 本系列假定您熟悉ML,一般的容器化,尤其是Docker.欢迎 ...

  • 在启用GPU的Docker容器中运行AI模型

    容器技术(例如Docker)极大地简化了依赖性管理和软件的可移植性.在本系列文章中,我们将探讨Docker在机器学习(ML)场景中的用法. 本系列假定您熟悉ML,一般的容器化,尤其是Docker.欢迎 ...

  • 教你如何使用群暉Docker安裝比emby plex更好用Jellyfin家庭影院HTPC

    大家好,俺又來了,這次給大家分享群暉Docker安裝Jellyfin了! 這個是算是俺的壓軸節目了,最近一口氣寫了好多關於群暉NAS軟體的分享,腦袋都是疼的! 關於jellyfin,最開始知道這個的時 ...

  • (40条消息) WASM能否取代Docker?

    云计算.微服务计算.无服务器计算.可扩展计算.可负担计算等等,这一切主要靠一项杰出的技术--Linux容器(LXC)来实现. Linux容器(LXC)提供了操作系统级的虚拟化沙箱.简而言之,容器允许在 ...

  • 群晖docker安装Emby并开启硬件解码

    最近在群晖中安装了Emby,使用体验很不错,现在将自己的安装过程分享出来 目前群晖中安装emby主要有两种方式,一是通过在套件中心中添加源来安装,二是通过docker来安装.我选择的是通过docker ...

  • 群晖使用docker安装&使用EMBY全流程教程

    前言 其实老早就想写这篇教程,一直偷懒不想写 为什么不选择PLEX OR Jellyfin,三者我都体验过,论综合体验emby实在胜过二者太多,现代化的前端页面,优秀的刮削体验,高度自定义的设置,丰富 ...