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

什么是 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/mirror#accelerator-doc

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 .

查询镜像

docker images

第一个容器

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

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

数据卷

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

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

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

总结

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(coding01)

原文发表时间:2017-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程坑太多

『中级篇』docker 使用bind Mounting实战(36)

PS:通过这个例子我想到了,我做java开发的可以吧对应的tomcat里面的webapp下的关联容器外部,容器内就跑tomcat 连接容器外的文件app 就可以...

1436
来自专栏IT派

使用 Docker 搭建 Java Web 运行环境

Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它。Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内...

1582
来自专栏A周立SpringCloud

Docker系列教程10-使用Docker Registry管理镜像

很多场景下,我们需使用私有仓库管理Docker镜像。相比Docker Hub,私有仓库有以下优势: 节省带宽,对于私有仓库中已有的镜像,无需从Docker Hu...

3008
来自专栏圣杰的专栏

Hello Docker

Docker: Build, Ship, and Run Any App, Anywhere 在任何地方构建、交付和运行任何应用 1. 引言 最近简单的学...

2369
来自专栏Linyb极客之路

使用 Docker 搭建 Java Web 运行环境

Docker 是 2014 年最为火爆的技术之一,几乎所有的程序员都听说过它。Docker 是一种“轻量级”容器技术,它几乎动摇了传统虚拟化技术的地位,现在国内...

4105
来自专栏Laoqi's Linux运维专列

Docker 基础配置安装(Ⅰ)

1718
来自专栏Grace development

五分钟快速了解Docker

使用docker搭建开发环境将近1年了,自我感觉docker的强大并非如此,不过没有机会将docker部署生产环境,有位架构师曾说过,最新的未必是最好的,架构要...

1414
来自专栏北京马哥教育

Docker Swarm学习笔记(一)

Docker Swarm概述 Docker Swarm是Docker官方提供的集群工具。它可以将一些关联的Docker主机转变成一个虚拟Docker主机。因为D...

3185
来自专栏Laoqi's Linux运维专列

Docker 配置安装(Ⅱ)

3056
来自专栏美团技术团队

Docker 入门介绍

Docker简介 ---- Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。2013年3月发布首个版本,当...

3418

扫码关注云+社区