docker:快速构建、运行、管理应用的工具,可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用
1、部署mysql
先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL(注意:若服务器上已经有mysql 占用了3306端口,可修改绑定服务器3307端口,如下)
docker run -d \
--name mysql \
-p 3307:3306 \ # 将主机端口从3306改为3307
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
运行完后,可以通过navicat 正常访问
如果想要集群部署,只需修改`宿主机端口映射`和`容器名称`保证不同即可,因为容器之间环境是相互隔离的,所以都是3306不用变
# 如果想要集群部署只需修改docker容器内部的端口号和容器名称即可
# 节点1
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
# 节点2
docker run -d \
--name mysql2 \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
# 节点3
docker run -d \
--name mysql3 \
-p 3308:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
大家可以发现,当我们执行命令后,Docker做的第一件事情,是去自动搜索并下载了MySQL,然后会自动运行MySQL,我们完全不用插手,非常方便。而且,这种安装方式完全不用考虑运行的操作系统环境问题,它不仅仅在CentOS系统是这样,在Ubuntu系统、macOS系统、甚至是装了WSL的Windows下,都可以使用这条命令来安装MySQL。
要知道,不同操作系统下其安装包、运行环境是都不相同的!如果是手动安装,必须手动解决安装包不同、环境不同的、配置不同的问题!
2、镜像和容器
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。
- 镜像:不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。
- 容器:Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
- 镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub(目前国内已停止访问)。
3、命令解读
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
解读:
- docker run -d:创建并运行一个容器,-d则是让容器以后台进程运行
- --name mysql: 给容器起个名字叫mysql,你可以叫别的,要唯一
- -p 3307:3306: 设置端口映射。格式: -p 宿主机端口:容器内端口,示例中将宿主机的3307映射到容器内的3306端口
- -e TZ=Asia/Shanghai:配置容器内进程运行时的一些参数,此处是设置时区,格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定
- -e MYSQL_ROOT_PASSWORD=123:是设置MySQL默认密码
- mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像,格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号,在未指定TAG的情况下,默认拉取最新版本镜像,也就是mysql:latest
容器是隔离环境,外界不可访问。但是可以将`宿主机端口`映射`容器内到端口`,当访问宿主机指定端口时,就是在访问容器内的端口了。
容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致,但是这里为了防止与之前外部安装的MySQL的3306冲突,改为3307映射容器内的3306。
镜像的名称不是随意的,而是要到DockerRegistry中寻找,镜像运行时的配置也不是随意的,要参考镜像的帮助文档。
4、Docker基础
4.1、常见命令
Docker最常见的命令就是操作镜像、容器的命令,详见官方文档: https://docs.docker.com/
命令 | 说明 | 文档地址 |
docker pull | 拉取镜像 | docker pull |
docker push | 推送镜像到DockerRegistry | docker push |
docker images | 查看本地镜像 | docker images |
docker rmi | 删除本地镜像 | docker rmi |
docker run | 创建并运行容器(不能重复创建) | docker run |
docker stop | 停止指定容器 | docker stop |
docker start | 启动指定容器 | docker start |
docker restart | 重新启动容器 | docker restart |
docker rm | 删除指定容器 | docker rm |
docker ps | 查看容器 | docker ps |
docker logs | 查看容器运行日志 | docker logs |
docker exec | 进入容器 | docker exec |
docker save | 保存镜像到本地压缩文件 | docker save |
docker load | 加载本地压缩文件到镜像 | docker load |
docker inspect | 查看容器详细信息 | docker inspect |
补充:默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启
# Docker开机自启
systemctl enable docker
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
5、部署Nginx容器
需求:
- 在DockerHub中搜索Nginx镜像,查看镜像的名称
- 拉取Nginx镜像
- 查看本地镜像列表
- 创建并运行Nginx容器
- 查看容器
- 停止容器
- 再次启动容器
- 进入Nginx容器
- 删除容器
# 第1步,查看nginx镜像仓库及相关信息
docker search nginx
# 第2步,拉取Nginx镜像
docker pull nginx
# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {
{.ID}}\t{
{.Image}}\t{
{.Ports}}\t{
{.Status}}\t{
{.Names}}"
# 查看容器日志:docker logs 容器名
docker logs nginx
# 持续或动态查看容器日志:docker logs -f 容器名
docker logs -f nginx
# 第6步,访问网页,地址:http://虚拟机IP地址:80
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {
{.ID}}\t{
{.Image}}\t{
{.Ports}}\t{
{.Status}}\t{
{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {
{.ID}}\t{
{.Image}}\t{
{.Ports}}\t{
{.Status}}\t{
{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,-it指的是可输入终端,查看容器内目录,输入exit 退出容器
docker exec -it nginx bash
# 或者,可以进入容器的同时跟上执行的命令,之间一步进入容器内的MySQL
docker exec -it mysql mysql -uroot -p
# 将镜像打包下载到本地,.tar.gz是打压缩包
docker save -o nginx.tar nginx:latest
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
# 删除镜像
docker rmi nginx:latest
# 将打包好的镜像加载到本地,不用再去docker pull 对应镜像了
docker load -i nginx.tar
# 查看nginx镜像
docker images
# 创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
可通过下面命令进行格式化信息:
docker ps --format "table {
{.ID}}\t{
{.Image}}\t{
{.Ports}}\t{
{.Status}}\t{
{.Names}}"
http://192.168.56.10/,通过这个地址可以访问nginx
5.1、数据别名
给常用Docker命令起别名,方便我们访问:
# 修改/root/.bashrc文件
vim /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {
{.ID}}\t{
{.Image}}\t{
{.Ports}}\t{
{.Status}}\t{
{.Names}}"'
alias dis='docker images'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# 修改/root/.bashrc文件 后,执行下面命令,使其生效
source ~/.bashrc
6、数据卷挂载
容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:
- 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?
- MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?
- 我想要让Nginx代理我的静态资源怎么办?
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