制作自己的Docker镜像并发布

制作自己的Docker镜像并发布

一、 准备工作

1.1 开启CPU虚拟化

在计算机BIOS界面找到 Virtualization Technology字样, 选择启用(enable)。保存设置,重启计算机。

1.2 开启Hyper-V功能(针对Windows平台)

在搜索栏搜索“功能”字样,找到启用或关闭windows功能,点击进入。

开启Hyper-V适用于Windows的linux子系统两个选项

开启后如果是第一次开启,Windows会自动下载一些需要的文件。耐心等待安装完成。完成后重启计算机。

1.3 下载Docker Desktop软件

Docker官方页面下载Docker Desktop

按默认选项安装即可

安装完成后需要注销当前Windows用户重新登陆,记得保存你的工作

重新登陆后打开软件,同意用户协议

安装完成。下面介绍如何创建DockerHub账号并登录Docker

1.4 创建DockerHUB账号并登录

在这个页面创建账户.

创建完账户后登录

之后会进入选择付费计划的页面, 根据你的需求选择. 一般个人用户用免费方案足够.

二、制作镜像

制作镜像主要有两种方式,一种是基于本地已有的容器生成,一种是使用Docker File生成。

2.1 基于本地容器生成镜像

按win+x键呼出控制栏菜单,选择Windows 终端(管理员),进入Power Shell命令行界面

这里我们选择使用Ubuntu最新版作为基础镜像进行制作。运行以下命令:

1
docker run -t -i ubuntu:latest

Docker会先检测本地是否存在这个镜像,如果不存在,则会在Docker Hub的公共镜像中进行拉取.下载完成后会自动创建一个容器并运行.

这个时候已经是linux的命令行了

接下来可以做一些自己自定义镜像需要的操作,比如下载某些软件, 或启动某些服务. 完成设定操作后, 按Ctrl+P,Q退出命令行.此时回到DockerDesktop的主界面可以发现已经创建了一个容器.

在Windows Shell中运行 docker ps 命令,可以看到正在运行的Docker容器列表

运行 docker commit 36e1e59ca175 ubuntu-costume , 保存对镜像的修改. 如果成功则会打印一串SHA值

运行 docker images可查看现有的镜像.

运行 docker tag 2d4a381ac185 ubuntu-costume:V1给刚才保存的镜像加一个Tag,这里的ID是镜像ID

如果你已经登陆了Docker,这时你就可以直接Docker push把镜像推到远端了.其他计算机可以通过Docker pull拉到你的镜像.

2.2 通过Docker File生成镜像

Dockerfile 是一个用来构建镜像的文本文件,以下是关于这个文件语法的一些说明.

下面以定制一个 nginx 镜像为例:

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

1
2
FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

TIPS: FROM 和 RUN 指令的作用:

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下两种格式:

shell 格式:

1
2
RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

exec 格式:

1
2
3
RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

1
2
3
4
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

1
2
3
4
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。

1
docker build -t nginx:v3 .

注意: 上面使用的命令中,最后有一个".", 这个点代表上下文路径,那么什么是上下文路径呢?

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

完整指令参考可见官方文档