dockerfile 介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(Docker hub 、阿里云镜像仓库)
dockerfile 构建过程
基础知识:
Dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件
Docker镜像 逐渐成为企业交付的标准,必须要掌握!
步骤:开发、部署、运维。。。缺一不可!**
DockerFile:构建文件,定义了一切的步骤,类似于源代码
DockerImages:通过Dockerfile构建生成的镜像,就是我们最终发布运行的产品
Docker容器:容器就是镜像运行起来提供服务
Dockerfile 的指令
FROM # 基础镜像,一切从这开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 假设构建tomcat镜像,这个tomcat压缩包,必须要添加进去吧. 用ADD添加的文件会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 指定暴露端口
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承的 dockerfile , 这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战测试: 创建一个centos
Docker hub中 99% 的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
- 编写自己的dockerfile文件 ```shell root@kylin:/home/dockerfile# cat mydockerfile-centos FROM centos MAINTAINER kylinvipvip@qq.com
ENV MYPATH /usr/local WORKDIR $MYPATH
RUN yum -y install vim RUM yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo “————end—————“
CMD /bin/bash
2. 通过文件构建镜像
```shell
命令: docker build -f dockerfile路径 -t 镜像名:[TAG] . //最后有个点
docker build -f mydockerfile-centos -t mycentos:0.1 .
#结果:
Successfully built cf79dd40a41e
Successfully tagged mycentos:0.1
- 运行
```shell
运行:
root@kylin:/home/dockerfile# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mycentos 0.1 cf79dd40a41e 6 minutes ago 295MB
root@kylin:/home/dockerfile# docker run -it mycentos:0.1
4. 对比:
之前的centos
```shell
[root@2a9e7735a29c /]# pwd
/
[root@2a9e7735a29c /]# vim
bash: vim: command not found
[root@2a9e7735a29c /]# ifconfig
bash: ifconfig: command not found
我们增加之后的mycentos:
[root@b8cc3e67320b local]# pwd
/usr/local
[root@b8cc3e67320b local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 9 bytes 766 (766.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 我们可以列出本地的镜像变更历史
docker history 镜像id
通过docker history 这个命令可以查看其它官方镜像的构建过程root@kylin:~# docker history mycentos:0.1
IMAGE CREATED CREATED BY SIZE COMMENT
cf79dd40a41e 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
f6d1c2d2eec1 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
2f9fc8597688 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
ec4844fcdccf 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
fddbeba135c5 12 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
e716a472c60f 12 minutes ago /bin/sh -c yum -y install vim 57.2MB
e716a248cc9c 12 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
fd9dccef6ad3 12 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
40450b32cb73 12 minutes ago /bin/sh -c #(nop) MAINTAINER kylin<vipvip@q… 0B
831691599b88 7 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 7 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 7 weeks ago /bin/sh -c #(nop) ADD file:84700c11fcc969ac0… 215MB
CMD 和 ENTRYPOINT 的区别
CMD # 指定这个容器启动的时候要运行的命令可以追加命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令可以追加命令
测试cmd命令
#1.编写 dockerfile 文件
root@kylin:/home/dockerfile# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]
#2. build 构建镜像
root@kylin:/home/dockerfile# docker build -f dockerfile-cmd-test -t cmd-test .
#3. run 运行,发现我们的ls -a 命令生效
root@kylin:/home/dockerfile# docker run cmd-test
.
..
.dockerenv
bin
dev
etc
home
...
#4. 想追加一个命令-l ,理想情况是 ls -al,但是却报错了
root@kylin:/home/dockerfile# docker run cmd-test -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 替换了 ["ls","-a"]命令,因为-l 不是命令,所以报错
#如果不用-l,而是换成pwd或者 ls -al其他命令,那么就直接执行pwd或者其他命令.(["ls","-a"]被替换了,不会执行)
测试 ENTRYPOINT
# 1. 编写dockerfile文件
root@kylin:/home/dockerfile# vim dockerfile-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 2. build生成镜像
root@kylin:/home/dockerfile# docker build -f dockerfile-entrypoint -t entrypoint .
# 3. run 运行镜像
root@kylin:/home/dockerfile# docker run entrypoint
.
..
.dockerenv
bin
dev
etc
home
# 4. 追加一个命令-l ,理想情况是 ls -al,结果与理想情况一样,追加命令是直接拼接在命令后面的
root@kylin:/home/dockerfile# docker run entrypoint -l
total 56
drwxr-xr-x 1 root root 4096 Aug 8 09:38 .
drwxr-xr-x 1 root root 4096 Aug 8 09:38 ..
-rwxr-xr-x 1 root root 0 Aug 8 09:38 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 Aug 8 09:38 dev
drwxr-xr-x 1 root root 4096 Aug 8 09:38 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
dockerfile中很多命令都十分相似,我们需要了解他们的区别,最好的学习方式就是对比他们,然后测试效果。
实战测试: Tomcat镜像
- 准备镜像文件: Tomcat压缩包 jdk的压缩包!
- 编写 dockerfile 文件,官方命名
Dockerfile
,build 会自动寻找这个文件,就不需要 -f 指定了 ```shell FROM centos MAINTAINER kylin1770824244@qq.com
COPY readme.txt /usr/local/readme.txt
ADD apache-tomcat-9.0.37.tar.gz /usr/local/ ADD jdk-8u261-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_261 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.37 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/bin/log s/catalina.out
3. 构建镜像
```shell
#docker build -t diytomcat .
启动镜像
docker run -d -p 9090:8080 --name kylin_tomcat01 -v /home/test:/usr/local/apache-tomcat-9.0.37/webapps/test -v /home/logs/:/usr/local/apache-tomcat-9.0.37/logs diytomcat
测试
curl localhost:9090 #成功执行
发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发不了)( 使用jsp+web.xml 测试) ```html <%@ page language=”java” contentType=”text/html; charset=utf-8” pageEncoding=”utf-8”%> <!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd">
```xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>FirstWebFontEnd</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
项目部署成功,可以直接访问
我们以后开发的步骤,需要掌握dockerfile的编写,我们之后发布的一切都是使用docker镜像来发布运行发布镜像
发布到 docker hub
- https://hub.docker.com 注册自己的账号
- 确定这个账号可以登录
- 在我们服务器上提交自己的镜像(先使用docker login登录) ```shell root@kylin:~# 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@kylin:~# docker login -u 用户名 -p 密码 WARNING! Using —password via the CLI is insecure. Use —password-stdin. 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**
```shell
docker push kylin177/mycentos:1.0
#注意:我的dockerhub用户名的kylin177(我只对这个kylin177有权限),所有我构建的镜像名字应该是以kylin177开头的
自己发布的镜像一定要带上版本号,很重要
解决没有TAG的方法:
docker tag 镜像id kylin177/mycentos:2.0
发布到阿里云
- 登录阿里云
- 找到容器镜像服务
- 创建命名空间(一个账号只能创建三个命名空间)
- 创建一个仓库(默认私有)
选择本地仓库- 看着阿里云给的官方教程(每个人的都不一样),上传自己的镜像
小节
不仅可以把镜像发布到云端,还可以把docker镜像打包发给别人打包:
docker save 镜像id -o xxxx.tar
加载:
docker load -i xxx.tar