Dockerfile与docker-compose容器编排(Docker系列第3章,共3章)

温馨提示

  • 不同的组件需要不同的docker配置(例如容器卷,端口,环境变量等),使用你懂得工具看hub.docker.com官方手册。
  • 不要死记硬背,因为这种东西不是天天要写,过段时间就忘了,很容易引起挫败感。
  • Dockerfile或者Docker-compose的编写,可以安装一些编辑器插件辅助编写。
  • 非官方中文文档镜像地址:https://dockerdocs.cn

Dockerfile

  • 官方文档:https://docs.docker.com/reference/dockerfile/#dockerfile-reference
  • 极简概括:用于构建Docker镜像的文本文件,包含一些指令,用于描述如何构建和配置容器,类比Linux的sh文件。
  • 适用场景:能够使用docker的地方,并且需要复杂的构建,都可以用Dockerfile。
  • 优点:
    • 降低部署成本:使用Dockerfile可以将应用程序、运行时环境和依赖项打包到一个容器镜像中,使得容器部署简单化。
    • 方便版本控制:Dockerfile是文本文件,可以与应用程序的源代码一起进行版本控制。
    • 自动化构建: Dockerfile可以与持续集成和持续交付 (CI/CD) 流程集成,实现自动化构建、测试和部署。
    • 灵活定制: Dockerfile允许DevOps自定义镜像的构建过程,可以根据具体的需求添加、删除或修改指令,实现灵活的定制。
  • 缺点:
    • 学习成本:Dockerfile有自己的语法,需要额外学习。

编写规则

  • 每条保留字(内置关键字)指令都必须为大写字母,后面至少跟随一个参数值。
  • #表示注释
  • 每条指令都会创建一个新的镜像层并对镜像进行提交,(docker会执行类似docker commit的操作,提交一个新的镜像层,然后并运行为一个新的容器,反复以上循环,直到所有命令执行完成)。
  • Dockerfile,D一定要大写。
  • 同一个保留字可使用多次。

保留字说明

  • FROM: 指定基础镜像,用于构建当前镜像的基础。例如 FROM ubuntu:latest 表示基于 Ubuntu 镜像构建,第一个指令必须是它。
  • MAINTAINER (已废弃): 用于指定维护者信息,一般是邮件,但已在 Docker 1.13 版本中废弃,建议使用 LABEL 指令来代替。
  • LABEL: 添加元数据到镜像,通常用于指定镜像的描述信息、版本号、维护者等。
  • RUN: 在镜像构建过程(docker build的时机)中执行命令,用于安装软件包、设置环境变量等,有两种运行方式,一种是shell原生风格,一种是exec风格(RUN ["参数1", "参数2", "参数3"])。
  • CMD: 指定容器启动后(docker run的时机)立即要执行的默认命令。如果 Dockerfile 中存在多个 CMD 指令,只有最后一个 CMD 会生效,支持shell和exec(这是防止空格产生的歧义)风格的指令,在命令行情况下,docker run命令,若与CMD执行的有冲突,则docker run会覆盖CMD中的指令。
  • EXPOSE: 声明容器运行时监听的端口,但并不映射到宿主机端口,就是个摆设。
  • ENV: 设置环境变量,可以在后续的指令中使用。例如 ENV key val,使用$KEY进行引用。也可以写成key=val。
  • ADD: 将文件、目录、URL 等资源复制到容器中。与 COPY 类似,但 ADD 具有解压功能,可以自动解压压缩文件。语法:add 宿主机路径 容器路径
  • COPY: 将本地文件复制到容器中。建议在只需要复制文件而不需要额外处理的情况下使用。
  • ENTRYPOINT: 类似CMD,但与CMD不同的是,指定的命令不会被 Dockerfile 后续的参数覆盖,而是作为参数的执行。当ENTRYPOINT遇见CMD时,CMD的含义就发生了变化,CMD变成了作为ENTRYPOINT的参数值,也就是说ENTRYPOINT为key,CMD为val,在命令行情况下,想要覆盖原本的ENTRYPOINT,需要在命令行添加--entrypoint=原entrypoint 覆盖命令。
  • VOLUME: 容器卷,垃圾玩意配置了死活不生效。
  • USER: 指定运行容器时使用的用户名,默认是root。
  • WORKDIR: 登录进容器后,默认进入的目录,如果下方有COPY、ADD、RUN、CMD、ENTRYPOINT指令,并且参数写的是相对路径,那么WORKDIR参数会影响他们的参考系。
  • ARG: 定义构建参数,用于在构建时传递变量。在构建时通过 --build-arg 参数传递。
  • ONBUILD: 定义触发器指令,用于在构建派生镜像时触发一些操作。
  • STOPSIGNAL: 指定容器停止时发送的信号,默认为SIGTERM。

