:::info 当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1.从已经创建的容器中更新镜像,并且提交这个镜像

  • 2.使用 Dockerfile 指令来创建一个新的镜像

:::

一、更新镜像

:::success 以tomcat为例 :::

1、运行一个镜像

  1. docker run -it -p 80:8080 --name mytomcat tomcat

Docker创建镜像 - 图1

ctrl + P + Q 退出容器

查看容器是否成功启动

  1. docker ps

Docker创建镜像 - 图2

2、修改容器

进入容器

  1. docker exec -it tomcat2 /bin/bash

Docker创建镜像 - 图3

进入tomcat/webapps目录

Docker创建镜像 - 图4

删除里面的docs

  1. rm -rf docs/

Docker创建镜像 - 图5

退出容器

  1. ctrl + P + Q

3、提交容器

  1. docker commit -m="自定义tomcat" -a="Dream笔" e006fab03d94 zhibi/mytomcat2:v1

说明:

  • e006fab03d94:容器的ID

  • zhibi:命名空间

  • mytomcat2:生成镜像的名字

  • v1:生成镜像的tag

Docker创建镜像 - 图6

查看镜像

  1. docker images

Docker创建镜像 - 图7

里面已经有了刚才提交的镜像,说明我们自定义更新镜像成功了

参数说明:

  • -a:作者信息

  • -c:从Dockerfile创建一个镜像

  • -m:提交的信息

  • -p:提交过程中暂停容器(默认是)

二、自己创建镜像

:::success 构建一个带vim命令的centos容器 :::

1、创建Dockerfile文件

  1. touch Dockerfile

2、编写Dockerfile

  1. vi Dockerfile
  1. FROM centos
  2. MAINTAINER 执笔<805073259@qq.com>
  3. ENV MYPATH /user/local
  4. WORKDIR $MYPATH
  5. RUN yum -y install vim
  6. EXPOSE 80
  7. CMD echo $MYPATH
  8. CMD echo '********* build success *********'
  9. CMD /bin/bash/

3、构建镜像

  1. docker build -t zhibi/centosvim:6.7 .

Docker创建镜像 - 图8

参数说明:

  • -t:镜像名和tag name:tag

  • -f:指定Dockerfile文件路径,如果是在当前路径下面,并且文件名是Dockerfile 就不需要

注:

  • 命令最后面有一个 .

  • 镜像名不要有大写字母

4、查看镜像

  1. docker images

Docker创建镜像 - 图9

自定义镜像完成

三、Dockerfile保留关键字

保留字指令 含义
FROM 基础镜像,表示当前镜像是基于哪个镜像的(基础镜像:scratch)
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
- RUN [“yum”, “install”, “httpd”]
- RUN yum install httpd
EXPOSE 当前容器对外暴露的端口号
- EXPOSE 80 443
WORKDIR 指定容器创建后,终端默认登录进来的工作目录
- WORKDIR /data
ENV 在构建过程中设置环境变量
- ENV MYSQL_ROOT_PASSWORD 123456
- ENV JAVA_HOME /usr/local/jdk1.8.0_45
ADD 将宿主机目录下的文件拷贝到镜像中
- ADD
- ADD html.tar.gz /var/www/html
- ADD https://xxx.com/html.tar.gz /var/www/html

注:ADD命令会自动处理URL和解压tar压缩包 | | COPY | 拷贝文件和目录到镜像中,只是简单的复制
- COPY ./start.sh /start.sh
注:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。 | | VOLUME | 容器数据卷,用于数据保存、数据持久化和数据共享
- VOLUME [“/var/lib/mysql”]
| | CMD | 指定容器启动时要运行的命令
- CMD [“-C”, “/start.sh”]
- CMD [“/usr/sbin/sshd”, “-D”]
- CMD /usr/sbin/sshd -D

注:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换 | | ENTRYPOINT | 指定容器启动时要运行的命令
- ENTRYPOINT [“/bin/bash”, “-C”, “/start.sh”]
- ENTRYPOINT /bin/bash -C ‘/start.sh’

注:ENTRYPOINT和CMD一样,都是在指定容器启动命令及参数,不同点就是全部生效,不会被docker run 之后的参数替换,会组合起来一起生效 | | ONBUILD | 父镜像被子镜像继承后,父镜像的ONBUILD被触发 | | USER | 为RUN、CMD和ENTRYPOINT执行Shell命令指定运行用户
- USER [:]
- USER [:]
- USER edisonzhou
| | ARG | |