【Docker 概念】
Docker
Docker 是一个开源的应用容器引擎,是一个轻量级容器技术。Docker 支持将各种软件编译成一个 Docker 镜像,然后在镜像中各种软件做好配置。其他使用者只需要安装启动 Docker 镜像就可以拥有该软件。
类比一下 Windows,不论什么语言开发的软件都是 exe 文件,我们只需要下载并安装 exe 文件,就可以使用这个软件。Docker 就是 Linux 平台规范的 exe 文件格式。
官网:https://hub.docker.com/
Docker Compose:https://blog.youkuaiyun.com/wyq2070857323/article/details/138310484
Docker 和虚拟机的区别
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统。而 Docker 仅仅是封装函数库,并没有模拟完整的操作系统。虚拟机整体来说性能、空间占用、启动速度都是不如 Docker 的。

Docker 组件
- 宿主机 Host: 安装了 Docker 程序的机器,Docker 是直接安装在操作系统之上的软件,一般宿主机为 Linux 系统
- 仓库 Registry: 用来保存各种打包好的软件 Docker 镜像,会有本地仓库和远端仓库区分。
- 镜像 Images: Docker 镜像是用于创建 Docker 容器的模板,Docker 将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
- 容器 Container: 镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用

【Docker 安装】
CentOS 安装 Docker
# 查看Linux的内核版本。Docker要求CentOS7系统且内核版本高于3.10
uname -r
# 安装docker,输入y确认安装
yum install docker
Docker 镜像仓库修改
每个人都可以去阿里云上获取一个镜像加速的地址,最好用自己的阿里云加速地址,否则其他地址经常有问题。修改仓库按照如下步骤即可。
# 1.编辑daemon.json文件
vim /etc/docker/daemon.json
# 2.填写文件内容如下
{
"registry-mirrors": [
"https://ox288s4f.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]
}
# 3.重新加载文件
systemctl daemon-reload
# 4.重新启动docker
systemctl restart docker
PS:现在可能这种方式不好用,可以使用毫秒镜像
。但是需要docker login
并且注册账号。
毫秒镜像:https://1ms.run/
Ubuntu 22.04 安装 Docker
# ----------------------------- 安装 Docker -----------------------------
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装依赖
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 镜像源(使用阿里云源)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新系统
sudo apt update
# 安装 Docker
sudo apt install -y docker-ce docker-ce-cli containerd.io
# ----------------------------- 配置 Docker 镜像加速器 -----------------------------
# 创建配置文件
sudo mkdir -p /etc/docker
# 配置阿里云镜像加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://<你的阿里云加速器ID>.mirror.aliyuncs.com"]
}
EOF
# 刷新 Docker 配置
sudo systemctl daemon-reload
# 重启 Docker 服务
sudo systemctl restart docker
【Docker 命令】
Docker 服务相关命令
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker
# 设置开机启动
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker总体帮助文档
docker --help
# 查看docker命令帮助文档
docker [具体命令] --help
Image 镜像相关命令
镜像名称一般分两部分组成repository:tag
,在没有指定 tag 时,默认是 latest,代表最新版本的镜像。

