Docker初学者入门详细学习(4)

174 阅读5分钟

本章节主要对DockerFile进行一个全面的基础学习。主要了解DockerFile的组成,DockerFile的指令,以及通过自己编写DockerFile来构建一个自己的镜像

DockerFile

DockerFile介绍

dockerfile 是用来构建docker镜像的文件!命令参数脚本! 构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

查看centos的github仓库

image.png

很多官方的镜像都是基础包,很多功能没有,我们通常会搭建自己的镜像!
官方既然可以制作镜像,那我们也可以

DockerFile构建过程

基础知识:

  1. 每个保留关键字(指令)都是必须是大写字母
  2. 执行从上到下顺序执行
  3. 表示注释

  4. 每一个指令都会创建提交一个新的镜像层,并提交

image.png
DockerFile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!

Docker镜像组件成为企业交付的标准,必须掌握

步骤:开发,部署,运维。。。缺一不可

DockerFile:构建文件,定义了一起的步骤,源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来的服务器

DockerFile的指令

FROM         # 基础镜像,一起从这里开始构建
MAINTAINER   # 镜像是谁写的 姓名+邮箱
RUN          # 镜像构建的时候需要运行的命令
例:要下载vim命令  RUN yum -y install vim    # -y 所有安装配置选yes
ADD          # 步骤:tomcat镜像,这个tomcat压缩包!添加内容。 如果添加压缩包会自动解压
    文件路径 要放置到容器的目录
例: ADD xxx.gz /usr/local
WORKDIR      # 镜像的工作目录
VOLUME       # 挂载的目录
EXPOSE       # 暴露端口配置 -p
CMD          # 指定这个容器启动的时候要运行的命令 cmd echo, 只有最后一个会生效,可被替代
ENTRYPOINT   # 指定这个容器启动的时候要运行的命令 可以追加命令
ONBUILD      # 当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令。触发指令。
COPY         # 类似ADD,将我们文件拷贝到镜像中
    文件路径 要放置到容器的目录
例: COPY xxx.txt /usr/local/xxx.txt
ENV          # 构建的时候设置环境变量

image.png

实战测试

Docker Hub中 99%的镜像都是从这个基础镜像过来的FROM scratch,然后配置需要的软件和配置来进行构建

创建一个自己的centos

# 1  编写DockerFile文件
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# vim mydockerfile01
FROM centos:centos7  # 最新版的可能安装vim会出错
MAINTAINER queqian<xxx@gmail.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

# 2 通过文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名字:[tag]
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker build  -f mydockerfile01 -t mycentos:0.1 .

# 3 查看镜像
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker images                               
REPOSITORY       TAG       IMAGE ID       CREATED              SIZE                    
mycentos         0.1       8d3cc10df709   About a minute ago   514MB

# 运行测试
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run -it mycentos:0.1
[root@0ff19891269e local]# pwd
/usr/local
[root@0ff19891269e local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:04  txqueuelen 0  (Ethernet)
        RX packets 13  bytes 1165 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@0ff19891269e local]# vim test

# 之前的centos官方镜像是没有ifconfig以及vim指令,且默认工作路径为/ 我们这边修改为/usr/local

查看镜像历史变更 history

我们可以列出镜像本地进行的变更历史 通过docker history 镜像id

image.png
我们平时拿到一个镜像,可以研究一下它是怎么做的

CMD和ENTRYPOINT区别

CMD          # 指定这个容器启动的时候要运行的命令 cmd echo, 只有最后一个会生效,可被替代
ENTRYPOINT   # 指定这个容器启动的时候要运行的命令 可以追加命令

# 测试CMD
# 编写一个CMD命令的 dockerfile文件
FROM centos
CMD ["ls","-a"]

# 构建镜像
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker build -f dockerfile-test -t test-cmd-dockerfile .
[+] Building 0.0s (5/5) FINISHED                                        docker:default
...

# 运行镜像 发现ls -a命令生效
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run test-cmd-dockerfile
.
..
.dockerenv
bin
dev

# 测试 想追加命令-l  即ls -al
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run test-cmd-dockerfile -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container:  

# cmd的指令下  -l替换了CMD ["ls", "-a"] 命令,-l 不是命令所以报错

# 测试ENTRYPOINT
# 编写一个测试ENTRYPOINT命令的 dockerfile文件
FROM centos
测试ENTRYPOINT ["ls","-a"]

# 构建镜像
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker build -f test-entrypoint-dockerfile -t test-entrypoint-dockerfile .
[+] Building 0.0s (5/5) FINISHED                                        docker:default
...
# 测试 想追加命令-l  即ls -al 成功执行
[root@iZwz909zuxxmim3sok3i3qZ dockerfile]# docker run test-entrypoint-dockerfile -l
total 56
drwxr-xr-x   1 root root 4096 Dec  4 09:45 .
drwxr-xr-x   1 root root 4096 Dec  4 09:45 ..
-rwxr-xr-x   1 root root    0 Dec  4 09:45 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Dec  4 09:45 dev
drwxr-xr-x   1 root root 4096 Dec  4 09:45 etc
drwxr-xr-x  20 root root 4096 Sep 15  2021 var
# 我们的追加命令 是直接拼接在ENTRYPOINT命令的后面