Docker - Dockerfile 构建镜像

Dockerfile 构建镜像

1.简介

Docker镜像是分很多层的

Dockerfile 由一行行命令语句组成, 并且支持以开头的注释行

一般而言, Dockerfile 主体内容分为4部分:

  • 基础镜像信息(必须的)
  • 维护者信息
  • 镜像操作指令
  • 容器启动时执行指令

Docker 以从上到下的顺序运行 Dockerfile 的指令

为了指定基本映像,第一条指令必须是 FROM

一个声 明以字符开头则被视为注释

可以在 Docker 文件中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令

指令 释义
FROM 指定基础镜像
MAINTAINER 维护者的信息
RUN 在容器内部 执行的命令
ADD 添加文件至镜像内(可以自动解压:仅限于tar格式的压缩包)
CMD 启动容器时 执行的命令
ENTRYPOINT 同CMD,但这个一定会被执行,不会被覆盖修改
ENV 设置执行命令时的环境变量,并且在构建完成后,仍然生效
ARG 设置只在构建过程中使用的环境变量,构建完成后,将消失
COPY 将本地文件或目录拷贝到镜像的文件系统中
USER 指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令
ONBUILD 当 当前镜像 被当做基础镜像时 执行的命令
WORKDIR 当前工作目录
VOLUME 目录挂载(添加数据卷)
EXPOSE 设置向外暴露的端口号
STOPSIGNAL 设置容器退出时发出的关闭信号
HEALTHCHECK 设置容器状态检查
LABEL 用于为镜像添加元数据
SHELL 更改执行shell命令的程序。Linux的默认shell是["/bin/sh","-c"],Windows的是["cmd", "/S", "/C"]

2.编写指令的文件 - 名称必须是:Dockerfile

# 1.创建一个编写指令的文件:Dockerfile
touch Dockerfile

3.编写构建镜像的指令

① FROM - 指定基础镜像(作为构建新镜像时 提供一个基础环境)

语法
FROM [镜像名称]
FROM [镜像]:[版本号]
FROM [镜像]@[摘要]

② MAINTAINER - 维护者信息

MAINTAINER [维护者的信息]

③ RUN - 构建镜像时 在镜像中执行的命令

RUN [Linux命令]

④ ADD - 将本地文件复制到镜像中

  • 可以添加网络资源
  • 会自动解压.tar格式的网络资源
  • 宿主机的文件路径可以是绝对路径,也可以是相对路径
  • 文件路径的权限也需要注意
ADD [宿主主机文件路径] [镜像相对应的文件路径]

⑤ COPY - 功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源

COPY [宿主主机文件路径] [镜像相对应的文件路径]

⑤ CMD - 指定容器启动时 默认执行的命令

CMD [容器启动时 在容器内执行的命令]

⑥ LABEL - 用于为镜像添加元数据

LABEL <key>=<value> <key>=<value> <key>=<value>

LABEL version="1.0" description="这是一个 Web 服务器" by="IT 笔录"

⑦ ENV- 设置环境变量

ENV <key> <value>

ENV MYSQL_ROOT_PASSWORD=123456

⑧ EXPOSE - 指定于外界交互的端口

EXPOSE 并不会让容器的端口访问到主机

要使其可访问,需要在 docker run 运行容器时通过-p 来发布这些端口

或通过-P 参数来发布 EXPOSE 导出的所有端口

EXPOSE <port>

EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp

⑨ VOLUME - 用于指定持久化目录(挂载)

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能

  • 卷可以容器间共享和重用
  • 容器并不一定要和其它容器共享卷
  • 修改卷后会立即生效
  • 对卷的修改不会对镜像产生影响
  • 卷会一直存在,直到没有任何容器在使用它
VOLUME ["/path/to/dir"]

⑩ WORKDIR - 工作目录,类似于 cd 命令

通过 WORKDIR 设置工作目录后,Dockerfile 中其后的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都会在该目录下执行

在使用 docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录

WORKDIR /path/to/workdir

WORKDIR /a	# 这时工作目录为/a
WORKDIR b	# 这时工作目录为/a/b
WORKDIR c	# 这时工作目录为/a/b/

⑩① ARG - 用于指定传递给构建运行时的变量

ARG <name>[=<default value>]

ARG site
ARG build_user=www

⑩② ONBUILD - 用于设置镜像触发器

当所构建的镜像被用做其它镜像的基础镜像时,构建镜像前会执行

ONBUILD [INSTRUCTION]

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

4.开始构建

选项 释义
-t 指定镜像名称
-f 指定Dockerfile路径
docker build [选项] [自定义镜像名称] [dockerfile]

5.实例

vim Dockerfile
i
FROM busybox:latest
CMD echo "Hello World"
Esc
:wq
docker build -t test/busybox01 .
docker images
docker run -d --name busybox001 test/busybox01
docker logs busybox001


# 创建1个Dockerfile
[root@localhost ~]# vim Dockerfile

# 按i进入插入模式
i

# 输入如下内容
FROM busybox:latest
CMD echo "Hello World"

# 按 Esc 退出插入模式  按 :wq 进行保存
Esc
:wq

# 构建镜像test/busybox01 到当前目录.
[root@localhost ~]# docker build -t test/busybox01 .
Sending build context to Docker daemon  7.786MB
Step 1/2 : FROM busybox:latest
 ---> dc3bacd8b5ea
Step 2/2 : CMD echo "Hello World"
 ---> Running in f5b2496a4cd3