运行Dockerfile

在Dockerfile所在的目录,执行(最后有个空格和点):

docker build -t 镜像名:tag .

Dockerfile简单实操

假设需要在新的centos上安装ifconfig和vim,启动容器后,进入根目录,并添加/test:/test的容器数据卷(Dockerfile添加不生效,试了20次+)

shell 复制代码
编辑一个Dockerfile
vim /test/Dockfile


FROM centos:latest
LABEL maintainer="zs@163.com"

ENV test_dir /test

#2021 年 12 月 31 日停止更新并停止维护,需要将镜像从 mirror.centos.org 更改为 vault.centos.org
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#yum clean all 是为了节省空间
RUN yum makecache && yum -y install net-tools &&  yum -y install vim && yum clean all

WORKDIR $test_dir
RUN echo ----------Success------------
# 选择默认的shell为bash shell
CMD ["/bin/bash"]


保存退出后,运行Dockerfile
cd /test
docker build -t zs_centos:0.0.1 .

然后运行容器,并添加容器卷
docker run -it -v /test:/test --privileged=true 7611bfc76047 /bin/bash

docker-compose

  • 官方文档:https://docs.docker.com/compose/reference
  • 极简概括:使用一个docker-compose.yml文件来配置多个容器的启动关闭和加载顺序,实现集群化统一管理的docker官方工具。
  • 适用场景:多容器部署。对于小公司或个人几乎用不到,10个任意规模的公司,用docker的有3个,用容器编排可能就1个,并不是所有的公司都有分布式、微服务、或集群。
  • 两个重要概念:
    • 项目:项目是Docker Compose管理的一个单元,它由一个或多个服务组成,一个docker-compose.yml管理一个项目。
    • 服务:一个或多个容器组成一个服务,服务是个模糊的概念,可以理解为一个或多个容器对外提供一种解决方案。
    • 辅助记忆:一个docker-compose.yml管一个项目,一个项目管多个服务,一个服务管单个或多个容器。
  • 优点:
    • 简化多容器部署流程。
    • 对多个容器实现统一管理。
  • 缺点:
    • 学习成本大:DockerCompose有自己的语法,增加学习成本,可以照着官方文档的docker run命令去实现。
    • 局限性:大规模复杂化的部署,可能需要更复杂的编排工具,或者更加精细化个性化的配置,这需要更复杂的编排计划。
    • 不支持跨主机:对于需要跨多个主机进行部署和管理的场景,可能需要使用其它容器编排工具,如 Kubernetes(K8S)。
  • 安装:
shell 复制代码
curl -SL https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

docker-compose --version

docker-compose.yml保留字

https://docs.docker.com/compose/compose-file/compose-file-v3/

  • version:定义Docker Compose文件的版本。例如,version: '3'表示使用Docker Compose的第3个版本。
  • services:定义各种服务的配置。每个服务可以包括镜像、端口映射、环境变量等信息。
  • networks:定义网络配置,包括网络驱动、IP范围等,相当于docker run --network
  • volumes:定义存储卷的配置,用于持久化数据。
  • build:参数跟路径,用于构建镜像,可以指定Dockerfile的路径去构建镜像。
  • image:指定使用的镜像名称。
  • ports:定义端口映射,将容器内部的端口映射到宿主机上。
  • environment:设置容器的环境变量,相当于docker run -e。
  • depends_on:参数值为依赖的服务名,定义服务之间的依赖关系,确保一个服务在另一个服务启动之后再启动,但不会等待前面的服务完全启动就绪后在启动。
  • volumes_from:从其他服务或容器挂载存储卷。
  • links:链接到其他服务。
  • restart:定义容器跟随docker引擎的重启,相当于docker run --restart=always
  • network_mode:指定容器使用的网络模式。
  • ports:定义容器端口映射。
  • external_links:链接到外部容器。
  • command:覆盖容器启动后默认执行的命令。
  • entrypoint:覆盖容器的默认入口点。
  • env_file:从文件加载环境变量,通过env文件来替代environment,env文件更加私密,防止信息泄露。
  • expose:暴露端口,不进行端口映射,只是标示容器监听的端口。
  • labels:为容器设置元数据。
  • logging:配置日志记录选项。
  • container_name:指定容器的名称,相当于docker run --name
  • devices:允许容器使用宿主机的设备。
  • dns:自定义DNS服务器。
  • dns_search:DNS搜索域名配置。
  • tmpfs:挂载临时文件系统。
  • cap_add, cap_drop:添加或删除容器的内核能力。
  • security_opt:自定义容器的安全选项。
  • user:指定容器内的命令以何种用户身份运行。
  • working_dir:设置容器内的工作目录。
  • domainname:容器的域名。
  • hostname:容器的主机名。
  • ipc:设置容器的IPC模式。
  • mac_address:为容器指定MAC地址。
  • privileged:指定容器是否在特权模式下运行。
  • read_only:设置容器的文件系统为只读。
  • shm_size:设置共享内存大小。
  • stdin_open, tty:保持标准输入开放,并分配一个伪终端。
  • extends:继承另一个服务的配置。
  • external:声明外部资源,如网络或卷。
  • extra_hosts:添加额外的 hosts 条目到容器的 /etc/hosts 文件中。
  • healthcheck:定义容器的健康检查配置。
  • isolation:指定容器的隔离技术。
  • logging:配置单个服务的日志记录选项。
  • network_mode:指定容器使用的网络模式。
  • pid:指定容器的PID模式。
  • platform:指定在哪个平台上运行容器。
  • ports:定义端口映射,将容器内部的端口映射到宿主机上。
  • secrets:从 Docker Swarm 中的 secret 中注入密钥。
  • stop_grace_period:指定停止容器前的等待时间。
  • sysctls:自定义容器的内核参数。
  • ulimits:设置容器的资源限制。
  • volume_driver:指定使用的卷驱动程序。
  • stop_signal:指定停止容器时发送的信号。
  • tty:分配一个伪终端。
  • restart:定义容器重启策略。
  • scale:指定服务的副本数量。
  • deploy:在 Docker Swarm 中定义部署选项。
  • configs:从 Docker Swarm 中的 config 中注入配置文件。