# 显示本机所有镜像。-a显示隐藏镜像、-q只显示镜像ID、--digests显示镜像描述
docker images
# 查找xxx镜像。-s xx查找点赞数超过xx的xxx镜像
docker search xxx
# 下载指定tag版本的xxx镜像,不写tag默认拉取latest最新版
docker pull xxx:tag
# 删除本地仓库中指定tag版本的xxx镜像,不写tag默认删除latest最新版。-f强制删除
docker rmi [镜像名称:镜像版本]|[镜像ID]
# 保存镜像到本地的xxx.tgz文件
docker save [镜像名称:镜像TAG]|[镜像ID] > [镜像文件.tgz]
# 保存镜像另一种写法
docker save -o [镜像文件.tgz] [镜像名称:镜像TAG]|[镜像ID]
# 加载镜像文件到本地镜像仓库
docker load [镜像文件.tgz]
# 推送镜像到远程仓库(PS:一般需要先docker login [仓库地址])
# 打TAG
1. docker tag [镜像名称:镜像TAG]|[镜像ID] [仓库名称:镜像TAG]
# 推送
2. docker push [仓库名称:镜像TAG]
Container 容器相关命令
# 显示正在运行的容器。-a所有容器、-l上一次运行的容器
docker ps
# 创建容器并启动(这个命令会详细讲解)
docker run [args] [镜像名称:镜像TAG]|[镜像ID]
# 启动容器
docker start [容器ID]
# 重启容器
docker restart [容器ID]
# 暂停容器
docker pause [容器ID]
# 恢复容器
docker unpause [容器ID]
# 停止容器
docker stop [容器ID]
# 停止容器(强制)
docker kill [容器ID]
# 停止容器(强制)
docker kill [容器ID]
# 删除已停止的容器。-f参数可以强制删除未停止的容器
docker rm [容器ID]
# 查看容器详细参数
docker container inspect [容器ID]
# 查看容器日志。-f参数可以实时滚动输出
docker logs [容器ID]
# 更新容器配置(开启/关闭自启动)
docker update --restart=always [容器ID]
docker update --restart=unless-stopped [容器ID]
# 提交容器并命名为xxx
docker commit [容器ID] [新容器名]
# 进入容器
docker exec -it [容器ID] /bin/bash(或者是/bin/sh)
# (已进入容器内部)退出容器
exit
Ctrl + c

docker run 命令参数详解
- –name: 指定容器名称。
- -d: 后台运行容器。
- -p: 容器端口映射。(容器外端口:容器内端口)
- -v: 文件挂载。(容器外目录:容器内目录)
- -P: 随机端口映射。
- –rm: 容器挂掉后自动删除容器
- –restart: --restart=always 设置 Docker 重启后自动启动该容器
# 后台运行nginx:1.21镜像为容器,命名为myNginx,宿主机90端口映射到容器内80端口上。
docker run --name myNginx -p 90:80 -d nginx:1.21
# Nginx访问地址为http://127.0.0.1:90
【Docker 数据卷】
Docker 数据卷
在 Docker 中,容器的数据读写默认发生在容器的存储层(也就是容器内),当容器被删除时,容器中的数据将会丢失。如果想实现数据的持久化,就需要将容器和宿主机建立联系(将数据从宿主机挂载到容器中),通俗的说,数据卷就是在容器和宿主机之间实现数据共享。而数据卷就是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。可以不需要进入容器内部,就可以查看所需要的容器中的数据。一个数据卷可以被多个容器同时挂载,一个容器也可以被挂载多个数据卷。
Docker 数据卷特性
- 持久化: 数据卷中的数据在容器删除后仍然存在。
- 共享: 多个容器可以共享同一个数据卷。
- 管理: 数据卷可以通过 Docker CLI 或 API 进行管理。
Docker 数据卷分类
- 命名卷: 通过一个名称来引用的数据卷,可以在多个容器之间共享。创建命名卷时,Docker 会自动管理其存储位置。
- 匿名卷: 在创建时没有指定名称,Docker 会自动生成一个唯一的标识符。匿名卷通常用于临时存储或避免某些文件被覆盖。
- 绑定挂载: 将主机上的一个目录或文件直接挂载到容器中。绑定挂载可以是目录,也可以是单个文件。
Docker 数据卷挂载方式
- volume 固定目录数据卷挂载: 容器之间共享数据。volumes 完全由 Docker 管理。容器数据被放到宿主机固定目录下(/var/lib/docker/volums/)
- bind mounts 自定义目录挂载: 主机与容器共享数据。bind mounts 依赖主机目录结构。
- tmpfs mounts 内存挂载: 既不想将数据存于主机,又不想存于容器中时使用(这可以是出于安全的考虑,或当应用需要写大量非持久性的状态数据时为了保护容器的性能)
# 匿名挂载,volume类型,直接会在/var/lib/docker/volums/下创建文件并挂载
docker run -v 容器内目录 镜像名/ID
# 具名挂载,volume类型(卷名可以存在可以不存在,不存在默认在/var/lib/docker/volums/下创建卷名目录)
docker run -v 数据卷名:容器内目录 镜像名/ID
# 指定路径挂载,bind类型
docker run -v 宿主机目录:容器内目录 镜像名/ID
Docker 创建数据卷
# 创建数据卷(默认会存放在/var/lib/docker/volumes/数据卷名称/_data)
docker volume create 数据卷名称
# 查看数据卷的详细信息
docker volume inspect 数据卷名称
# 查看全部数据卷
docker volume ls
# 删除数据卷
docker volume rm 数据卷名称
# 删除未被使用的卷,容器停止的占用的卷也不会删除
docker volume prune

