DockerFile 介绍
Dockerfile
是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。使用docker build
用户可以创建一个自动执行的构建,该构建可以连续执行多个命令行指令。
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
DockerFile构建过程
基础知识:
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像曾,并提交!
Dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成企业交付的标准,必须要掌握!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
DockerFile指令说明
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包! 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置,跟 -p 是一个道理
CMD # 指定这个容器启动时要执行的命令,只有最后一个命令会生效,可悲替代
ENTRYPOINT # 指定这个容器启动的时候要执行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令。触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量,跟 -e 是一个意思
# CMD 和 ENTRYPOINT 的区别说明:(后面也会介绍)
# 若CMD 和 ENTRYPOINT 后跟的都是 ls -a 这个命令,当docker run 一个容器时,添加了 -l 选项,则CMD里的ls -a 命 令就会被替换成-l;而ENTRYPOINT中的 ls -a会追加-l变成 ls -a -l
实战: 构建自己的Centos
实战测试:
Docker Hub中99%镜像都是从这个基础镜像过来的( FROM scratch ),然后配置需要的软件和配置来构建。
#1.创建一个dockerfile
FROM centos
MAINTAINER martin<1634848844@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo"-------build seccessulf!"
CMD /bin/bash
#2.将dokcerfile bulid 成一个镜像
docker build [-f dockerfile路径] -t 镜像名:[tag] . #若DockerFile文件名字是dockerfile 则可以省略不写
[root@localhost mycentos]# docker build -t mycentos .
Sending build context to Docker daemon 2.048kB
Step 1/9 : FROM centos
---> 0d120b6ccaa8
Step 2/9 : MAINTAINER martin<1634848844@qq.com>
---> Running in 7eb7c03f7c4e
Removing intermediate container 7eb7c03f7c4e
---> 6d10910a8d15
Step 3/9 : ENV MYPATH /usr/local
---> Running in 9969a7e12c2e
Removing intermediate container 9969a7e12c2e
---> 285afe1fd48b
Step 4/9 : WORKDIR $MYPATH
---> Running in 97f22270fcec
Removing intermediate container 97f22270fcec
---> e32304af7dc4
Step 5/9 : RUN yum -y install vim
Step 6/9 : RUN yum -y install net-tools
Step 7/9 : EXPOSE 80
---> Running in f9df5f568fd4
Removing intermediate container f9df5f568fd4
---> 7d3a9cf3114b
Step 8/9 : CMD echo"-------build seccessulf!"
---> Running in 1edaa05c360d
Removing intermediate container 1edaa05c360d
---> d9515e3eae93
Step 9/9 : CMD /bin/bash
---> Running in 59641c982f81
Removing intermediate container 59641c982f81
---> ed74c68370bd
Successfully built ed74c68370bd
Successfully tagged mycentos:latest
#3测试运行
CMD和ENTRYPOINT的区别
测试CMD
# 编写dockerfile文件
$ vim dockerfile-test-cmd
FROM centos
CMD ["ls","-a"]
# 构建镜像
$ docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
# 运行镜像
$ docker run cmd-test:0.1
.
..
.dockerenv
bin
dev
# 想追加一个命令 -l 成为ls -al
$ docker run cmd-test:0.1 -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.
ERRO[0000] error waiting for container: context canceled
# cmd的情况下 -l 替换了CMD["ls","-l"]。 -l 不是命令,所以报错
测试ENTRYPOINT
# 编写dockerfile文件
$ vim dockerfile-test-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
$ docker run entrypoint-test:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found ...
# 我们的命令,是直接拼接在我们的ENTRYPOINT命令后面的
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 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 ....
DockerFile制作tomcat 镜像
1、准备镜像文件tomcat压缩包,jdk压缩包!
2、编写Dockerfile文件,官方命名: Dockerfile ,build会自动寻找这个文件,就不要 -f 指定了!
FROM centos
MAINTAINER kuangshen<123456@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u161-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.0.53.tar.gz /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.53
ENV CATALINA_BASH /usr/local/apache-tomcat-8.0.53
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-8.0.53/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.0.53/bin/logs/catalina.out
3、构建镜像
# docker build -t diytomcat . diytomcat是定义的镜像名
4、启动镜像,创建容器
# docker run -d -p 9090:8080 --name kuangshentomcat02 -v /home/kuangshen/build/tomcat/test:/usr/local/apache-tomcat-8.0.53/webapps/test -v /home/kuangshen/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-8.0.53/logs diytomcat
5、访问测试
发布镜像到DockerHub
Docker Hub
2、确定这个账号可以登录
3、在我们服务器上提交自己的镜像
#1.登录dockerhub
[root@localhost mycentos]# docker login -u 1634848844
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
2.上传镜像
[root@localhost ~]# docker push mycentos
The push refers to repository [docker.io/library/mycentos]
f7e6bad32f2f: Preparing
b372a66da4c4: Preparing
291f6e44771a: Preparing
denied: requested access to the resource is denied #出现了问题
解决:增加一个tag docker tag 指定镜像的id dockerhub的用户名/镜像重命名:[tag]
[root@localhost ~]# docker tag ed74c68370bd 1634848844/mycentos:1.0
[root@localhost ~]# docker push 1634848844/mycentos:1.0
The push refers to repository [docker.io/1634848844/mycentos]
f7e6bad32f2f: Pushed
b372a66da4c4: Pushed
291f6e44771a: Mounted from library/centos
1.0: digest: sha256:a7d31f4cf05ec7b5eeb824c00589f7c83ef3c966fc0247157345b9a4fea0ba89 size: 953
注意:镜像的重命名前一定要加当前的dockerhub的用户名,否则将会push失败!!!!
发布镜像到阿里云容器服务