dockerfile入门
dockerfile使用准则
1.大 首字母必须大写
2.空 尽量把dockerfile放到空目录中
3.单 每个容器尽量只有一个功能
4.少 执行的命令越少越好
dockerfile工作流程
1.编写dockerfile
学习其中的一些关键字
2.要执行一个docker命令,会根据dockerfile
编写的流程开始制作镜像
===接下来的流程就是自动的了===
3.检测需要的镜像存不存在,如果本地没有,就自动下载
4.将镜像打开 --> 得到一个容器
5.进入到容器内部
6.根据dockerfile编写的步骤,一步步执行
7.成功,得到一个镜像 -> 是从容器导出的
dockerfile基础指令
1.FROM
FROM 镜像名 -> 原始镜像
FROM 镜像名:tag
2.MAINTAINER
dockerfile维护者信息
MAINTAINER 维护人员信息
MAINTAINER zhangsan zhangsan@abc.com
3.RUN
RUN shell命令
RUN mkdir /home/test/abc -p
RUN ["mkdir" , "/home/test/abc", "-p"]
4.EXPOSE
设置对外开放的端口
EXPOSE 80
举例
创建 Dockerfile
编写
FROM ubuntu
MAINTAINER zhangsan zhangsan@abc.com
RUN mkdir hello
RUN mkdir world
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
EXPOSE 80
编写完成
dockerfile运行时指令
1.CMD
CMD shell命令
CMD ["shell命令", "命令参数1", "命令参数2"]
2.
3.VOLUME
VOLUME ["/data"]
dockerfile触发器指令
1.ONBUILD
ONBUILD [command]
# 镜像的来源,源镜像
FROM ubuntu
# 作者信息
MAINTAINER zhangsan
# 更换服务器地址
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 更新
RUN apt-get update
RUN apt-get install gcc libc6-dev git vim lrzsz -y
# 安装go,使用文件拷贝方式
ADD go.tar.gz /usr/local
# 配置go基本环境变量
ENV GOROOT=/usr/local/go
ENV PATH=$PATH:/usr/local/go/bin
ENV GOPATH=/root/go
ENV PATH=$GOPATH/bin/:$PATH
# 拷贝beego代码,放到GOPATH/src
ADD beego.tar.gz /root/go/src
# 创建项目目录
RUN mkdir /root/go/src/myTest
WORKDIR /root/go/src/myTest
# 往当前/root/go/src/myTest 拷贝go文件
COPY test.go /root/go/src/myTest
# 运行go程序
# ENTRYPOINT go run test.go
ENTRYPOINT ["go", "run", "test.go"]
### 3.1 Dockerfile介绍
```shell
# 编写dockfile文件
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER panda kstwoak47@163.com
# 执行命令
RUN mkdir hello
RUN mkdir world
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install nginx -y
# 对外端口
EXPOSE 80
```
- 宿主机创建一个空目录, 将上边的dockerfile文件放到里边
- 在dockerfile对应的目录中执行一个命令, 构建新的镜像
```shell
docker build [OPTIONS] PATH | URL | -
OPTIONS:
-t, --tag: 指定构建出的镜像的名字
PATH: dockerfile文件的目录
```
### 3.2 Dockerfile基础指令
- FROM
```dockerfile
FROM 镜像名 -> 原始镜像
FROM 镜像名:tag
# FROM必须要出现Dockerfile的第一行(除注释), 可以连续写多个FROM创建多个镜像.
# 如果指定的镜像名本地仓库没有, 会从远程仓库pull到本地, 远程仓库也没有 -> 报错.
```
- MAINTAINER
```Dockerfile
dockerfile维护者信息
MAINTAINER 维护人员信息
MAINTAINER zhangsan zhangsan@itcast.com
```
- RUN
```dockerfile
# 构建镜像时候执行的shell命令, 如果命令有确认操作, 必须要加 -y
# 如果命令太长需要换行, 行末尾需要加 \
RUN shell命令
RUN mkdir /home/go/test -p
RUN ["mkdir", "/home/go/test", "-p"]
```
- EXPOSE
```dockerfile
# 设置对外开放的端口
# 容器和外部环境是隔离的, 如何向从外部环境访问到容器内部, 需要容器开发端口
# 在使用的时候, 让宿主机端口和容器开放端口形成一个映射关系, 就可以访问了
# docker run -itd -p 8888:80
EXPOSE 80
```
### 3.3 Dockerfile运行时指令
- CMD
```dockerfile
# 新镜像已经被制作完毕, 启动新镜像-> 得到一个容器
# 容器启动后默认执行的命令
# 一个dockerfile文件只能指定一个CMD指令
# 如果指定多个, 只有最后一个有效
# 该CMD会被 docker run指定的shell命令覆盖
CMD shell命令
CMD ["shell命令", "命令参数1", "命令参数2"]
```
- ENTRYPOINT
```dockerfile
# docker容器启动之后执行的命令, 该命令不会被docker run指定的shell指令覆盖
# ENTRYPOINT只能指定一个, 指定多个, 只有最后一有效
# ENTRYPOINT 和 CMD可以同时指定
# 如果想被docker run覆盖, 启动docker容器时可使用docker run --entrypoint
ENTRYPOINT shell命令
ENTRYPOINT ["shell命令", "命令参数1", "命令参数2"]
```
- CMD ENTRYPOINT 综合使用
```dockerfile
docker run -itd ubuntu
# 任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到ENTRYPOINT指令之后
ENTRYPOINT mkdir /home/go/a/b/c/d/e/f -p
CMD -p
mkdir /home/go/a/b/c/d/e/f -p
```
### 3.4 Dockerfile文件编辑指令
- ADD
```dockerfile
# 将宿主机文件拷贝到容器目录中
# 如果宿主机文件是可识别的压缩包, 会进行解压缩 -> tar.gz tar.bz2
rar
zip
ADD 宿主机文件 容器目录/文件
ADD ["宿主机文件", "容器目录/文件"]
# 实例
ADD ["宿主机文件", "容器目录"]
- 宿主机文件: 一般放到和Dockerfile同一级目录中
- 容器目录: 不存在, 会自动创建
ADD ["a.txt", "/home/go/b.txt"]
- a.txt: 放到了和Dockerfile同一级目录中
- /home/go/a.txt:
如果a.txt存在: 覆盖
如果不存在: 直接拷贝到go目录中
a.tar.gz -> 解压得到mytest目录
ADD ["a.tar.gz", "/home/go/"]
- 会在/home/go中得到一个目录: mytest
```
- COPY
```dockerfile
# COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
# 单纯复制文件场景,Docker 推荐使用COPY
COPY ["a.tar.gz", "/home/"]
```
- VOLUME
```dockerfile
# VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
# 通过VOLUME 指定挂载点目录是自动生成的。
VOLUME ["/data"]
# 数据卷容器
docker run -itd -v /backup --name container ubuntu bash
- 当前container可以是一个数据卷容器, 挂载点: /backup
```
### 3.5 Dockerfile环境指令
- ENV
```dockerfile
# 设置环境变量,可以在RUN 之前使用,然后RUN 命令时调用,容器启动时这些环境变量都会被指定
ENV <key> <value> (一次设置一个环境变量)
ENV <key>=<value> ... (一次设置一个或多个环境变量)
ENV HELLO 12345
ENV HELLO=12345
ENV HELLO=12345 WORLD=12345 NIHAO=12345
```
- WORKDIR
```dockerfile
# 切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录。相当于cd
# 可以多次切换(相当于cd 命令),
# 也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR /path/to/workdir
RUN a.sh
WORKDIR /path
WORKDIR to # 相对路径
WORKDIR workdir
RUN pwd
/path/to/workdir
```
- USER
```dockerfile
# 指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
# 如果不输入任何信息,表示默认使用root 用户
USER root
```
- ARG
```dockerfile
# 通过外部命令向dockerfile传参
$ docker build [OPTIONS] PATH | URL | -
docker build --build-arg
ARG <name>[=<default value>]
```
```dockerfile
FROM ubuntu
ARG myname
ARG index
```
```shell
docker build --build-arg myname=hello index=1
```
### 3.6 Dockerfile触发器指令
- ONBUILD
```dockerfile
# 当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,
# 新镜像B在构建的时候,会插入触发器中的指令。
ONBUILD [command]
# 原始镜像 -> 纯净版
-> 修改 ONBUILD ["echo", "hello,linux"]
# 基于原始镜像制作新镜像 -> 镜像A
-> 启动镜像A -> 不会输出hello, linux
# 基于镜像A制作了镜像B
-> 启动镜像B -> 会输出 hello, linux
```