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