前言
之前也有听说过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镜像中了,可以运行一些命令来看一下
按 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 也加进去了!(忍不住想起了下面这张图)
运行容器
终于到了容器化的最后一步 —— 创建并运行我们的容器!通过以下命令运行刚才创建的 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 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!