# 构建镜像

有些冷门的软件不在远程仓库里,此时就需要手动安装。我们以 Ubuntu 的 base 镜像中安装 Java 环境,并将其打包成新的镜像(这个新的镜像就是一个包含 Java 环境的 Ubuntu 系统镜像)。

拉取启动 Ubuntu:

docker pull ubuntu
docker run -it ubuntu

更新 apt(因为只有 base 镜像)

apt update

这一步我之前换不换源都会出错,反正就是更新失败,后来折腾了两三天,都没什么效果。最后把 wifi 换成热点就更新成功了。所以你如果更新失败,可以试着检查一下网络问题。

也不用怀疑版本问题,本人用 Ubuntu 15 和 Ubuntu22 都更新成功过。

安装 jdk

apt install openjdk-8-jdk
# 如果 apt 更新失败,后面的也会失败

退出容器,将其构建为新的镜像,使用 commit 将容器保存为新的镜像:

docker commit 容器名称/ID 新的镜像名称

此时再使用 docker images 就可以看到新构建的镜像了。

但是这种构建方式 Docker 官方并不推荐。普通用户可以使用 Dockerfile 构建上述镜像

创建名为 Dockerfile 的文件:

touch Dockerfile

我们需要在 Dockerfile 文件内部编写指令来告诉 Docker 需要构建镜像的相关信息

FROM <基础镜像>

FROM 指令选择当前镜像的基础镜像(必须以该指令开始)。如果不需要任何基础镜像,使用 scratch 表示从零开始基础构建。

在容器中运行命令安装 Java 环境

RUN apt update
RUN apt install -y openjdk-8-jdk

构建:

docker build -t <镜像名称> <构建目录>

执行后,Docker 会在构建目录中寻找 Dockerfile 文件,然后开始依次执行 Dockerfile 中的指令:

每一个指令都会在镜像上创建一个新的层, -t 指定要创建的目标镜像名, . 是 Dockerfile 所在目录。

# 发布镜像

我们可以将镜像上传到:https://hub.docker.com/repositories

先在 hub.docker.com 上创建公共的镜像仓库,再将本地镜像上传,上传前可以将镜像名称修改规范:

docker tag ubuntu-java-file:latest 用户名/仓库名称:版本

然后本地上传:

docker push nagocoler/ubuntu-java:1.0

这里参考的青空の霞光的用户名 nagocoler 和仓库名 ubuntu-java

公共仓库是可以被搜索和下载的,搜索使用 search 命令即可:

docker search nagocoler/ubuntu-java

再使用 pull 命令下载:

docker pull nagocoler/ubuntu-java:1.0

# 参考

https://www.yuque.com/qingkongxiaguang/zwhkpi/kq6rlg

https://pdai.tech/md/devops/docker/docker-03-basic2.html