Docker之Dockerfile

Dockerfile

Dockerfile介绍

dockerfile 是用来构建dokcer镜像的文件!命令参数脚本!

构建步骤:

  1. 编写一个dockerfile 文件
  2. docker build构建成为一个镜像
  3. docker run运行镜像
  4. docker push发布镜像( DockerHub、阿里云镜像仓库! )

查看一下官方是怎么做的!

1681463477395

1681471153890

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

Dockerfile构建过程

基础知识:

1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层 ,并提交!

1681471460118

dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准,必须要掌握!

步骤:
DockerFile :构建文件,定义了一切的步骤,源代码
Dockerlmages :通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务的

Dockerfile的指令

以前的话我们就是使用别人的,现在我们知道了这些指令后,我们来练习自己写一个镜像!

FROM              # 基础镜像,一切从这里开始构建
MAINTAINER        # 镜像是谁写的,姓名+邮箱
RUN               # 镜像构建的时候需要运行的命令
ADD               # 步骤,tomcat镜像,这个tomcat压缩包!增加内容
WORKDIR           # 镜像的工作目录
VOLUME            # 挂载的目录
EXPOSE            # 保留端口配置
CMD               # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT        # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD           # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令。触发指令。
COPY              # 类似ADD,将我们文件拷贝到镜像中
ENV               # 构建的时候设置环境变量!

1681475851501

实战测试

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

1681475965283

创建一个自己的centos

# 1.编写Dockerfile的文件
root@ubuntu:/home/dockerfile# cat mydockerfile-centos
FROM centos
MAINTAINER moran<848732536@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

# 2.通过这个文件构建镜像
# 命令docker build -f dockerfile文件路径 -t镜像名:[tag]
root@ubuntu:/home/dockerfile# docker build -f mydockerfile-centos -t mycentos:0.1 .

Successfully built e2bd75cfe070
Successfully tagged mycentos:0.1

# 测试运行

1681481200998

我们可以列出本地进行的变更历史

1681481261760

CMD 和ENTRYPOINT 区别

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

测试cmd

# 编写 dockerfile 文件
root@ubuntu:/home/dockerfile# vim mydockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

# 构建镜像
root@ubuntu:/home/dockerfile# docker build -f mydockerfil
e-cmd-test -t cmdtest .

# run运行
root@ubuntu:/home/dockerfile# docker run e323eed4b9cd393f344ae7
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 想追加一个 -l(结果报错)
root@ubuntu:/home/dockerfile# docker run e323eed4b9cd393f344ae7 -l
docker: Error response from daemon: 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.

# cmd的清理下 -l 替换了CMD命令,-l 不是命令所以报错!

# 现在换成 ls -al(成功)
root@ubuntu:/home/dockerfile# docker run e323eed4b9cd393f344ae7 ls -al
total 56
drwxr-xr-x   1 root root 4096 Apr 15 02:25 .
drwxr-xr-x   1 root root 4096 Apr 15 02:25 ..
-rwxr-xr-x   1 root root    0 Apr 15 02:25 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Apr 15 02:25 dev
drwxr-xr-x   1 root root 4096 Apr 15 02:25 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 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 390 root root    0 Apr 15 02:25 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Apr 15 02:25 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var

测试

root@ubuntu:/home/dockerfile# vim mydockerfile-cmd-entrypoint

root@ubuntu:/home/dockerfile# docker build -f mydockerfile-cmd-entrypoint -t entrypoint-test .
[+] Building 0.0s (5/5) FINISHED
 => [internal] load build definition from mydocker  0.0s
 => => transferring dockerfile: 89B                 0.0s
 => [internal] load .dockerignore                   0.0s
 => => transferring context: 2B                     0.0s
 => [internal] load metadata for docker.io/library  0.0s
 => CACHED [1/1] FROM docker.io/library/centos      0.0s
 => exporting to image                              0.0s
 => => exporting layers                             0.0s
 => => writing image sha256:7fd13b7183e60dcae58ffc  0.0s
 => => naming to docker.io/library/entrypoint-test  0.0s


root@ubuntu:/home/dockerfile# docker run 7fd13b7183e60dcae58ffc
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面
root@ubuntu:/home/dockerfile# docker run 7fd13b7183e60dcae58ffc -l
total 56
drwxr-xr-x   1 root root 4096 Apr 15 02:29 .
drwxr-xr-x   1 root root 4096 Apr 15 02:29 ..
-rwxr-xr-x   1 root root    0 Apr 15 02:29 .dockerenv
lrwxrwxrwx   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root  340 Apr 15 02:29 dev
drwxr-xr-x   1 root root 4096 Apr 15 02:29 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 Sep 15  2021 lost+found
drwxr-xr-x   2 root root 4096 Nov  3  2020 media
drwxr-xr-x   2 root root 4096 Nov  3  2020 mnt
drwxr-xr-x   2 root root 4096 Nov  3  2020 opt
dr-xr-xr-x 392 root root    0 Apr 15 02:29 proc
dr-xr-x---   2 root root 4096 Sep 15  2021 root
drwxr-xr-x  11 root root 4096 Sep 15  2021 run
lrwxrwxrwx   1 root root    8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root 4096 Nov  3  2020 srv
dr-xr-xr-x  13 root root    0 Apr 15 02:29 sys
drwxrwxrwt   7 root root 4096 Sep 15  2021 tmp
drwxr-xr-x  12 root root 4096 Sep 15  2021 usr
drwxr-xr-x  20 root root 4096 Sep 15  2021 var

Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后测试效果!

