Docker常用命令与基本概念摘记
Dockerfile文件编写
作用
Dockerfile的主要用途
对当前应用进行描述(当前应用及其依赖)
指导Docker完成应用容器化
语法基本介绍
注释、命令、参数。
命令
FROM
指定基于哪个基础镜像。
MAINTAINER
作者信息。
RUN
操作指令。
CMD
指定容器启动时用到的命令。
EXPOSE
暴露端口。(记录元数据,不产生新镜像层)
ENV
定义环境变量。
ADD
可以将本地文件或目录添加到容器中。也可以通过url指定文件
COPY
类似ADD,但不支持URL
VOLUME
指定挂载点。
USER
指定运行容器的用户。
WORKDIR
指定命令的工作目录。(目录会作为元数据记录到镜像配置中,该命令不会创建新的镜像层)
ENTRYPOINT
指定容器启动时要执行的命令,且不能被docker run覆盖。
示例
Python项目运行环境构建
# 拉去python3.10的基础镜像
FROM python:3.10
# 将requirements.txt添加到容器中
ADD requirements.txt /env
# 指定工作目录为requirements.txt所在目录
WORKDIR /env
# 运行命令安装环境
RUN pip install -r requirements.txt
docker常用命令
构建镜像
在Dockerfile所在目录(构建上下文)
docker build -t <IMAGE_NAME>:<TAG> .
导出镜像
按镜像名称及标签导出
docker save -o <TARFILE> <IMAGE_NAME>:<TAG>
按镜像ID导出
docker save -o <TARFILE> <IMAGE_ID>
导入镜像
docker load -i <IMAGE_NAME_TAR_PATH>
查看镜像
列举所有镜像
docker image ls
查看镜像分层
docker image inspect IMAGE:TAG
……
删除镜像
docker rmi <IMAGE_ID>
移除悬虚镜像(none:none):
docker image prune
移除none:none镜像的同时额外移除没有被任何容器使用的镜像
docker image prune -a
重命名镜像
docker tag <IMAGE_ID> <NEW_IMAGE_NANE>:<NEW_IMAGE_TAG>
推送镜像到仓库
Docker镜像推送需要信息:
Register 镜像仓库服务
Repository 镜像仓库
Tag 镜像标签
查看容器
查看运行中的容器
docker ps
查看单个容器详细信息
docker inspect <IMAGE_ID>###
查看所有容器
docker ps -a
查看容器日志
docker logs -n <LINE> <CONTAINER_ID>
删除容器
快速清理全部运行容器(谨慎使用):
docker container rm $(docker container ls -aq) -f
拉取远程镜像
docker pull <IMAGE_NAME>:<TAG>
常用容器命令
docker container exec 在运行状态的容器中启动新进程
。。。
docker-compose.yml文件
基本介绍
Compose
项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。使用场景为需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务前后端容器本身,可能还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
基本命令
docker compose使用yaml文件定义多服务应用。
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
- services:用于定义不同的应用服务。上面的例子定义了两个服务,一个名为web的前端服务;一个名为redis的内存数据库服务。
二级key:
build: 指定
Dockerfile
所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。Compose
将会利用它自动构建这个镜像,然后使用这个镜像。command: 覆盖容器启动后默认执行的命令。
container_name: 指定容器名称。默认将会使用
项目名称_服务名称_序号
这样的格式。depends_on: 解决容器的依赖、启动先后的问题。
expose: 暴露端口,但不映射到宿主机,只被连接的服务访问。
image: 指定为镜像名称或镜像 ID。如果镜像在本地不存在,
Compose
将会尝试拉取这个镜像。ports: 暴露端口信息。
使用宿主端口:容器端口
(HOST:CONTAINER)
格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。networks:定义服务使用的网络。网络必须是已存在的,或者在一级key中定义。
volumes
docker-compose常用命令
可用参数
-f, –file FILE 指定使用的compose文件,默认为docker-compose.yml文件
-p, –project-name NAME 指定项目名称
–verbose 输出调试信息
-v 打印版本
启动容器
docker-compose up
后台启动
docker-compose up -d
停止应用
docker-compose down
重启应用
docker-compose restart
删除容器
docker-compose rm
注:Mac系统最新docker的compose命令用法为:
docker compose
示例:
Docker原理及概念摘记
关于镜像
技术上如何理解镜像?
一个配置对象,包含一系列镜像层和元数据信息。镜像层是实际数据存储的地方(比如文件)。所有Docker镜像始于一个基础镜像层,进行修改或增加内容时会在当前镜像层之上创建新的镜像层。
有的dockerfile指令不会创建新的镜像层,只会在镜像中添加元数据,如ENV、EXPOSE、CMD、ENTRY-POINT。
可以将镜像理解为“类”,那么容器就是“类”的实例化对象。
镜像内容安全性(完整性)如何保证?
内容散列、分发散列值(压缩版镜像的散列值),用于校验拉取的镜像是否被篡改过?
……
关于容器
何为容器化?
将应用整合到容器中并且运行起来,称为容器化,或docker化。
容器和镜像的关系是?容器和虚拟机的区别是?
容器是镜像的运行中实例,类似虚拟机和虚拟机模版的关系。
容器和虚拟机都依赖于宿主机运行,但虚拟机是对硬件资源虚拟化,容器是对操作系统虚拟化。因此容器模型比虚拟机模型更为简洁高效,使用容器可以在更少的资源运行更多的应用。
容器如果不运行任何进程则无法存在
杀死容器中的主进程,容器也会被杀死。
容器可以持久化数据吗?
多次停止、启动、暂停、重启容器不会导致数据被删除,明确删除容器才会使容器丢弃其中的数据,但如果将容器数据存储在卷(volume)中,或者说容器数据存储在来自宿主机挂载的磁盘/目录,数据也会被保存下来。
卷(Volume)是容器中存储持久数据的首选。
如何停止容器比较好?
docker container rm
-f 可以销毁运行中的容器,其直接向容器内进程发送SIGKILL信号,强行、突然杀死容器进程 如果要删除容器,推荐两阶段进行:先stop后rm,即先发送SIGTERM信号再发生SIGKILL信号(如果10s内进程没有终止)。
……
应用容器化的步骤
应用代码
创建Dockerfile
基于dockerfile构建docker镜像
将应用构建到docker镜像中。
生产环境下Docker镜像构建优化
原则、目标:生产环境镜像应该尽可能小,因为镜像越大则越慢。
Dockerfile命令优化
如:使用&&连接多个命令并使用反斜杠换行的方式将多个命令包含在一个RUN指令中。(每一个RUN指令都会新增一个镜像层)
多阶段构建
分成多个阶段构建镜像,每个阶段从FROM指令开始,后面的构建阶段会从前面的阶段得到的镜像复制相关的必要代码或文件,无需复制生产环境不需要的组件,从而减少整体镜像大小。
利用构建缓存
使用no-install-recommends(Linux)
确保api仅安装核心以来,不安装其他推荐的包。
不安装MSI包(Windows)
关于Docker Compose
核心:通过声明式的配置文件描述整个应用,将多个服务组织起来,只用一条命令即可完成部署。