容器是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 exec
和docker 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 start
与docker start
效果是一样的!docker container stop
与docker stop
效果是一样的!docker container restart
与docker restart
效果是一样的!docker container rm
与docker rm
效果是一样的!docker container logs
与docker logs
效果是一样的!