Docker简单上手01

前言

之前也有听说过docker但是因为没有具体的业务接触所以并没有具体的去了解过,最近手头的工作也暂时没有那么急所以趁着时间来看下。

准备

系统:CentOS 7.6 64位

查看Linux核心版本,3.10版本及以上才可以安装docker

更新yum包

查看docker是否曾经安装过

安装需要的软件包

yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

设置yum源

安装

默认安装最新版本

安装某特定版本需增加版本号(如18.06.3.ce-3.el7)

配置用户

将 docker 的权限移交给非 root 用户,这样使用 docker 就不需要每次都 sudo 了:

启动

注销用户或者重启之后就会生效。然后通过 systemd 服务配置 Docker 开机启动:

验证安装是否成功

如果存在Client和Server则成功

运行图

这个过程中Docker做了以下事情:

  • 检查本地是否有指定的 hello-world:latest 镜像(latest 是镜像标签,后面会细讲),如果没有,执行第 2 步,否则直接执行第 3 步。
  • 本地没有指定镜像(Unable to find xxx locally),从 Docker Hub 下载到本地。
  • 根据本地的 hello-world:latest 镜像创建一个新的容器并运行其中的程序。
  • 运行完毕后,容器退出,控制权返回给用户。

实例二:运行一个Nginx服务器

运行以下命令:

ubuntu输出图

这时我们已经在这个Ubuntu镜像中了,可以运行一些命令来看一下

按 Ctrl + D (或者输入 exit 命令)即可退出。你可以在 docker ps 的终端再次检查容器是否已经被关闭了。

销毁容器

我们刚才创建的 Docker 容器也只是用于初步探索,后续不会再用到。由于 Docker 容器是直接存储在我们本地硬盘上的,及时清理容器也能够让我们的硬盘压力小一些。我们可以通过以下命令查看所有容器(包括已经停止的):

类似 Shell 中的 rm 命令,我们可以通过 docker rm 命令销毁容器,例如删除我们之前创建的 dreamland 容器:

但如果我们想要销毁所有容器怎么办次次输入 docker rm 删除显然不方便,可以通过以下命令轻松删除所有容器:

docker ps -aq 会输出所有容器的 ID,然后作为参数传给 docker rm 命令,就可以根据 ID 删除所有容器啦。

删除运行中的容器

同样的,我们可以删除所有容器,无论处于什么状态:

容器化第一个应用:开启筑梦之旅

在之前的步骤中,我们体验了别人为我们提前准备好的镜像(例如 hello-world、nginx 和 ubuntu),这些镜像都可以在 Docker Hub 镜像仓库中找到。在这一步,我们将开始筑梦之旅:学习如何容器化(Containerization)你的应用。

运行以下命令来获取代码,然后进入项目:

如果没有安装git,可以运行

来安装,也可以到GIT官网来查看如何安装你所对应的平台。

在这一步中,我们将容器化这个用 React 编写的前端应用,用 Nginx 来提供前端页面的访问。

什么是容器化

什么是容器化:

  • 编写代码:我们已经提供了写好的代码。
  • 构建镜像。
  • 创建和运行容器:通过容器的方式运行我们的应用。

构建镜像

构建 Docker 镜像主要包括两种方式:

  • 手动:根据现有的镜像创建并运行一个容器,进入其中进行修改,然后运行 docker commit 命令根据修改后的容器创建新的镜像。
  • 自动:创建 Dockerfile 文件,指定构建镜像的命令,然后通过 docker build 命令直接创建镜像。

准备工作

我们先把前端项目 client 构建成一个静态页面。确保你的机器上已经安装 Node 和 npm(点击这里下载,或使用 nvm),然后进入到 client 目录下,安装所有依赖,并构建项目:

如果安装node和npm出现问题的可以看下我之前的这篇文章Linux安装Node。

等待一阵子后,你应该可以看到 client/build 目录,存放了我们要展示的前端静态页面。

创建 Nginx 配置文件 client/config/nginx.conf,代码如下:

上面的配置大致意思是:监听 80 端口,网页根目录在 /www,首页文件是 index.html,如果访问 / 则提供文件 index.html。

创建 Dockerfile

然后就是这一步骤中最重要的代码:Dockerfile!创建 client/Dockerfile 文件,代码如下:

可以看到我们用了 Dockerfile 中的三个指令:

  • FROM 用于指定基础镜像,这里我们基于 nginx:1.13 镜像作为构建的起点。
  • RUN 命令用于在容器内运行任何命令(当然前提是命令必须存在)。
  • COPY 命令用于从 Dockerfile 所在的目录拷贝文件到容器指定的路径。

现在可以来构建我们的镜像了,运行以下命令:

可以看到我们指定了 -t(–tag,容器标签)为 dream-client,最后指定了构建容器的上下文目录(也就是 当前目录 . 或 client)。

运行以上的命令之后,你会发现:

接着运行了一系列的 Step(4 个),然后提示镜像构建成功。

为什么这个构建上下文(Build Context)这么大为我们把比 “黑洞” 还 “重” 的 node_modules 也加进去了!(忍不住想起了下面这张图)

再次构建构建
可以看到这次只有1.217MB,而且速度也明显快了很多.

运行容器

终于到了容器化的最后一步 —— 创建并运行我们的容器!通过以下命令运行刚才创建的 dream-client 镜像:

与之前类似,我们还是设定端口映射规则为 8080:80,容器名称为 client,并且通过 -d 设置为后台运行。然后访问 localhost:8080(老样子–服务器域名:8080):

运行容器
可以看到如图所示的页面,表示容器运行成功.

关于镜像标签

在刚才的实战中,你也许已经注意到在拉取和构建镜像时,Docker 总是会为我们加上一个 :latest 标签,这个 :latest 的含义便是 “最新” 的意思。和软件的版本机制一样,镜像也可以通过标签实现 “版本化”。

实际上,我们完全可以在拉取或构建镜像时指定标签(通常被认为是一种好的做法):

还可以给现有的镜像打上标签:

可以看到,标签未必一定是版本,还可以是任何字符串(当然最好要有意义,否则过了一阵子你也不记得这个打了这个标签的容器有什么作用了)。

关于 Dockerfile

Dockerfile 实际上是默认名称,我们当然可以取一个别的名字,例如 myDockerfile,然后在构建镜像时指定 -f(–file)参数即可:

这里举两个经典的使用场景:

  • 例如在 Web 开发时,分别创建 Dockerfile.dev 用于构建开发镜像,创建 Dockerfile.prod 构建生产环境下的镜像;
  • 在训练 AI 模型时,创建 Dockerfile.cpu 用于构建用 CPU 训练的镜像,创建 Dockerfile.gpu 构建用 GPU 训练的镜像。

最后

这篇文章是我跟着图灵社区的流程走了一遍所记录的过程,点击这里查看图灵社区

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8579 人正在系统学习中

来源:1024肥宅

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年9月6日
下一篇 2020年9月6日

相关推荐