一般有两种方式来制作自己的 Docker 镜像
- 基于现有的 Docker 镜像,安装自己的软件环境后,完成制作
- 从零开始用 Dockerfile 来制作
宿主机环境
Ubuntu 18.04 x86_64
基于现有Docker镜像来制作
首先要获得一个基本的 Docker 镜像
使用 ”docker pull“ 即可从 Docker Hub 拉取到一个精简版的 Ubuntu 18.04 镜像
sudo docker pull ubuntu:18.04
查看当前宿主机存在的镜像
sudo docker images
打印结果
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 71eaf13299f4 6 weeks ago 63.1MB
进入该容器
sudo docker run -it --rm ubuntu:18.04
命令行这里可以看到该容器的 ID:4ac01885c4c2
搭建环境
这一步,需要安装基本的命令以及 gcc 环境(根据个人需要来制作)
这里仅举例说明
安装 vi 编辑器
apt-get update
apt-get install -y vim
安装 ping 和 ifconfig 命令
apt-get install -y iputils-ping
apt-get install -y net-tools
安装 make 相关的命令
apt-get install -y make patch perl
安装 gcc 环境
apt-get install -y gcc g++
清理缓存文件
apt-get clean
rm -rf /var/lib/apt/lists/*
从宿主机拷贝文件到容器里
查看容器 ID
sudo docker ps -a
拷贝文件到容器里
sudo docker cp xxx 4ac01885c4c2:/home
到这里,我所需要的环境已经搭建完毕
生成镜像
使用 “docker commit” 命令
sudo docker commit -m "xxx emulator base on ubuntu 18.04" -a "Flinger <123456789@qq.com>" 4ac01885c4c2 cfl927096306/xxx_emulator:v1.0
docker commit -m “xxxDescription” -a “authorName” containerID Hub的账号名/仓库名称:Tag
之后通过 “sudo docker images” 看到宿主机下多了一个叫 cfl927096306/xxx_emulator:v1.0 的镜像
注意:事先我在 Docker Hub 上面,注册了 cfl927096306 这个账号,为了方便后续上传该镜像到 Docker Hub
从零开始用Dockerfile来制作
基于现有镜像,使用 docker commit 来扩展一个镜像是比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,类似于我们熟知的 Makefile,里面包含一些如何创建镜像的指令。
Dockerfile基本的语法
- 使用 # 来注释
- FROM 指令告诉 Docker 使用哪个镜像作为基础
- MAINTAINER 镜像创建者的信息
- RUN 开头的指令会在创建中被执行,比如安装一个软件包,在这里使用 apt-get 来安装一些软件
- ADD 将宿主机文件拷贝到新生成的镜像的文件系统对应的路径,ADD src dest
- CMD 镜像启动成功后,会执行 CMD 后面的命令。一个 Dockerfile 中只能有一条 CMD 命令
新建一个目录和一个 Dockerfile
mkdir docker-test
cd docker-test
vi Dockerfile
编辑Dockerfile
FROM ubuntu:18.04
MAINTAINER <123456789@qq.com>
# Install basic tools
RUN apt-get -qq update
RUN apt-get install -y vim iputils-ping net-tools make patch perl gcc g++
# clean cache files
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
创建镜像
sudo docker build -t cfl927096306/xxx_emulator:v2.0 ./
“-t” 用来添加 tag,指定新的镜像的用户和镜像名称信息
“./” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径
之后通过 “sudo docker images” 看到宿主机下多了一个叫 cfl927096306/xxx_emulator:v2.0 的镜像
本地导出镜像
保存镜像到本地,格式为 tar 包,使用 “docker save” 命令
sudo docker save -o xxx_emulator.tar cfl927096306/xxx_emulator:v1.0
保存成功,能看到本地的 tar 包:xxx_emulator.tar
之后可以把这个 tar 包分享给他人,别人拿到这个 tar 包之后,可以导入到本地
使用 “docker load” 命令
sudo docker load -i xxx_emulator.tar
发布镜像
这里将镜像发布到 Docker 的官方仓库
需要到 https://hub.docker.com/ 注册账号
然后使用命令行登录到 Docker Hub
sudo docker login -u cfl927096306 -p 123456
再使用 “docker push” 命令,发布到 Docker Hub
sudo docker push cfl927096306/xxx_emulator:v1.0
sudo docker push cfl927096306/xxx_emulator:v2.0
此时用自己账号在浏览器登录到 https://hub.docker.com/ 可以看到发布的镜像
之后,其他人就可以使用 “docker pull” 来下载到这个镜像了,例如
sudo docker pull cfl927096306/xxx_emulator:v2.0