教你如何写dockerfile

本文深入解析Dockerfile的各个指令,包括FROM、MAINTAINER、RUN等,并通过实例展示如何使用这些指令来构建镜像。同时,文章还介绍了构建镜像的高级技巧和运行容器的选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dockerfile 例子

example
From ubuntu:14:04
MAINTAINER foo bar <foo@bar.com>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo"\ndaemon off;">>/etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx
VOLUME ["/data","/etc/nginx/site-enable","/var/log/nginx"]
WORKDIR /etc/nginx
CMD ["nginx"]
EXPOSE 80
EXPOSE 443

指令介绍

FROM: 指定镜像 名字:标签
MAINTAINER:维护者信息
RUN:运行shell脚本 一定要加上-y,创建时不能接受输入
VOLUME: 与主机共享目录 也可运行时 -v
CMD:启动脚本
WORKDIR:为CMD中设置可执行文件设置运行目录
EXPOSE:与主机相连的端口

From 可以有多个,多个则创建多个镜像

Maintainer 维护则信息可省略

Run 脚本

RUN shell
RUN [“apt-get”,“install”,"-y",“nginx”] #非shell
可执行文件 形参
run的执行结果会被缓存,下次创建不想缓存build --no-cache

CMD 启动脚本

CMD shell
CMD [“可执行文件”,“形参”] #无shell

ENTRYPOINT[“可执行文件”] 而后 CMD[“形参”] 分开写

只能执行一次
docker run --entrypoint

EXPOSE 80 443 对主机露端口号

ENV 环境变量

ENV HELLO 1234

ADD 用于向镜像添加文件,要复制的文件,以相对路径,当前目录以内

还会解压缩 解包 对于网络文件只解压缩不解包(tar)
外部文件
网络文件
curl http:/xxxx/tar.gz | tar -xz

COPY 用于添加文件

但不会解压缩包,不能用于网络文件

VOLUME 将目录存储到主机内

VOLUME /data
VOLUME ["/data","/var/log/hello"]
不能指定主机目录
只有在docker run时指定,否则用默认的

USER <用户名>

USER后面所有的 RUN CMD ENTRYPOINT 都是以该用户执行的

WORKDIR

为那些命令设置工作路径
可更换以改变路径

ONBUILD 触发式,当别人用你的镜像的时候,FROM 后面就会执行

ONBUILD RUN touch /hello.txt

可查看 docker inspect -f “{{.ContainerConfig.OnBuild}}” example

构建命令

build命令创建镜像
docker build <选项> <dockerfile路径> --tag 名字:标签 .
docker images 查看
.dockerignore 忽略某些目录 ,遵循go语言规则
经常忽略.git .svn这类

运行选项(在构建完成,后追加到生成容器阶段)

docker run --name hello-nginx -d -p 80:80 -v /root/data:data hello:0.1
docker -d 后台运行
-p 端口映射
-v 文件映射
-e 设置环境变量
–rm 一次性用完即毁坏
–privileged 容器可以有主机内核功能

查看历史

docker history <镜像名orID>:<标签>

复制文件

docker cp hello-nginx:/etc/nginx/nginx.conf ./
docker cp <容器名>:<路径><主机路径>

从容器中创建镜像

docker commit 从容器
docker commit -a “Foo Bar foo@bar.com” -m “add hello.txt” hello-nginx hello:0.2
-a
-m
提交用户注册信息

查看容器文件修改与镜像对比

docker diff hello-nginx
A添加
C修改
D删除

查看内容

docker inspect <内容>

上传私有仓库时,先要打上标签

docker tag : <私有仓库url>:/:
docker push :/:

别名

docker run --link <别的容器名>:<在本容器内叫什么>

docker ps 查看端口号
引用时<别名>:<端口号>

数据卷的概念

主机中挂载到docker容器内的,任何修改都会保存的。
-v [主机(省略就会挂到/var/…docker)]:[容器内]

数据卷容器

docker run -i -t --volumes-from hello-volume(容器名) --name www
这样那些数据卷就会自动挂载到这个容器www中了

创建基础镜像步骤

ubuntu

  1. 安装bootstrap工具
    sudo apt-get install debootstrap
    sudo debootstrap trusty trusty #ubuntu版本代号 目录
    tar -C trusty -c . | sudo docker import - trusty
    打包文件 并且 传给 docker import
    centos
    省略

空镜像
tar cv --files-from /dev/null | sudo dcoker import - scratch
打空包
Dockerfile
From scratch
ADD ./hello /hello
CMD ["/hello"]
ADD 镜像中要包含的文件 <本地路径> <镜像路径>

要编 Dockerfile 来构建 Python 项目,可以按照以下步骤进行操作: 1. 首先,在项目根目录下创建一个名为 `Dockerfile` 的文件。 2. 在 Dockerfile 中,指定基础镜像。可以选择适合你的项目的 Python 基础镜像,例如 `python:3.9`。在 Dockerfile 的第一行添加以下内容: ``` FROM python:3.9 ``` 3. 将项目文件复制到容器中。使用 `COPY` 命令将项目文件复制到容器的工作目录中。如果你的项目文件位于与 Dockerfile 相同的目录中,可以使用以下命令: ``` COPY . /app ``` 这将将当前目录中的所有文件复制到名为 `/app` 的容器目录中。 4. 设置工作目录。使用 `WORKDIR` 命令设置容器中的工作目录为 `/app`: ``` WORKDIR /app ``` 5. 安装项目依赖。如果你的项目有依赖项,在 Dockerfile 中使用 `RUN` 命令来安装它们。例如,如果你使用的是 `pip` 来管理依赖项,可以运行以下命令: ``` RUN pip install -r requirements.txt ``` 这将使用 `pip` 安装 `requirements.txt` 文件中列出的所有依赖项。 6. 暴露端口(如果需要)。如果你的项目需要监听某个端口,可以使用 `EXPOSE` 命令指定要暴露的端口号。例如: ``` EXPOSE 8000 ``` 7. 定义容器启动命令。最后,使用 `CMD` 命令定义容器启动时要运行的命令。这将指定在容器启动时执行的命令或脚本。例如,如果你的项目是一个使用 Flask 构建的 Web 应用程序,可以使用以下命令: ``` CMD ["python", "app.py"] ``` 这将在容器中运行 `app.py` 文件。 完成上述步骤后,你的 Dockerfile 就完成了。你可以使用 Docker 命令来构建和运行项目的 Docker 容器。例如,可以使用以下命令构建镜像: ``` docker build -t my-python-app . ``` 然后,可以使用以下命令运行容器: ``` docker run -p 8000:8000 my-python-app ``` 这将在本地主机的 8000 端口上运行你的 Python 项目。请根据你的项目需要进行相应的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值