DockerFile文件解析

DockerFile

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

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

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

还可以方便移植!

什么是DockerFile

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

shell 复制代码
-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指令

关键字:

shell 复制代码
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

shell 复制代码
# 阿里云官方的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,之后形成新的命令组合!

shell 复制代码
# 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
shell 复制代码
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 来构建镜像

!

shell 复制代码
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

启动

shell 复制代码
[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,需要有一个账号

shell 复制代码
# 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 
相关推荐
XIAOHEZIcode1 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化