目录
01 23-dockerfile的run和maintainer
01 16-docker常用的网络模式
- 容器连接网络
```shell
docker network connect [OPTIONS] NETWORK CONTAINER
```
### 2.4 host网络
```shell
$ docker run -itd --name test3 --network host ubuntu bash
```
## 3. Dockerfile
### 3.1 Dockerfile介绍
```shell
# 编写dockfile文件
# 构建一个基于ubuntu的docker定制镜像
# 基础镜像
FROM ubuntu:v1.0
# 镜像作者
MAINTAINER panda kstwoak47@163.com
02 17-创建桥接网络
# 执行命令
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对应的目录中执行一个命令, 构建新的镜像
03 18-容器加入到指定网络中
```shell
docker build -t mynginx:v2.0 dockerfile所在的目录(.)
-t, --tag: 指定构建出的镜像的名字
```
### 3.2 Dockerfile基础指令
- FROM
```dockerfile
FROM 镜像名
FROM 镜像名:tag
# FROM必须要出现Dockerfile的第一行(除注释), 可以连续写多个FROM创建多个镜像.
# 如果指定的镜像名本地仓库没有, 会从远程仓库pull到本地, 远程仓库也没有 -> 报错.
```
- MAINTAINER
```Dockerfile
dockerfile维护者信息
MAINTAINER 维护人员信息
```
04 19-容器添加到网络和从网络中删除
- 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
```
05 20-host网络的使用
### 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"]
```
01 21-dockerfile介绍
- CMD ENTRYPOINT 综合使用
```dockerfile
docker run -itd ubuntu
# 任何docker run设置的命令参数或者CMD指令的命令,都将作为ENTRYPOINT 指令的命令参数,追加到ENTRYPOINT指令之后
ENTRYPOINT mkdir /home/go/a/b/c/d/e/f
CMD -p
mkdir /home/go/a/b/c/d/e/f -p
```
### 3.4 Dockerfile文件编辑指令
- ADD
```dockerfile
# 将宿主机文件拷贝到容器目录中
# 如果宿主机文件是可识别的压缩包, 会进行解压缩 -> tar
ADD 宿主机文件 容器目录/文件
# 实例
ADD ["宿主机文件", "容器目录"]
- 宿主机文件一般放到Dockerfile对应的目录中
- 容器目录, 有可能存在, 有可能不存在
- 存在: 直接拷贝到容器目录
- 不存在: 先在容器中创建一个, 再拷贝
ADD ["a.txt", "/home/go/a.txt"]
- 第二个参数如果指定的是一个文件名
- 这个文件存在: 直接覆盖
- 不存在: 直接拷贝
02 22-dockerfile演示
COPY
```dockerfile
# COPY 指令和ADD 指令功能和使用方式类似。只是COPY 指令不会做自动解压工作。
# 单纯复制文件场景,Docker 推荐使用COPY
COPY ["a.tar.gz", "/home/"]
```
- VOLUME
```dockerfile
# 数据卷容器创建, 挂载点为/backup
docker create -it --name contains -v /backup ubuntu bash
# 其他容器挂载到数据卷容器上
docker run -itd --volumes-from contains ubuntu bash
# VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点
# 通过VOLUME 指定挂载点目录是自动生成的。
VOLUME ["/data"]
01 23-dockerfile的run和maintainer
## 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
```
02 24-RUN和EXPOSE关键字
- USER
```dockerfile
# 指定运行容器时的用户名和UID,后续的RUN 指令也会使用这里指定的用户。
# 如果不输入任何信息,表示默认使用root 用户
USER daemon
```
- ARG
```dockerfile
# ARG 指定了一个变量在docker build 的时候使用,可以使用--build-arg <varname>=<value>来指定参数的值。
ARG <name>[=<default value>]
```
03 25-ENTRYPOINT和CMD关键字
### 3.6 Dockerfile触发器指令
- ONBUILD
```dockerfile
# 当一个镜像A被作为其他镜像B的基础镜像时,这个触发器才会被执行,
# 新镜像B在构建的时候,会插入触发器中的指令。
ONBUILD [command]
04 26-COPY,ADD,VOLUME关键字
# 原始镜像 -> 纯净版
-> 修改 ONBUILD ["echo", "hello,linux"]
# 基于原始镜像制作新镜像 -> 镜像A
-> 启动镜像A -> 不会输出hello, linux
# 基于镜像A制作了镜像B
-> 启动镜像B -> 会输出 hello, linux
```