【9.0】Docker之Dockerfile

发布时间 2023-08-29 15:57:41作者: Chimengmeng

【引入】部署的镜像来源

【1】从仓库拉取

  • 从仓库拉取:可以通过使用docker pull命令从远程仓库拉取已经构建好的镜像。
    • 例如,要拉取名为nginx的镜像,可以运行以下命令:
docker pull nginx

【2】容器做成镜像

  • 可以使用docker commit命令将正在运行的容器创建成一个新的镜像。
    • 这对于需要定制化的镜像非常有用。
    • 下面是一个示例命令,将容器ID为abc123的容器创建成一个名为my-image的新镜像:
docker commit abc123 my-image

【3】备份恢复

  • 可以通过使用docker savedocker load命令备份和恢复镜像。
  • 首先,使用docker save将镜像保存为一个压缩包文件,例如:
docker save -o my-image.tar my-image

然后,使用docker load从该压缩包文件中恢复镜像:

docker load -i my-image.tar

【4】Dockerfile构建

  • 可以使用Dockerfile文件来定义镜像的构建过程,包括基础镜像、软件安装、配置等。
    • 使用docker build命令根据Dockerfile构建镜像。
    • 以下是一个简单的Dockerfile示例:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • 然后,使用以下命令在Dockerfile所在目录中构建镜像:
docker build -t my-image .

【补充】构建私有仓库(hu.docker)

  • 为了构建私有仓库,可以使用Docker官方提供的Registry镜像作为基础。
  • 首先,通过运行以下命令拉取Registry镜像:
docker pull registry
  • 接下来,运行以下命令启动Registry容器:
docker run -d -p 5000:5000 --name=registry registry
  • 这将在本地启动一个Registry服务,并将其映射到主机的5000端口。现在,您可以通过指定localhost:5000<your-host-ip>:5000来访问私有仓库。
  • 为了将镜像推送到私有仓库,首先需要给镜像一个特定的标签,使用私有仓库地址作为前缀。例如,给名为my-image的镜像添加私有仓库标签:
docker tag my-image localhost:5000/my-image
  • 然后,使用以下命令将镜像推送到私有仓库:
docker push localhost:5000/my-image
  • 这样,镜像就被推送到了私有仓库中。其他机器可以使用docker pull命令从私有仓库拉取镜像。
  • 需要注意的是,私有仓库需要进行适当的认证和授权配置,以确保只有授权用户可以访问和推送镜像。
  • 这涉及到更复杂的配置和管理,请参考Docker文档或相关教程进行配置和管理。

【一】什么是Dockerfile

  • Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
  • 1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  • 2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
  • 3、对于运维人员:在部署时,可以实现应用的无缝移植。

【二】Dockerfile常用命令

命令 作用
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录

【三】构建镜像案例

【1】引言

  • 构建一个带 vim 的centos:7镜像,根路径下有一个 test.txt 文件

【2】操作步骤

  • 打开一个 Dockerfile 文件(必须叫这个文件名)
vim Dockerfile
  • 将下面的内容 复制进去
# 基础镜像
FROM centos:7
# 指定维护者
MAINTAINER dream
# 设置一个环境变量
ENV name dream
# 执行安装命令
RUN yum install vim -y
# 执行创建文件夹命令
RUN mkdir /newfile
# 摸一下test.py(创建)
RUN touch /newfile/test.py
# 将 print('hellow') 写入到 /newfile/test.py 文件里
RUN echo 'print('hellow')' >/newfile/test.py
# 将 /root/newfile/newtest.txt (本机文件) 拷贝到  /newfile/newtest.txt 镜像文件
COPY ./newtest.txt /newfile/newtest.txt
# 设置当前工作目录
WORKDIR /dream
  • 在本地创建一个文件
    • copy 本地文件到镜像,本地必须要先有一个文件
[root@dream ~]# mkdir newfile
[root@dream ~]# ls
newfile  
[root@dream ~]# cd newfile
[root@dream newfile]# ls
[root@dream newfile]# vim newtest.txt
[root@dream newfile]# ls
newtest.txt
[root@dream newfile]# vim Dockerfile
[root@dream newfile]# ls
Dockerfile  newtest.txt
  • 基于Dockerfile 构建镜像
    • . 基于当前路径下的 Dockerfile 文件构建镜像
docker build -t="centos_dream_vim" .
[root@dream newfile]# pwd
/root/newfile
[root@dream newfile]# ls
Dockerfile  newtest.txt
[root@dream newfile]# docker build -t="centos_dream_vim" .
[+] Building 56.7s (12/12) FINISHED                                                                 docker:default
 => [internal] load .dockerignore                                                                             0.0s
 => => transferring context: 2B                                                                               0.0s
 => [internal] load build definition from Dockerfile                                                          0.0s
 => => transferring dockerfile: 616B                                                                          0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                   0.0s
 => [1/7] FROM docker.io/library/centos:7                                                                     0.0s
 => [internal] load build context                                                                             0.1s
 => => transferring context: 121B                                                                             0.0s
 => [2/7] RUN yum install vim -y                                                                             49.7s
 => [3/7] RUN mkdir /newfile                                                                                  0.7s
 => [4/7] RUN touch /newfile/test.py                                                                          0.7s 
 => [5/7] RUN echo 'print('hellow')' >/newfile/test.py                                                        0.6s 
 => [6/7] COPY ./newtest.txt /newfile/newtest.txt                                                             0.1s 
 => [7/7] WORKDIR /dream                                                                                      0.1s 
 => exporting to image                                                                                        4.7s 
 => => exporting layers                                                                                       4.7s
 => => writing image sha256:b2223859566ec2e2843806be118a7b46647fbd0c07c8c66436b80577922e8593                  0.0s
 => => naming to docker.io/library/centos_dream_vim                                                           0.0s
  • 查看已经做好的镜像
