:::info 当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用 Dockerfile 指令来创建一个新的镜像
:::
一、更新镜像
1、运行一个镜像
docker run -it -p 80:8080 --name mytomcat tomcat
ctrl + P + Q
退出容器
查看容器是否成功启动
docker ps
2、修改容器
进入容器
docker exec -it tomcat2 /bin/bash
进入tomcat/webapps目录
删除里面的docs
rm -rf docs/
退出容器
ctrl + P + Q
3、提交容器
docker commit -m="自定义tomcat" -a="Dream笔" e006fab03d94 zhibi/mytomcat2:v1
说明:
e006fab03d94:容器的ID
zhibi:命名空间
mytomcat2:生成镜像的名字
v1:生成镜像的tag
查看镜像
docker images
里面已经有了刚才提交的镜像,说明我们自定义更新镜像成功了
参数说明:
-a:作者信息
-c:从Dockerfile创建一个镜像
-m:提交的信息
-p:提交过程中暂停容器(默认是)
二、自己创建镜像
:::success 构建一个带vim命令的centos容器 :::
1、创建Dockerfile文件
touch Dockerfile
2、编写Dockerfile
vi Dockerfile
FROM centos
MAINTAINER 执笔<805073259@qq.com>
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD echo $MYPATH
CMD echo '********* build success *********'
CMD /bin/bash/
3、构建镜像
docker build -t zhibi/centosvim:6.7 .
参数说明:
-t:镜像名和tag name:tag
-f:指定Dockerfile文件路径,如果是在当前路径下面,并且文件名是Dockerfile 就不需要
注:
命令最后面有一个
.
镜像名不要有大写字母
4、查看镜像
docker images
自定义镜像完成
三、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 | |