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