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效果是一样的!

你可能感兴趣的:(docker)