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