Bootstrap

关于Docker


Docker

Docker是一个快速构建、运行、管理应用的工具。
能够快速部署项目、项目依赖的组件、项目运行的环境。

项目传统的部署方式缺点:

  • 各类环境、组件命令太多,记不住
  • 各类环境、组件安装包太多,不知道下载源
  • 各类环境、组件安装步骤太复杂,容易出错

Docker安装软件的过程,就是自动搜索下载镜像,然后创建并运行容器的过程。
镜像(image)中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。
容器(container)就是镜像运行时的独立环境。与其他容器时互相隔离的。DockerHub网站是官方仓库,阿里云、华为云会提供一些第三方仓库,我们也可以自己搭建私有的镜像仓库。

镜像来源:

  • 基于官方基础镜像自己制作
  • 直接去DockerRegistry下载。

WSL

适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能,可用于在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双引导。 WSL 旨在为希望同时使用 Windows 和 Linux 的开发人员提供无缝高效的体验。

安装过程:
(1)检查Windows版本
要求:

  • 对于 x64 系统:版本 1903 或更高版本,内部版本为 18362.1049 或更高版本。
  • 对于 ARM64 系统:版本 2004 或更高版本,内部版本为 19041 或更高版本。

命令:

winver

更新:
Windows更新 --> 检查更新 --> 重启电脑

(2)启用适用于 Linux 的 Windows 子系统

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

(3)启用虚拟机功能

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

(4)重启电脑

(5)下载并安装 Linux 内核更新包
下载适用于 x64 计算机的 WSL2 Linux 内核更新包:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
安装

(6)将 WSL 2 设置为默认版本

wsl --set-default-version 2

(7)安装所选的 Linux 分发
Microsoft Store中搜索响应的Linux 版本,比如“Ubuntu 22.04.5 LTS”

(8)默认会登录root用户,改密码

passwd

(9)更新和升级包

sudo apt update && sudo apt upgrade
#添加 wget(从 Web 服务器检索内容)和 ca 证书(允许基于 SSL 的应用程序检查 SSL 连接的真实性)
sudo apt-get install wget ca-certificates

(10)配置VS Code的环境
安装远程开发扩展包:Remote Development

WSL命令行中运行:

#WSL中配置宿主Windows的VS Code的环境变量
vim ~/.bashrc
export PATH=$PATH:“/mnt/d/Vscode/Microsoft VS Code/bin”
#保存~/.bashrc后,需要刷新
source ~/.bashrc
如果没有反应,则需要重启WSL
wsl --shutdown
wsl
#在当前WSL目录下打开VS Code
code .


WSL默认安装位置移动其到指定安装路径
默认安装位置:C:\Users\Administer\AppData\Local\Packages中以CanonicalGroupLimited名字开头的文件夹

导出WSL的发行版:

wsl --export Ubuntu-22.04 F:\WSL\Ubuntu-22.04.tar

注销WSL的发行版:

wsl --unregister Ubuntu-22.04

导入 WSL 发行版到新位置:

#wsl --import WSL发行版名称 新的安装目录 之前导出的发行版包
wsl --import Ubuntu-22.04 F:\WSL\Packages\Ubuntu F:\WSL\Ubuntu-22.04.tar


通过宿主Windows访问WSL的文件系统:

\wsl$\

WSL访问宿主Windows的文件系统:

/mnt/c/…


安装时碰到的问题汇总:
(1)参考的对象类型不支持尝试的操作
解决:使用nolsp.exe

.\nolsp.exe C:\WINDOWS\system32\wsl.exe

WMWare虚拟机

Windows下除了WSL的方式外,采用虚拟机来使用docker

WMWare安装CentOS 7时设置固定ip的配置:
在这里插入图片描述
设置主机名:
在这里插入图片描述
配置网络:
在这里插入图片描述

WMWare设置虚拟机快照:
在这里插入图片描述
拍摄快照:
在这里插入图片描述

Windows下可以使用VSCode远程连接虚拟机的Linux文件系统

  • 安装Remote-SSH插件
  • 在VSCode起始页点击:连接到…
  • 按照提示操作即可
    在这里插入图片描述

CentOS7安装docker

步骤1:卸载旧版的docker:

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux 

步骤2:Docker的yum源(阿里云源)

cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
::清除yum
yum clean all
::更新缓存
yum makecache
::安装yum工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
::配置阿里云的docker源
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
::更新yum,建立缓存
sudo yum makecache fast
::安装docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

