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

2,635 阅读5分钟

group_5622_0
group_5622_0

什么是 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 列表中加入下面的镜像地址:

40974b5e.m.daocloud.io

点击 Apply & Restart 按钮使设置生效。
更多参考:
www.daocloud.io/mirror#acce…

WX20170910-211235@2x
WX20170910-211235@2x

PHP 项目中创建一个Dockerfile

FROM daocloud.io/php:5.6-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./hello.php" ]

写个 hello.php

<?php 
  echo "hello yemeishu";    
?>

创建镜像

docker build -t my-php-app .

WX20170910-212504@2x
WX20170910-212504@2x

查询镜像

docker images

WX20170910-212700@2x
WX20170910-212700@2x

第一个容器

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

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

WX20170910-213651@2x
WX20170910-213651@2x

数据卷

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

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

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

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

<?php
    $file_path = "public/test.txt";
    if(file_exists($file_path)){
        $fp = fopen($file_path,"r");
        $str = fread($fp,filesize($file_path));//指定读取大小,这里把整个文件内容读取出来
        echo $str = str_replace("\r\n","<br />",$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

WX20170910-222305@2x
WX20170910-222305@2x

总结

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

下一步我们从如何利用已有的 laradock (github.com/laradock/la…)运行 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 期待您关注

qrcode
qrcode


感谢您能看到这了

qrcode
qrcode