Docker系列学习文章 - docker基本使用(四)

| 导语通过上一篇文章的学习,我们把docker安装好了,那么安装好docker后该怎么使用呢?本篇文章通过一两个例子跟大家讲述下docker的基本使用。然后,我们还会跟大家讲解下如何进入到一个容器里面。最后,我们再跟大家说说如何停止、挂起和删除一个容器。

一、用容器启动一个Nginx/mysql/redis服务

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

用容器跑应用是最常见的操作。其中,跑web服务是最多的。容器的好处前面说过就是轻量、快捷、方便。开发人员申请一套开发环境,不再要求运维人员帮忙打包部署,直接里run一个或者多个自己想要的容器服务,然后这些容器服务根据开发人员的要求组合在一起就能快速形成开发人员想要的环境。这里,假装我们这有一位web开发工程师小王。小王已经开发好了他的网站了,现在想让网站跑起来。那么小王需要用到的是Nginx服务,那么我们就从Nginx服务给大家讲讲docker的基本使用。

部署之前,我们先回味下,在传统的虚拟机部署步骤当中,我们要一个nginx服务需要做哪些操作。无非就这么几大步(假设我们有了IAAS层的云计算虚拟化平台):

A. 创建一个Linux/Windows虚拟机

B. 启动虚拟机

C. 进入虚拟机系统,然后yum安装/exe安装 Nginx服务

D. service start/双击运行 nginx服务

E. 如果要迁移,需要把虚拟机导出打包成qcow2格式的镜像,然后导入到其他云平台里(时间很长)

在传统的虚拟机模式下,部署一个服务基本需要做这些操作。那如果是在容器下呢?要做哪些步骤?(假设我们有了很完善的PAAS层的云计算平台):

A. docker run --name webserver -d -p 80:80 nginx

B. 如果要迁移,把几兆的镜像导出,即可迁移到任何容器环境里

有没有搞错?只需要做这两步??是的,就这两步,非常方便。其实,如果要划分细点,比如要配置IP和设置存储路径啥的,虚拟机环境下的部署还更复杂,而容器下依然就那两步。

所以,到这你应该清楚了,我们运行一个容器就那么简单!

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

这个命令运行后,你的控制台将会显示以下内容:

我们分析下上面这张图代表的意思:

我们可以运行docker ps 命令查看正在运行的容器:

这就像linux里ps -ef 一样的意思,当前运行着一个nginx的容器服务.如果运行这命令没显示,那说明你的容器服务没运行成功,状态是死的。

当然,你还不放心容器是否真正运行,你可以打开浏览器,输入你宿主机的IP,然后看下是否有nginx服务的默认页面:

到这,你会发现,真的是太简单了,根本就不需要yum安装啥,直接一条命令就能来个服务。其实如果容器平台搭建的好,开发人员真的是想要什么就能立马要什么。就如圣经开头说的,神要光,于是就有了光...

接着,我们再仔细分析下刚才那条命令:docker run --name webserver -d -p 80:80 nginx

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

--name webserver :这里就是给这个容器服务命名成自己想要的名字,我这里命的是webserver;

-d :以守护进程方式运行(后台运行,如果不加,那么镜像下载后界面就会卡住,如果你按ctr+c退出,那么容器服务也会停止,所以一般咱们都要让容器服务后台运行);

-p 80:80 :指定容器服务的端口,这里大家看到有两个端口,左边的是宿主机的端口,右边的是容器里面的端口。注意,宿主机如果跑了多个相同的容器服务,那么端口别冲突了(也就是说左边的不可能有相同的值),不然容器会启动失败

nginx :这个就是镜像仓库里镜像的名字,我们要运行nginx服务,那么官方仓库里nginx服务的镜像名就叫nginx,当然这里也可以跟上冒号+tag方式指定版本(比如docker run -t -i ubuntu:15.10 /bin/bash命令中:15.10就是ubuntu这个镜像的tag版本),如果不写就默认下载最新的 latest 版。

那么,上面就是运行一个nginx服务的方法,有些同学操作的过程中可能会出现一些错误,这里要注意下,我们这个实验是得在联网的环境下做的,如果没联网,那么肯定会失败。建议初学者在有网的环境下做。不然老失败,你就会觉得没意思不想继续了。另外,还有的同学可能会遇到容器启动报 WARNING: IPv4 forwarding is disabled. Networking will not work 的告警,然后容器启动失败。那么注意下,这是因为你的宿主机没打开IPv4转发,解决的方法是vim /usr/lib/sysctl.d/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容器:

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

运行了这条命令后,结果跟运行nginx的一样,本地没有mysql:5.6版本的镜像,先下载,然后启用了3306端口,最后在后台运行。

这命令多了一个参数就是 -e 我们看到这里是给mysql设置了密码。

mysql容器运行成功后,我们试着连接下。我们找另外一台机器(注意要装好mysql-client,不然运行mysql命令不成功),然后运行 : mysql -h111.230.181.97 -p123456 即可进入到容器里的mysql服务里:

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

最后,我们来运行一个redis服务,同样的,我们直接docker run即可,它会自动到官网下载redis镜像,像redis这样流行的开源软件,官网肯定是有镜像的:

运行:docker run --name myredis -d -p 6379:6379 redis:latest

我们看到我们运行的myredis已经起来了,然后我们运行下面命令检测下是否成功:

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

已成功进入容器运行的redis服务里。

