DockerFile构建步骤及命令

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、创建镜像仓库

选择本地仓库

点击进入容器仓库

提交操作步骤

原文地址:https://www.cnblogs.com/2393920029-qq/p/15125482.html