动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

30天自动登录
微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

使用Docker搭建开发环境

08-09 14:38 405浏览
举报 T字号
  • 大字
  • 中字
  • 小字

安装

如果是windows10之前的用户,那么安装docker比较麻烦. 你可能需要一个Docker Toolbox的东西,具体安装方式请自行google.因为我的机子是Windows10的.

如果你是Windows10的用户,恭喜你.你只要点这里下载一个exe文件,然后就可以无脑安装了.但是要保证开启Hyper-V功能.如何开启看这里.注意,这个开启之后就不能使用virtualbox虚拟机了.

安装好之后,启动docker在左下角就可以看到docker的logo了.之后我们的操作都是在PowerShell/CMD下面执行的了.执行docker info会看到下面的内容

PS C:\Windows\system32\WindowsPowerShell\v1.0> docker info
Containers: 1
 Running: 1
 Paused: 0
 Stopped: 0
Images: 4
........

基本概念

在使用docker之前你要明白两个概念,两个学docker过程中一定会一直强调的概念

image

container (这种术语直接使用英文,不做翻译)

这两个是整个docker的基础概念,这里本着不负责任的侥幸心理大概的说一下这两个的区别.

image是静态的,类比为面向对象就是一个类

container是动态运行的,类比为面向对象就是一个实例化的对象.

一般,container是可运行的,我们启动一个container之后,这个container里面就是我们的linux环境.

懂得了上面的意思,你就明白了我们要做的事情很简单:找一个合适的image,这个image里面应该包含一切开发时候所需要的东西, 然后启动它,我们就可以在这个container环境上工作了.当然这个时候container应该可以跟宿主共享文件.并且可以在本局域网内可以被访问到.

在继续搭建我们的开发环境之前,我们还是要先学一点docker的命令和概念的.

id&&name

每个image都有一个唯一的id来标识,同样container也有.这个唯一的id一般很长,比如:c59dc2dfad95,但是一般我们输入的时候只要输入若干位能标识当前系统内唯一标识某一个image就可以了.比如只要输入c59d可能就可以标识这个image.除了id,还可以给一个image起名字,这样子也可以通过name来操作一个image.

run

通过docker run image_name可以直接启动本地的一个image.这个命令后面可以加很多子参数来开启其他功能.如果本地不存在这个image,那么docker会去官方的仓库去下载,这个仓库你可以理解为github一样的网站,上面存放了许多别人push上去的image.

tag

每个image都有一个名称.除了名称之外还有一个叫做tag的东西,这个称之为标签的东西可以用来标识同一个image的不同版本.如果你没有给一个image指定一个tag,那么docker会默认为这个iamge添加一个名为:latest的tag.如果你使用docker run ubuntu,那么就会默认运行ubuntu:latest.如果本地没有这个image,那么就会去从仓库下载ubuntu:latest的iamge.很多时候你会看到ubuntu:14.04的image.这个14.04就是代表这个image的tag.只是很多时候image制作者把tag用来标记version了而已.

docker images

这个命令会列出本地所有的images.每个image都会有一个独一无二的id.如下面 IMAGE ID字段.

PS C:\Windows\system32\WindowsPowerShell\v1.0> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu-ok           latest              5f93b91bc208        26 hours ago        423.7 MB
ubuntu              latest              a421b4d8494d        27 hours ago        423.1 MB
ubuntu              14.04               3f755ca42730        2 days ago          188 MB

docker ps

这个命令会列出所有在运行的container.当运行docker ps -a就会列出所有的container.包括已经退出的container.

docker commit

这个命令可以把一个container制作成一个image.

docker rm && docker rmi

docker rm container_id可以用来删除一个container.docker rmi image_id/image_name可以用来删除一个image.

AUFS

很多文章讲docker都会把这个放到后面一点讲.反正不会在类似"使用docker做开发环境"的文章里面讲. 但是这个东西是理解docker的关键.所以一定要讲.

AUFS比不是docker独有的,很多Linux的发行版中都用到了这个特性.说起AUFS,这个东西是UFS的升级版,前面的A就是代表advanced的意思.那AUFS/UFS到底是个什么东西?

