概述
Docker初探
Docker是一个允许用户在任何地方构建、分发及运行任何应用的平台。目前已经被视为解决软件中最昂贵的方面之一:部署的一个标准方法
在Docker出现之前,开发流水线通常由用于管理软件活动的不同技术组成而成,如虚拟机、配置管理工具、不同的包管理系统以及各类依赖库复杂的网站。
Docker改变了这一切,允许不同的工程师参与到这个过程中,有效地使用同一门语言,使得协作变得轻而易举。所有东西通过一个共同的流水线转变成可以在任何目标平台上使用的单一的产出。
Docker是什么
使用Docker,配置工作从资源管理中分离出来,而部署工作则是微不足道。运行docker run
,环境的镜像会被拉取下来并准备运行,所消耗的资源更少并且是内含的,因此不会干扰其他环境。
Docker好处
- 替代虚拟机(VM):用Docker代替虚拟机,并将操作系统交给其他人去考虑。Docker不仅启动速度快,迁移更为轻量,同时得益于分层文件系统,与其他人分享变得更简单,更便捷。
- 软件原型:Docker可以在几毫秒内提供一个沙箱环境。
- 打包软件:Docker镜像实际上没有依赖,所以非常适合用于打包软件。用户可以构建镜像,并确保它可以运行在任何现代Linux机器上。
- 让微服务架构成为可能
- 网络建模:可以在一台机器上启动数百个(甚至数千个)隔离的容器,因此对网络进行建模轻而易举。
- 离线是启动全栈生产力:将系统的所有部分捆绑在docker容器中,用户可以将其编排运行在笔记本电脑中移动办公,即便是离线时也没有任何问题。
- 降低调试支出:Docker可以让用户清晰地说明在一个属性已知的系统上调试问题的步骤,错误和环境重现变得更简单,而且通常与所提供的宿主主机环境是分离的。
- 文档化软件依赖及接触点:Docker强制用户从一个基本出发点开始明确地记录软件依赖。
- 启用持续交付:持续交付(continues delivery,CD)是一个基于流水线的软件交付范型,该流水线通过一个自动化(或半自动化)流程在每次变动时重新构建系统然后交付到生产环境中。
关键概念
关键的Docker命令
docker build
构建一个Docker镜像
docker run
以容器形式运行一个Docker镜像
docker commit
将一个Docker容器作为一个镜像提交
docker tag
给一个Docker镜像打标签
镜像与容器
构建一个Docker应用程序
用Docker来构建一个简单的“to-do”应用程序镜像。
to-do应用是协助用户跟踪待完成事项的一个应用程序。
创建新的Docker镜像的方式
方法 | 描述 |
---|---|
Docker 命令/手工 | 使用docker run 启动一个容器,并在命令行输入命令来创建镜像,使用docker commmit 来创建一个新的镜像 |
Dockerfile | 从一个已知基础进行开始构建,并指定一组有限的简单命令来构建 |
Dockerfile及配置管理(configuration management,CM)工具 | 与Dockerfile相同,不过将构建的控制权交给了更为复杂的CM工具。 |
从头创建镜像并导入一组文件 | 从一个空白镜像开始,导入一个含有所需的文件TAR文件 |
编写一个Dockerfile
FROM node
MAINTAINER JueChen
RUN git clone -q https://github.com/docker-in-practice/todo.git
WORKDIR todo
RUN npm install > /dev/null
EXPOSE 8000
CMD ["npm","start"
- 定义基础镜像
- 声明维护人员
- 克隆todoapp代码
- 移动到新的克隆目录
- 运行node包管理器的安装命令
- 指定从所构建的镜像启动的容器需要监听这个端口
- 指定在启动时需要运行的命令
构建一个Docker镜像
运行命令得到的输出
Sending build context to Docker daemon 2.56kB
Step 1/7 : FROM node
latest: Pulling from library/node
844c33c7e6ea: Pull complete
ada5d61ae65d: Pull complete
f8427fdf4292: Pull complete
f025bafc4ab8: Pull complete
7a9577c07934: Pull complete
9b4289f800f5: Pull complete
c74d80ccdeab: Pull complete
b418965736e5: Pull complete
fb4cff8b8d55: Pull complete
Digest: sha256:a4ee833346b09f24095868f6a9d2c7781b6ac319821f912df05f71c6f5a4259c
Status: Downloaded newer image for node:latest
---> 2af77b226ea7
Step 2/7 : MAINTAINER JueChen
---> Running in 0515a15fe80a
Removing intermediate container 0515a15fe80a
---> 59c98e1c7b03
Step 3/7 : RUN git clone -q https://github.com/docker-in-practice/todo.git
---> Running in c443f977a9b3
Removing intermediate container c443f977a9b3
---> b91e17c42c45
Step 4/7 : WORKDIR todo
---> Running in c5bed731a012
Removing intermediate container c5bed731a012
---> d956aee69ed1
Step 5/7 : RUN npm install > /dev/null
---> Running in 6322361e79df
npm WARN deprecated react-tools@0.11.2: react-tools is deprecated. For more information, visit https://fb.me/react-tools-deprecated
npm WARN deprecated graceful-fs@2.0.3: please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js
npm WARN deprecated minimatch@0.3.0: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated buffer-browserify@0.2.5: Package not maintained. Recent browserify uses https://github.com/feross/buffer
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN notsup Unsupported engine for minifyify@4.4.0: wanted: {"node":"0.10.x"} (current: {"node":"13.3.0","npm":"6.13.1"})
npm WARN notsup Not compatible with your version of node/npm: minifyify@4.4.0
npm WARN todomvc-swarm@0.0.1 No repository field.
npm WARN todomvc-swarm@0.0.1 license should be a valid SPDX license expression
Removing intermediate container 6322361e79df
---> 9d43ae56a20a
Step 6/7 : EXPOSE 8000
---> Running in 4062ab80435e
Removing intermediate container 4062ab80435e
---> acf8135546ec
Step 7/7 : CMD ["npm","start"]
---> Running in 22ea4a1411aa
Removing intermediate container 22ea4a1411aa
---> b91598f2cc0d
Successfully built b91598f2cc0d
- Docker会上传docker build指定目录下的文件和目录
- 每个构建从0开始按顺序编号,并与命令一起输出
- 每个命令会导致一个镜像被创建出来,其镜像ID在此输出
- 为了节省空间,在继续前每个中间容器会被移除
- 构建的调试信息在此输出
- 此次构建的最终镜像ID,可用于打标签
对ID打上标签
docker tag b91598f2cc0d todoapp
现在就能从一个Dockerfile构建自己的Docker副本,并重现别人的定义的环境了。
运行一个Docker容器
启动镜像
➜ docker docker run -p 8000:8000 --name example1 todoapp
> todomvc-swarm@0.0.1 prestart /todo
> make all
npm install
npm WARN todomvc-swarm@0.0.1 No repository field.
npm WARN todomvc-swarm@0.0.1 license should be a valid SPDX license expression
audited 858 packages in 3.112s
1 package is looking for funding
run `npm fund` for details
found 19 vulnerabilities (7 low, 11 high, 1 critical)
run `npm audit fix` to fix them, or `npm audit` for details
if [ ! -e dist/ ]; then mkdir dist; fi
cp node_modules/react/dist/react.min.js dist/react.min.js
LocalTodoApp.js:9: // TODO: default english version
LocalTodoApp.js:84: fwdList = this.host.get('/TodoList#'+listId); // TODO fn+id sig
TodoApp.js:117: // TODO scroll into view
TodoApp.js:176: if (i>=list.length()) { i=list.length()-1; } // TODO .length
local.html:30: <!-- TODO 2-split, 3-split -->
model/TodoList.js:29: // TODO one op - repeated spec? long spec?
view/Footer.jsx:61: // TODO: show the entry's metadata
view/Footer.jsx:80: todoList.addObject(new TodoItem()); // TODO create default
view/Header.jsx:25: // TODO list some meaningful header (apart from the id)
> todomvc-swarm@0.0.1 start /todo
> node TodoAppServer.js
Swarm server started port 8000
^C
➜ docker docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fd42749ed7 todoapp "docker-entrypoint.s…" About a minute ago Exited (0) 24 seconds ago example1
➜ docker docker start example1
example1
➜ docker docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09fd42749ed7 todoapp "docker-entrypoint.s…" 5 minutes ago Up 2 seconds 0.0.0.0:8000->8000/tcp example1
➜ docker docker diff example1
C /root
C /root/.npm
C /root/.npm/_cacache
C /root/.npm/_cacache/index-v5
C /root/.npm/_cacache/index-v5/34
C /root/.npm/_cacache/index-v5/34/8e
C /root/.npm/_cacache/index-v5/34/8e/30c54cce758990bcd1b33114c4aa8a9e5a25c152ac39d9feab22b7e13e00
A /root/.npm/_logs
A /root/.npm/_logs/2019-12-10T01_28_26_779Z-debug.log
A /root/.npm/_logs/2019-12-10T01_28_57_559Z-debug.log
C /root/.npm/anonymous-cli-metrics.json
C /root/.config
C /root/.config/configstore
C /root/.config/configstore/update-notifier-npm.json
C /todo
A /todo/dist
A /todo/dist/LocalTodoApp.app.js
A /todo/dist/TodoApp.app.js
A /todo/dist/react.min.js
A /todo/.swarm
A /todo/.swarm/_log
docker run
子命令启动容器,-p将容器的8000端口映射到宿主机的8000端口上,–name给容器赋予一个唯一的命令,最后一个参数是镜像- 容器的启动进程的输出被发送到终端中。
- 在此按Ctrl+C终止进程和容器
- 通过
ps -a
查看已经启动和移除的容器,以及其ID和状态。 - 重新启动容器,这次是后台运行
- 用ps查看变化后的状态
- 使用
docker diff
子命令显示镜像被实例化成一个容器依赖那些文件受到了影像
Docker分层
Docker分层协助用户管理在大规模使用容器时会遇到的一个但问题。
默认情况下,Docker在内部使用写时复制(copy-on-write)机制来减少所需的硬件空间量。每当一个运行中的容器需要写入一个文件时,它会通过将该项目复制到硬盘的一个新区域来记录这一修改。
写时复制:是计算机技术中使用的一种标准的优化策略,在从模板创建一个新的对象时,只有在数据发生变化时才能将其复制进来,而不是复制所需的数据集。
因为层是静态的,所以用户只需要在想引用的镜像之上进行构建,变更的内容都在上一层中,
最后
以上就是眼睛大镜子为你收集整理的Docker——基础概念Docker初探的全部内容,希望文章能够帮你解决Docker——基础概念Docker初探所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复