总结:上面运行的三种服务其实是最简单的运行,这里只是给大家一个简单的感受。在实际的生成环境下,运行容器服务还得规划好,尤其是数据库这样的服务,还得在docker run的时候指定清楚数据卷路径和配置文件路径。

二、如何进入容器

前面我们运行了docker服务后,我们就直接就 -d 后台运行了,并没有进入到容器里面去看一看。刚学容器的同学会很疑问,容器不也是一个沙盒吗?我想进去看一看什么样!

好的,接下来,我们带你进入容器里面瞧一瞧。

不过进入容器之前,要跟大家说明一下。那就是容器跟虚拟机不一样,容器其实它归根结底就是一进程。一般的,一个容器里面就运行一个服务,千万不能把它当作虚拟机来用,不然管理部署方面跟虚拟机就没啥区别了,到时候也会变得复杂。有些容器服务,你进去里面是毫无意义的,比如我们刚才运行的nginx和redis服务,你进去后就是挂起状态,不能敲任何命令,然后你要是按Ctr + C退出了,那么容器就会停止运行。所以,我们这里用ubuntu系统级的容器镜像给大家做演示,这样直观点。

我们运行 docker run -d -it ubuntu 搞一个ubuntu的镜像看看。运行这个命令后,我们用docker ps命令就可以看到这个ubuntu容器已经运行了:

那么如果我们想进这个ubuntu容器里看一看,那么我们有什么方法呢?主要有两种方式:

1. attach 命令

attach 在英文里就是“连接”的意思,如果一个后台正在运行的容器,我们想登录进去查看,我们可以用 docker attach + CONTAINER ID 的方式进入。比如刚才我们运行成功的那个ubuntu 容器,ID是0b282c9a7fc3,那么我们运行docker attach 0b282c9a7fc3 即可进入。

不过,要注意的是,进入后,如果你 exit 或者按ctr + c 退出,容器就会停止运行。

因此这个attach 的方法我们不推荐。

2. exec 命令

这个exec命令效果跟attach差不多,不过用exec进入容器后,你exit 或者按ctr + c 退出,容器不会停止运行。

# docker exec -it b37f8d63c82d bash

注意,我们最后得加个bash,这样就进入容器后就是 /bin/shell模式了。

这种方式我们比较推荐,一般都是用这种方式进入容器。

三、如何停止、删除容器

我们运行docker ps命令就可以看到当前正在运行的容器服务,下面三个是我们刚才启动的。

1. 停止容器服务

那么假如我们不需要某个容器运行了,那么我要怎么停止呢?

很简单,直接运行 docker stop + CONTAINER ID(或者容器名) 即可,同时这命令你还能跟多个CONTAINER ID

比如我们把redis的服务停止掉,咱们运行 docker stop 5eff30763079 就行,运行成功后,我们再用docker ps命令就看不到redis容器服务了。

如果全部都停止,那么就执行docker stop 5eff30763079 3ec277478f46 ae2ce781dea9 ;这样三个容器都停止了,你再运行docker ps 就是空的。但是,运行docker ps -a 可以看到所有的容器服务,即使停止的也会列出来。

我们要重新让容器启动,直接运行  docker start 5eff30763079 3ec277478f46 ae2ce781dea9 即可

2. 删除容器服务

如果容器我们不想要了,我们想要删除怎么办?只要执行这两步即可:

a. 停止你想要删除的容器服务

b. docker rm + CONTAINER ID(跟容器名也可以) 即可

比如我们想删掉mysql的容器,我们只要操作

# docker stop mymysql  (跟容器名也可以)

# docker rm mymysql  

执行了这两步后,mymysql这个容器就没有了。

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

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏holer

外网访问内网Docker容器

局域网里的主机上安装了Docker容器,只能在内网访问,怎样从外网也能访问内网的Docker容器?

2321
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用Docker和Docker Compose配置持续集成测试环境

持续集成(CI)指的是开发人员尽可能频繁地集成代码,并且在自动化构建将每个提交合并到共享存储库之前和之后都要进行测试的实践。

510
来自专栏实战docker

制作mongodb的Docker镜像文件

在上一章《Docker下,极速体验mongodb》中,我们快速搭建了mongodb并在控制台做了基本的体验,当时用的镜像是官方发布在hub.docker.com...

3459
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Docker和Docker Compose配置持续集成测试环境

持续集成(CI)是指开发人员尽可能经常集成代码并在每个提交在通过自动构建合并到共享存储库之前和之后进行测试的实践。

790

Docker – 清理磁盘占用

最近,我们开始对一些应用进行 docker 化,不得不说,我已经爱上 Docker 了!这是一个非常棒的工程,在 AWS EC2 上,它让我们的生活变得更加轻松...

3999
来自专栏阮一峰的网络日志

Docker 入门教程

2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业。 但是,许多人并不清楚 Docker 到底是什么,要解决什么问题,好处又在哪里?本文...

3453
来自专栏散尽浮华

CentOS7下安装Docker-Compose操作记录

Docker-Compose是一个部署多个容器的简单但是非常必要的工具.安装Docker-Compose之前,请先安装 python-pip

942
来自专栏Laoqi's Linux运维专列

Docker 配置安装(Ⅲ)

1436
来自专栏北京马哥教育

Docker容器构建过程的安全性分析

DevOps概念的流行跟近些年微服务架构的兴起有很大关系,DevOps是Dev(Development)和Ops(Operations)的结合,Dev负责开发,...

720
来自专栏吴伟祥

Docker学习——Docker 三剑客(七) 顶

1401

扫码关注云+社区