目录
一:Dockerfile是什么
1.1:介绍
1.2:构建三步骤
二:Dockerfile构建过程解析
2.1:Dockerfile内容基础知识
2.2:Docker执行dockerfile的大致流程
2.3:Dockerfile构建过程总结
三:Dockerfile保留字指令
FROM
MAINTAINER
RUN
EXPOSE
WORKDIR
ENV
ADD
COPY
VOLUNE
CMD
ENTRYPOINT
ONBUILD
四:docker build构建镜像命令
演示案例docker 安装 mysql5.6 并提交到阿里云
阿里云创建命名空间
?阿里云创建仓库
本地推送到阿里云
测试案例一:对比CMD与ENTRYPOINT的区别
测试案例二 - 构建自定义镜像-mycentos
一:Dockerfile是什么
1.1:介绍
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
1.2:构建三步骤
编写Dockerfile文件 --> docker build --> docker run
二:Dockerfile构建过程解析
2.1:Dockerfile内容基础知识
- 每条保留字指令都必须为大写且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
2.2:Docker执行dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚刚提交的镜像运行一个新的容器
- 执行Dockerfile中的下一条指令直到所有指令都执行完成
2.3:Dockerfile构建过程总结
????????Dockerfile,Docker镜像,Docker容器分别代表三个不同的阶段。
- Dockerfile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器是软件的运行态
????????Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力完成Docker体系的基石
三:Dockerfile保留字指令
-
FROM
- 基础镜像,当前镜像是基于哪个镜像
-
MAINTAINER
- 镜像维护者的姓名和邮箱地址
-
RUN
- 容器构建需要运行的命令
RUN set -x; buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
-
EXPOSE
- 当前容器对外暴露的端口
-
WORKDIR
- 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
-
ENV
- 用来在构建镜像过程中设置环境变量
- ENV MY_PATH /usr/mypath 这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样,也可以在其他指令中直接使用这些环境变量。?
-
ADD
- 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包
-
COPY
- 类似ADD拷贝文件和目录到镜像中,从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内<目标路径>
- COPY src dest 或者 COPY ["src", "dest"]
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
-
VOLUNE
- 容器数据卷,用于数据保存和持久化工作
-
CMD
- 指定一个容器启动时要运行的命令
- Dockerfile中可以有多个CMD指令
- 容器启动命令
推荐使用exec格式
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
CMD ["nginx", "-g", "daemon off;"]
-
ENTRYPOINT
- 指定一个容器启动时要运行的命令
- ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序与参数
-
ONBUILD
- 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
四:docker build构建镜像命令
构建镜像 - 在 Dockerfile 文件所在目录执行:
docker build -f /home/docker/myip/DockerfileCmd -t nginx:v3 .
-f Dockerfile文件的绝对路径
-t 仓库name:tag
后面的. 标识<上下文路径/URL/->
一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。
所有需要的文件都放到当前目录下(镜像构建上下文(Context)
如果该目录下没有所需文件,那么应该把所需文件复制一份过来
docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像
如果目录下有些东西确实不希望构建时传给 Docker 引擎,
那么可以用 .gitignore 一样的语法写一个 .dockerignore,
该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。
实例解读- build的过程
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
解读过程:
Step 1: 表明根镜像
Step 2 RUN 指令启动了一个容器 9cdc27646c7b,执行了所要求的命令,
并最后提交了这一层 44aa4490ce2c,随后删除了所用到的这个容器 9cdc27646c7b
演示案例docker 安装 mysql5.6 并提交到阿里云
docker search mysql
docker pull mysql:5.6
运行容器
docker run -p 12345:3306 --name mysql5.6 \
--mount type=bind,source=/home/docker/mysql5.6/conf,target=/etc/mysql/conf.d \
--mount type=bind,source=/home/docker/mysql5.6/logs,target=/logs \
--mount type=bind,source=/home/docker/mysql5.6/data,target=/var/lib/mysql \
# -v /home/docker/mysql5.6/conf:/etc/mysql/conf.d \
# -v /home/docker/mysql5.6/logs:/logs \
# -v /home/docker/mysql5.6/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.6
使用:
docker exec -it bc42425282a8 /bin/bash
mysql -u root -p
备份数据:
docker exec bc42425282a8 sh -c 'exec mysqldump --all-databases -uroot -p "12345"' > /tmp/database.sql
提交容器到阿里云
1: 在阿里云后台创建好命名空间,与镜像仓库 - 见下图
2: 提交生成新的镜像 commit -a 作者信息 -m '描述'
docker container commit -a iwester -m 'my mysql5.6' bc42425282a8 my_mysql:1.0
3: docker login --username=180****0076 registry.cn-hangzhou.aliyuncs.com
4:docker tag 镜像ID registry.cn-hangzhou.aliyuncs.com/iwester-test/my_mysql:[镜像版本号]
5:docker push registry.cn-hangzhou.aliyuncs.com/iwester-test/my_mysql:[镜像版本号]
阿里云创建命名空间
?阿里云创建仓库
本地推送到阿里云
测试案例一:对比CMD与ENTRYPOINT的区别
镜像名后面的是command,运行时会替换CMD的默认值,但是会追加在ENTRYPOINT的后面
-- 利用curl -s -i 命令演示
# cmd镜像 Dockerfile
mkdir mycentos
cd mycentos
vim DockerfileCmd
FROM centos
RUN yum install -y curl
CMD ["curl", "-s", "http://icanhazip.com"]
# 构建cmd镜像
docker build -f /home/docker/myip/DockerfileCmd -t iwester/myip:1.1 .
# docker run -it iwester/myip:1.1 -> 正常输出ip
# 如果想达到 curl -s http://icanhazip.com -i
带参数执行 docker run -it iwester/myip:1.1 -i
--- 报错 exec: "-i": executable file not found in $PATH: unknown.
因为跟在镜像名后面的是command,运行时会替换CMD的默认值
因此这里的-i替换了原来的CMD,而不是添加在原来的curl -s 的后面,
而-i不是一个命令, 所以会报错
真正执行的是:curl -i
# ENTRYPOINT镜像 Dockerfile
mkdir mycentos
cd mycentos
vim DockerfileEnt
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl", "-s", "http://icanhazip.com"]
# 构建ENTRYPOINT镜像
docker build -f /home/docker/myip/DockerfileEnt -t iwester/myip:1.2 .
# docker run -it iwester/myip:1.2 -> 正常输出ip
#如果想达到 curl -s -i http://icanhazip.com
带参数执行:docker run -it iwester/myip:1.2 -i -> 正常输出
HTTP/1.1 200 OK
....
真正执行的是:curl -s http://icanhazip.com -i
测试案例二 - 构建自定义镜像-mycentos
?????? --- 构建一个拥有vim与ifconfig镜像,工作目录/usr/local
基础版的centos是简洁的没有vim与ifconfig命令,
mkdir mycentos
cd mycentos
vim Dockerfile
FROM centos
MAINTAINER iwester<iwester@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success -- "
CMD /bin/bash
开始使用Dockerfile构建镜像
docker build -f /home/docker/mycentos/Dockerfile -t iwester/mycentos:1.1 .
Sending build context to Docker daemon 2.048kB
Step 1/9 : FROM centos
Step 2/9 : MAINTAINER iwester<iwester@163.com>
Step 3/9 : ENV MYPATH /usr/local
Step 4/9 : WORKDIR $MYPATH
Step 5/9 : RUN yum -y install vim net-tools
Step 6/9 : EXPOSE 80
Step 7/9 : CMD echo $MYPATH
Step 8/9 : CMD echo "success -- "
Step 9/9 : CMD /bin/bash
Successfully built 4475f3cfa400
Successfully tagged iwester/mycentos:1.1
查看我们构建的镜像
docker history iwester/mycentos:1.1
运行镜像可以查看工作目录与vim,ifconfig 都可以使用
|