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

本文介绍了Docker的基本概念及其在软件开发中的重要作用,包括保证运行环境一致性、解决多项目环境冲突及版本控制等。通过实例演示了如何创建Docker镜像、运行容器以及使用数据卷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

6302-978e8412f45ea9b3.png
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 列表中加入下面的镜像地址:

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

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

6302-b22d4390ec9435e2.png
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 .
6302-6c5a6d1712545667.png
WX20170910-212504@2x
查询镜像
docker images
6302-4192e47f24a8d6d2.png
WX20170910-212700@2x

第一个容器

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

docker run -it --rm --name my-running-app my-php-app
6302-8abf05497f1dc223.png
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
6302-e5421df74c8c867d.png
WX20170910-222305@2x

总结

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

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

附:Docker 常用命令数据卷

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

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

6302-dbfe1ae6d9307cae.jpeg
qrcode

coding01 期待您关注

6302-d7be6540f6fa449e.jpeg
qrcode
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值