|
|
|
|
# Docker镜像学习
|
|
|
|
|
|
|
|
|
|
## 镜像构建流程
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
## 构建镜像的三种方法
|
|
|
|
|
|
|
|
|
|
+ 基于已有容器,使用 `docker commit` 命令构建
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
# 1 创建容器,执行相关操作,之后退出
|
|
|
|
|
docker run -it ubuntu:18.04 /bin/bash
|
|
|
|
|
docker exec -it xxxxxxxx
|
|
|
|
|
|
|
|
|
|
# 2 基于该容器使用构建新的镜像
|
|
|
|
|
docker commit -m "new_image" -a "cnLinuxer" b66 myubuntu:v1
|
|
|
|
|
|
|
|
|
|
参数解释:
|
|
|
|
|
-m选项指定了新镜像的提交信息
|
|
|
|
|
-a标注作者信息
|
|
|
|
|
b66是容器ID
|
|
|
|
|
myubuntu:v1是指定的新镜像名称。
|
|
|
|
|
|
|
|
|
|
# 3 使用新镜像
|
|
|
|
|
docker images
|
|
|
|
|
docker run -it ubuntu:18.04 /bin/bash
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ 基于本地模板,使用 `docker import ` 导入
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
# 1 将现有容器,导出为模板文件
|
|
|
|
|
docker export b66 > /root/myubuntu.tar
|
|
|
|
|
|
|
|
|
|
# 2 模板文件导入为镜像
|
|
|
|
|
docker import /root/myubuntu.tar ruyu/ubuntu:18.04
|
|
|
|
|
|
|
|
|
|
# 3 使用新镜像
|
|
|
|
|
docker images
|
|
|
|
|
docker run xxxx
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+ 基于Dockerfile文件,使用 `docker build` 构建
|
|
|
|
|
|
|
|
|
|
```tex
|
|
|
|
|
# 1 编写Dockerfile文件
|
|
|
|
|
|
|
|
|
|
文件内容示例
|
|
|
|
|
|
|
|
|
|
#指定父镜像
|
|
|
|
|
FROM centos:7.5.1804
|
|
|
|
|
|
|
|
|
|
#指定维护者信息
|
|
|
|
|
MAINTAINER mynginx
|
|
|
|
|
|
|
|
|
|
#将本地nginx软件包上传至容器/usr/local/下
|
|
|
|
|
ADD nginx-1.11.1.tar.gz /usr/local
|
|
|
|
|
|
|
|
|
|
#yum安装依赖软件
|
|
|
|
|
RUN yum -y install vim wget gcc gcc-c++ make openssl-devel pcre-devel
|
|
|
|
|
|
|
|
|
|
#进入nginx工作目录
|
|
|
|
|
WORKDIR /usr/local/nginx-1.11.1/
|
|
|
|
|
|
|
|
|
|
#编译并安装nginx服务
|
|
|
|
|
RUN ./configure --prefix=/usr/local/nginx && make && make install
|
|
|
|
|
|
|
|
|
|
#关闭nginx后台运行
|
|
|
|
|
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
|
|
|
|
|
|
|
|
|
|
#添加nginx的环境变量
|
|
|
|
|
ENV PATH /usr/local/nginx/sbin:$PATH
|
|
|
|
|
|
|
|
|
|
#将容器的80端口映射出来
|
|
|
|
|
EXPOSE 80
|
|
|
|
|
|
|
|
|
|
#执行nginx命令,启动nginx
|
|
|
|
|
CMD ["nginx"]
|
|
|
|
|
|
|
|
|
|
# 2 docker build 构建镜像
|
|
|
|
|
docker build -f Dockerfile -t mynginx:v1 .
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 构建过程(docker build -f Dockerfile -t name .)
|
|
|
|
|
|
|
|
|
|
> docker是c/s架构,c为docker cli,s为驻守服务进程。
|
|
|
|
|
> docker build 构建镜像时,cli只负责把命令和相文件传递给服务进程,服务程序接收命令和文件、创建构建上下文、执行构建并产出镜像。
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 构建环境
|
|
|
|
|
|
|
|
|
|
1. Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下,可以为Dockerfile父目录的子目录
|
|
|
|
|
2. Dockerfile中相对路径默认都是Dockerfile所在的目录
|
|
|
|
|
3. 因Docker构建的分层构建,联合挂载的特性,Dockerfile中,每一条指令被视为一层,尽量一行写多个指令(&&连接 \用来分行)。
|
|
|
|
|
4. 约定:指令大写,内容小写
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Dockerfile文件
|
|
|
|
|
|
|
|
|
|
>Dockerfile是用来定制镜像的文本文件,内容为构Docker建镜像的一条条指令,由Docker build 命令使用,构建Docker镜像。
|
|
|
|
|
|
|
|
|
|
## 文件组成
|
|
|
|
|
|
|
|
|
|
> \# 开头的为注释行
|
|
|
|
|
>
|
|
|
|
|
> 通常包含4部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令,新版“维护者信息”放在LABLE中指定
|
|
|
|
|
>
|
|
|
|
|
> 执行:按照Dockerfile指令顺序,从上到下依次执行。
|
|
|
|
|
|
|
|
|
|
```dockerfile
|
|
|
|
|
# 这是一个示例Dockerfile文件
|
|
|
|
|
FROM busybox
|
|
|
|
|
MAINTAINER username <demo@163.com>
|
|
|
|
|
ENV file=app
|
|
|
|
|
ADD ./project/ /usr/local/$file/
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 命令
|
|
|
|
|
|
|
|
|
|
+ FROM
|
|
|
|
|
|
|
|
|
|
> FROM 指令必须是非注释的第一个指令, 可以使用 “ AS 别名” 提供别名,在路另外使用( --from)。
|
|
|
|
|
>
|
|
|
|
|
> 指定了基础镜像,后面的所有指令都是运行在该基础镜像环境上的。
|
|
|
|
|
>
|
|
|
|
|
> 如果不以任何镜像为基础,那么写法为:FROM scratch
|
|
|
|
|
|
|
|
|
|
```dockerfile
|
|
|
|
|
#语法格式
|
|
|
|
|
FROM <image>
|
|
|
|
|
FROM <image>:<tag>
|
|
|
|
|
FROM <image>@<digest>
|
|
|
|
|
|
|
|
|
|
# 特殊例子
|
|
|
|
|
#不以任何镜像为基础(内置空白镜像)
|
|
|
|
|
FROM scratch
|
|
|
|
|
|
|
|
|
|
# busybox是一个软件工具箱镜像,集成了linux中几百个常用的linux命令以及工具。
|
|
|
|
|
# 大小只有1.2M,适合用来测试
|
|
|
|
|
FROM busybox
|
|
|
|
|
|
|
|
|
|
# .net core例子
|
|
|
|
|
# .net core sdk
|
|
|
|
|
mcr.microsoft.com/dotnet/sdk:2.1 AS build
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## run
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
# /bin/sh -c 参数
|
|
|
|
|
-c 参数:把后面的命令(字符串)当成一个整体来执行
|
|
|
|
|
```
|
|
|
|
|
|