DockerFile文件解析

我不是你的梦 2024-10-02 08:37:01 阅读 77

DockerFile

要研究自己如何做一个镜像,而且微服务项目打包上云部署,Docker就是最方便的。

微服务打包成镜像,任何装了Docker的地方,都可以下载使用,极其的方便。

流程:开发应用=>DockerFile=>打包为镜像=>上传到仓库(私有仓库公司内部的 aliyun,公有仓库dockerhub)=> 下载镜像 => 启动运行

还可以方便移植!

什么是DockerFile

dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

<code>-controller

-poji

-xxx

-xxx

-Dockerfile (必备)

构建步骤:

1、编写DockerFile文件

2、docker build 构建镜像

3、docker run

dockerfile文件我们刚才已经编写过了一次,这里我们继续使用 centos 来看!

地址:https://hub.docker.com/_/centos

在这里插入图片描述

在这里插入图片描述

DockerFile构建过程

基础知识:

1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2、指令按照从上到下,顺序执行

3、# 表示注释

4、每条指令都会创建一个新的镜像层,并对镜像进行提交

流程:

1、docker从基础镜像运行一个容器

2、执行一条指令并对容器做出修改

3、执行类似 docker commit 的操作提交一个新的镜像层

4、Docker再基于刚提交的镜像运行一个新容器

5、执行dockerfile中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。

DockerFile 是软件的原材料 (代码)Docker 镜像则是软件的交付品 (.apk)Docker 容器则是软件的运行状态 (客户下载安装执行)

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

在这里插入图片描述

DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权限控制)等等。

Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行 Docker 镜像时,会真正开始提供服务;

Docker容器:容器是直接提供服务的。

DockerFile指令

关键字:

<code>FROM # 基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER # 镜像维护者的姓名混合邮箱地址

RUN # 容器构建时需要运行的命令

EXPOSE # 当前容器对外保留出的端口

WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

ENV # 用来在构建镜像过程中设置环境变量

ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY # 类似ADD,拷贝文件和目录到镜像中!

VOLUME # 容器数据卷,用于数据保存和持久化工作

CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!

ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样

ONBUILD # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

在这里插入图片描述

实践

Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的

Scratch镜像很赞,它简洁、小巧而且快速,它没有bug、安全漏洞、延缓的代码或技术债务。除了被Docker添加了metadata之外,它基本上是空的。

我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包。

如果我们的需求是在构建一个符合我们实际业务需求的Docker镜像的前提下,确保镜像尺寸尽可能的小,应该怎么做呢?

思路是使用空镜像scratch,可以说是真正的从零开始构建属于自己的镜像,镜像的第一层

在这里插入图片描述

发行一个自己的centos

<code># 阿里云官方的centos是不完整的,很多命令没有。自定义一个镜像,vim 、ifconfig

# vim dockerfile

FROM centos

MAINTAINER kuangshen<24736743@qq.com>

ENV MYPATH /usr/local

WORKDIR $MYPATH

# centos 8 镜像源更新

RUN cd /etc/yum.repos.d/

RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*

RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum makecache

RUN yum update -y

# 在基础的centos上安装vim、net-tools

RUN yum -y install vim

RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH

CMD echo "------end------"

CMD /bin/bash

# 构建我们自己的镜像

-f 指定dockerfile文件

-t 输出的镜像文件名:版本号

.

[root@kuangshenlinux ~]# docker build -f dockerfile-mycentos -t mycentos:1.0 .

centos8 , https://developer.aliyun.com/article/1165954

在这里插入图片描述

docker history 查看镜像的变更历史

如果你下载了一个镜像,报错了或者你想查看一些构建逻辑,使用docker history

思路

项目中编写Docker

1、基于一个空的镜像

2、下载需要的环境 ADD

3、执行环境变量的配置 ENV

4、执行一些Linux命令 RUN

5、日志 CMD

6、端口暴露 EXPOSE

7、挂载数据卷 VOLUMES

这个过程就是你手动部署项目的过程,你通过docker可以再未来实现自动化构建。

CMD VS ENTRYPOINT

我们之前说过,两个命令都是指定一个容器启动时要运行的命令

这里的有效,值得是我们容器运行起来之后的参数有效。

**CMD:**Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换!

ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!

<code># vim cmd 的 dockerfile

FROM centos

# docker run执行以后,你想要添加新命令参数,无法直接添加,而是需要编写完整的命令,CMD的使用

CMD ["ls","-a"]

# 测试

[root@kuangshenlinux ~]# docker run 7d ls -al

total 0

drwxr-xr-x 1 root root 6 Dec 10 12:42 .

drwxr-xr-x 1 root root 6 Dec 10 12:42 ..

-rwxr-xr-x 1 root root 0 Dec 10 12:42 .dockerenv

lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin

drwxr-xr-x 5 root root 340 Dec 10 12:42 dev

drwxr-xr-x 1 root root 66 Dec 10 12:42 etc

drwxr-xr-x 2 root root 6 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 6 Sep 15 2021 lost+found

drwxr-xr-x 2 root root 6 Nov 3 2020 media

drwxr-xr-x 2 root root 6 Nov 3 2020 mnt

