docker pull:
上一篇提到,我们直接使用docker pull 拉取到的image,实际是从 docker官方镜像仓库中拉取的(https://hub.docker.com),
如图就是在docker hub中tomcat的image
然而,官方的image是如何创建的呢?
在GitHub上有一个仓库源(https://github.com/docker-library),在这个项目中可以找到tomcat相关
然后我们可以按照下图中的路径一直点击,就可以看到一个名为Dockerflie的文件,官方的image其实就是通过这个Dockerflie来生成的。
Dockerflie语法:
FROM:指定基础镜像,比如:FROM openjdk:8
FROM openjdk:8
MAINTAINER:指定维护者信息
MAINTAINER tmac01
RUN:在镜像内部执行一些命令,比如安装软件,配置环境等,换行可以使用 " "
RUN groupadd -r mysql && useradd -r -g mysql mysql
ENV:设置变量的值,比如:ENV MYSQL_MA JOR 5.7
ENV MYSQL_MAJOR 5.7
LABEL: 设置镜像标签
LABEL email="xxx@163.com" name="mysql-demo" version="1.0.0" author="tmac01"
VOLUME:指定数据的挂在目录
VOLUME /var/lib/mysql
COPY:将主机的文件复制到镜像内,如果目录不存在,会自动创建所需要的目录,注意只是复制,不会提取和解压
COPY spring-demo.jar /usr/local/bin/
ADD:将主机的文件复制到镜像内,和COPY类似,只是ADD会对压缩文件提取和解压
ADD spring.yml /etc/user
WORKDIR:指定镜像的工作目录,之后的命令都是基于此目录工作,若不存在则创建
WORKING /user/local
WORKDIR mysql
RUN touch readme.txt
会在/user/local/mysql 创建一个readme.txt文件
CMD:容器启动的时候默认会执行的命令,若有多个CMD命令,最后一个生效
CMD ["mysqld"]
或者
CMD mysqld
ENTRYPOINT:和CMD的使用类似
和CMD不同:docker run 执行时会覆盖CMD的命令,而ENTRYPOINT不会
ENTRYPOINT ["mysqld"]
EXPOSE:指定镜像要暴露的端口,启动镜像时,可以使用-p将该端口映射给宿主机
EXPOSE 3306
如何自己来创建一个image:
1.准备一个springboot项目,并且mvn clean package 生成jar包,代码如下,生成jar包为:dockerfile-demo-0.0.1-SNAPSHOT.jar
@RestController
public class DockerController {
@GetMapping("/dockerfile")
@ResponseBody
String dockerfile() {
return "hello docker" ;
}
}
2.创建一个文件夹用来存放Dockerflie文件,文件夹名随意。
3.将dockerfile-demo-0.0.1-SNAPSHOT.jar传入第2步建好的文件夹中
4.创建一个Dockerfile文件,如图
5.vim 编辑Dockerfile
FROM openjdk:8
MAINTAINER tmac01
LABEL name="dockerfile-demo" version="1.0" author="tmac01"
COPY dockerfile-demo-0.0.1-SNAPSHOT.jar dockerfile-image.jar
CMD ["java","-jar","dockerfile-image.jar"]
6.运行 docker build -t my-docker-file-image
此时image已经生成,如图:
我们可以执行命令 docker run -d --name my-docker-file -p 8080:8080 my-docker-file-image
验证: