本篇摘录自黑马程序员的B站教学视频:
黑马程序员Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+DockerCompose项目实战一套搞定

一、快速入门

0、原理

Docker 是一种基于 Linux 内核特性实现的轻量级操作系统级虚拟化技术。
Docker 的核心原理基于 Linux 内核的三大技术:Namespace、Cgroups 和 UnionFS。

  • 通过 Namespace 实现了资源的隔离:进程、网络、文件系统等资源,让每个容器都像一个独立的 “微型系统”;
  • Cgroups资源控制机制:通过 Cgroups 限制和统计容器的 CPU、内存等资源,防止资源滥用;
  • UnionFS实现分层镜像:通过 UnionFS 实现镜像的分层存储,让镜像可以复用、轻量分发。

1、介绍

Docker是快速构建、运行、管理应用的运维工具。
能快速部署项目、以及项目依赖的各种组件。

优点
传统的部署方式,例如Mysql,需要卸载旧的、下载新的、解压、安装依赖、再安装Mysql,在配置。
容易出现问题:1、命令太多记不住,2、安装步骤太复杂容易出错,3、安装包太多,不知道去哪里下

Docker只需要一条命令即可。
Docker镜像中包含了系统函数库,所以能跨系统运行。
隔离环境:一个虚拟机上可以安装2个MySQL容器,互不干扰,且无需重复下载镜像,相当于下载一个QQ能打开两个QQ登陆。

2、Docker安装

# 1、卸载旧版(如果系统中已存在,\斜杠是换行)
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 2、配置Docker的yum库
yum install -y yum-utils   # 安装yum工具

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  # 配置Docker的yum源
# 注意:此处下载的是centos版本
# 3、安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-comp...
# 4、查看是否安装成功
docker -v  # 查看版本,但不代表安装成功
docker images  # 查看镜像,报错:docker进程连接不上,因为需要启动docker
# 报错:Cannot connect to the Docker daemon at ...
# 5、启动和校验
systemctl start docker  # 启动docker
systemctl stop doceker  # 停止
systemctl restart docker  # 重启

systemctl enable docker  # 开机自启动
docker ps   # 查看容器,如果不报错,则表示安装自动成功
# 6、配置镜像加速:

在这里插入图片描述

在这里插入图片描述

3、部署MySQL

# 需先停掉虚拟机中的Mysql,确保Docker已安装,且网络畅通
docker run -d \   
	--name mysql \
	-p 3306:3306 \
	-e TZ=Asia/Shanghai \
	-e MYSQL_ROOT_PASSWORD=123 \
	mysql

在这里插入图片描述

4、镜像和容器

在这里插入图片描述

5、命令解读

docker run -d \     # docker run:创建并运行一个容器,-d:让容器在后台运行(一般都加)
	--name mysql \    # 给容器起个名字,必须唯一
	-p 3306:3306 \    # 设置端口映射,前面是宿主机ip,后面是mysql的ip(mysql一般都是3306),
	#因为容器是隔离的,不能访问,所以可以通过宿主机的3306端口访问mysql的3306,如果有两个mysql,前面的3306就需要改成其他的
	-e TZ=Asia/Shanghai \  # -e: 设置环境变量,environment
	-e MYSQL_ROOT_PASSWORD=123 \
	mysql   # 指定运行的镜像的名字,去docker镜像仓库查

镜像命名规范
镜像一般分两部分: [repository]:[tag]
repository是镜像名,tag是版本号,例如:mysql:5.7
tag不写的话表示默认下载最新版本的

在这里插入图片描述

二、Docker基础

1、常见命令

在这里插入图片描述
在这里插入图片描述
容器状态里的up是指启动时间

# 命令的帮助文档地址: https://docs.docker.com/engine/reference/commandline/docker/

# Docker:
docker version          #查看docker的版本信息
docker info             #查看docker的系统信息,包括镜像和容器的数量
docker 命令 --help       #帮助命令(可查看可选的参数)

# 镜像:
docker images          #查看本地主机所有镜像
docker rmi  镜像名               #删除镜像
docker rmi -f  镜像id 镜像id 镜像id     #删除多个镜像

