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.1 KiB
Markdown

3 years ago
# Docker镜像学习
## 镜像构建流程
![构建镜像](images/DockerBuild.png)
## 构建镜像的三种方法
+ 基于已有容器,使用 `docker commit` 命令构建
3 years ago
``` shell
3 years ago
# 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 ` 导入
3 years ago
``` shell
3 years ago
# 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. 约定:指令大写,内容小写
3 years ago
3 years ago
```shell
# 构建流程
# docke build . 默认构建
# 输出,#行为手动添加的说明
# 加载 Dockerfile 文件
3 years ago
=> [internal] load build definition from Dockerfile 0.0s
# 把 dockerfile 文件传输到Docker守护进程服务大小为 149B
=> => transferring dockerfile: 149B 0.0s
# 加载.dockerignore(Dockerfile目录下不上传文件配置文件) 文件
=> [internal] load .dockerignore 0.0s
# 传输构建上下文会传Docfile目录及子目录中除.dockerignore配置外的所有文件及文件夹
=> => 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
# 构建第一阶段:下载与验证基础镜像
3 years ago
=> [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 years ago
# 执行命令
=> [2/2] ADD ./project/ /usr/local/app/ 3.6s
# 导出镜像
=> exporting to image 0.3s
# 导出镜像层
=> => exporting layers 0.0s
# 写入镜像文件
3 years ago
=> => writing image sha256:9f21ab65d16f8a8599aec0ba0c1b31b806ae675be2701a6d671ec42887ab5e56
3 years ago
0.0s
# 给镜像打标签
=> => naming to docker.io/library/mycentos:study1 0.0s
3 years ago
```
3 years ago
## 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/
```
## 命令
3 years ago
+ FROM
3 years ago
3 years ago
> FROM 指令必须是非注释的第一个指令(新版AGU指令可值于前面) 可以使用 “ AS 别名” 提供别名,在路另外使用( --from=别名)。
3 years ago
>
> 指定了基础镜像,后面的所有指令都是运行在该基础镜像环境上的。
>
> 如果不以任何镜像为基础那么写法为FROM scratch
```dockerfile
#语法格式
FROM <image>
FROM <image>:<tag>
3 years ago
FROM <image>@<digestmd5>
3 years ago
# 特殊例子
#不以任何镜像为基础(内置空白镜像)
FROM scratch
# busybox是一个软件工具箱镜像集成了linux中几百个常用的linux命令以及工具。
# 大小只有1.2M,适合用来测试
FROM busybox
# .net core sdk
3 years ago
FROM mcr.microsoft.com/dotnet/sdk:2.1 AS build
3 years ago
```
## run
3 years ago
``` shell
3 years ago
# /bin/sh -c 参数
-c 参数:把后面的命令(字符串)当成一个整体来执行
```