docker-compose 常用操作命令

shell 复制代码
#docker-compose xxx 后面跟参数的,一般是服务器id,或者其它内置指令。
docker-compose -h                   # 查看帮助
docker-compose up                   #启动所有docker-compose服务
docker-compose up-d                 #启动所有docker-compose服务并后台运行
docker-compose up 服务名            #启动指定docker-compose服务
docker-compose down                 #停止并删除容器、网络、卷、镜像。
docker-compose exec yml里面的服务id  #进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id/bin/bash
docker-compose ps                   #展示当前docker-compose编排过的运行的所有容器
docker-compose top                  #展示当前docker-compose编排过的容器进程
docker-compose logs 服务id          #查看容器输出日志 -f为动态实时输出
docker-compose config               #检查配置
docker-compose config -q            #检查配置,有问题才有输出
docker-compose restart              #重启服务
docker-compose start                #启动服务
docker-compose stop                 #停止服务
docker-compose pause 服务id         #暂停状态中的服务
docker-compose unpause 服务id       #恢复处于暂停状态中的服务

docker-compose.yml简单实操

记得把中文注释去了。

yml 复制代码
//docker-compose版本号,这个和docker引擎版本关联,https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-and-docker-compatibility-matrix
version: "3.8"
//定义多个服务
services:
	//服务起个名
	zs_nginx:
		//镜像
		image: nginx:latest
		//相当于docker run -p参数
		ports:
		- "80:80"
		//容器卷
		volumes:
      - /test:/usr/share/nginx/html
	//服务起个名
	zs_mysql:
		//镜像
		image: mysql:latest
		//相当于docker run -p参数
		ports:
		- "3306:3306"
		//环境变量,相当于docker run -e
		environment:
		//或者写成MYSQL_ROOT_PASSWORD:ROOT
		- "MYSQL_ROOT_PASSWORD=root"

保存并退出

docker-compose up -d

docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
65b8ea2596c9   mysql:latest   "docker-entrypoint.s..."   5 seconds ago   Up 4 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   test-zs_mysql-1
8de18d446714   nginx:latest   "/docker-entrypoint...."   5 seconds ago   Up 4 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp                      test-zs_nginx-1
相关推荐
cdut_suye1 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
qq_433618446 分钟前
shell 编程(三)
linux·运维·服务器
企业管理8MSaaS12 分钟前
如何选择适合Scrum团队的项目管理系统?
云计算·scrum
苹果醋313 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
企业管理8MSaaS15 分钟前
如何在 Scrum 管理中化解团队冲突?
云计算·scrum
两张不够花15 分钟前
Jenkins 持续集成部署
运维·jenkins
Tlzns27 分钟前
Linux网络——UDP的运用
linux·网络·udp
码农土豆33 分钟前
PaddlePaddle飞桨Linux系统Docker版安装
linux·docker·paddlepaddle
Hacker_xingchen38 分钟前
天融信Linux系统安全问题
linux·运维·系统安全
丘狸尾39 分钟前
[cisco 模拟器] ftp服务器配置
android·运维·服务器