docker食用食谱(二) —— 镜像
2019-11-24 本文已影响0人
谁有羊毛
镜像
以前我在windows上学习linux的时候,都是搭一个linux的虚拟机,现在没想到docker也可以这么简单轻量的启动一个linux的交互式终端,供我们简单的学习
# -i 表示交互式 -t表示终端 --rm表示用后就删除容器 bash表示终端是shell
docker run -it --rm centos:centos7.2 bash
镜像的命令
docker image --help 看到所有的镜像相关的命令
- 查看所有的镜像
docker image ls
- 删除镜像
docker image rm [image_tag_name]
docker image rm [image_id]
- 查看镜像所占的体积 真实的硬盘空间
docker system df
镜像的构建 —— Dockerfile
它是用来构建自定义镜像的
- 基础镜像毕竟是基础镜像,无法满足我们的需求,我们总是要各种定制(为了方便),而方式有二:docker commit 和 Dockerfile ,由于docker commit实在不容易记录更改,日久就忘了。所以 Dockerfile 就成了我们的选择
- 一个 Dockerfile 可能长这样:
# 基础镜像
FROM python:3.7.5-slim
# 工作目录
WORKDIR /home/user/app
# 复制当前目录下所有文件入容器目录(自动创建目录)
COPY / /home/user/app
# 构建层 执行各种命令
RUN pip install flask
# 声明一个端口用以随机映射
EXPOSE 5000
# 声明数据卷
VOLUME /data
# 容器启动后执行的命令
CMD ["python","index.py"]
- FROM base_image_name
# FROM表示从一个镜像为基础来构建
FROM debian
- RUN 这玩意儿运行一次就构建一层,所以尽量少构建层
一次RUN完
# 这个可以用以装环境依赖什么的
RUN apt-get update \
&& apt-get install -y python3 && pip3 install flask \
&& rm -rf /var/lib/apt/lists/*
- COPY 复制文件命令
命令 源地址 镜像中的目录
COPY / /home/user/app/
# 将操作的主机的目录下的文件(比如build好的文件)copy到镜像的目录下
- WORKDIR
WORKDIR /home/user/app
# 这样就可以指定工作目录 即使没有也会递归创建整个路径
- CMD
cmd命令 容器运行的时候,是以服务该主进程的,当CMD这个命令执行结束的时候,那就结束了,所以没必要去后台运行进程
CMD ["python3","index.py"]
index.py内容如下:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0')
- EXPOSE 暴露端口
# 这个EXPOSE 的作用在于使用运行docker run -P ...... 命令的时候,会使用宿主机的随机端口来自动映射到这个声明的端口
# docker run -p <宿主端口>:<容器端口> -t [container_tag_name]
EXPOSE 5000
- ENV 配置环境变量
# 格式:ENV <key1>=<value1> <key2>=<value2>...
ENV ASP_ENV=production FLASK_ENV=production
- ARG 构建环境变量
# 这个也是一种环境变量,只不过它只存在与构建镜像的时候,运行的时候并不存在,主要对于CI系统的一些构建会比较有用
ARG NODE_VERSION=10.1
- VOLUME 数据卷 又一个很重要的东西,类似一个路径映射关系。注意:数据卷是一个关系。同时无法在创建镜像是指定本机目录,只能声明这个卷,创建容器的时候才能关联本机目录
# 我们数据持久化会用到这个东西,比如你的mysql,这个就必不可少了
# 定义一个匿名卷
命令 镜像使用的目录
VOLUME /data
# 该命令会关联本机目录 创建一个匿名的卷,同时把本地路径/var/user/data 映射到容器的 /data目录,也就是在容器中访问/data就是访问本地的/var/user/data 目录
docker run -v /var/user/data:/data -t [image_tag_name]