【9.0】Docker之Dockerfile
【引入】部署的镜像来源
【1】从仓库拉取
- 从仓库拉取:可以通过使用
docker pull
命令从远程仓库拉取已经构建好的镜像。- 例如,要拉取名为
nginx
的镜像,可以运行以下命令:
- 例如,要拉取名为
docker pull nginx
【2】容器做成镜像
- 可以使用
docker commit
命令将正在运行的容器创建成一个新的镜像。- 这对于需要定制化的镜像非常有用。
- 下面是一个示例命令,将容器ID为
abc123
的容器创建成一个名为my-image
的新镜像:
docker commit abc123 my-image
【3】备份恢复
- 可以通过使用
docker save
和docker 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容器即可(第三方依赖发生变化)
- 重写构建镜像,运行容器