DockerFile
dockerfile就是用来构建docker镜像的构建文件,命令脚本
构建步骤:
1、编写一个 dockerfile 文件
2、docker build 构建成一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
很多官方镜像都是基础包,很多功能没有,需要自己搭建镜像
基础知识:
1、每个保留关键字(指令)都必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每个指令都会创建提交一个新的镜像层,并提交
关系:
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过 DockerFile 构建生成的镜像
DockerContainer:容器就是镜像运行起来提供服务
DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 维护者信息,镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定容器启动的时候运行的命令,只有最后一个生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行 ONBUILD 指令,触发指令
COPY # 类似 ADD ,将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
测试
# 编写自己的 DockerFile 文件
FROM centos
MAINTAINER zhangsan<1234567890@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
# dockerfile 构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag] .
查看本地镜像变更历史
docker history 镜像id
CMD 与 ENTRYPOINT 区别
CMD 指定这个容器启动的时候要运行的命令,只有最后一个生效,可被替代
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
测试CMD
# CMD dockerfile 文件编写
FROM centos
CMD ["ls","-a"]
# 想追加命令 -l => ls -al
[root@VM-4-6-centos dockerfile]# docker run e07c1b169ee5 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
# CMD的情况下 -l 替换了 CMD ["ls","-a"] 命令,-l 不是命令所以报错
测试ENTRYPOINT
# ENTRYPOINT dockerfile 文件编写
FROM centos
ENTRYPOINT ["ls","-a"]
# 追加命令,直接拼接在 ENTRYPOINT 命令的后边,-l => ls -al
[root@VM-4-6-centos dockerfile]# docker run 11e57c775083 -l
total 56
drwxr-xr-x 1 root root 4096 Aug 15 07:30 .
drwxr-xr-x 1 root root 4096 Aug 15 07:30 ..
-rwxr-xr-x 1 root root 0 Aug 15 07:30 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x 5 root root 340 Aug 15 07:30 dev
drwxr-xr-x 1 root root 4096 Aug 15 07:30 etc
drwxr-xr-x 2 root root 4096 Nov 3 2020 home
lrwxrwxrwx 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 2020 lost+found
例子:dockerfile 制作 tomcat 镜像
1、准备镜像文件 tomcat压缩包,jdk压缩包
2、编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,可以不需要-f指定文件名
# dockerfile编写
FROM centos
MAINTAINER zhangsan<1234567890@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u301-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.69.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_301
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.69
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.69
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.5.69/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.69/logs/catalina.out
3、构建镜像
docker build -t mytomcat:1.0 .
4、启动镜像
docker run -d -p 8080:8080 --name mytomcat -v /home/tomcat-test/test:/usr/local/apache-tomcat-8.5.69/webapps/test -v /home/tomcat-test/tomcatlogs:/usr/local/apache-tomcat-8.5.69/logs mytomcat:1.0
5、访问测试
6、发布项目(因为做了卷挂载,可以直接在本地发布项目)
在test目录下新建WEB-INF目录,再新建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
</web-app>
在test目录下新建index.jsp
<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>my test file</title>
</head>
<body>
this is a test file
<%
System.out.println("----this is a test file----");
%>
</body>
</html>
访问成功!
日志
dockerHub发布镜像
发布到dockerhub
1、登录docker账户
docker login -u 账户名 -p 密码
2、提交镜像
docker push 镜像名
提交出现 denied: requested access to the resource is denied
镜像名重复,使用 docker tag 镜像id 镜像名 修改,镜像名一般为 账户号/镜像名:版本号
发布到阿里云镜像服务
1、登录阿里云,找到容器镜像服务
2、创建命名空间
4、创建镜像仓库
选择本地仓库
点击进入容器仓库
提交操作步骤