资讯专栏INFORMATION COLUMN

从最简单的入手学习 Docker (一)

blastz / 3063人阅读

摘要:根据不同的项目,使用不同的镜像,搭建开发环境而每一个应用有自己一个独立的运行环境,互不干扰。如何测试人员还是运维人员,也可以根据最新版本的镜像来测试和部署新的测试环境和生产环境。下一步我们从如何利用已有的运行项目来进一步掌握。

什么是 Docker

Docker is the leading Containers as a Service (CaaS) platform

Docker is the world’s leading software container platform. Developers use Docker to eliminate “works on my machine” problems when collaborating on code with co-workers. Operators use Docker to run and manage apps side-by-side in isolated containers to get better compute density. Enterprises use Docker to build agile software delivery pipelines to ship new features faster, more securely and with confidence for both Linux, Windows Server, and Linux-on-mainframe apps.

Docker 作用 运行环境尽可能一致

不管是在大公司还是小公司,由于代码有版本控制,大家的代码能保证一致;但由于大家相互之间的开发硬件不一样 (如,有人喜欢在 windows 环境下开发,有些人用 Mac 电脑),必然导致开发环境不一致,有时候就因为环境不一致,而误解为代码的问题,如 (有些语言,在 windows 下对大小写不敏感,但在 Linux下敏感),所以提供一个如何保证相同的开发运行环境就显得很重要了。

Java 曾提出 「Write Once, Run Anywhere」,而 Docker 则提出了 「Build once, Run anywhere, Configure once, Run anything」。

Java 的一个非常重要的特性就是与平台无关性,而使用 Java 虚拟机是实现这一特性的关键。Java 虚拟机屏蔽了与具体平台相关的信息,使得 Java 语言编译程序只需生成可以在 Java 虚拟机上运行的目标代码 (字节码),就可以在多种平台上不加修改的运行。

和 Java 虚拟机类似,Docker 使用容器引擎解决平台依赖问题,它在每台宿主机上都启动一个 Docker 的守护进程,守护进程屏蔽了与具体平台相关的信息,对上层应用提供统一的解析给不同平台上的执行驱动,存储驱动和网络驱动去执行。

解决本地多个项目多种环境相互干扰的问题

可能由于不同的项目需要不同的开发环境,如有些项目需要 PHP 5.6,有些项目需要 PHP7.0;有些项目需要 Apache,有些项目需要 Nginx。在同一台电脑上需要同时安装相同软件的不同版本,或者同时运行相同端口 (如:80),这些都避免不了出现冲突的情况。

有时候我们并不想电脑上同时安装很多开发软件,这时候 Docker 就发挥作用了。根据不同的项目,使用不同的 Docker 镜像,搭建开发环境;而每一个 Docker 应用有自己一个独立的运行环境,互不干扰。

Docker 具有版本控制能力

Docker 容器还可以像 git 仓库一样,可以让你提交变更到 Docker 镜像中并通过不同的版本来管理它们。设想如果你因为完成了一个组件的升级而导致你整个环境都损坏了,Docker 可以让你轻松地回滚到这个镜像的前一个版本。这整个过程可以在几分钟内完成,如果和虚拟机的备份或者镜像创建流程对比,那 Docker 算相当快的,它可以让你快速地进行复制和实现冗余。

如何测试人员还是运维人员,也可以根据最新版本的镜像来测试和部署新的测试环境和生产环境。

Docker 基本使用 第一个镜像

为了加速下载 Docker 镜像,可以使用国内的一些加速器,如daocloud,如 Mac:

Docker For Mac

右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中加入下面的镜像地址:

http://40974b5e.m.daocloud.io

点击 Apply & Restart 按钮使设置生效。
更多参考:
https://www.daocloud.io/mirro...

PHP 项目中创建一个Dockerfile
FROM daocloud.io/php:5.6-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./hello.php" ]
写个 hello.php
创建镜像
docker build -t my-php-app .

查询镜像
docker images

第一个容器

有了第一个镜像,就可以利用这个镜像,创建容器,运行代码。

docker run -it --rm --name my-running-app my-php-app

数据卷

正如之前所说的,代码有版本控制,镜像的一个目标是:让我们的运行环境一致。所以我们的做法是尽可能将代码和镜像分离开来。

这时候就需要利用到「数据卷」。数据卷是一个可供一个或者多个容器使用的特殊目录,主要有以下几个特点:

1.数据卷可以在容器之间共享和重用;
2.对数据卷的内容进行修改,会立刻生效;
3.数据卷内容并不包含在镜像中,所以不会影响镜像;

在使用 docker run 命令时,使用 -v 标记来创建一个数据卷,或者指定挂载一个本地主机的目录到容器中,如我们将本地的 hello.php 挂载到容器中,其中稍微修改下hello.php

",$str);
    }
?>

将本地的一个包含 test.txt 的 public 文件夹挂载到容器中,并读取该文件中的内容:

docker run -it --rm --name my-running-app -v /Users/ye/docker/learning/demo/public:/usr/src/myapp/public my-php-4

总结

Docker 需要并且可学习的东西还有很多,我们从编写简单的 Dockerfile 文件来创建镜像,创建容器,挂载数据卷,一步步去了解和使用 Docker。

下一步我们从如何利用已有的 laradock (https://github.com/laradock/laradock)运行 Laravel 项目来进一步掌握 Docker。

附:Docker 常用命令数据卷
id 命令 含义
1 docker kill $(docker ps -a -q) 杀死所有正在运行的容器
2 docker rm $(docker ps -a -q) 删除所有已经停止的容器
3 docker images 查看本地镜像
4 docker ps 查看本地容器
5 docker build -t name:tag Dockerfile路径 创建镜像
6 docker exec-it IMAGE ID或者NAMES /bin/bash 进入容器
7 docker stop CONTAINER ID或者NAMES 关闭容器
8 docker start CONTAINER ID或者NAMES 重新启动关闭的容器
9 docker rm CONTAINER ID或者NAMES 移除本地容器

听说最美的人和最帅的人,都会给作者打赏,以资鼓励


coding01 期待您关注

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25811.html

相关文章

  • 从最简单入手学习 Docker ()

    摘要:根据不同的项目,使用不同的镜像,搭建开发环境而每一个应用有自己一个独立的运行环境,互不干扰。如何测试人员还是运维人员,也可以根据最新版本的镜像来测试和部署新的测试环境和生产环境。下一步我们从如何利用已有的运行项目来进一步掌握。 showImg(https://segmentfault.com/img/remote/1460000011106825); 什么是 Docker Docke...

    livem 评论0 收藏0
  • 使用 Docker 搭建简易 Java Web 环境 (二)

    摘要:创建一个环境最近公司正在使用开发网站应用,所以有必要了解下如何使用创建对应的环境。还好,提供了文档的形式来组合多个容器来搭建开发环境。下一步我们将使用来构建更加复杂的开发环境。 showImg(https://segmentfault.com/img/remote/1460000011106825); 从《从最简单的入手学习 Docker (一)》一文中,可以简单的了解 Docker ...

    Tamic 评论0 收藏0
  • PHPer书单

    摘要:想提升自己,还得多看书多看书多看书下面是我收集到的一些程序员应该看得书单及在线教程,自己也没有全部看完。共勉吧当然,如果你有好的书想分享给大家的或者觉得书单不合理,可以去通过进行提交。讲师温铭,软件基金会主席,最佳实践作者。 想提升自己,还得多看书!多看书!多看书!下面是我收集到的一些PHP程序员应该看得书单及在线教程,自己也没有全部看完。共勉吧!当然,如果你有好的书想分享给大家的或者...

    jimhs 评论0 收藏0
  • 从零构建个基于DockerLaravel应用

    摘要:简介其实在这样的一个云计算时代早就已被人众所周知了它改变了传统物理机的虚拟化方式使得机器的资源得到了高效的利用因为运行在中的应用实际上就是运行在宿主机上的所以它是不需要进行硬件层面的虚拟化以及运行一个完整操作系统来支持于是在应用代码的执行效 Docker简介 其实在这样的一个云计算时代, Docker 早就已被人众所周知了,它改变了传统物理机的虚拟化方式,使得机器的资源得到了高效的利用...

    ixlei 评论0 收藏0
  • 由浅入深学习lodashdebounce函数

    摘要:定时器调用频率优化把开启定时器的逻辑放在可以大大减少定时器的数量。举个例子,比如为,此时在某一个定时器的回调函数检测到上一次触法事件的为,而为,此时虽然要开启下一次定时,但这个时候定时的时间为就可以了。 最近的面试中考到了debounce,函数防抖,笔试的时候答的不是特别好,下来好好研究了一下,从原理到优化,再到开源工具库lodash的实现源码,梳理了一番,现整理如下。 先简单介绍一下...

    Raaabbit 评论0 收藏0

发表评论

0条评论

blastz

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<