分享

Docker

 1qxm19 2021-04-06

容器是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:///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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多