初次使用Docker的体验笔记
一、前言
Docker容器已经发布许久,但作为一名程序员如今才开始接触,实在是罪过……
        在此之前,我还没有对Docker进行过深入的了解,对它的认识仍停留在:这是一种新型的虚拟机。这样的层面。今天就我的初次体验进行记录。声明一点:以下内容大部分是主观片面的,另有来自百度的(嗯,就是百度)。要是有什么说的不对,或者是理解有问题的地方,还请大家告诉我,先谢谢大家了。
二、环境
        我的基础运行环境是运行在Win10专业版HyperV虚拟机中的CentOS7-Minimal版本。新装的虚拟机,保证运行环境不受奇奇怪怪的东西影响。
        CentOS安装Docker简洁明快:sudo yum install docker -y。等着就行……安装内容如下:

四、启动Docker服务
        与安装一样简洁明快:sudo systemctl start docker。如果没有报错,那就是启动完成了。(我喜欢用systemctl,反正只要能启动服务,你想咋启动就咋启动。)命令没有回显,我就不截图了。
五、获取容器镜像
        Docker提供镜像搜索命令(search),方便你快速找到自己想要的镜像。当然,镜像的源你可以自己配置,默认是docker.io。我只打算找一个CentOS的镜像,所以默认的源就行。搜索命令如下:

可以看到,搜索到好多镜像。最后两列字面意思我没理解,但是应该是标记官方镜像和开发者上传的镜像。我选择第一个,标记着“官方的”,应该没有装任何其他的东西。
        嗯,接下来就是下载(pull)镜像了。命令如下(渣渣网速):

可以看到,默认下载的是最新的(latest)。当然,你可以下载其他非最新的版本,具体操作请查询pull命令的相关参数。我只要最新的(傲娇脸)。这个镜像大小也是6 。这么小,估计真的是什么都没装吧(还是压缩了?)……

上面是下载完成后显示的信息。
六、创建容器
        接下来就是从刚下载的镜像创建一个容器了。新的容器的所有内容都会从镜像里拷贝(那个改是拷贝吧)。
        声明:由于输入sudo太麻烦,所以下面的演示都用root用户执行。
        创建容器(run)命令就比较复杂了,参数较多:

如上,我来一个一个解释:
        -itd:这是 -i -t -d 的简写。-i 表示保持打开标准输入流(stdin),无论是否连接到此容器。-t 为容器分配一个虚拟的tty。-d 表示后台模式运行容器,即容器启动后将断开与当前终端的连接。(之后会演示怎么再连回来)。
        --name:这是为容器起一个名字,之后与容器的交互需要用到,当然用容器的Id也是可以的(就是run命令后那个巨长的回显)。当然,不写的话也会有默认的名字。
        -v:表示挂载宿主机(这个称呼对吗?)目录到容器的目录(宿主机目录路径:容器目录路径)。当然可以设置读写属性,这个就不说了,可以自行探索。
        -p:表示映射(端口转发?)主机端口至容器端口(主机端口:容器端口)。这个参数可以重复出现,映射多个端口。这个参数也有许多情况,也请自行探索。
        centos:这个是本地镜像名称(centos),必须是已经下载(pull)到本地的镜像。当然,若是本地没有,Docker会执行search并询问你是不是要下载。
        /bin/bash:这个是本次启动的镜像要执行的任务。这个门道比较多,我在后面会说一下。
        此处省略了-a参数。-a参数可以指定连接准输入流(STDIN)、标准输出流(STDOUT)和标准错误流(STDERR),默认好像是都连接。可以显式使用,以连接指定的流。
        以上就是命令的相关解释,是我自己配合百度理解的,要是有不对的,请大家留言哦。
七、查看容器
        使用docker ps -a 命令可以查看当前存在的所有容器:

如上,我只运行了一个容器。命令显示了容器的ID、使用的镜像、运行的命令、创建时间、运行时间、端口映射、名称。
八、连接容器
        连接容器有多种办法。在宿主机中使用Docker的attach命令,即可连接到容器:

如上,就已经连接到容器了。可以看到命令行信息的变化。
        我使用了ps命令查看了容器中的进程。可以看到一个ID为1的进程,这个进程就是run命令最后的那个参数。Run命令所指定的任务进程Id一定是1 。我们使用attach命令连接的也是这个命令的标准输入输出流(错误流我不知道连接了没)。由于run指定的命令是bash,所以attach也是连接到了bash,这样就能随意操作容器了。
        关闭连接很容易想到,就是退出bash:exit。
但是、但是、但是,这样退出会导致一个问题,那时就是:容器因为1号进程的退出(就是attach命令连接的bash),会认为任务已完成,容器就停止了。

如上,容器已经停止了(Exited)。
        所以,我建议使用exec命令对容器进行操作。我们重启容器:

可以看到,start 加容器名称就能启动。
        使用exec命令,可以让容器直接执行命令(docker exec 容器名称 命令):

如上,是我用exec对nethost执行ps命令查看进程,执行ls命令列出根目录。
        也可以用exec执行bash并挂载输入输出流:

如上,是我用exec命令启动bash并挂载输入输出流。-it参数的意义和run命令相同,不同的是没有使用-d命令,这样(前台模式)可以使命令执行后直接连接输入输出流。我执行了ls命令和ps命令。
        从ps命令的显示可以看出,exec命令启动了一个新的bash,PID为24(当然,PID应该是随机赋值的)。区别于PID为1的bash,我们当前连接的就是这个PID为24的bash,一样可以执行命令,随意操作。并且退出之后,也不会影响PID为1的bash,这样就可以使容器继续运行。

