1.4 Docker的基本用法

学会了基本的搭建,接下来我们要学习Docker的基本用法,本章我们将运行一些简单的实例。

1.4.1 用容器启动一个Nginx/MySQL/Redis服务

1.用容器启动一个Nginx服务

用容器启动应用是一项常规操作,例如运行Web服务。容器的好处是轻量、快捷,开发人员如果需要一套容器开发环境,不用再要求运维人员帮忙打包部署,直接使用docker run命令启动一个或者多个容器服务就可以了。这些容器服务可根据业务需求组合在一起,为开发人员提供需要的业务环境。我们以Nginx服务为例,了解一下Docker的基本用法。

(1)Nginx在虚拟机上启动流程

在传统的虚拟机模式下,要部署一个Nginx服务需要做以下操作(假设我们有了IaaS层的云计算虚拟化平台)。

●创建一个Linux/Windows虚拟机。

●启动虚拟机。

●进入虚拟机系统,然后安装Nginx服务。

●运行Nginx服务。

●如果要迁移服务,需要把虚拟机导出打包成qcow2格式的镜像,然后导入其他云平台。

(2)Nginx容器方式启动流程

在传统的虚拟机模式下,部署一个服务基本需要经过以上操作。如果是在容器下,部署Nginx服务只需要两步(假设我们有了很完善的PaaS层的云计算平台)。

先通过docker run命令启动。


$ docker run --name webserver -d -p 80:80 nginx

然后把镜像导出,迁移到目标容器环境。

在容器中,只需要两步,即可进行服务迁移。如果再划分详细步骤,比如配置IP和设置存储路径,虚拟机环境下部署的步骤将更复杂,而容器方式依然只有上述两步。

运行docker run--name webserver-d-p 80:80 nginx命令后,控制台将显示如图1-18所示的内容。

图1-18 docker run启动容器

分析容器启动过程,如图1-19所示。

运行docker ps命令查看正在运行的容器,如图1-20所示。

类似Linux中的ps-ef命令,当前运行着一个Nginx的容器服务。如果运行命令没反应,就说明容器服务没有运行成功。

图1-19 分析启动容器过程

图1-20 查看正在运行的容器

如果还不确定容器是否真正运行,也可以打开浏览器,输入宿主机的IP,查看是否有Nginx服务的默认页面,如图1-21所示。

图1-21 Nginx默认首页

搭建一个Web服务真的很简单,不需要yum安装额外的软件,直接运行一条命令就能构建一个IT资源服务。

下面,我们仔细分析刚才那条命令。


$ docker run --name webserver -d -p 80:80 nginx

●docker run:运行容器的命令开头是docker run,这是固定的命令格式,run就是启动的意思,这个很好理解。

●--name webserver:这里是给这个容器服务命名,我命名的是webserver。

●-d:以守护进程的方式运行(后台运行,如果不加-d参数,镜像下载后界面会卡住,如果按“ctrl+C”退出进程,容器服务也会停止,所以一般我们要让容器服务在后台运行)。

●-p 80:80:指定容器服务的端口,这里大家看到有两个端口,左边的是宿主机端口,右边的是容器里面的端口。注意,宿主机如果运行了多个相同的容器服务,端口不要冲突,不然容器会启动失败。

●Nginx:这里就是镜像仓库里镜像的名字,我们要运行Nginx服务,那么官方仓库里Nginx服务的镜像名就是Nginx。当然这里也可以用“:tag_num”的方式指定镜像版本(比如docker run-t-i ubuntu:15.10/bin/bash,15.10就是指定了ubuntu这个镜像的tag版本),如果不指定就默认下载最新版镜像。

上面就是运行一个Nginx服务的方法,有时操作过程中可能会出现一些错误,这里再次强调,我们这个实验要在联网的环境下进行,如果没联网,那么实验肯定会失败。另外,有可能会遇到容器启动后出现警告:WARNING: IPv4 forwarding is disabled.Networking will not work。然后容器启动失败。这是因为宿主机没有打开IPv4转发,解决的方法是运行linux vim命令vim/usr/lib/sysctl.d/00-system.conf,修改00-system.conf文件,然后添加参数配置net.ipv4.ip_forward=1,接着重启宿主机,最后运行sysctl net.ipv4.ip_forward命令查看配置是否生效,如果返回为net.ipv4.ip_forward = 1,表示配置成功。

2.用容器启动一个MySQL服务

除了Nginx服务,MySQL数据库服务也是我们经常用到的。那么,如何在容器里运行MySQL服务呢?其实运行MySQL和运行Nginx类似,唯一区别是运行MySQL需要指定密码给MySQL容器。


$ docker run --name mymysql \
-d -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 mysql:5.6 mysql:5.6

运行了上述命令后,结果和运行Nginx一样,本地没有mysql:5.6版本的镜像,先下载,然后启用3306端口,最后在后台运行,如图1-22所示。

图1-22 启动MySQL容器

