什么是dockerfile 就是用来构建docker镜像的构建文件

我们先使用命令脚本体验一下

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# FROM centos 使用什么系统作为基础
# VOLUME 要挂载的卷

# CMD 打印信息
# 使用 bin/bash

#其中的每一步都是镜像的一层一层的关系

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "=======end========="
CMD /bin/bash

构建镜像命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 命令语法
# -f file 要构建的文件的路径
# -t 镜像的名称

docker bulid -f 要build的路径 -t build的镜像的名称:[TAG] .

# 测试结果
root@again:/home/docker-file-volume# docker build -f /home/docker-file-volume/dockerfile01 -t liufugui/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
---> 0d120b6ccaa8
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in e275f052e25b
Removing intermediate container e275f052e25b
---> 774280e3a651
Step 3/4 : CMD echo "======end====="
---> Running in 59d9ac617cc7
Removing intermediate container 59d9ac617cc7
---> 66b9eef20bef
Step 4/4 : CMD /bin/bash
---> Running in f3d9827760e0
Removing intermediate container f3d9827760e0
---> 6e86c0c4da67
Successfully built 6e86c0c4da67
Successfully tagged liufugui/centos:1.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 进入我们自己的镜像 可以看到我们挂载的目录
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02

# 查看自己镜像的inspect信息 查看挂载的目录所对应的本地目录
#执行结果 标注蓝色的就是我们挂载好的目录
root@again:/home/docker-file-volume# docker inspect 2fe307785df8