上图可见,我退出了容器的bash后,容器依然在运行。我在宿主机中使用exec执行ps命令后,nethost这个容器中1号进程仍然在运行。
九、停止和删除容器
        上面提到了启动容器(start)命令,停止容器当然是停止命令(stop)了。

stop命令执行效果如上。
        删除容器更容易,使用rm命令:

如上,我删除了名为nethost的容器,因为只有一个容器,所以删除之后九没有容器了。要注意的是:rm命令只能删除已经停止的容器。并且rm命令不像linux的rm命令那样会有删除确认,docker的rm命令会直接删除容器,所以用的时候要小心。
十、其他
        其他的内容,如:备份、迁移、上传镜像等,我还没有试过,暂时不进行记录。
初次使用Docker的体验笔记的更多相关文章
- 在Docker中体验数据库之MySql
		在上一篇在Docker中体验数据库之Mongodb之后,这次记录一下在docker中安装mysql.过程要比Mongodb麻烦一点…… 参考网址: https://dev.mysql.com/doc/ ... 
- Docker初体验
		## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ... 
- docker rancher 体验  (未完待续.....)
		docker rancher 体验 官方 githubhttps://github.com/rancher/rancher 环境说明: 10.6.0.14010.6.0.18710.6.0.188 修 ... 
- 在Docker中体验数据库之Microsoft SQL Server
		前面记录了一下在docker中体验mongodb和mysql.今天记录一下mssql……其实早就体验了,就是没有记录,前几天看了一下2019的一些新闻,很喜欢Polybase这个特性,想体验一把,可惜 ... 
- Docker小白使用笔记
		本文来自网易云社区. 本人DBA一枚,但因为工作的关系,接手的机器越来越多,要部署的东西也从MySQL扩展到其他千奇百怪的各种应用服务,因此需要使用自动化部署的场景也越来越多.早就听运维部的其他大大们 ... 
- 2.Docker初体验【Docker每天5分钟】
		原文:2.Docker初体验[Docker每天5分钟] Docker给PaaS世界带来的“降维打击”,其实是提供了一种非常便利的打包机制.该机制打包了应用运行所需要的整个操作系统,从而保证了本地环境和 ... 
- 在Docker中体验数据库之Mongodb
		本文记录一下,在docker中安装Mongodb的过程. 环境:物理机 ubuntu18.04 因为环境变了,我在一台物理机上直接安装了ubuntu(非虚拟机和双系统),制作U盘镜像.安装参考:htt ... 
- docker入门-学习笔记
		docker可以类比成window下的VMware或者virtualbox软件.docker有两个基本的概念:容器(container)和镜像(image),分别对应为VMware中的系统镜像和系统镜 ... 
- Laravel-初体验笔记
		一直想学Laravel却动不了手,刚好需要研究一个workflow之类的功能,有个Laravel项目一个登陆就把我搞晕,看Laravel文档看的也不能看进去,直接新建个Laravel仿一个,动手搞起来 ... 
随机推荐
- 常见浏览器兼容问题、盒模型2种模式以及css hack知识讲解
			什么是浏览器兼容问题?所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站或者登陆我们 ... 
- C#调用windows api示例
			这是运行结果: Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提 供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩 展,一般也都提供 ... 
- kfreebsd不适用于实际环境
			debian搞的kfreebsd,其中有很多常用的软件包处于依赖破损的状态,个人觉得是无法用作日常开发或生产环境的. 当然,对于只使用其中几项完整可用功能的场景,基本上还是可以的. 当时看个这个东东的 ... 
- 线段树区间求最大值(点更新)---I Hate It
			HDU 1754 Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的 ... 
- php中的常用数组函数(一)(比较多个数组的差集的函数们 array_diff_assoc() array_diff() array_diff_key() array_diff_ukey() array_diff_uassoc())
			array_diff_assoc($arr1, $arr2, $arr3,... n); 返回:一个$arr1的副本,后续的数组中出现一个键值相同的元素,就在副本中删掉这个元素,最后返回这个副本. 如 ... 
- 二、SQL语句映射文件(2)增删改查、参数、缓存
			//备注:该博客引自:http://limingnihao.iteye.com/blog/106076 2.2 select 一个select 元素非常简单.例如: Xml代码 收藏代码 <!- ... 
- 1秒30000QPS,前后端设计思路
			Q:现在有这样一个需求,在一秒中有3万的支付订单请求,有什么比较好的解决方案吗? PS:我们数据库用的是oracle 程序是java spring mybatis dubbo mq等技术,现在有这样一 ... 
- [Tool] 使用CodeMaid自动程序排版
			[Tool] 使用CodeMaid自动程序排版 前言 「使用StyleCop验证命名规则」这篇文章,指引开发人员透过StyleCop这个工具,来自动检验项目中产出的程序代码是否合乎命名规则. [Too ... 
- 关于字符串replace方法第二个参数探究
			网上有关replace的文章很多了,这里主要聊聊它的第二个参数.阅读本文需要对replace方法有一定了解.W3school=>replace 我们要把一段字符串中的某些指定字符替换掉,第一时间 ... 
- 初学Node(二)package.json文件
			package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ... 