drwxr-xr-x 2 root root 6 Nov 3 2020 opt

dr-xr-xr-x 145 root root 0 Dec 10 12:42 proc

dr-xr-x--- 2 root root 162 Sep 15 2021 root

drwxr-xr-x 11 root root 163 Sep 15 2021 run

lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin

drwxr-xr-x 2 root root 6 Nov 3 2020 srv

dr-xr-xr-x 13 root root 0 Dec 10 12:42 sys

drwxrwxrwt 7 root root 171 Sep 15 2021 tmp

drwxr-xr-x 12 root root 144 Sep 15 2021 usr

drwxr-xr-x 20 root root 262 Sep 15 2021 var

在这里插入图片描述

<code>

FROM centos

# docker run传递参数的时候,拼接到 ENTRYPOINT 指令中,不传就是执行默认的

ENTRYPOINT ["ls","-a"]

[root@kuangshenlinux ~]# docker run entrycentos -l

total 0

drwxr-xr-x 1 root root 6 Dec 10 12:46 .

drwxr-xr-x 1 root root 6 Dec 10 12:46 ..

-rwxr-xr-x 1 root root 0 Dec 10 12:46 .dockerenv

lrwxrwxrwx 1 root root 7 Nov 3 2020 bin -> usr/bin

drwxr-xr-x 5 root root 340 Dec 10 12:46 dev

drwxr-xr-x 1 root root 66 Dec 10 12:46 etc

drwxr-xr-x 2 root root 6 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 6 Sep 15 2021 lost+found

drwxr-xr-x 2 root root 6 Nov 3 2020 media

drwxr-xr-x 2 root root 6 Nov 3 2020 mnt

drwxr-xr-x 2 root root 6 Nov 3 2020 opt

dr-xr-xr-x 144 root root 0 Dec 10 12:46 proc

dr-xr-x--- 2 root root 162 Sep 15 2021 root

drwxr-xr-x 11 root root 163 Sep 15 2021 run

lrwxrwxrwx 1 root root 8 Nov 3 2020 sbin -> usr/sbin

drwxr-xr-x 2 root root 6 Nov 3 2020 srv

dr-xr-xr-x 13 root root 0 Dec 10 12:42 sys

drwxrwxrwt 7 root root 171 Sep 15 2021 tmp

drwxr-xr-x 12 root root 144 Sep 15 2021 usr

drwxr-xr-x 20 root root 262 Sep 15 2021 var

自定义一个Tomcat

一般一个项目都在一个文件夹中,我们只需要在项目目录下 编辑一个Dockerfile 文件即可

build 不需要在-f来指定,默认寻找项目目录下的 Dockerfile 来构建镜像

!

在这里插入图片描述

<code>FROM centos

MAINTAINER kuangshen<24736743@qq.com>

# 步骤

# 宿主机目录下文件 拷贝到容器内

COPY readme.txt /usr/local/container-readme.txt

# 添加我们自己的安装包

ADD jdk-8u11-linux-x64.tar.gz /usr/local

ADD apache-tomcat-9.0.22.tar.gz /usr/local

# 安装yum / vim 配置环境变量

# centos 8 配置

RUN cd /etc/yum.repos.d/

RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*

RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum makecache

RUN yum update -y

#安装vim编辑器

RUN yum -y install vim

# 配置工作目录

ENV MYPATH /usr/local

WORKDIR $MYPATH

# 配置环境变量

ENV JAVA_HOME /usr/local/jdk1.8.0_11

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22

ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#

EXPOSE 8080

# 启动的时候自动运行tomcat

CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

启动

[root@kuangshenlinux kuangshentomcat]# docker run -d -p 9090:8080 --name kuangshentomcat \

> -v /root/mytomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \

> -v /root/mytomcat/logs:/usr/local/apache-tomcat-9.0.22/logs \

> --privileged=true \

> tomcatnew

在我们自定义的tomcat服务器中上传一个项目,在本地挂载目录,丢一个项目上去。

发布镜像

公有仓库:DockerHub

注册dockerhub https://hub.docker.com/signup,需要有一个账号

# docker login 默认登录是 Docker Hub 仓库

[root@kuangshenlinux ~]# docker login --help

Usage: docker login [OPTIONS] [SERVER]

Log in to a registry.

If no server is specified, the default is defined by the daemon.

Options:

-p, --password string Password

--password-stdin Take the password from stdin

-u, --username string Username

[root@kuangshenlinux ~]# docker login -u kuangshen

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 上传镜像需要打标签

docker tag 0a5262a16c83 kuangshen/tomcatnew:1.0

# 上传推送到Dockerhub

[root@kuangshenlinux ~]# docker push kuangshen/tomcatnew:1.0

The push refers to repository [docker.io/kuangshen/tomcatnew]

5f70bf18a086: Pushed

7e35af64d506: Pushed

1da1d8285a23: Pushed

cebec5506465: Pushed

15a3304b2547: Pushed

6a4a6f0a44c5: Pushed

8b070a512c7d: Pushed

06f964bcf5f7: Pushed

7d33883ba73a: Pushed

74ddd0ec08fa: Mounted from library/centos



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。