You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
7.0 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Docker镜像学习
## 镜像构建流程
![构建镜像](images/DockerBuild.png)
## 构建镜像的三种方法
+ 基于已有容器,使用 `docker commit` 命令构建
``` shell
# 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 ` 导入
``` shell
# 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 clis为驻守服务进程。
> docker build 构建镜像时cli只负责把命令和相文件传递给服务进程服务程序接收命令和文件、创建构建上下文、执行构建并产出镜像。
![build](images/build2.png)
## 构建环境
1. Dockerfile中所用的所有文件一定要和Dockerfile文件在同一级父目录下可以为Dockerfile父目录的子目录
2. Dockerfile中相对路径默认都是Dockerfile所在的目录
3. 因Docker构建的分层构建联合挂载的特性Dockerfile中,每一条指令被视为一层,尽量一行写多个指令(&&连接 \用来分行)。
4. 约定:指令大写,内容小写
```shell
# 构建流程
# docke build . 默认构建
# 输出,#行为手动添加的说明
# 加载 Dockerfile 文件
=> [internal] load build definition from Dockerfile
# 把 dockerfile 文件传输到Docker守护进程服务大小为 149B 0.0s
=> => transferring dockerfile: 149B
# 加载.dockerignore(Dockerfile目录下不上传文件配置文件) 文件 0.0s
=> [internal] load .dockerignore
# 传输构建上下文会传Docfile目录及子目录中除.dockerignore配置外的所有文件及文件夹 0.0s
=> => transferring context: 2B
# 从基础镜像加载元数据 0.0s
=> [internal] load metadata for docker.io/library/centos:latest
# 加载构建上下文 3.0s
=> [internal] load build context
# 传输构建上下文 0.0s
=> => transferring context: 125B
# 构建第一阶段:下载与验证基础镜像 0.0s
=> [1/2] FROM docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 10.8s
=> => resolve docker.io/library/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 0.0s
=> => sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1 83.52MB / 83.52MB 7.0s
=> => sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 762B / 762B 0.0s
=> => sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc 529B / 529B 0.0s
=> => sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 2.14kB / 2.14kB 0.0s
=> => extracting sha256:a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1
# 构建第二阶段
# 执行命令 3.6s
=> [2/2] ADD ./project/ /usr/local/app/
# 导出镜像 0.3s
=> exporting to image
# 导出镜像层 0.0s
=> => exporting layers
# 写入镜像文件 0.0s
=> => writing image sha256:9f21ab65d16f8a8599aec0ba0c1b31b806ae675be2701a6d671ec42887ab5e56
# 给镜像打标签 0.0s
=> => naming to docker.io/library/mycentos:study1
```
## 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
``` shell
# /bin/sh -c 参数
-c 参数:把后面的命令(字符串)当成一个整体来执行
```