实战:Tomcat镜像

  1. 准备镜像文件 tomcat 压缩包,jdk的压缩包!(老师是从本地windows系统上传到Linux里面的)

    1681531035058

  2. 编写dockerfile文件,官方命名Dockerfile,build 会自动寻找这个文件,就不需要 -f 指定了!

    
    FROM centos
    MAINTAINER moran<848732536@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-20_linux-x64_bin.tar.gz /usr/local/
    ADD apache-tomcat-10.1.7.tar.gz /usr/local/
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk20.0
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    
    ENV CATALINA_HOME /usr/local/apache-tomcat-10.1.7
    ENV CATALINA_BASH /usr/local/apache-tomcat-10.1.7
    ENV PATH $PATH:$JAVA_HOME/bin:SCATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-10.1.7/bin/startup.sh && tail -F /url/local/apache-tomcat-10.1.7/bin/logs/catalina.out
    
  3. 构建镜像

    # docker build -t diytomcat .
    
  4. 启动镜像

  5. 访问测试

  6. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了 !)

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://java.sun.com/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                                   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
               version="2.5">
    
      </web-app>
    
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>hello kuangshen</title>
    </head>
    <body>
    Hello World!<br/>
    <%
    System.out.println("----my test web logs----")
    %>
    </body>
    </html>
    

    发现:项目部署成功,可以直接访问ok !
    我们以后开发的步骤:需要掌握Dokcerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

发布自己的镜像

DockerHub

1、地址 https://hub.docker.com/ 注册自己的账号 !
2、确定这个这账号可以登录
3、在我们服务器上提交自己的镜像

root@ubuntu:/home/kuangshen/build/tomcat/tomcatlogs# 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

4、登录完毕后就可以提交镜像了,就是一步 docker push

# 登录DockerHub 输入账号和密码
root@ubuntu:/home/kuangshen/build/tomcat/tomcatlogs# docker login -u moran778
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

# push镜像的问题
root@ubuntu:/home/kuangshen/build/tomcat/tomcatlogs# docker push diytomcat
Using default tag: latest
The push refers to repository [docker.io/library/diytomcat]
5f70bf18a086: Preparing
4c5cbd36103c: Preparing
ae55129caa66: Preparing
ca906bebbcb6: Preparing
74ddd0ec08fa: Preparing
denied: requested access to the resource is denied # 拒绝

# 解决,增加一个 tag(标签)
root@ubuntu:/home/kuangshen/build/tomcat/tomcatlogs# docker tag 398162e9e623 moran778/tomcat:1.0
root@ubuntu:/home/kuangshen/build/tomcat/tomcatlogs# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
moran778/tomcat       1.0       398162e9e623   3 hours ago     436MB
diytomcat             latest    398162e9e623   3 hours ago     436MB
tomcat02              1.0       f660787a90cb   3 days ago      684MB
mysql                 latest    412b8cc72e4a   10 days ago     531MB
nginx                 latest    605c77e624dd   15 months ago   141MB
tomcat                9.0       b8e65a4d736d   16 months ago   680MB
tomcat                latest    fb5657adc892   16 months ago   680MB
redis                 latest    7614ae9453d1   16 months ago   113MB
mysql                 5.7       c20987f18b13   16 months ago   448MB
moran/ubuntu          1.0       e8910fc5d4bb   18 months ago   72.8MB
ubuntu                latest    ba6acccedd29   18 months ago   72.8MB
centos                latest    5d0da3dc9764   19 months ago   231MB
entrypoint-test       latest    7fd13b7183e6   19 months ago   231MB
cmdtest               latest    e323eed4b9cd   19 months ago   231MB
portainer/portainer   latest    580c0e4e98b0   2 years ago     79.1MB
elasticsearch         7.6.2     f29a1ee41030   3 years ago     791MB

# docker push上去即可!自己发布的镜像尽量带上版本号
root@ubuntu:/home/kuangshen/build/tomcat/tomcatlogs# docker push moran778/tomcat:1.0
The push refers to repository [docker.io/moran778/tomcat]
5f70bf18a086: Pushed
4c5cbd36103c: Pushed
ae55129caa66: Pushed
ca906bebbcb6: Pushed
74ddd0ec08fa: Pushed
1.0: digest: sha256:adbf98630b7cd0727ef834dc908d3ddb169cad8310163e9a31653788059a7e27 size: 1367

提交的时候也是按照镜像的层级来进行提交的!

也可以把镜像发布到阿里云镜像服务上(没找到具体发布的位置,以后找到了再添加)

小结

1681713783134

到现在Docker学习已经没问题了,再往下走就是运维层面的了。

本笔记根据B站-遇见狂神说视频所编写!

遇见狂神说-https://space.bilibili.com/95256449

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值