"Mounts": [
{
"Type": "volume",
"Name": "27975eddc9ef4982705b56f89a219010dde7a0c8d0f7b1a475701021518fdab5",
**"Source": "/var/lib/docker/volumes/27975eddc9ef4982705b56f89a219010dde7a0c8d0f7b1a475701021518fdab5/_data"**,
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "94e82ea291672c7aa040fa587ab6149d386d34705ea8f091281e73a12dbb41fa",
**"Source": "/var/lib/docker/volumes/94e82ea291672c7aa040fa587ab6149d386d34705ea8f091281e73a12dbb41fa/_data"**,
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

# 他这个挂载的方式使用的是 匿名挂载、

测试文件是否可以同步,如果同步成功表示测试数据卷挂载成功

这种方式我们未来使用特别多,因为通常我们要构建自己的镜像

假设构建镜像的时候没有挂载卷,需要手动挂载镜像 -v卷名 容器内路径

数据卷容器

例如多个MySQL同步数据

1
2
3
4
5
6
7
8
# 首先启动一个镜像作为父容器
root@again:/# docker run -it --name dockerparent sky_linux:1.0 /bin/bash

# 再启动一个容器挂载父容器

root@again:~# docker run -it --name docker01 --volumes-from dockerparent liufugui/centos:1.0

# 挂在成功之后我们去文件夹创建文件看是否可以同步,如下图所示

当我们在启动一个容器去挂载docker01的时候是否可以也同步一下父容器数据卷的内容呢?

只要通过 –volumes-from 就可以对容器之间进行绑定,达到数据共享

继承继承了父容器的容器

直接继承父容器

如果删除了父容器,其他继承了父容器的容器数据还会存在吗

答案是会的

多个Mysql之间该如何共享数据呢?

1
2
3
4
5
6
7
8
# 先运行一个MySQL
docker run -d -p 3306:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=543210 --name mysql01 mysql:5.7

# 再运行一个MySQL 去 继承使用mysql01的数据卷

#执行结果
root@again:~# docker run -d -p 3307:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=543210 --name mysql02 --volumes-from mysql01 mysql:5.7
a344be99a07c235af6b6e6f54504c7f844e46d86285d74f0e24f73cbdbfcb412

总结

容器之间配置信息传递,数据卷容器的声明周期,一直持续到没有容器使用位置

但是一旦你持久化到了本地,本地的数据是不会消失滴

Dockerfile

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

  • 构建步骤

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

    查看一下官方是怎么做的


    很多官方镜像都是基础包,很多功能都没有,我们通常会搭建自己的镜像

    官网既然可以制作镜像,我们自己也可以做镜像

    Dockerfile的构建

    • 它其中有很多指令
    • 基础知识
      1. 每个保留关键字(指令) 都要是大写
      2. 从上到下按顺序执行
      3. #表示注释
      4. 每一个指令都会创建提交一个镜像层,并提交

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

    docker 镜像逐渐成为企业交付的标准,必须要掌握

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

    dockerimages:通过dockerfile构建生成的一个镜像,最终发布和运行产品

    docker容器:容器就是镜像运行起来提供服务器

    Dockerfile指令

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

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

    实战测试

    自己构建一个Centos

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    # 编写Dockerfile文件

    FROM centos

    MAINTAINER liufugui<2677672@gmail.com>

    ENV MYPATH /usr/local

    # 官方默认是根目录,我们添加了一个目录
    WORKDIR $MYPATH
    # 我们自己加需要的命令
    RUN yum -y install vim
    RUN yum -y install net-tools
    RUN yum -y install lrzsz

    EXPOSE 80

    CMD echo $MYPATH

    CMD echo "构建完毕"

    CMD /bin/bash

    # 通过文件构建镜像
    # docker build -f /home/dockerfile/mydockerfile -t fugui/centos:1.0 .

    # 测试运行一下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # 我们可以列出本地变更历史
    docekr history 镜像id

    root@again:/home/dockerfile# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    fugui/centos 1.0 0f5e9610ea55 8 minutes ago 317MB
    sky_linux 1.0 848f350d368c 5 hours ago 272MB
    liufugui/centos 1.0 6e86c0c4da67 5 hours ago 215MB
    tomcat_fg 9.0 8c3e700c6f6c 11 hours ago 653MB
    tomcat 9.0 625b734f984e 4 days ago 648MB
    tomcat latest 625b734f984e 4 days ago 648MB
    mysql 5.7 1b12f2e9257b 4 days ago 448MB
    nginx latest f35646e83998 2 weeks ago 133MB
    centos latest 0d120b6ccaa8 2 months ago 215MB
    elasticsearch 7.6.2 f29a1ee41030 7 months ago 791MB
    root@again:/home/dockerfile# docker history 0f5e9610ea55
    IMAGE CREATED CREATED BY SIZE COMMENT
    0f5e9610ea55 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
    c0ee469aa206 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
    cbe1a7249e42 9 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
    81333008bb15 9 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
    6bdc5588527b 9 minutes ago /bin/sh -c yum -y install lrzsz 22.3MB
    e2e9394c2227 9 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
    41300cae6449 9 minutes ago /bin/sh -c yum -y install vim 57.2MB
    9fd920f9f252 9 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
    17226e1ebedf 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
    c3fd2e7e8234 9 minutes ago /bin/sh -c #(nop) MAINTAINER liufugui<26776… 0B
    0d120b6ccaa8 2 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
    <missing> 2 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
    <missing> 2 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB

    CMD 命令和 ENTRYPOINT的区别

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

    CMD

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    # 编写CMD命令
    FROM centos

    CMD ["ls","-a"]

    # 构建成镜像
    docker build -f docker-cmd -t cmdtest:1.0 .

    # 执行cmdtest镜像
    # 执行结果
    # 发现我们脚本的CMD命令生效了
    root@again:/home/dockerfile# docker run cmdtest:1.0
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
    lost+found
    media
    mnt
    opt
    proc
    root
    run
    sbin
    srv
    sys
    tmp
    usr
    var
    # 我们再执行这个镜像并给他添加命令
    # 发现最后运行报错了 因为我们使用 -l的情况下,再启动镜像就会替换了镜像的命令 而且没有 -l 这个命令所以报错
    root@again:/home/dockerfile# docker run cmdtest:1.0 -l
    docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.

    # 当我们使用正确的命令的时候呢,就会替换掉原来的CMD命令

    root@again:/home/dockerfile# docker run cmdtest:1.0 ls -al
    total 56
    drwxr-xr-x 1 root root 4096 Oct 27 11:47 .
    drwxr-xr-x 1 root root 4096 Oct 27 11:47 ..
    -rwxr-xr-x 1 root root 0 Oct 27 11:47 .dockerenv
    lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
    drwxr-xr-x 5 root root 340 Oct 27 11:47 dev
    drwxr-xr-x 1 root root 4096 Oct 27 11:47 etc
    drwxr-xr-x 2 root root 4096 May 11 2019 home
    lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
    lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
    drwx------ 2 root root 4096 Aug 9 21:40 lost+found
    drwxr-xr-x 2 root root 4096 May 11 2019 media
    drwxr-xr-x 2 root root 4096 May 11 2019 mnt
    drwxr-xr-x 2 root root 4096 May 11 2019 opt
    dr-xr-xr-x 137 root root 0 Oct 27 11:47 proc
    dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
    drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
    lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
    drwxr-xr-x 2 root root 4096 May 11 2019 srv
    dr-xr-xr-x 13 root root 0 Oct 27 07:13 sys
    drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
    drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
    drwxr-xr-x 20 root root 4096 Aug 9 21:40 var

    ENTRYPOINT

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    # 创建docker entrypoint测试脚本

    FROM centos

    ENTRYPOINT ["ls","-a"]

    # 构建脚本为镜像
    # 执行结果
    root@again:/home/dockerfile# docker build -f docker-cmd-entrypoint -t cmdtestentrypoint:1.0 .
    Sending build context to Docker daemon 4.096kB
    Step 1/2 : FROM centos
    ---> 0d120b6ccaa8
    Step 2/2 : ENTRYPOINT ["ls","-a"]
    ---> Running in 41bad47522f3
    Removing intermediate container 41bad47522f3
    ---> b33a7962ae91
    Successfully built b33a7962ae91
    Successfully tagged cmdtestentrypoint:1.0

    # 启动镜像
    # 启动成功后,执行我们的脚本命令
    root@again:/home/dockerfile# docker run b33a7962ae91
    .
    ..
    .dockerenv
    bin
    dev
    etc
    home
    lib
    lib64
    lost+found
    media
    mnt
    opt
    proc
    root
    run
    sbin
    srv
    sys
    tmp
    usr
    var

    # 测试执行的时候在后面添加别的命令
    # 发现在添加之后他不会报错,直接追加到前面的命令后
    root@again:~# docker run b33a7962ae91 -l
    total 56
    drwxr-xr-x 1 root root 4096 Oct 27 11:57 .
    drwxr-xr-x 1 root root 4096 Oct 27 11:57 ..
    -rwxr-xr-x 1 root root 0 Oct 27 11:57 .dockerenv
    lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
    drwxr-xr-x 5 root root 340 Oct 27 11:57 dev
    drwxr-xr-x 1 root root 4096 Oct 27 11:57 etc
    drwxr-xr-x 2 root root 4096 May 11 2019 home
    lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
    lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64
    drwx------ 2 root root 4096 Aug 9 21:40 lost+found
    drwxr-xr-x 2 root root 4096 May 11 2019 media
    drwxr-xr-x 2 root root 4096 May 11 2019 mnt
    drwxr-xr-x 2 root root 4096 May 11 2019 opt
    dr-xr-xr-x 138 root root 0 Oct 27 11:57 proc
    dr-xr-x--- 2 root root 4096 Aug 9 21:40 root
    drwxr-xr-x 11 root root 4096 Aug 9 21:40 run
    lrwxrwxrwx 1 root root 8 May 11 2019 sbin -> usr/sbin
    drwxr-xr-x 2 root root 4096 May 11 2019 srv
    dr-xr-xr-x 13 root root 0 Oct 27 07:13 sys
    drwxrwxrwt 7 root root 4096 Aug 9 21:40 tmp
    drwxr-xr-x 12 root root 4096 Aug 9 21:40 usr
    drwxr-xr-x 20 root root 4096 Aug 9 21:40 var

    注意注意注意:如果自己构建的时候说命令错误注意空格问题

    实战tomcat和jdk镜像

    • 准备镜像文件 tomcat压缩包,jdk压缩包
    • 编写Dockerfile文件 官方命名Dockerfile build的时候会自动寻找这个文件,就不需要-f指定了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM centos

MAINTAINER 刘富贵<2677672@gmail.com>

ADD apache-tomcat-9.0.37.tar.gz /usr/local
ADD jdk-8u271-linux-x64.tar.gz /usr/local

RUN yum -y install vim

ENV MYPATH /usr/local

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_271

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

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

ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37

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

EXPOSE 8080

当我们的命令敲完之后呢,构建镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
docker build -t 自定义镜像名:[TAG] .

#执行结果
[root@mylinux tomcat]# docker build -t myselfimage:1.0 .
Sending build context to Docker daemon 623.5MB
Error response from daemon: Dockerfile parse error line 12: unknown instruction: WORKDIR $MYPATH
[root@mylinux tomcat]# vim Dockerfile
[root@mylinux tomcat]# docker build -t myselfimage:1.0 .
Sending build context to Docker daemon 623.5MB
Error response from daemon: Dockerfile parse error line 12: unknown instruction: WORKDIR $MYPATH
[root@mylinux tomcat]# vim Dockerfile
[root@mylinux tomcat]# vim Dockerfile
[root@mylinux tomcat]# docker build -t myselfimage:1.0 .
Sending build context to Docker daemon 623.5MB
Error response from daemon: Dockerfile parse error line 12: unknown instruction: WORKDIR $MYPATH
[root@mylinux tomcat]# vim Dockerfile
[root@mylinux tomcat]# docker build -t myselfimage:1.0 .
Sending build context to Docker daemon 623.5MB
Step 1/14 : FROM centos
latest: Pulling from library/centos
3c72a8ed6814: Pull complete
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
---> 0d120b6ccaa8
Step 2/14 : MAINTAINER 刘富贵<2677672@gmail.com>
---> Running in a6222134c2b3
Removing intermediate container a6222134c2b3
---> d3feaf874353
Step 3/14 : ADD apache-tomcat-9.0.37.tar.gz /usr/local
---> d863e61deb6c
Step 4/14 : ADD jdk-8u271-linux-x64.tar.gz /usr/local
---> 21e4754023c2
Step 5/14 : RUN yum -y install vim
---> Running in 518f536bee14
CentOS-8 - AppStream 117 kB/s | 5.8 MB 00:50
CentOS-8 - Base 150 kB/s | 2.2 MB 00:15
CentOS-8 - Extras 14 kB/s | 8.1 kB 00:00
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vim-enhanced x86_64 2:8.0.1763-13.el8 AppStream 1.4 M
Installing dependencies:
gpm-libs x86_64 1.20.7-15.el8 AppStream 39 k
vim-common x86_64 2:8.0.1763-13.el8 AppStream 6.3 M
vim-filesystem noarch 2:8.0.1763-13.el8 AppStream 48 k
which x86_64 2.21-12.el8 BaseOS 49 k

Transaction Summary
================================================================================
Install 5 Packages

Total download size: 7.8 M
Installed size: 31 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm 441 kB/s | 39 kB 00:00
(2/5): vim-filesystem-8.0.1763-13.el8.noarch.rp 514 kB/s | 48 kB 00:00
(3/5): which-2.21-12.el8.x86_64.rpm 320 kB/s | 49 kB 00:00
(4/5): vim-enhanced-8.0.1763-13.el8.x86_64.rpm 69 kB/s | 1.4 MB 00:20

构建完镜像,我们启动容器并配置挂载卷

1
docker run -d -p 8080:8080 --name liufugui -v /home/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps -v /home/tomcat/logs:/usr/local/apache-tomcat-9.0.37/logs myself:1.0

打开tomcat,在浏览器访问tomcat

发布自己的镜像

发布自己的镜像到DockerHub

  1. 在官网 https://hub.docker.com/ 上注册自己的账号
  2. 确保账号可以登录
  3. 在我们的服务器上提交自己的镜像
1
2
3
4
5
6
7
8
9
10
11
12
# 在服务器上登录账号
[root@mylinux ~]# docker login --help

Usage: docker login [OPTIONS] [SERVER]

Log in to a Docker 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

提交到自己的仓库需要注意

**提交的时候镜像命令要是你的dockerhub名称加上镜像名加上:TAG标记,这样就可以提交成功了(意思就是你的镜像名称必须为你的dockerhub名称加上你的镜像名和版本号)

例如你的dockerHub用户名为 hello
你提交的镜像名称必须为 hello/镜像名:tag**

[root@mylinux ~]# docker push sky0429/mytomcat:1.0
The push refers to repository [docker.io/sky0429/mytomcat]
12ce4d49a2bf: Pushed
b1f6ac31789f: Pushed
a0ff47fa59d6: Pushed
291f6e44771a: Pushed
1.0: digest: sha256:047b039ac9326c10471ec6ce530c453efdea5925e12b02ce921c01a34e6b0ae9 size: 1166

小结