–volume/-v 和–mount 区别
- 参数–volume(或简写为-v)只能创建 bind mount。主机地址必须是绝对路径或者数据卷名称,不存在的卷名会在/var/lib/docker/volums/下创建卷名目录。
- 参数–mount 默认情况下用来挂载 volume,但也可以用来创建 bind
mount 和 tmpfs。如果不指定 type 选项,则默认为挂载 volume,volume 是一种更为灵活的数据管理方式,volume 可以通过 docker volume 命令集被管理
【Docker 网络】
Docker 网络
基于对 Network Namespace 的控制,Docker 可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。按 Docker 官方的说法,Docker 容器的网络有五种模式。
当安装 Docker 时,它会自动创建三个网络(bridge、host、none)

# 创建自定义网络
docker network create my_network
# 查看网络列表
docker network ls
# 将容器连接到网络
docker network connect my_network my_nginx
# 断开网络连接
docker network disconnect my_network my_nginx
引用
有点不想看了,如果有问题,直接参照这个博客吧。https://blog.youkuaiyun.com/qq_36306519/article/details/130749164
【DockerFile】
DockerFile
Dockerfile 是由一系列命令和参数构成的脚本,可以认为是 Docker 镜像的描述文件,这些命令应用于基础镜像并最终创建一个新的镜像。
DockerFile 使用流程
- 编写 DockerFile 文件并且命名为 Dockerfile(无后缀)
- 使用 docker build 命令通过 DockerFile 构建镜像【命令:
docker build -t 镜像名:版本号 .
(最后有个点用于指定 Dockerfile 文件所在位置)】 - 构建时 Dockerfile 文件所在目录(上下文/context)内的所有文件都会被打包发送给 Docker Server 进行构建,可以使用 dockerIgnore 来忽略某些文件。
DockerFile 规定
- 每条保留字指令必须为大写,且后面都要跟至少一个参数。
- 指令按照从上到下,顺序执行。
- #表示注释。
- 每条指令都会创建一个新的镜像层,并对镜像进行提交。
- Dockerfile 中所用的所有文件一定要和 Dockerfile 文件在同一级目录下,可以为 Dockerfile 父目录的子目录
- Dockerfile 中相对路径默认都是 Dockerfile 所在的目录
DockerFile 内容详解
# 版本不写为latest,image为镜像名称定义了使用哪个基础镜像启动构建流程,一般指linux版本。必须作为Dockerfile的第一个指令出现。
FROM <image>[:<tag>]
# 声明镜像的创建者(废弃),建议使用LABEL命令。
MAINTAINER <name>
# 为镜像指定标签。可以有多个LABEL。LABEL会继承基础镜像中的LABEL,如遇到key相同,则值覆盖
LABEL <key>=<value>
# 设置环境变量,可以写多条(用等于号)。
ENV <key> <value>
# 变量替换一
$varname
# 变量替换二
${varname}
# 变量替换三:变量不存在用默认值
${varname:-default value}
# 变量替换四:变量存在用默认值
$(varname:+default value}
# 是Dockerfile的核心部分,RUN指令将在当前映像之上的新层中执行任何命令并提交结果。
# 生成的提交映像将用于Dockerfile中的下一步(可以多条)。一般用于执行linux命令。
RUN command
# 将宿主机的文件/文件夹复制到容器内,如果是一个压缩文件,将会在复制后自动解压。
# 还可以是url,类似于wget下载的url。如果是文件夹,会将文件夹下所有文件复制过去,本身文件夹不会复制。
ADD <src> <dest>
# 和ADD相似,但是如果有压缩文件并不能解压。并且只能是本地文件。
COPY <src> <dest>
# 设置工作目录(切换目录,类似于cd /xxx)
WORKDIR path_dir
# 暴露容器内端口,使容器内的应用可以通过端口和外界交互(只起到声明作用,暴露与否取决于启动容器的命令),默认都是tcp,使用udp
EXPOSE <port>/<tcp/udp>
# 将本地文件夹或者其他容器的文件挂载到容器中
VOLUME
# 启动时执行的命令。在构建容器时使用,会被docker run 后的argument覆盖。使用JSON数据形式
CMD argument
# 启动时执行的命令。和CMD相似,但是并不会被docker run指定的参数覆盖。使用JSON数据形式
ENTRYPOINT argument
# 设置启动容器的用户,可以是用户名或UID
USER 用户名/UID
# 设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg =来指定参数
ARG <name>[=<default value>]
# 当容器停止时给系统发送什么样的指令,默认是15
STOPSIGNAL signal
# 这个命令只对当前镜像的子镜像生效。里面的命令会在子镜像构建的时候被执行
ONBUILD [INSTRUCTION]
# 在容器内部运行一个命令来检查容器的健康状况,NONE表示取消健康检查命令。options参数为–interval=DURATION
HEALTHCHECK [OPTIONS] CMD command
两次检查默认的时间间隔为 30 秒。–timeout=DURATION 健康检查命令运行超时时长,默认 30 秒。–retries=N。当连续失败指定次数后,则容器被认为是不健康的,状态为 unhealthy,默认次数是 3
DockerFile 中 RUN、CMD、ENTRYPOINT 命令区别
三者都是允许执行 Linux 命令,RUN 用于构建镜像过程中的命令,CMD 和 ENTRYPOINT 用于执行启动命令。RUN 可以多条顺序执行,CMD 和 ENTRYPOINT 多条只会执行最后一条。CMD 和 ENTRYPOINT 之间 ENTRYPOINT 不会被 Docker run 命令后的参数覆盖而是缀加,CMD 会被 docker run 后的参数覆盖。
DockerFile 举例
# 依赖基础镜像名称和版本
FROM centos:7
# 指定镜像创建者信息
MAINTAINER IMoMei
# 切换到usr下
WORKDIR /usr
# 执行Shell命令:创建/usr/local/java目录
RUN mkdir /usr/local/java
# 拷贝文件
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
# 配置 java 环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
// -----------------------------
docker build ‐t='jdk1.8'
【Docker Compose】
Docker Compose
Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务(一个或多个)。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。(可以理解为简化版的 K8S)
Docker Compose 下载和卸载
Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose
# 下载
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
# 开启可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本
docker-compose --version
#docker-compose version 1.29.2, build 5becea4c
# 如果使用curl方式安装的,这样卸载即可
rm /usr/local/bin/docker-compose
Docker Compose 使用的三个步骤
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
yml 举例
version: "3.8"
services:
mysql:
# 基于 mysql:5.7.25 镜像构建的容器
image: mysql:5.7.25
# 参数
environment:
MYSQL_ROOT_PASSWORD: 123456
# 数据卷挂载目录和文件
volumes:
- "/tmp/mysql/data:/var/lib/mysql"
- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
web:
# .表示使用当前目录下的Dockerfile文件进行构建生成镜像
build: .
ports:
# 映射上面的 myJavawebDemo容器 中暴露的端口
- "8090:8090"
Docker Compose 常用命令
# 构建启动nignx容器
docker-compose up -d nginx
# 登录到nginx容器中
docker-compose exec nginx bash
# 此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose down
# 列出项目中目前的所有容器
docker-compose ps
# 重新启动nginx容器
docker-compose restart nginx
# 构建镜像
docker-compose build nginx
# 不带缓存的构建
docker-compose build --no-cache nginx
# 查看各个服务容器内运行的进程
docker-compose top
# 查看nginx的实时日志
docker-compose logs -f nginx
# 列出 Compose 文件包含的镜像
docker-compose images
# 验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose config
# 以json的形式输出nginx的docker日志
docker-compose events --json nginx
# 暂停nignx容器
docker-compose pause nginx
# 恢复ningx容器
docker-compose unpause nginx
# 删除容器(删除前必须关闭容器,执行stop)
docker-compose rm nginx
# 停止nignx容器
docker-compose stop nginx
# 启动nignx容器
docker-compose start nginx
# 重启项目中的nignx容器
docker-compose restart nginx
# 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
docker-compose run --no-deps --rm php-fpm php -v