跳至主要內容

六、Docker run 运行镜像

安图新大约 7 分钟云原生Docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源

Docker 可以让开发者打包它们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化

Docker 使用完全使用沙箱机制,两个容器之间不会有任何接口 (这个有点像 iPhone 的 app ) ,更重要的是容器性能开销极低

学习前提

在继续阅读之前,我们希望你对 Linux 有一些基本的了解,包括

1、 会使用Linux常用的命令;
2、 知道大部分的Linux常识,比如终端serviceip用户等;
3、 熟练使用Ubuntu或者Centos或者MacOS种的一种昂;

如果你对这些知识还是一知半解,可以访问我们的 Linux 基础教程 先进行一些简单的了解

Docker的应用场景

1、 Web应用的自动化打包和发布;
2、 自动化测试和持续集成、发布;
3、 在服务型环境中部署和调整数据库或其他的后台应用;
4、 从头编译或者扩展现有的OpenShift或CloudFoundry平台来搭建自己的PaaS环境;

Docker 的优点

1、 简化程序;

Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化
Docker 改变了虚拟化的方式,使开发者可以直接将自己的成果放入 Docker 中进行管理
方便快捷已经是 Docker 的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成

2、 解决运维配置噩梦;

在没有 Docker 之前,每一台机器,每一个要用到的依赖,几乎都要重新配置一遍
比如新增一台 MySQL 数据库,就要从头开始配置所有环境
有了 Docker 之后,只需要从仓库里把之前的 MySQL 镜像拉出来,直接使用

3、 节省开支;

使用 Docker ,可以在一台电脑上部署多个服务,多个应用,从而充分榨干每一滴性能
同时,又不用担心多个应用之间出现相互访问的情况

相关链接

Docker 官网: http://www.docker.comopen in new window

Github Docker 源码: https://github.com/docker/dockeropen in new window

Docker 镜像只有运行起来,才会创建一个容器,才能提供对外服务

这里我们先不解释什么是镜像,我们只解释它们之间的关系和类比

我们先说镜像,镜像有点类似于已经打包好了,放在腾讯服务器上的,但还没有装在电脑上的 QQ 安装程序

那么容器,就相当于一个已经在用户电脑上安装好的 QQ 软件,只要输入 QQ 号和密码,就可以使用了

它们之间一样么? 不一样的

1、 QQ安装程序,人人都可以下,但是只要不安装,它就不能使用,它只是一个安装程序而已;
2、 已经安装好的QQ程序,这时候就不是人人都能用了,只有电脑的主人才能用,而且这时候可以登录然后聊天了;

相比较于 Docker ,我们只有把一个镜像 run 起来,它才能对外提供服务

将一个镜像转换成容器,使用的就是 docker run 命令

Docker Hello World

docker run 命令可以从一个镜像创建一个容器,并运行一个应用程序

比如下面的 docker run 命令从 ubuntu:17.10 镜像创建一个容器,并运行 echo "Hello world" 服务输出 Hello world

[root@www.hotmindshare.com ~]# docker run ubuntu:17.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:17.10' locally
1710: Pulling from library/ubuntu
68393378db12: Pull complete 
9e3366501e0e: Pull complete 
156ec05da9a5: Pull complete 
281cba1133d9: Pull complete 
0acdc2cc8ed1: Pull complete 
Digest: sha256:20ed22f88148889c94970cb325b5341f455c820aa6d3289ce4b721b14c78c242
Status: Downloaded newer image for ubuntu:17.10
Hello world

参数说明
dockerDocker 的二进制执行文件
run与前面的 docker 组合来运行一个容器
ubuntu:17.10指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在
如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像
/bin/echo “Hello world在启动的容器里执行的命令

更多docker start 命令使用方法,可以访问 docker start 命令

运行交互式的容器

使用docker run 如果添加了 -i-t 或者 -it 参数,那么 Docker 就会创建一个交互式的容器,可以实现应答模式

[root@www.hotmindshare.com ~]# docker run -i -t ubuntu:17.10 /bin/bash
root@1bc08b56d08f:/#  

这次执行的时候没有从远程拉取 ubuntu:17.10 镜像了,而是使用的本地版本

参数说明
-t在新容器内指定一个伪终端或终端
-i允许对容器内的标准输入 ( STDIN ) 进行交互

当出现 root@1bc08b56d08f:/# 之后,就进入了 ubuntu 17.10 系统的容器

我们可以在 root@1bc08b56d08f:/# 之后输入一些 Linux 命令 ,比如使用 cat /proc/version 和 ls 分别查看当前系统的版本信息和当前目录下的文件列表

root@1bc08b56d08f:/# cat /proc/version
Linux version 4.9.87-linuxkit-aufs (root@95fa5ec30613) (gcc version 6.4.0 (Alpine 6.4.0) )1 SMP Wed Mar 14 15:12:16 UTC 2018
root@1bc08b56d08f:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

如果要推出交互式容器,可以运行 exit 命令或者使用 CTRL+D 组合键

后台模式

跟所有的 Linux 应用程序一样,如果不使用后台模式,那么它们一直会独占 终端,如果退出了终端,那么容器就会自动退出

所以,一般情况下我们都希望使用后台模式运行一个容器,可以添加 -d 参数

[root@www.hotmindshare.com ~]# docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
4558b3b54da0ff34fa4c4bc6fb2c3303b2b3f602fad046b205b342b9babc21d6

使用后台模式,日志就不会输出到标准输出了,也就是不会显示在 终端 上了

这时候显示出来的,当前容器的 ID。

每个容器的 ID 都是唯一的,我们可以通过容器的 ID 来查看容器的状态和容器的所有信息

查看容器运行状况

如果想要查看容器的运行状况,可以使用 docker ps 命令

[root@www.hotmindshare.com ~]# docker ps
CONTAINER ID  IMAGE        ...  STATUS        ...
4558b3b54da0  ubuntu:17.10 ...  Up 2 minutes  ...

docker ps 命令只会显示所有正在运行的容器

如果想要查看所有的容器,那么需要添加 -a 参数

[root@www.hotmindshare.com ~]# docker ps -a
CONTAINER ID  ...  STATUS                    ...
4558b3b54da0  ...  Up 2 minutes              ...
e08201b591cd  ...  Exited (0) 15 minutes ago ...
6801e4604a32  ...  Exited (0) 15 minutes ago ...

更多docker ps 命令使用方法,可以访问 docker ps 命令

查看容器的运行日志

后台容器的输出不会显示在 终端 上,而是被 Docker 收集起来了

我们可以通过 docker logs 命令查看容器的日志

docker logs <container_id>

例如想要查看容器 4558b3b54da0 的日志,可以使用下面的命令

[root@www.hotmindshare.com ~]# docker logs 4558b3b54da0
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
......

更多docker logs 命令使用方法,可以访问 docker logs 命令

停止容器

如果想要主动停止容器,可以使用 docker stop 命令

docker stop <container_id>

我们可以使用下面的命令来停止容器 4558b3b54da0

[root@www.hotmindshare.com ~]# docker stop 4558b3b54da0
4558b3b54da0

docker stop 命令的返回值是停止的容器 ID

现在通过 docker ps -a 查看,容器已经停止工作

[root@www.hotmindshare.com ~]# docker ps -a
CONTAINER ID  ... STATUS                     ...
6801e4604a32  ... Exited (0) 15 minutes ago  ...

更多docker stop 命令使用方法,可以访问 docker stop 命令

上次编辑于:
贡献者: Andy