创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
一、基于已有容器创建
命令格式:
docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
示例:
### 启动镜像alpine,创建txt文件并编辑
weijie@WEI:/$ docker run -it alpine
# touch txt
# vi txt
### 编辑文本
i #进入编辑
test #文字
esc #退出编辑
:wq #保存
### 退出容器
# exit
### 查看所有容器
weijie@WEI:/$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7ee0bfb48aba alpine "/bin/sh" 10 minutes ago Exited (0) 3 minutes ago sweet_bohr
### 提交镜像,指定容器ID,指定 REPOSITORY 和 TAG
weijie@WEI:/$ docker commit 7ee0bfb48aba malpine:1.0
### 查看所有镜像
weijie@WEI:/$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
malpine 1.0 a2ba5d223510 5 seconds ago 5.61MB
alpine latest 0a97eee8041e 3 days ago 5.61MB
二、基于Dockerfile创建
Dockerfile主体大致分4个部分:基础镜像信息,维护信息,镜像操作指令,容器启动时执行指令。
示例:
### 指定基础镜像,从这个镜像基础上构建新镜像
FROM ubuntu:latest
### 标签,使用键值对。比如来添加维护者信息
LABEL maintainer=wei<00000@qq.com>
### 镜像操作指令,在构建新镜像的过程中执行
RUN apt-get update && apt-get install -y nginx
### 容器启动时执行命令,这里表示启动新容器时运行nginx
CMD nginx
三、示例:基于Dockerfile创建java程序镜像
项目结构
以一个demo项目为例,以下是该项目的结构
项目模块demo-api的构建准备
1.首先打包demo-api,在target下得到demo-api-0.0.1-SNAPSHOT.jar
命令:mvn clean package
2.编写Dockerfile
在demo-api目录下编写Dockerfile
# openjdk:8u151-jre-alpine是一个只提供JRE环境的镜像,并以alpine作为镜像系统
FROM openjdk:8u151-jre-alpine
# 创建目录
RUN mkdir -p /project/demo/demo-api
# 设置工作目录,当启动或进入容器时默认使用的目录
WORKDIR /project/demo/demo-api
# 复制文件<src>(docker build时上下文目录)到<dest>(镜像内目录,当使用相对路径时,会以工作目录作为当前目录,如果没有声明过工作目录,那么根目录就是默认的工作目录);
# 这里表示把docker build的上下文目录下的target/demo-api-0.0.1-SNAPSHOT.jar文件复制到镜像内/project/demo/demo-api/目录下
COPY ./target/demo-api-0.0.1-SNAPSHOT.jar ./
# 暴露2020端口,以便在使用镜像时知道该镜像会使用哪些端口;
# demo-api程序将使用2020端口运行
EXPOSE 2020
# 运行容器时执行该命令,所以当运行容器时,会启动java程序
CMD java -jar demo-api-0.0.1-SNAPSHOT.jar
构建demo-api镜像
### 进入构建镜像的Dockerfile所在目录
cd ~/IdeaProjects/demo/demo-api
### 构建镜像 -f 所使用的Dockerfile文件 -t 目标镜像 . docker build的上下文目录
docker build -f Dockerfile -t demo-api:1.0 .
### 运行容器
docker run --name demo-api -p 1002:2020 demo-api:1.0
命令:docker build -f Dockerfile -t demo-api:1.0 .
-f,指定所使用的Dockerfile文件,如果在docker build时的目录下存在名称为Dockerfile的文件,那么可以不加该参数指定,因为docker build默认以当前目录下名称为Dockerfile的文件作为构建文件。
-t,目标镜像。
.,上下文路径。docker build时会将此路径下的所有文件打包传送到docker引擎,那么在构建镜像所用到的如COPY指令时就通过此路径获取打包过来的文件(所以使用../上层路径或/根目录获取文件或目录是无效的);
如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置;
上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。