这里命令多了一个参数-e,是给MySQL设置了密码。

MySQL容器运行成功后,我们通过另外一台电脑(注意要装好mysql-client,不然无法成功运行MySQL命令)运行mysql-h111.230.181.97-p123456,即可进入容器里的MySQL服务,如图1-23所示。

图1-23 连接MySQL容器

3.用容器启动一个Redis服务

最后,我们用容器启动一个Redis服务,同样地,直接使用docker run命令即可自动到官网下载Redis镜像。像Redis这样流行的开源软件,官网肯定是有镜像的,如图1-24所示。

图1-24 在Docker hub官网下载Redis容器镜像

接着运行如下命令,启动Redis容器,如图1-25所示。


$ docker run --name myredis -d -p 6379:6379 redis:latest

图1-25 启动Redis容器

通过docker ps命令可以看到myredis已经运行了,输入如下命令检测是否成功运行。


$ redis-cli -a redis -h 111.230.181.97 -p 6379

结果表明已成功进入容器运行的Redis服务里,如图1-26所示。

图1-26 查看运行的Redis容器

上面运行的3种服务只是给大家一个简单的感受。在实际的生产环境中,运行容器服务需要提前规划好,尤其是数据库这样的服务,需要在运用docker run命令的时候指定好数据卷路径和配置文件路径。

1.4.2 如何进入容器

前面我们通过添加-d参数,直接在后台运行Docker服务,并没有进入容器里面去看一看。接下来,我们一起进入容器内部。

在进入容器之前,先要说明容器和虚拟机是不一样的,单个容器归根结底是单个进程。一般来说,一个容器只运行一个服务,我们不能把容器当作虚拟机来使用,不然在管理和部署方面,也会变得复杂。有些容器服务启动后无法进入该容器,比如我们刚才运行的Nginx和Redis服务,会处于挂起状态,此时不能运行任何命令,如果退出进程,容器会立即停止运行。接下来我们用ubuntu系统的容器镜像给大家做个演示。

运行docker run-d-it ubuntu命令后,通过docker ps命令可以看到ubuntu容器已经运行了,查看ubuntu容器,如图1-27所示。

图1-27 查看运行的ubuntu容器

我们可以通过如下两种方式进入ubuntu容器。

1.attach命令

docker attach命令可以理解为“容器连接”,运行docker attach+CONTAINER ID命令可以进入后台正在运行的容器。比如刚才我们运行成功的ubuntu容器,ID是0b282c9a7fc3,那么我们运行docker attach 0b282c9a7fc3命令即可进入ubuntu,如图1-28所示。

图1-28 运行docker attach命令

不过,需要注意的是,进入容器后如果退出,容器就会停止运行。因此不推荐使用这个attach命令的进入方法。

2.exec命令

docker exec命令效果和attach差不多,不过用exec进入容器后,退出容器后容器不会停止运行。运行docker exec进入容器,如图1-29所示。


$ docker exec -it b37f8d63c82d bash

图1-29 运行docker exec进入容器

注意,命令最后需要加一个bash,这样进入容器后就是/bin/shell模式了。

1.4.3 如何停止、删除容器

运行docker ps命令就可以看到当前正在运行的容器服务,下面3个是我们刚才启动的,查看运行中的容器如图1-30所示。

图1-30 查看运行中的容器

1.停止容器服务

如果不需要继续运行某个容器,要怎么停止呢?

很简单,直接运行docker stop+CONTAINER ID(或者容器名)即可,这条命令后边还能添加多个CONTAINER ID。

比如想停止Redis的服务,运行docker stop 5eff30763079命令就可以了。运行成功后,再运行docker ps命令,就看不到Redis容器服务了。运行docker stop且查看容器,如图1-31所示。

图1-31 查看停止的容器

运行如下命令,可以停止全部容器。


$ docker stop 5eff30763079 3ec277478f46 ae2ce781dea9

这样3个容器都停止了,再运行docker ps命令就是空的。但是,运行docker ps-a可以看到所有的容器服务,即使停止运行的也会列出来。

直接运行如下命令,可以重启容器。


$ docker start 5eff30763079 3ec277478f46 ae2ce781dea9

2.删除容器服务

通过如下两步可以删除容器服务。

1)停止想要删除的容器服务。

2)运行docker rm+CONTAINER ID(跟容器名也可以)命令。

比如我们想删除MySQL的容器,只要运行如下命令。


$ docker stop mymysql         #mymysql为容器名
$ docker rm mymysql

本节简单介绍了3种常见的容器服务启动方式,我们都是直接用官方镜像操作,而且启动的时候用的是比较简单的参数。在实际的生产环境里,大家一定要灵活运用相关启动参数(具体参数后面我们还会仔细讲解),这样才能应对千变万化的生产环境。另外,要注意的是容器和虚拟机不一样,容器其实是一个进程,不要总有进容器里做复杂操作的想法。容器的最大作用就是运行好我们想运行的应用,它很单纯。