Docker自娱—6.Dockerfile
Dockerfile是用来构建docker镜像的构建文件,是命令脚本!
可通过脚本一步步生成镜像。镜像是一层层的,对应脚本就是一个个命令
基本使用
--- 通过编写dockerfile构建镜像,加深volume的了解 ---
[root@wg ~]# mkdir /home/docker_test // 本地路径需自建
[root@wg ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos 6 5bf9684f4720 4 months ago 194 MB
docker.io/centos 7 eeb6ee3f44bd 4 months ago 204 MB
docker.io/centos 8 5d0da3dc9764 4 months ago 231 MB
docker.io/centos 5 1ae98b2c895d 5 years ago 285 MB
[root@wg ~]# vi docker_file // 编写dockerfile
| from docker.io/centos:7 // 要求大写,测试小写
| volume ["volume01", "volume02"] // 挂载两个目录
| cmd echo "---end---" // 结束
| cmd /bin/bash
[root@wg docker_test]# docker build -f ./docker_file -t wg/centos .
# 执行镜像生成命令,用刚刚编写的dockerfile创建镜像
# 1.基础镜像来源centos7;在其上有构建了一层。
# 2.-f后边跟的是本地路径,相对路径和绝对路径都可以
# 3.-t后边跟的是给镜像起的名字
# 4..的作用指的是在引擎的当前目录
[root@wg docker_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wg/centos latest 4ad8458e5d13 2 minutes ago 204 MB
docker.io/centos 7 eeb6ee3f44bd 4 months ago 204 MB
[root@wg ~]# docker run -it --name d01 wg/centos // 生成容器
# 登入会看到在根目录下有volume01和02两个目录
# 注意,如用-v挂载路径,两个目录挂两次
# 这里只是试验1,实现volume
[root@wg ~]# docker run -it --name d02 -v test1:/volume01 -v test2:/volume02 wg/centos
# 和上边命令有变化,增加了-v挂载;两次
# 这时候可以exit登出后查看volume的变化
[root@wg ~]# docker volume ls // 查看卷,已经存在
[root@wg ~]# docker volume inspect test1 // 查看卷具体信息 路径有了 图1
[root@wg ~]# docker ps // 再用容器id查看
[root@wg ~]# docker container inspect 容器id // 路径也有了 图2
--- 把新容器目录挂到旧容器目录上,实现数据共享 ---
- d02关于volume;下边的d03关于共享;两种实验
[root@wg ~]# docker run -it --name d03 --volumes-from d01 wg/centos
# volumes-from:数据卷容器——容器间传递共享
# docker默认工作路径在/var/lib/docker,volumes目录就其下
# 实现本地volumes目录下,随机长名称/_data同d01、d03数据共享
# 既d03挂载到d01, d01就是数据卷容器;共享的目录volume01 volume02
# 进入d03或01创建文件,或者本地目录删除文件,都可以同步
# 继续升级,把02的挂载到本地指定位置,再创建04并共享目录
- 总结:
| 实现容器间配置信息的传递;
| 数据全容器的生命周期一致,持续到没有容器使用为止
| 一旦持久化存储到本地,本地的数据是不会被删除的
[root@wg ~]# docker volume rm -f $(docker volume ls -q) // 删除所有卷
[root@wg ~]# docker rmi -f 镜像名:tag // 删不掉镜像要加版本号
commit命令
- commit是通过容器构建镜像
| docker commit -m="提交的表述信息" -a="作者" 容器id 目标镜像名:tag
- dockerfile是通过镜像构建镜像
构建解读
1、基本概念
- dockerfile是面向开发的。发布项目、做镜像,就编写dockerfile,这是交付标准。
- dockerfile 构建文件,定义了一切步骤,源代码
- images 通过dockerfile构成镜像,是最终发布和运行产品
- container 容器就是运行起来的镜像,提供服务
- 步骤:开发 部署 运维 缺一不可
2、基本步骤
- 1、编写dockerfile文件
- 2、docker build 构建镜像
- 3、docker run 运行镜像
- 4、docker push 发布镜像(dockerhub、阿里云仓库)
3、步骤事项
1、每个保留字(指令)都是必须是大写字母(我小写也可以)
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交!
4、构建指令
FROM # 基础镜像,一切从这里开始
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 dockerfile 这个时候就会运行 onbuild 的指令 触发指令
COPY # 类似ADD 将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
简单示例
1、编写dockerfile
[root@wg test]# vi docker_file_centos.sh
| FROM docker.io/centos:7 // 从centos镜像开始
| MAINTAINER wg<m18610609135@163.com> // 作者及邮箱
|
| ENV MYPATH /usr/local // 构建环境,mypath和/usr/local是键值对
| WORKDIR $MYPATH // cd到/usr/local
|
| RUN yum -y install vim // 执行下载任务
| RUN yum -y install net-tools // ipconfig命令在这里边
|
| EXPOSE 80 // 暴露80端口 通过-p指定
|
| ADD https://.... // 下载,但不能解压
| ADD mysql.5.7.35.tar.gz // 拷贝进去并解压,可以指定解压目录
| WORKDIR mysql // 可以用相对路径,相对的是/usr/local
| COPY my.cnf // 把文件拷贝进去
|
| CMD echo $MYPATH // echo是在脚本执行过程中输出的
| CMD ehco "---end---"
| CMD /bin/bash
2、创建镜像
[root@wg ~]# docker build -f dockerfile_centos -t my_centos .
# 1. -f 是指定路径,相对路径和绝对路径都可以
# 2. -t 创建的新镜像名和tag
# 3. . 简单说,执行文件所需都上传到一个目录,在这目录里找文件执行
3、生成容器
[root@wg ~]# docker run -it my_centos
# 进入以后检查ifconfig命令
# 查看当前目录 都无问题
4、查看过程
[root@wg ~]# docker images // 找到镜像的Id
[root@wg ~]# docker history imageid // 查看镜像的构建过程
构建示例
指令详解
1、cmd和entrypoint
[root@wg ~]# vi dockerfile_cmd.sh
| FROM centos
| CMD ["ls","/opt"]
[root@wg ~]# docker build -f dockerfile_cmd -t cmdtest .
[root@wg ~]# dokcer run -it cmdtest // ls /data命令正常执行
[root@wg ~]# docker run -it cmdtest ls / // 执行ls /
- 结果:命令被替换了
[root@wg ~]# docker run cmdtest /bin/bash -c "ls -al" // 写法2
# 总结:运行容器时,cmd指令会被覆盖
[root@wg ~]# vi dockerfile_cmd.sh
| FROM centos
| ENTRYPOINT ["ls","/data"]
[root@wg ~]# docker run cmdtest ls / // 结果为 执行了 ls / 和 ls data
[root@wg ~]# docker run cmdtest / // 替换 只执行了 ls / # 这里有问题,是追加还是替换回头看一下
# 总结:运行容器时,entrypoint,是追加指令;也能完成命令的替换,格式不一样
# 总结:其实替换执行的指令 docker run --entrypoint=ls cmdtest /
# 示例: docker run mycentos:01 sh -c "ls /"
- 在使用的时候,一般是结合使用
| ENTRYPOINT ["ls"]
| CMD ["/data"]
# 总结:entrypoint一般写固定指令 cmd用来传递参数 必须使用json数组格式
2、WORKDIR和RUN cd
- WORKDIR改变的是环境,登入后在WORKDIR指定路径
- RUN cd 是改变临时工作路径,登入时在WORKDIR路径
3、ADD和COPY
- ADD 能将上传的压缩文件解压,能指定路径
- ADD 后边跟网址能执行下载操作,同样能指定路径
- COPY 仅能上传文件,可指定路径
导入导出
- docker镜像导出方式有两种:
| docker save id(name)
| docker export id(name)
- save和export的区别:
| save会保存该镜像的所有历史记录;export不会保留历史记录,即没有commit历史
| save保存的是镜像(image);export保存的是容器(container)
| load用来载入镜像包,import用来载入容器包,但两者都会恢复为镜像;
| load不能对载入的镜像重命名;import可以为镜像指定新名称。
save命令
- 命令格式:docker save [options] images [images...]
[root@wg ~]# docker save -o nginx.tar nginx:latest
[root@wg ~]# docker save > nginx.tar nginx:latest
- -o和>表示输出到文件
- nginx.tar为目标文件
- nginx:latest是源镜像名(name:tag)
load命令
- 命令格式:docker load [options]
[root@wg ~]# docker load -i nginx.tar
[root@wg ~]# docker load < nginx.tar
- -i和<表示从文件输入
- 导入镜像及相关元数据,包括tag信息
export命令
- 命令格式:docker export [options] container
[root@wg ~]# docker export -o nginx-test.tar nginx-test
[root@wg ~]# docker export nginx:latest > /home/export.tar
- 导出为tar格式
- -o表示输出到文件
- nginx-test.tar为目标文件
- nginx-test是源容器名(name)
- 也可以是源容器id
import命令
- 命令格式:docker import [options] file|URL|- [REPOSITORY[:TAG]]
[root@wg ~]# docker import nginx-test.tar nginx:imp
[root@wg ~]# cat nginx-test.tar | docker import - nginx:imp
上传下载
步骤
- 1.在docker官网注册账号
- 2.开通账号的仓库
- 3.在本地登录自己的注册账号
- 4.确认自己镜像名格式为 注册账号/镜像名:tag
- 5.执行上传
操作
[root@wg ~]# docker login -u xiaorenwudashuju
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
[root@wg ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql test1 e74a7965445b 2 hours ago 448MB
[root@wg ~]# docker tag e74a7965445b xiaorenwudashuju/mysql:test1
[root@wg ~]# docker push xiaorenwudashuju/mysql:test1
[root@wg ~]# docker pull xiaorenwudashuju/mysql:test1
Tomcat
1、准备工作
[root@wg dockerfile]# ls // tomcat jdk 说明文档
apache-tomcat-9.0.56.tar.gz jdk-8u202-linux-x64.tar.gz readme.txt
2、编写dockerfile文件
[root@wg dockerfile]# vi Dockerfile // 用Dockerfile命名可直接识别,不用-f指定
FROM centos:xx
MAINTAINER smitty<m186xxxx@163.com>
COPY readme.txt /usr/local/readme.txt // 把文件拷贝进容器内部
ADD jdk-8u202-linux-x64.tar.gz /usr/local/ // ADD可以自动解压
ADD apache-tomcat-9.0.56.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_202
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.56
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.56
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.56/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.56/bin/logs/catalina.out
3、构建镜像;生成容器;进入容器
[root@wg dockerfile]# docker build -t diytomcat .
[root@wg dockerfile]# docker run -d -p 9090:8080 --name smitty_tomcat -v /home/smitty/build/tomcat/test:/usr/local/apache-tomcat-9.0.56/webapps/test -v /home/smitty/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.56/logs diytomcat
[root@wg dockerfile]# docker ps
[root@wg dockerfile]# docker exec -it 容器id /bin/bash
示例升级
mkdir /home/smitty/build/tomcat/test/WEB-INF
创建两个文件 index.jsp web.xml 并编辑相关网页内容
## 问题应该出在两个文件上了,前端呀。。买马匹。。。
-----------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 " + request.getRemoteAddr());
%>
</body>
</html>
-------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
</web-app>
--------------------------------
# 访问localhost:9090/test 就能查看到自己生成的网页
# 和之前的实验一样,没搞明白哪里有坑,这回做到第三遍才成功
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)