初识docker

856 阅读4分钟

docker解决的问题

场景:开发进入提测阶段

测试:你这个功能不对吧,缺陷提过来

开发:我这里正常的啊,你过来看...

测试:我这有问题,你过来看...

(此处省略沟通过程...)

最终是因为测试和开发环境不一致导致的。

开发:那我给你整一套环境吧,开发测试在同一个环境下测


那么我们就需要一个一致的环境,docker刚好可以解决上述问题。


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

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

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。


概念



docker client: docker install 后提供给用户的命令终端,用户可以在这个终端操作docker daemon。

docker daemon:docker服务的进程。安装过docker以后,就会在后台程序跑一个docker daemon,执行docker client的命令。

docker images:镜像,包含有执行环境的只读文件,如上述栗子中container1里边包含了 git,just,tnpm,我们想把这个container1直接给测试用,可以通过docker commit将这个container打成一个镜像。

docker container:一个包含了镜像的运行容器。这个运行环境如果想要复用,也可以生成一个镜像。如上述栗子中的container2是基于container1打包好的镜像添加了nice的运行容器。每个容器相互隔离。

官方解释:有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效、轻量、自给自足,还能保证部署在任何环境中的软件都能始终如一地运行。

docker registry:docker images的仓库。


开门红

通过上一步的安装以后,用户的终端里已经可以执行docker命令了。

docker verison查看docker版本信息

docker search centos查看centos是否存在

docker pull centos从docker仓库获取centos镜像,这里没有指明tag信息,所以使用默认tag:latest

docker images查看当前系统中的images信息

docker run 启动一个容器,注意命令行路径变化了,说明已经进入到一个容器中,在当前容器下执行查看git版本信息,提示找不到该命令,说明这个容器下没有安装git,于是通过yum安装git

-v 映射本机目录 参数格式: 本机目录:docker中目录
-p 映射本机端口 参数格式: 本机端口:docker端口
--name 制定容器名称
-i 以交互模式运行容器,通常与 -t 同时使用;
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d 以后台模式运行

安装完成后通过git--verison查看版本号,可以查看了,然后通过exit退出该容器。


通过docker ps -a查看docker下的所有容器,可以看到以下容器均已退出。

通过commit命令将容器转化成镜像,其中,-m指定提交信息;-a指定用户信息;8cdcaa5dfa72代表容器的id,通过docker ps可以查看容器id;jade.wp/centos:git指定目标镜像的用户名、仓库名和 tag 信息。

现在我们就有两个容器,一个centos容器,一个基于centos容器的增加git命令的容器,运行docker run -it jade.wp/centos:git,在这个容器下就查看git版本信息就可以看到了。


再深入一点

难道每次我都需要在命令行里写那么多命令才能执行吗,会不会像node一样,可以执行命令行操作,也可以执行js文件呢?有,dockerfile。

FROM reg.docker.alibaba-inc.com/aone-base-global/git-image:1.0.0

WORKDIR /zodiac

RUN mkdir -p /zodiac/src
COPY src/*.js /zodiac/src/
COPY entry.js /zodiac/entry.js
COPY package.json /zodiac/package.json

RUN tnpm i --production

ENTRYPOINT ["node", "/zodiac/entry.js"]

上述dockerfile的意思是

FROM 镜像:基于哪个镜像之上新生成的镜像。

WORKDIR:工作目录。

RUN:执行其后跟随的shell命令

COPY:从当前目录拷贝src/*.js到容器的/zodiac/src/

ENTRYPOINT:run的执行入口

更多的指令看这里


参考:

zhuanlan.zhihu.com/p/23599229

www.atatech.org/articles/12…

www.atatech.org/articles/65…

www.atatech.org/articles/47…