所谓AUFS,Advanced Union File System 就是把不同物理位置的目录合并mount到同一个目录中.这种技术有一点典型的应用:有些linux发行版只要插入一个光盘就可以直接运行.不用进行安装.你对系统文件进行的增删改只是反映在电脑的硬盘上面,不会影响到光盘的内容.即对光盘只读不写.那么docker是如何使把这个技术应用到docker上?

docker把一个镜像分成了很多层layer.这些层合并在一起才成为了一个完整的image.这样子有什么好处?最直观的一点就是,ubuntu15.04跟ubuntu16.04的image可能只有一点点差别.这点差别体现在第四层layer上.那么ubuntu15.04跟16.04就可以共享前三层layer.这样子如果你本地有了ubuntu15.04的image.那么再pull ubuntu16.06的时候只要把第四层的pull下来就可以了.

而且,image的所有层都是只读的,当你启动一个image当做container运行的时候,docker会在image的只读层上加一层薄薄的可写层.你在container里面做的所有操作都是反映在可写层.当你退出container之后,下次启动同一个image,之前操作的所有东西都会没有掉.一个重新做人的image.

这个时候有一个问题就来了,我们pull一个image,启动了container.好不容易把该安装的软件都安装好了,然后退出了container.之前安装的软件就都没有了!这个时候我们就要使用commit命令了.commit命令可以把当前的可写层合并到image的只读层里面.这样子这个image又多了一层.下次我们启动这个image的时候安装的软件就都还在了.

当启动一个container之后,就会在iamge的只读层基础上添加一个可写层.所有对container执行的操作都反映在container上.(以上图片都来自docker文档.)

这里提一点,当使用docker images命令查看iamge信息的时候,后面的SIZE是表示当前iamge所占用的大小,但是不意味着所有SIZE相加起来就是占用磁盘空间的总大小.一定要注意,可能有image共享若干层layer.这些layer在相加的时候被计算了好几遍.

PS C:\Windows\system32\WindowsPowerShell\v1.0> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              12e32b701daa        25 minutes ago      188 MB
ubuntu              14.04               3f755ca42730        3 days ago          188 MB
centos              6                   8315978ceaaa        6 weeks ago         194.6 MB

删除

上面的命令提到删除有rm跟rmi两个,rm是用来删除一个已经退出的container.rmi是用来删除一个image的.有了上面AUFS的概念之后,要明白的是我们使用docker rm container_id的时候,其实只是删除掉了一层可写层的数据.因为只读层是container跟image共享的.只要iamge没有被删掉,那么只读层的数据一定也不会被删除掉.

同样,当多个image共享若干层只读层的时候,删除掉一个image.只是删除掉了这个image独有的一层只读层数据.其他共享的数据并没有被删除掉,只有当删除掉所有的image之后,共享的layer层才会被删掉.

执行删除命令的时候会看到如下的信息,这里每一次deleted都是代表删除掉了一层layer.

PS C:\Windows\system32\WindowsPowerShell\v1.0> docker rmi ubuntu-fin
Untagged: ubuntu-fin:latest
Deleted: sha256:9e0728e8edbaf72846c43c629590fba5f46b1d705111d3fb1d79b9cf03a6c50c
Deleted: sha256:d53e457ca7161cd6f2d1b6678ecaafd19043dcaeb1363471867e1047819268fa
Deleted: sha256:496ef4fa137e03d80cf821745f875860d3d3120447326b8609938aa70f2edbd9
Deleted: sha256:12e32b701daa90c435176a273b2b41b4bfb219523c1ae396dc2f7068bbb6c088
Deleted: sha256:e8f29656cf54ad60a17d4b38362d9207b52a846cce3cc13e245fc3b799ff53e9
Deleted: sha256:48f6b521c809e40468886b0a159040503d00a0abb1eabf310451edfea562b459
Deleted: sha256:e94abc94ab1aff00280016eaf0649a75270886a2b60c8fe862ca549a0601949f
Deleted: sha256:3f755ca4273009a8b9d08aa156fbb5e601ed69dc698860938f36b2109c19cc39
Deleted: sha256:565903b66233d5576592815ca4d499bd6fe09a9b4baf83f345aaf64544f1cd78
Deleted: sha256:b653e4373a4b35aa760ff67cfa3de2c9fe3c089823b63ec797eb04de256f86ba
Deleted: sha256:362e536c4e530b94ce4204461e4f8c998705bcb98c91be54dd40b22f50531f3a
Deleted: sha256:b69ad682d83af6a6962b4a60a0b5f033c8d39efcd20dbdf320b6dd8136e50aae
Deleted: sha256:bc224b1b676d12be2a49f99778dda08b90d22747244d0a0afcdf4cfeb7db5d89

