初识Dockerfile+进阶Dockerfile(手把手叫你如何编写Dockerfile)

Posted 轻狂书生han

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识Dockerfile+进阶Dockerfile(手把手叫你如何编写Dockerfile)相关的知识,希望对你有一定的参考价值。

初识Dockerfile

Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下

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

#创建一个dockerfile文件,名字可以随意 建议 Dockerfile
#文件中的内容 指令  参数

FROM centos

VOLUME {"volume01","volume02"}

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

CMD /bin/bash

#这里的每个命令,就是镜像的一层

image

image

#启动下自己写的容器

image
这个卷和外部一定有一个同步的目录

image
查看一下卷挂载的路径

image
测试一下刚才的文件是否挂载出去了

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

假设护肩镜像的狮虎没有挂载,要手动镜像挂载 -v 卷名 容器内路径

数据卷容器

多个mysql同步数据!

image

#启动3个容器。通过我们刚才自己写的镜像启动

image

image

image

image

# 测试,可以删除Docker01,查看一下docker02和docker03是否还可以访问这个文件
# 测试依旧可以访问

image
多个mysql实现数据共享

[root@hsStudy home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01  mysql:5.7

[root@hsStudy home]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02  --volume-from mysql01 mysql:5.7

# 这个时候,可以实现两个容器数据同步!

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

但是一旦持久化到了本地,这个时候,本地的数据是不会删除的。

DockerFile

DockerFile介绍

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

构建步骤:

1.编写一个dockerfile文件

2.docker build 构建成为一个镜像

3.dockerrun 运行镜像

4.docker push 发布镜像(DockerHub,阿里云镜像仓库)

查看一下官方是怎么做的

image

image

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

官方既然可以制作镜像,那么我们也可以!

DockerFile构建过程

基础知识:

1.每个保留关键字(指令)都是必须是大写字母

2.执行从上到下顺序执行

3.#标示注释

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

image

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

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

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

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

DockerImages:通过DockerFile构建生成的镜像,最终发部和运行的产品(原来数jar,war)

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

DockerFile指令

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

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

image

实战测试

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

创建一个自己的centos

# 1.编写dockerfile的文件
[root@hsStudy dockerfile]# cat mydockerfile-centos 
FROM centos
MAINTAINER hansuo<925351628@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 buile -f dockerfile文件路径 -t 镜像名:[tag]

Successfully built df93fdf24c53
Successfully tagged mycentos:0.1

#3.测试运行

对比:之前的原生的centos

image
工作目录默认是根目录

没有vim,ifconfig等命令

我们增加之后的镜像

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

image
我们平时拿到一个镜像可以研究它是怎么做的了。

CMD和ENTRYPOINT的区别

CMD        # 指定这个容器启动时要运行的命令  cmd echo
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令

测试cmd命令

#编写docker文件
[root@hsStudy dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD {"ls","-a"}

# 构建镜像
[root@hsStudy dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon  12.29kB
Step 1/2 : FROM centos
 ---> 300e315adb2f
Step 2/2 : CMD {"ls","-a"}
 ---> Running in 04cb924b9593
Removing intermediate container 04cb924b9593
 ---> 51c83a05687e
Successfully built 51c83a05687e
Successfully tagged cmdtest:latest

# run运行,发现我们的ls-a生效
[root@hsStudy dockerfile]# docker run 51c83a05687e
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 项追加一个命令 -l ls -al
[root@hsStudy home]# docker run 51c83a05687e -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

#cmd的情况下 -l 替换了CMD {"ls","-a"}命令,-l不是命令,所以报错!

测试ENTRYPOINT

[root@hsStudy dockerfile]# docker build -f docker-cmd-entrypoint -t entrypoint-test .
Sending build context to Docker daemon  17.92kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT {"ls","-a"}
---> Running in cad38b424215
Removing intermediate container cad38b424215
---> 702b706c4939
Successfully built 702b706c4939
Successfully tagged entrypoint-test:latest
[root@hsStudy dockerfile]# docker run 702b706c4939
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 我们的追加命令,是直接在我们ENTRYPOINT命令的后面
[root@hsStudy dockerfile]# docker run 702b706c4939 -l
drwxr-xr-x.   1 root root 4096 May 20 01:46 .
drwxr-xr-x.   1 root root 4096 May 20 01:46 ..
-rwxr-xr-x.   1 root root    0 May 20 01:46 .dockerenv
lrwxrwxrwx.   1 root root    7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root  340 May 20 01:46 dev
drwxr-xr-x.   1 root root 4096 May 20 01:46 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 Dec  4 17:37 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. 230 root root    0 May 20 01:46 proc
dr-xr-x---.   2 root root 4096 Dec  4 17:37 root
drwxr-xr-x.  11 root root 4096 Dec  4 17:37 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 May 20 00:51 sys
drwxrwxrwt.   7 root root 4096 Dec  4 17:37 tmp
drwxr-xr-x.  12 root root 4096 Dec  4 17:37 usr
drwxr-xr-x.  20 root root 4096 Dec  4 17:37 var

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

实战:Tomcat镜像

1.准备镜像文件 tomcat压缩包,jdk的压缩包!

image

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

FROM centos
MAINTAINER hansuo<925351628@qq.com>

COPY readme.txt /usr/local/readme.txt

ADD jdk-8u181-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/

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

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

                       



3.构建镜像

# docker build -t diytomcat .
docker images

docker run -d -p 9090:8080 --name hansuotomcat -v /home/hansuo/build/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test -v /home/hansuo/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat



docker exec -it 容器名 

pwd 

ll

  curl localhost :9090

4.启动镜像

5.访问测试

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

在tomcat cd/test/

makdir WEB-INF

cd WEB-INF/

vim web .xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>HEllo,韩锁</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("=====my test web logs=====");
%>
</body>
</html>

发现:项目部署成功,可以直接访问ok!

我们以后开发的步骤:需要掌握Dockerfile的编写!我们之后的一切都是使用docker镜像来发布运行!

发布自己的镜像

DockerHub

1.地址https://hub.docker.com/,注册自己的账号!

2.确定这个账号可以登录

3.在我们服务器上提交自己的镜像

[root@hsStudy tomcatlogs]# 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
  [root@hsStudy tomcatlogs]# docker login -u 925351628
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

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

#push自己的镜像到服务器上
[root@hsStudy tomcatlogs]# docker push diytomcat
Using default tag: latest
The push refers to repository [docker.io/library/diytomcat]
1a7b0cfbf206: Preparing 
a975613c91ac: Preparing 
1de3849928a3: Preparing 
34b5f5832e52: Preparing 
2653d992f4ef: Preparing 
denied: requested access to the resource is denied #拒绝

#push镜像的问题
[root@hsStudy tomcatlogs]# docker push hansuo/diytomcat:2.0
The push refers to repository [docker.io/hansuo/diytomcat]
An image does not exist locally with the tag: hansuo/diytomcat

#解决:增加一个tag
[root@hsStudy tomcatlogs]# docker push 925351628/tomcat:1.0

#dockers push上去即可,自己发布的镜像尽量带上版本号
[root@hsStudy tomcatlogs]# docker push hansuo/tomcat:1.0
The push refers to repository [docker.io/hansuo/tomcat]
1a7b0cfbf206: Preparing 
a975613c91ac: Preparing 
1de3849928a3: Preparing 
34b5f5832e52: Preparing 
2653d992f4ef: Preparing 

image

提交的时候也是按照镜像的层级来尽享提交的。!

阿里云镜像服务上

1.登录阿里云

2.找到容器镜像服务

3.创建命名空间

4.创建容器镜像

5.浏览阿里云

阿里云容器镜像就参考官方地址!

小结

image

以上是关于初识Dockerfile+进阶Dockerfile(手把手叫你如何编写Dockerfile)的主要内容,如果未能解决你的问题,请参考以下文章

Docker 进阶之 Dockerfile 详解

Docker 从入门到进阶七:DockerFile 与 Docker Compose

Docker| 进阶吧,DockerFile

第136天学习打卡(Docker 容器数据卷 安装MySQL 具名和匿名挂载 初识Dockerfile)

详解Docker——你需要知道的Docker进阶知识五

轻松掌握Docker使用-进阶操作