步骤3:配置镜像加速

::创建目录
mkdir -p /etc/docker
::镜像加速地质
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://mirrors.sohu.com",
        "https://ustc-edu-cn.mirror.aliyuncs.com",
        "https://ccr.ccs.tencentyun.com",
        "https://docker.m.daocloud.io",
        "https://docker.awsl9527.cn"
    ]
}
EOF
::重新加载配置
systemctl daemon-reload

docker启动关闭命令:

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

# 重启Docker
systemctl restart docker

docker基础命令

常用命令关系图:
在这里插入图片描述

docker run

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql
  • docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行
  • –name mysql : 给容器起个名字叫mysql
  • -p 3306:3306 : 设置端口映射
    – 容器是隔离环境,外界不可访问。但是可以将宿主机端口映射到容器端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
    – 容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
    – 格式: -p 宿主机端口:容器内端口
  • -e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数
    – 格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定
    – 案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码
  • mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像
    – 格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号
    – 在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

docker stop
停止指定容器,停止的是容器中的进程,比如停止mysql
再次启动时,docker start

docker start
启动停止的容器,比如vm关闭了,下次启动时,容器存在,只是停止不运行了。

docker exec -it mysql bash
进入mysql容器,并启动bash

docker update --restart=always [容器名/容器id]
docker容器的开机自启

docker inspect:查看某个容器的详情

docker数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁。

为什么需要数据卷?
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便:

  • 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
  • MySQL、Nginx容器运行后,如果需要修改其中的某些配置该怎么办?
  • 想要让Nginx代理静态资源怎么办?
  • 如果mysql容器数据目录不挂载到宿主机目录,那么以后此容器随着数据的增多越来越大,非常不便于迁移。

容器数据管理思路:
容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦

例子:nginx容器的html目录和conf目录映射到宿主机,这一过程也称为挂载
在这里插入图片描述
完成此步骤后,将文件放到宿主机对应的目录,nginx容器就可以自动完成代理。

默认情况下,默认的存放所有容器数据卷的根目录:/var/lib/docker/volumes
需要注意的是:

  • 容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。

容器创建时,指定数据卷:
-v 数据卷:容器内目录

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v hello:/usr/share/nginx/html nginx

命令运行完,会在宿主机生成目录:
/var/lib/docker/volumes/hello/_data
此目录挂载到了/usr/share/nginx/html

常用命令:
docker volume create:创建数据卷
docker volume ls:查看所有数据卷
docker volume rm:删除指定数据卷
docker volume inspect:查看某个数据卷的详情
docker volume prune:清除数据卷

例子:查看mysql的匿名数据卷

# 1.查看MySQL容器详细信息
docker inspect mysql
# 关注其中.Config.Volumes部分和.Mounts部分

.Config.Volumes部分

{
  "Config": {
    // ... 略
    "Volumes": {
      "/var/lib/mysql": {}
    }
    // ... 略
  }
}

可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷

.Mounts部分

"Mounts": [
    {
        "Type": "volume",
        "Name": "05ea5d858aa2f60afc6926b35d50aa8ef9b4c80c6f65397cf9feb53f28e04ed4",
        "Source": "/var/lib/docker/volumes/05ea5d858aa2f60afc6926b35d50aa8ef9b4c80c6f65397cf9feb53f28e04ed4/_data",
        "Destination": "/var/lib/mysql",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
  ]

上述配置是将容器内的/var/lib/mysql这个目录,与数据卷05ea5d858aa2f60afc6926b35d50aa8ef9b4c80c6f65397cf9feb53f28e04ed4挂载。于是在宿主机中就有了/var/lib/docker/volumes/05ea5d858aa2f60afc6926b35d50aa8ef9b4c80c6f65397cf9feb53f28e04ed4/_data这个目录。这就是匿名数据卷对应的目录,其使用方式与普通数据卷没有差别。

实际生产中,不建议采用匿名卷

  • 匿名卷不便于数据迁移
  • 匿名卷名字太长,目录太深,很难使用

挂载本地目录或文件

-v 宿主机目录或文件:容器内目录或文件
宿主机目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

挂载mysql的数据目录、配置文件目录、初始化库目录
/var/lib/mysql:mysql数据目录
/etc/mysql/conf.d:mysql配置文件目录
/docker-entrypoint-initdb.d:mysql初始化库目录(仅在第一次创建容器时有作用)

# 创建并运行新mysql容器,挂载本地目录
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql
;