第三十七章:docket
一:docket
1.什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
# kvm:开源的免费的 Kernel-based Virtual Machine 的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20 之后集成在 Linux 的各个主要发行版本中
# exsi:vmware 商用的,装在裸机上,可以虚拟化出很多机器
# openstack(python 开发的,开源的):电信云,华为云 openstack 管理云平台
# 阿里云(自研,阿里飞天):云服务器,到一个网站,点点 ---》付款 ---》完成
# docker:容器技术
# k8s:多机容器管理,容器编排
2.docker是什么
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 [GitHub](https://github.com/docker/docker) 上进行维护。
Docker 是一个用于开发、发布和运行应用程序的开放平台。Docker 可让您将应用程序与基础架构分离,以便快速交付软件。借助 Docker,您可以像管理应用程序一样管理基础架构。通过利用 Docker 的发布、测试和部署代码方法,您可以显著减少编写代码和在生产中运行代码之间的延迟。
3.容器与虚拟机比较
4.Docker 架构
# 1 docker 是客户端-服务器(cs)架构,mysql、redis、c 和 s 要通信,使用的 http 协议,符合 resful 规范
# 2 Docker 镜像:镜像是基于一堆文件,相当于虚拟机装了操作系统,又装了软件的一堆文件
# 3 Docker 容器:镜像运行起来,成为了容器,【当成一台虚拟机上面装了一些软件】
Docker 客户端与 Docker 守护进程通信,后者负责构建、运行和分发 Docker 容器等繁重工作。Docker 客户端和守护进程可以运行在同一系统上,或者您可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您处理由一组容器组成的应用程序。
5.Docker 安装
# win:下个软件,一路下一步即可(尽量不要使用它)
-https://www.docker.com/products/docker-desktop/
-一路下一步
# centos:建议你直接在虚拟机中安装
# 先卸载
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
# 安装
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
# 查看版本
docker -v # Docker version 23.0.3, build 3e7cbfd
二:使用指南
1.docker 启动设置镜像
# 设置国内镜像站
# 远程仓库,下载镜像 ,国外:https://hub.docker.com ---》下载比较慢 ---》设置国内镜像站
-https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
# docker 安装后会有 /etc/docker 文件夹
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://x1566319.mirror.aliyuncs.com"]
}
sudo systemctl daemon-reload # 重新加载某个服务的配置文件
sudo systemctl restart docker # 重启服务
2.docker 服务常用命令
systemctl start docker # 启动 docker
systemctl stop docker # 停止 docker
systemctl restart docker # 重启 docker
systemctl status docker # 查看 docker 状态
systemctl enable docker # 开机启动
docker info # 查看 docker 概要信息
docker --help # 查看 docker 帮助文档
3.镜像相关命令
# 1 查找镜像
-docker search 镜像名称
-建议去 hub.docker.com 直接搜,更直观
# 2 拉取镜像,指定标签 tag
docker pull centos:7
# 如果不指定标签,会下载最新
docker pull centos
docker pull centos:latest
# 3 查看本地镜像
docker images # 等同于 docker image ls
# 4 删除镜像
docker rmi 镜像ID # 可以同时删多个
# 5 删除所有镜像
# 查出所有镜像的id号
docker rmi `docker images -q`
4.容器
4.1 容器相关命令
# 把镜像运行成容器,并且一个镜像,可以运行出多个容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
docker ps -l # 查看最后一次运行的容器
# 运行容器(其实是两步:创建容器:create,运行容器:run)
docker run -id # 不会进入到容器内部
docker run -it # 会进入到容器内部
docker run -it --name=mycentos centos:7 # 启动一个 centos 容器,名字叫 mycentos,并且进入
-如果容器没有创建,直接执行 run,就会创建并运行,所以你只需要会 run 就行了
-run 的时候,有很多参数
-i:表示运行容器
-t:表示容器启动后会进入容器命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端
-d:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)
--name:为创建的容器命名,如果不写,随机生成一个名字
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射
docker start mycentos # 启动容器
docker stop mycentos # 停止容器
# 进入到容器内部(本质是让容器执行命令)
docker exec f82e8578b9b1 ls
docker exec -it f82e8578b9b1 /bin/bash # 进入到容器内部
exit # 退出
# -v 参数:目录映射 宿主机目录:容器目录
docker run -id --name=lqz -v /home/lqz:/lqz centos:7
注意:以后无论在宿主机还是容器中修改当前目录下的文件,都会相互影响
# -p 参数:端口映射 容器中启动一个 mysql5.7 ---》容器中的 3306 监听,宿主机 3306 没人监听,做端口映射后,宿主机的 3306 就被 docker 的这个容器监听了
# 启动的 mysql 的 root 密码是 123456
docker run -id --name=mysql -p 80:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# netstat -nlp | grep 80 查看本机 80 端口占用情况
# 以后访问宿主机 80 端口就等于访问容器的 3306 端口
# docker 网络命令
docker network create mynetwork # 创建一个新的自定义网络
docker network ls # 列出所有网络
--name # 设置容器名称
--env-file .env # 设置环境变量
--memory="512m" # 将容器内存使用量限制为 512 MB
--cpus="0.5" # 将半个核心的 CPU 配额定义为 0.5
4.2 容器操作
4.2.1 启动与停止
# 启动容器
docker start 容器id
# 停止容器
docker stop 容器id
4.2.2 文件拷贝
# 容器的文件copy到宿主机上(不是在容器内执行)
docker cp 容器名称:容器目录 需要拷贝的文件或目录
docker cp 20fd8:/home/lqz.txt /home/lqz.txt
# 宿主机的文件copy到容器中
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp ./lqz.txt 20fd894a3f20:/home/lqz.txt
4.2.3 查看容器
docker inspect 容器名称 # 查看容器的详细描述,很多
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
# 在多个容器之间是可以 ping 通的
# centos:172.17.0.3
# mysql:172.17.0.2
4.2.4 删除容器
# 删除容器(删除已停止的容器)
docker rm 容器id
docker rm `docker ps -a -q`
4.2.5 打包与导入
# docker save -o
docker save -o my_image.tar my_image_name
# my_image.tar:这是输出的 tar 文件名。
# my_image_name:这是要保存的镜像名称。
# docker load
docker load -i my_image.tar # -i my_image.tar:指定要加载的 tar 文件名。
5.Dockerfile
5.1 什么是 Dockerfile
# 镜像的来源
1 远程仓库拉取的 docker pull
2 用容器做成的镜像 docker commit
3 把备份的恢复 docker load
4 使用 Dockerfile 来构建
# 什么是 Dockerfile
Dockerfile 是由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像并最终创建一个新的镜像
5.2 Dockerfile 的命令
5.2.1 常用命令
FROM python:3.12
WORKDIR /usr/local/app
# Install the application dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# Copy in the source code
COPY src ./src
EXPOSE 5000
# Setup an app user so the container doesn't run as the root user
RUN useradd app
USER app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
FROM <image>- 这指定了构建将扩展的基础图像。
WORKDIR <path>- 该指令指定“工作目录”或图像中将复制文件和执行命令的路径。
COPY <host-path> <image-path>- 该指令告诉构建器从主机复制文件并将其放入容器映像中。
RUN <command>- 该指令告诉构建器运行指定的命令。
ENV <name> <value>- 该指令设置正在运行的容器将使用的环境变量。
EXPOSE <port-number>- 声明容器将监听的网络端口,公开端口但不会实际开放端口。
CMD ["<command>", "<arg1>"]- 该指令设置使用此映像的容器将运行的默认命令。
USER 指定以哪个用户的名义执行 RUN, CMD 和 ENTRYPOINT 等命令
5.2.2 不常用命令
ARG 设置只在构建过程中使用的环境变量,构建完成后,将消失
EXPOSE 设置对外暴露的端口。
ENTRYPOINT 同CMD,但这个一定会被执行,不会被覆盖修改。
HEALTHCHECK 设置容器状态检查。
MAINTAINER 声明镜像的创建者
MLABELAINTAINER 表明镜像的作者。将被遗弃,被LABEL代替。
ONBUILD 如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令
STOPSIGNAL 设置容器退出时发出的关闭信号。
SHELL 更改执行 shell 命令的程序。Linux的默认 shell 是[“/bin/sh”, “-c”],Windows 的是[“cmd”, “/S”, “/C”]。
VOLUME 添加数据卷
5.3 示例
# 一般镜像构建流程
1.编写 Dockerfile 用于生成镜像
方法一:docker build -t your_image_name .
方法二:sudo docker-compose build 或 sudo docker-compose up -d --build
2.使用 docker-compose 构建,配置 Dockerfile 所在路径
services:
web:
build: ./src
3.git 拉取代码到指定文件夹,用于宿主机与容器映射文件使用
4.启动:一般使用 docker-compose
5.浏览器访问,如果有报错,使用 docker logs -f --since=5m your_container_name 实时查看近 5 分钟数据
FROM python:3.10.14-bullseye
RUN mkdir /src \
&& mkdir -p /etc/supervisor/conf.d \
&& mkdir /logs \
&& mkdir -p /run/daphne
COPY . /src/
COPY ./conf/supervisord.conf /etc/supervisor/
COPY ./conf/req.txt ./src
WORKDIR /src
RUN pip install -r req.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple \
&& pip install --no-cache-dir -r my_req.txt \
-i http://127.0.0.1:8080/simple --trusted-host=192.168.100.4 --default-timeout=180 \
6.docker-compose
使用 Docker Compose,您可以在一个 YAML 文件中定义多个容器及其配置。
如果您将此文件添加到代码仓库中,那么任何克隆您仓库的人都可以通过一个命令启动并运行它。
重要的是要理解 Compose 是一个声明式工具 - 您只需定义它即可运行。您无需总是从头开始重新创建所有内容。如果您进行了更改,请docker compose up
再次运行,Compose 将协调文件中的更改并智能地应用它们。
# Dockerfile 与 Compose 文件
Dockerfile 提供构建容器镜像的指令,而 Compose 文件则定义正在运行的容器。
Compose 文件通常会引用 Dockerfile 来构建用于特定服务的镜像。
6.1 安装
# 下载、设置权限、安装
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
6.2 常用命令
# 启动
docker-compose up # 启动并后台运行
docker-compose up -d # 启动并后台运行
docker-compose up web db # 仅启动指定服务
docker-compose -f 指定文件 --env-file env_file up -d # 指定 yml 文件、指定 env 文件
# 停止
docker-compose down # 停止所有服务并删除容器
docker-compose stop # 停止服务但保留容器和数据卷
# 查看
docker-compose ps # 列出所有运行中的服务
docker-compose logs # 查看所有日志
docker-compose logs web # 查看指定服务日志
docker-compose logs -f # 实时跟踪日志
# 重建
docker-compose up --build # 重新构建镜像并启动服务
# 管理服务生命周期
docker-compose start # 启动已存在的服务
docker-compose restart # 重启
docker-compose pause # 暂停服务
docker-compose unpause # 恢复服务
docker-compose images # 管理的镜像
# 运行中的容器内执行命令
docker-compose exec web bash # 进入 web 容器的 Shell
docker-compose exec db mysql -uroot -p
# 清理资源
docker-compose down --volumes --rmi all # 删除所有停止的容器、未使用的镜像和网络
6.3 环境变量
6.3.1 优先级
# 优先顺序(从高到低)如下:
1、docker compose run -e 在 CLI 中使用进行设置。
2、--env-file <env_file>
3、仅使用 Compose 文件中的 environment 属性进行设置。
4、在 Compose 文件中使用该 env_file 属性。
5、在“ENV指令”中设置容器映像。在“Dockerfile”中设置任何“ARG”或“ENV”只会在“environment”、“ENV_file”或“run--ENV”没有Docker Compose条目的情况下进行计算。
6.3.2 插值
# cat .env
COMPOSE_FILE=../compose.yaml
POSTGRES_VERSION=9.3
# cat ../compose.yaml
services:
db:
image: "postgres:${POSTGRES_VERSION}"
6.4 示例
启动 minio
version: '3'
services:
minio:
image: 'minio/minio:latest'
container_name: minio
restart: always
command: server /data --console-address ":9001"
environment:
- MINIO_ROOT_USER=root
- MINIO_ROOT_PASSWORD=minio_123
- MINIO_COMPRESS=on
- MINIO_COMPRESS_EXTENSIONS=.txt,.log,.csv,.json,.tar,.xml,.bin
- MINIO_COMPRESS_MIME_TYPES=text/*,application/json,application/xml
ports:
- "9400:9000"
- "9401:9001"
volumes:
- ./minio/data:/data
- ./minio/config:/root/.minio
7.docker私有仓库
# 有个远程仓库 ,docker官方提供的 ---》我们可以把我们的镜像传上去
# 公司做的镜像,一般不放在远程仓库,公司会自己搭建私有仓库(把公司制作的镜像传到私有仓库)
7.1 镜像传到官方仓库
# 第0步:在远端创建仓库
# 第一步:给镜像打标签
docker tag ab5c0e652fd4 liuqingzheng/centos_vim:v1
# 第二步:登录到远程
docker login
用户名:不是邮箱
密码:挺复杂
# 第三步:提交
docker push liuqingzheng/centos_vim:v1
# 第四步:别人就可以下载了
docker pull liuqingzheng/centos_vim:v1
7.2 镜像分层
每一个 Dockerfile 命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交通过查看下载下来的镜像,发现历史层信息的层ID是 missing,其实是因为原本的层 id 只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID
RUN yum install vim -y
RUN yum install git -y
# 查看镜像分层的命令
docker history liuqingzheng/centos_vim:v1
# 好处:
构建快,分发方便,如果本地有某一层了,这一层就不需要下载了
# 补充:Dcokerfile 写命令,建议多条命令合为一条
RUN python -m pip install --upgrade pip &&\
python -m pip install --upgrade setuptools &&\
pip install -r requirements.txt
7.3 私有仓库搭建
# 自己搭建私有仓库
-harbor:企业级私有仓库---》https://blog.csdn.net/Gf19991225/article/details/121982824
- registry:用docker搭建私有仓库
# registry 搭建步骤:
-第一步:拉取镜像 docker pull registry
-第二步:运行容器:docker run -di --name=registry -p 5000:5000 registry
-第三步:打开浏览器 输入地址http://47.103.74.128:5000/v2/_catalog看到{"repositories":[]} 表示私有仓库搭建成功并且内容为空
-第四步:修改daemon.json
vi /etc/docker/daemon.json
{
"insecure-registries":["47.103.74.128:5000"]
}
-第五步:重启docker 让配置生效
systemctl restart docker
docker start registry
-第六步:把某个镜像tag成私有仓库的镜像
docker tag 镜像名字/id 47.103.74.128:5000/django_books:v1
-第七步:提交到私有仓库
docker push 47.103.74.128:5000/django_books:v1
-第八步:其他人,只要配置了私有仓库就可以直接拉取
docker pull 47.103.74.128:5000/django_books:v1