我们再删除iamge的时候有时候不能成功删除.大概原因有一下几点:

container正在运行,你删除这个container会失败.应该使用docker stop container_id退出当前container再尝试删除.

container退出了,删除当前image也会失败.因为container虽然退出,当前container保存着运行环境等数据.container是在iamge的基础上添加了一层可写层.所以他们是共享只读层的.

删除一个iamge会有Untagged: ubuntu:14.04.这个不是没有删除成功.这个是因为有其他image跟这个ubuntu:14.04共享layer层.所以删除时候并没有真正删除掉layer层的数据.

Dockerfile

Dockerfile是用来描述如何构建一个image的,Dockerfile由一些指令构成,全部指令大概有20个左右,这里不全部讲解.只讲一些我们下面会用到的.具体Dockerfile的全部用法参考Docker官方出的最佳实践.

FROM

我们要制作的image必然是基于某个现有image的基础,from命令就是用来指定使用哪个基础iamge的.像很多ubuntu官方在Docker Hub上维护由官方的image.我们下面开发环境的搭建就是基于ubuntu:14.04的环境下完成的.

COPY && ADD

copy命令是把宿主机上的文件拷贝到image中.add可以是copy的高级版.

copy要求拷贝的文件在宿主机上存在

add可以指定一个url座位源文件,docker会自动去下载这个url的文件, 然后拷贝到image中.

我们待会儿就会用到add指令,因为我们需要使用163的ubuntu源来替换ubuntu原生的apt-get源.所以我们的Dockerfile会有类似的指令 : ADD http://mirrors.163.com/.help/sources.list.trusty /etc/apt/sources.list.

CMD

这个是指定启动一个container之后,默认执行的命令.我们执行docker run ubuntu:14.04启动一个container之后,默认就进入了bash界面.这就说明这个ubuntu:14.04的CMD就是bash.

这里要澄清一个概念.使用docker run之后默认进入了bash会让很多人以为启动container跟启动一个虚拟机没什么区别.其实不是的.docker的container就是为了某个进程而存在的,这个进程就是CMD所指定的程序.比如:CMD /bin/bash就是启动了bash.当我们退出了bash之后,整个container也就退出了.如果你的CMD写成:CMD service nginx start.你会发现container执行之后就马上结束了.这是因为整个container只是为了service nginx start这条命令而存在的,它不会管你这条命令启动了什么.默认启动的bash正好是一直在前台运行,只有你使用exit命令退出bash的时候才结束bash进程.这个时候container才结束.才会让人有container跟虚拟机差不多的错觉.

上面的这个概念很重要,一定要理解透彻.如果没有搞清楚这点.你会一直觉得docker跟虚拟机没有什么区别.

RUN

这个命令指定了在构建image时候image中药执行的命令.这么说可能有点蹩脚.举个例子,我们希望我们的镜像构建好的时候就安装好了git.那么我们就可以在Dockerfile里面写RUN apt-get -y install git.这样子在构建镜像的时候就会去安装git了.待会儿我们要安装的软件都是通过这个命令指定的.也是有了RUN指令,我们就可以知道一个image构建过程中做了一些什么操作.

动力节点在线课程涵盖零基础入门,高级进阶,在职提升三大主力内容,覆盖Java从入门到就业提升的全体系学习内容。全部Java视频教程免费观看,相关学习资料免费下载!对于火爆技术,每周一定时更新!如果想了解更多相关技术,可以到动力节点在线免费观看Docker入门视频教程哦!

1人推荐
共同学习,写下你的评论
0条评论
代码小兵988
程序员代码小兵988

67篇文章贡献228982字

作者相关文章更多>

推荐相关文章更多>

SpringBoot是什么框架

代码小兵99203-29 17:29

简述SpringBoot与Spring区别

杨晶珍08-02 11:09

使用Docker搭建开发环境

代码小兵98808-09 14:38

重启Docker容器命令

代码小兵87208-09 15:04

简述微服务的3个优点

代码小兵69606-10 10:02

发评论

举报

0/150

取消