Removing intermediate container f5b2496a4cd3
 ---> 3798dc9e5d7b
Successfully built 3798dc9e5d7b	# 构建出的镜像ID
Successfully tagged test/busybox01:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
test/busybox01      latest              3798dc9e5d7b        About a minute ago   1.23MB
nginx               latest              bc9a0695f571        8 days ago           133MB
busybox             latest              dc3bacd8b5ea        9 days ago           1.23MB
mysql               5.7                 ae0658fdbad5        12 days ago          449MB
mysql               5.7.32              ae0658fdbad5        12 days ago          449MB
redis               latest              74d107221092        2 weeks ago          104MB
centos              latest              0d120b6ccaa8        3 months ago         215MB
python              3.6.8               48c06762acf0        18 months ago        924MB

# 用 test/busybox01镜像 运行一个容器 busybox001
[root@localhost ~]# docker run -d --name busybox001 test/busybox01
5e53fd64cb19359395075f59a49e7c51bd723ad028365a3b02e74b853ce93de2

# 查看容器busybox001的日志
[root@localhost ~]# docker logs busybox001
Hello World	# 这个就是容器输出的内容

ALLOW_HOST = []
ALLOW_HOST = ['*']
vim Dockerfile

FROM busybox:latest
RUN touch index.html
RUN echo "Hello" > index.html
CMD cat index.html

docker build -t test/busybox:v2 .

docker images

docker run -d --name busybox002 test/busybox:v2

docker logs busybox01



vim Dockerfile

FROM busybox:latest


ADD xxx.zip /root

RUN touch index.html
RUN echo "Hello" > index.html
CMD cat index.html

docker build -t test/busybox:v3 .

docker images

docker run -d --name busybox003 test/busybox:v3

docker logs busybox003
vim Dockerfile

# 1.指定基础镜像
FROM python:3.6.8

# 2.安装django
RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/

# 3.创建1个django项目
RUN django-admin startproject blog
RUN cd blog && python3 manage.py startapp app01

## 3.将当前目录的文件 复制到镜像中(此处不能用绝对路径)
ADD django_proj01 /root

# 4.设置启动命令
CMD cd /root && python3 manage.py runserver 0.0.0.0:8000


docker build -t test/django:v1 .

docker run -dit -p 30000:8000 --name django01 --network host test/django:v1

安装Nginx

# 1.安装yum工具
yum install yun-utils -y

# 2.创建文件
touch /etc/yum/repos.d/nginx.repo

# 3.编辑文件


# 4.生成yum缓存
yum makecache

# 5.安装nginx
yum install nginx -y


# 6.配置dialing


# 7.设置配置文件
nginx -t:测试配置文件
nginx -g 'daemon off;'	# 在前台启动nginx

构建nginx

mkdir teach
cd teach
mkdir django
mkdir nginx
cd nginx
touch Dockerfile
vim nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx_mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


vim Dockerfile


# 设置基础镜像
FROM centos:7

# 安装wget
yum install wget -y

# 换源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo


# 创建nginx源的文件
ADD nginx.repo /etc/yum/repos.d/

# 刷新yum缓存
RUN yum makecache

# 安装yum工具
RUN yum install yum-utils -y

# 安装nginx
RUN yum install nginx -y

# 复制配置文件
ADD default.conf /etc/nginx/conf.d/

# 设置启动命令
CMD nginx -g "daemon off;"

docker build -t nginx:v1 .

Dockerfile

# 设置基础镜像
FROM centos

RUN yum install wget -y

# 换源
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

RUN cd /etc/yum.repos.d && wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

RUN mv /etc/yum.repos.d/CentOS7-Base-163.repo /etc/yum.repos.d/CentOS-Base.repo

# 创建nginx源的文件
ADD nginx.repo /etc/yum.repos.d/ 

# 刷新yum缓存
RUN yum makecache

# 安装yum工具
RUN yum install yum-utils -y

# 安装Nginx
RUN yum install nginx -y

# 复制配置文件
ADD default.conf /etc/nginx/conf.d/

# 设置启动命令
CMD nginx -g 'daemon off;'

default.conf

upstream django {
    server django:8000;
}

server {
    listen 80;
    server_name _;
    location / {
        proxy_pass http://django;
        index index.html index.htm;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

mine

all

cd /root
mkdir mine
cd mine 
mkdir django
mkdir mysql

mysql

cd /root/mine/mysql
vim Dockerfile

# 1.指定基础镜像
FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD=123456
RUN mysql -uroot -p123456
RUN create database blog01 default charset utf8;
EXPOSE 3306

docker build -t mysql:v1 .

docker run -dit -p 3306:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:v1


docker run -dit -p 3306:3306 --name mysql01 mysql:v1

django

cd /root/mine/django
vim Dockerfile

# 1.指定基础镜像
FROM python:3.6.8

# 2.安装django
# RUN pip3 install django==2.2.2 -i https://pypi.douban.com/simple/

# 3.将当前目录的文件 复制到镜像中(此处不能用绝对路径)
ADD django_blog /root

# 4.安装依赖
CMD pip3 install -r requirements.txt -i https://pypi.douban.com/simple/

EXPOSE 8000


# 4.设置启动命令
CMD python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000


docker build -t django:v1 .

docker run -dit -p 8000:8000 --name django01 --network host django:v1
docker run -dit -p 8000:8000 --name django03 django:v2 
posted @ 2020-12-18 21:12  轻描丨淡写  阅读(201)  评论(0编辑  收藏  举报