初识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
#这里的每个命令,就是镜像的一层
#启动下自己写的容器
这个卷和外部一定有一个同步的目录
查看一下卷挂载的路径
测试一下刚才的文件是否挂载出去了
这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设护肩镜像的狮虎没有挂载,要手动镜像挂载 -v 卷名 容器内路径
数据卷容器
多个mysql同步数据!
#启动3个容器。通过我们刚才自己写的镜像启动
# 测试,可以删除Docker01,查看一下docker02和docker03是否还可以访问这个文件
# 测试依旧可以访问
多个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,阿里云镜像仓库)
查看一下官方是怎么做的
很多官方镜像都是基础包,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那么我们也可以!
DockerFile构建过程
基础知识:
1.每个保留关键字(指令)都是必须是大写字母
2.执行从上到下顺序执行
3.#标示注释
4.,每一个指令都会创建提交一个新的镜像层,并提交!
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 # 构建的时候设置环境变量!
实战测试
Docker Hub中99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置我们需要的软件和配置来进行构建
创建一个自己的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
工作目录默认是根目录
没有vim,ifconfig等命令
我们增加之后的镜像
我们可以列出本地进行的变更历史
我们平时拿到一个镜像可以研究它是怎么做的了。
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的压缩包!
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
提交的时候也是按照镜像的层级来尽享提交的。!
阿里云镜像服务上
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器镜像
5.浏览阿里云
阿里云容器镜像就参考官方地址!
小结
以上是关于初识Dockerfile+进阶Dockerfile(手把手叫你如何编写Dockerfile)的主要内容,如果未能解决你的问题,请参考以下文章
Docker 从入门到进阶七:DockerFile 与 Docker Compose