# 容器:(以下容器是指name和id都行)
docker exec -it 容器 bash  # 进入容器内部   exit退出容器
docker logs 容器   # 日志
docker logs -f 容器   # 日志,不会退出,持续跟踪,调试用,比如有被调用,会新追加
docker rm 容器   # 删除容器,不能删除一个正在运行的容器,方法一:先stop,方法二:
docker rm -f 容器  # 强制删除

docker inspect 容器 # 容器的所有配置信息

1.1 命令别名

常用的命令可以设置简化版别名,方便访问,具体在 /root/.basrc 文件中设置:
在这里插入图片描述
添加完后,使用以下命令使其生效:

source /root/.basrc

2、数据卷

数据卷(volume)是一个虚拟目录,是容器目录宿主机目录之间映射的桥梁。
映射后容器内本质上就没有存储文件,只在宿主机目录下。

例如:nginx容器内只有系统运行需要的系统环境,没有linux命令,进容器操作就会比较麻烦。
也方便迁移数据,例如:redis容器删除后,容器内数据也没了,如果存在宿主机内,即可以保留。。

  • /var/lib/docker/volumes 是固定目录,数据卷都存在该文件下。
  • 需要在创建容器时就创建数据卷,否则无法创建数据卷
    在这里插入图片描述
docker volume 
docker volume create 数据卷名  # 创建数据卷
docker volume ls  # 查看所有数据卷
docker volume inspect 数据卷名  # 查看某个数据卷的详情
docker volume rm VOLUME_NAME [VOLUME_NAME...]  	# 删除某个数据卷   删除容器后,数据卷还会存在,宿主机目录也存在
docker volume prune       # 删除所有未使用的卷

docker run -d \   # 创建容器时就创建数据卷并映射
	--name nginx \
	-p 80:80 \
	-v 数据卷名:容器内目录   # -v即可
	nginx  

2.1 例题1

在这里插入图片描述
在这里插入图片描述
Source:宿主机目录,Destination:容器内目录

2.2 匿名卷

容器创建时会自动创建的数据卷,名称特别长,容易出现问题:不方便升级迁移

2.3 目录直接挂载,无需数数据卷

前提:需要在宿主机内提前把目录创建好
在这里插入图片描述
在这里插入图片描述

3、自定义镜像

在这里插入图片描述
在这里插入图片描述
分层的好处:

  • 1、解耦,能公用某些层
  • 2、下载镜像时,前两层若发现一样,就可以不用重新下载,如下图:
    在这里插入图片描述

3.1 Dockerfile

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 从已经创建的容器中更新镜像

从 docker 镜像仓库中下载的镜像不能满足我们的需求时,可以通过两种方式对镜像进行更改:
1、使用 Dockerfile 指令来创建一个新的镜像
2、从已经创建的容器中更新镜像,并且提交这个镜像

更新镜像步骤:
1、先需要使用镜像来创建一个容器

docker run -t -i ubuntu:15.10 /bin/bash

2、 在运行的容器内使用 apt-get update 命令进行更新
3、exit 命令来退出这个容器
4、通过命令 docker commit 来提交容器副本

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
        -m: 提交的描述信息
        -a: 指定镜像作者
        e218edb10161:容器 ID
        runoob/ubuntu:v2: 指定要创建的目标镜像名

4、容器网络

在这里插入图片描述

容器之间是如何访问的呢?因为容器有相同网关gateway,在同一个网段:(一个容器内ping另一个容器ip是能通的)
在这里插入图片描述
在这里插入图片描述

4.1 网络命令

加入自定义网络的容器才可以通过容器名互相访问;
加入默认网桥的不能通过容器名访问,可以通过ip;
只有加入到同一网络的容器才能互相访问

docker network create 网络名  # 创建一个网络,ip addr可以看到网络被创建
docker network ls  # 查看所有网络
docker network rm  # 删除指定网络
docker network prune # 清除未使用的网络
docker network connect 网络名 容器名  # 使指定容器连接加入某网络,docker inspect 容器名---可以看到networks下存在新网络
docker network disconnect # 使指定容器连接离开某网络
docker network inspect 网络名 # 查看网络详细信息

三、项目部署

1、部署Java应用

将java项目打包为镜像并部署

2、部署前端

3、Docker Compose

Docker Compose通过一个单独的docker-compose.yml模版文件(YAML 格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1 命令

# docker compose的命令格式如下:
docker compose [OPTIONS] [COMMAND]

在这里插入图片描述

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