docker images
[root@dream newfile]# docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
centos_dream_vim   latest    b2223859566e   40 seconds ago   478MB
redis              latest    506734eb5e71   11 days ago      138MB
centos             7         eeb6ee3f44bd   23 months ago    204MB
  • 基于这个镜像运行容器
docker run -id --name xx centos_dream_vim
[root@dream newfile]# docker run -id --name xx centos_dream_vim
64cd5790fcea33873c732656e713bfe36ad1f4188ff2da2160e28778aa78c595
[root@dream newfile]# docker ps
CONTAINER ID   IMAGE              COMMAND       CREATED          STATUS          PORTS     NAMES
64cd5790fcea   centos_dream_vim   "/bin/bash"   5 seconds ago    Up 3 seconds              xx
62f7be788c95   centos:7           "/bin/bash"   15 minutes ago   Up 15 minutes             dreamcentos
[root@dream newfile]# 
  • 进入到容器
docker exec -it xx /bin/bash
[root@dream newfile]# docker exec -it xx /bin/bash
[root@64cd5790fcea dream]# 

【四】纯干货!Docker Dockerfile指令大全

  • Dockerfile是用于构建Docker镜像的文本文件,其中包含了一系列指令(Instructions),用来描述镜像的构建过程。

  • 下面是每个指令的详细解释以及相关案例。

  • FROM:

    • 指定基础镜像,表示当前镜像是基于哪个镜像构建的。

    • 示例:FROM ubuntu:latest

  • RUN:

    • 在镜像中执行命令。可以用于安装软件包、运行编译命令等。

    • 示例:RUN apt-get update && apt-get install -y <package>

  • CMD:

    • 定义容器启动时要执行的命令。可以有多个CMD指令,但只有最后一个CMD指令会生效。

    • 示例:CMD python app.py

  • ENTRYPOINT:

    • 与CMD类似,定义容器启动时要执行的命令,但ENTRYPOINT的参数不可被覆盖,而CMD可以被命令行参数覆盖。

    • 示例:ENTRYPOINT ["java", "-jar", "app.jar"]

  • COPY:

    • 将文件或目录从主机复制到容器中的指定路径。

    • 示例:COPY app.py /app/

  • ADD:

    • 与COPY相似,不仅可以复制文件或目录,还可以解压缩tar文件和远程URL文件。

    • 示例:ADD http://example.com/package.tar.gz /

  • MAINTAINER:

    • 设置镜像作者的信息。

    • 示例:MAINTAINER John Doe <johndoe@example.com>

  • EXPOSE:

    • 声明容器运行时要监听的端口。不会实际发布端口,只是用来说明容器内部程序使用的网络端口。

    • 示例:EXPOSE 8080

  • ARG:

    • 定义构建镜像过程中的变量,该变量可以在后续指令中使用,并可以通过构建命令(--build-arg)进行传递。

    • 示例:ARG version=latest

  • WORKDIR:

    • 为后续的RUN、CMD、ENTRYPOINT等指令设置工作目录。

    • 示例:WORKDIR /app

  • VOLUME:

    • 在容器中创建一个挂载点,并将它标记为持久化存储的卷。

    • 示例:VOLUME /data

  • USER:

    • 设置容器运行时的用户或用户组。

    • 示例:USER nobody

  • ONBUILD:

    • 定义触发器,指定当当前镜像作为其他镜像的基础镜像时应该执行的操作。

    • 示例:ONBUILD COPY . /app

  • STOPSIGNAL:

    • 设置容器停止时发送给主进程的信号。

    • 示例:STOPSIGNAL SIGTERM

  • HEALTHCHECK:

    • 定义容器的健康检查指令,可用于检测容器是否正常运行。
    • 示例:HEALTHCHECK --interval=5m CMD curl -f http://localhost/ || exit 1

【五】Dockerfile构建一个Django项目

  • 以图书管理系统为例
  • 第一步:有一个项目,pycharm开发者,开发完后
  • 第二步:在项目路径下新建Dockerfile,写入
FROM python:3.8
MAINTAINER dream
WORKDIR /soft
COPY ./requirements.txt /soft/requirements.txt
RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
CMD ["python","manage.py","runserver",'0.0.0.0:8080']
  • 第三步:代码提交到git
  • 第四步:上线人员,在上线机器上,拉取代码
git clone https://gitee.com/xxxx.git
  • 第五步:构建镜像
docker build -t="django_books" .
  • 第六步:运行容器
docker run -id --name=books /root/dream/books:/soft -p 8080:8080 django_books
  • 第七步:其他人访问宿主机的 8080 端口,就能看到项目了

  • 第八步:开发人员继续提交代码

  • 第九步:运维人员 pull 代码。重启容器,用户就可以看到最新版本了

  • 重启docker容器即可(第三方依赖发生变化)
    • 重写构建镜像,运行容器