本文介绍 Docker 的基本使用方法和常用命令,包括容器的创建、查看、停止和删除。通过这些操作可以实现单个容器的使用和应用部署。至于 Docker 镜像创建、Dockerfile 的书写和编配工具 Docker-compose 的使用等进阶话题,后续更新。
安装和启动 Docker
之前已经介绍过 CentOS7 下安装 Docker 和非 root 用户执行 Docker 命令:
如果没有配置开机启动,则需要手动启动 Docker 守护进程:
$ systemctl start docker
运行第一个容器
百度百科: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
所以使用 Docker 所操作的对象就是容器,具体操作包括创建、启动、查看、关闭、删除等。
启动一个容器:
$ docker run -it --name myubuntu ubuntu /bin/bash
其中:
docker run为 Docker 命令。-it、--name为命令参数,i表示开启容器 STDIN,t表示创建伪 tty 终端,只有指定这两个参数才能提供交互式 shell;name用于指定要创建容器的名字,这里取为 myubuntu,若不指定 name 参数则自动生成随机名称。容器名称必须唯一!ubuntu指定创建容器所需要的镜像名,每个容器都依赖于镜像创建,镜像概念后续更新。/bin/bash指定了容器启动后执行的命令,这里表示启动 ubuntu 系统内的 bash。
不出意外,执行结果如下图:

在继续使用 myubuntu 之前,先说明下 Docker 命令的使用帮助。
查看 Docker 支持的命令
$ docker查看具体命令的使用
$ docker run --help
容器的使用
上面已经成功以 root 用户启动容器 myubuntu 并进入 bash 终端,这是一个完整的 ubuntu 系统,可以用来做任何事情。其中容器的 ID c7f79d6c379b 同时也是容器的主机名。

我们可以尝试在系统内安装 vim:

再看看看容器的进程:

你可以继续做任何想做的,如安装 python3, 部署 flask,…甚至rm -rf /o(∩_∩)o 。不用担心,创建容器是docker run那么容易。
现在是时候退出了,输入exit并回车:

一旦退出容器,/bin/bash 命令也就结束了,容器也随之停止。我们又回到了主机,初次的体验完毕。
查看容器
退出容器回到宿主机,容器虽然停止,但是仍然存在,可以再次使用。
使用docker ps查看当前系统的容器列表(-a显示所有容器,包括运行和停止的,不加则只显示运行的)
$ docker ps -a

其中:
- CONTAINER ID, 容器 id
- IMAGE,创建容器使用的镜像
- COMMAND,容器最后执行的命令
- CREATED,容器的创建时间
- STATUS,容器的退出状态
- PORTS,容器和主机的端口映射
- NAMES,容器名称
docker inspect可以查看容器的配置信息,如名称、网络等。
重新启动已停止的容器
上面使用 exit 退出了容器,容器也随之停止。也许以后某个时候,我们还需要再次使用(当然可以再创建一个新的,这样的话,不用的容器记得删除,删除方法见本文最后),则可以使用docker start重新启动停止的容器:
$ docker start myubuntu
一般的,容器名和容器 ID 可以替换使用,如上面操作也可以用:
$ docker start c7f7
不需要使用完整的 ID,开始的 3 - 4 位足矣!
类似相关命令有:docker restart, docker create,如何学习?--help。
有没有发现执行了上述命令,好像没有看到什么变化?docker ps一下:

注意STATUS,已经UP。
那么问题来了,如何再次进入终端呢?有两种方法(科普一下茴香豆的茴有4种写法:茴 ,回,囘,囬):
附着到容器(命令执行后需要 Enter 直到进入)
$ docker attach myubuntu在容器内重新运行新进程(
docker exec登场)$ docker exec -it myubuntu /bin/bash
在第二种方法中,我们新启动了 bash 进程,有图为证:

注意上面操作都要求容器先启动!
同样,exit 退出。
创建守护容器
前面创建的容器都是交互式运行的,更多时候我们需要创建长期运行的容器来运行服务,而且不需要交互式会话(比如数据库)。
容器创建仍旧使用docker run命令,但这次使用-d参数:
$ docker run --name myredis -d -p 9527:6379 redis

这里我使用 redis 镜像 并添加-d将任务放到了后台,所以执行命令后仍然回到主机而没有进入容器。至于-p参数,用于容器与主机的端口映射(上面例子将容器内 redis 端口映射到主机的 9527),这次docker ps可以看到PORTS有了内容。

查看某容器的端口可直接使用命令
docker port:

通过docker ps可以看到容器已经成功在后台运行,如何与该容器交互使用呢?比如这里如何连接上 reids?其实很简单,只要使用主机的 ip 和 容器映射的主机端口就可以正常使用。

如果想研究容器内部都做了些什么,可以使用docker logs来读取容器日志。命令可以添加参数-f进行滚动查看(效果类似 tail -f),参数-t为 每条日志添加时间戳。退出日志跟踪使用Ctrl-C。

如果想进入容器,使用上面的docker exec命令。
更多容器状态检测命令,查阅:docker top, docker stats。
停止守护容器
只需要执行docker stop命令:
$ docker stop myredis
还有个命令docker kill直接向容器发送 SIGKILL 信号停止容器。
删除容器
如果容器不再使用,可以使用docker rm删除。
$ docker rm myredis
若要删除运行中的容器,使用-f参数。
若要删除所有容器:
$ docker rm `docker ps -aq`
DEMO: 学习 Spark
查看是否有 spark 镜像
$ docker search spark
创建容器(使用点赞最多的 sequenceiq/spark)
$ docker run -it --name myspark sequenceiq/spark spark-shell

总结
Docker 最基本常用的命令就这些:docker run启动容器,docker ps查看容器状态,docker stop停止容器,docker rm删除容器。
有了 Docker,你可以通过docker search查询镜像仓库是否已经有人做好相关镜像,如果有则直接docker run创建容器使用,否则需要自己构建镜像。作为入门篇,这里就不多说了。
Docker 最直观的好处,就是可以无痛快速尝试新的技术,这些往往别人已经做好镜像配置好环境(对于学习这些环境足够了),初学者不必自己去处理繁琐的运维配置。而且启动容器的代价非常小,资源隔离保证主机安全下满足好奇心,折腾坏了直接删除新建一个就可以。
931

被折叠的 条评论
为什么被折叠?



