黑马Docker基础学习笔记及相关问题解决

目录

1、Docker的下载

 1. Docker简介

 2. CentOS 7 上安装 Docker 的前置条件

 3.安装必要的工具

 4. 安装 Docker

2、Docker学习

 1.配置镜像加速

 2.尝试使用Docker部署Mysql

 3.常见命令

 4.数据卷

         4.1 默认挂载到宿主机 docker 目录下的 volume 目录

4.2 挂载到宿主机的任意目录下

 5.自定义镜像

 6.容器网络

 7.项目部署

  7.1 后端部署

  7.2 前端部署

 8.DockerCompose


1、Docker的下载

 1. Docker简介

        Docker 是一组平台即服务(PaaS)和容器即服务(CaaS)的产品,它基于操作系统层级的虚拟化技术(称为容器化),将软件及其依赖项打包为独立的容器。这些容器可以在几乎任何地方以相同的方式运行,无论底层基础架构如何。Docker 引擎是负责管理这些容器的核心软件。Docker 的主要优势包括:轻量级、可移植性、易于部署和扩展。


 2. CentOS 7 上安装 Docker 的前置条件

        确保系统更新:首先,确保你的 CentOS 7 系统是最新的。使用 yum update 命令来更新系统。

yum update

        卸载旧版 Docker:如果系统中已安装旧版本的 Docker,需要先卸载它们,以避免冲突。使用以下命令:

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

 3.安装必要的工具

         安装 yum-utils:这个工具包提供了一些额外的实用程序,对于管理仓库和包非常有用。 

yum install -y yum-utils

        但我一直卡在下载界面,之后就报了如下错误信息。

     所以我参考了下面文章的方将原有的repo文件更换成了阿里云的repo配置文件。

【已解决】CentOS7虚拟机安装yum-utils速度慢_yum install -y yum-utils-CSDN博客

最终解决了问题,成功安装了yum-utils工具。接下来就可以开始安装Docker了。

 4. 安装 Docker

         安装 Docker :使用以下命令安装 Docker 

yum install -y docker-ce docker-ce-cli containerd.io docker-bulidx-plugin docker-compose-plugin

但是在安装Docker的过程中,出现了以下错误,始终找不到解决方法。

        之后我找到了原因可能是默认的 Docker 仓库镜像无法访问,所以我更换了阿里云的镜像仓库地址。

 yum-config-manager \
  --add-repo \
   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

        最终再次执行Docker的安装命令,成功安装了Docker,之后可以使用 docker -v 命令查看 Docker 的版本,同时确认docker是否安装成功。

2、Docker学习

1.配置镜像加速

        配置合适的镜像加速器,通过修改daemon配置文件 vim /etc/docker/daemon.json 来配置。

我配置的是阿里云容器镜像服务的镜像加速器,每个人的地址是不同的。

  

        按照给出的提示操作后就成功配置好阿里云的镜像加速了。


2.尝试使用Docker部署Mysql

        使用以下指令部署Mysql

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql

        docker run:创建并运行一个容器。                -d:让容器在后台运行。 

        --name:为容器指定名称(唯一)。

   -p 3306:3306:设置端口映射。它将容器内的3306端口映射到宿主机的3306端口上。MySQL默认使用3306端口,这样设置后,你就可以通过宿主机的3306端口来访问容器内的MySQL服务了。(a:b  a是宿主机端口,b是容器内端口)

        -e:设置环境变量。(-e key=value)

                TZ:设置时区。

                MYSQL_ROOT_PASSWORD:设置Mysql的密码。

        mysql:指定运行的镜像名。

                正常写法:mysql(镜像名):5.7 (版本号,不写默认最新版本)

        部署完成

         使用 Navicat 测试连接是否成功,主机 ipLinux 虚拟机的 ip 地址

Docker 优点:镜像只需下载一次,但可多次开启,形成集群互不干扰

        利用Docker安装应用时,Docker会自动搜索并下载镜像,其中包含应用本身,还包含应用运行所需要的环境、配置、系统数据库。容器是Docker运行镜像时创建的一个隔离环境。储存和管理镜像的平台叫镜像仓库。

        启动 Docker 时 Docker 服务端会执行一个守护进程(docker daemon),它会一直等待输入命令 ,·若是部署Mysql,就去镜像仓库里找Mysql,找到后拉取到本地,同时为镜像创建容器,可多实例部署。


 3.常见命令

         常用docker命令(建议开启 Docker 开机自启动)

# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启Docker
systemctl restart docker
# 设置Docker开机自启动
systemctl enable docker
# 查看所有本地镜像
docker images
# 删除镜像
docker rmi 镜像ID或镜像名:标签
# 保存镜像到本地压缩文件
docker save -o 文件名.tar 镜像名:标签
# 加载本地压缩文件到镜像
docker load -i 文件名.tar
# 推送到仓库
docker push 仓库地址/镜像名:标签
# 创建并运行容器
docker run [选项] 镜像名 [命令]
# 停止容器中的进程(容器还在)
docker stop 容器ID或容器名
# 启动容器
docker start 容器ID或容器名
# 查看当前容器运行情况
docker ps
# 删除容器
docker rm 容器ID或容器名
# 查看容器运行日志
docker logs 容器ID或容器名
# 进入容器
docker exec -it 容器ID或容器名 /bin/bash

docker  save -o 文件名 容器名:版本        -o:保存到那个文件里

docker load -i 文件名 -q         -i:加载哪个文件        -q:不输出信息

在成功运行容器后,会输出一串编号,这就是容器 Id。

使用 docker ps 查看运行中的容器。(可使用 --format 简化, -a 查看所有的容器)

container id:容器 ID,当前容器的唯一标识,只显示部分。        

image:指定容器是由哪个镜像运行的。

command:内部运行时的启动命令。

created:创建时间

status:当前容器状态

ports:端口映射

names:容器名称

可以使用 docker logs 容器名 查看容器运行日志。        -f:持续输出日志

使用 docker exec -it 容器名 bash 进入容器内部操作。        -it:添加一个可输入的终端

        bash:使用命令行进行交互

        显示 root@容器ID 表示已进入容器  (exit 退出)

        在删除容器时需要先将容器停止运行,再进行删除,也可在删除命令后加上 -f 强制删除。

Tips

Linux中可以给命令起别名 -> vim ~/.bashrc        (编辑 .bashrc 文件

例如在之后按 A 键继续添加 alias dps=‘docker images’ ,完成后按Esc再输入 :wq 保存退出。

之后再输入 source ~/.bashrc 加载该文件配置,最后输入 dps 就可以查看本地所有镜像了。


 4.数据卷

        4.1 默认挂载到宿主机 docker 目录下的 volume 目录

        数据卷是一个虚拟目录,是内容目录与宿主机目录之间映射的桥梁,会自动形成双向映射。可以供一个或多个容器使用。它的设计目的是为了实现数据的持久化和容器间的数据共享。使我们可以非常方便的修改容器内的文件。数据卷独立于容器的生命周期,即使容器被删除,数据卷及其内容也不会被自动删除。

                                        宿主机文件系统 <--->数据卷<--->容器

1)执行 docker run 命令时,使用 -v 数据卷:容器内目录 可以完成数据卷挂载(在创建时去执行)

2)创建容器时,如果挂载了数据卷切数据卷不存在,则会自动创建

        常见指令

# 查看数据卷
docker volume ls
# 删除数据卷
docker volume rm 数据卷名 [数据卷名 ...]
#查看数据卷详情
docker volume inspect 数据卷名
# 删除未使用的数据卷
docker volume prune 

        使用 docker volume inspect 数据卷名 查看数据卷详情,其中 Mountpoint 代表在宿主机上挂载的位置,与 html 卷映射,而html卷和容器目录,所以宿主机上挂载的位置又和容器目录进行了间接映射。


4.2 挂载到宿主机的任意目录下

        可以使用 docker inspect 容器名  来查询容器的详情,其中Mounts(数据挂载)中可以查看卷的详细信息。

Type:挂载模式

Name:数据卷名称

Source:宿主机目录

Destination:容器内目录

        上面图片中的卷是由容器运行时自动创建的卷,匿名卷(不建议使用),名称自动生成,但挂载的位置过深,不方便迁移,。

在执行 docker run 命令时,使用 -v 本地目录:容器内目录 可以完成本地目录挂载。

本地目录必须以 “/”“./” 开头,如果直接以名称开头,会被识别为数据卷而非bendimu

若需要挂载容器的其他文件,则需查看官方的镜像文档。

例:在宿主机的root目录下创建 mysql 目录 其中包含 dataconfinit 三个目录,需要将 mysql 容器的相应的目录挂载上。

        先使用 docker rm -f mysql 命令删除掉原有的 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

        安装成功后,可以看到我们创建的 root 目录下的 mysql/data 目录下出现了数据


5.自定义镜像

        镜像就是一个文件包,包含了应用程序本身,还有一些配置、函数库等文件包,构建镜像的过程其实就是把这些文件打包的过程。自定义镜像可以将我们写好的 java 应用打包成一个镜像,提供给他人使用。

分析,如果要构建一个 java 镜像,需要哪些东西?

1)一个运行所需的系统的运行环境。

2)安装 JRE 并配置环境变量。

3)拷贝 jar 包。

4)编写运行脚本(入口【Entrypoint】)。

        将以上这些分别打成压缩包,作为镜像的一部分,合在一起才是一个完整的 docker镜像。这些压缩包我们称之为 层【layer】,添加安装包、依赖、配置等,每次操作都形成新的一层。例如我们在下载镜像时需要下好几个文件,它就是在分层下载。

        优点:可以共享某些 基础的层(基础镜像【BaseImage】),下载速度加快。

        例如,在下载 redis 时,第一个显示 Already exists,表示该层已经存在,就不用下载了。
 


        Dockerfile

        Dockerfile 是一个文本文件,包含一个个的指令,可以使用指令来说明要执行什么操作来构建镜像。

        常见指令

        具体内容如下图所示

        使用 docker build -t 镜像名称:版本 .  命令构建镜像

                -t:给镜像起名,不指定时默认为 latest

                .:是指定 Dockerfile 所在目录,如果就在当前目录,则指定为 “.” 。

        输入指令后在一瞬间构建完成 docker-demo 镜像

        通过 docker images 查看镜像显示 docker-demo 已经变成一个镜像了,且因为没有指定版本,所以为 latest(最新版本)

         启动镜像后使用 docker logs -f 容器名 查看运行日志

        启动服务后,可以在浏览器访问到当前虚拟机地址下的网页。


 6.容器网络

        在安装 docker 时,会在虚拟机里创建一张网卡,名字默认为 docker0 地址是一个范围,

172.17.0.1/16:“/16” 表示前16为不能变,也就是 172.17 这两段不能变。

网卡充当了一个网桥的作用,为容器分配不同的地址,同时与网桥建立了连接。

        ·可以使用 ip addr 指令查看当期那虚拟机上的网卡,如下图。

·        但我们每一次启动网卡分配的地址都有可能不同,当我们在代码中配置时就可能出错。这就需要我们创建自定义网络了,但我们创建自定义网络时会形成一个自定义网桥,那么加入这个网桥的容器就可以相互互联,并且可以通过容器名互相访问。、

        常见网络操作命令

        可以看到在我们成功创建了一个自定义网络以及与之对应的网桥

        使用 docker network connect 网络名 容器名 可以连接容器和我们的自定义网络

连接后使用 docker inspect 容器名 可以看到多出来一个网桥

       【TIps

        其次,我们可以在启动容器 docker run 时在其后加上 --network 网络名 来在容器创建时就连接上我们的自定义网络,那样它只会连接到我们的自定义网络

        将 dd(之前配置的自定义镜像)与 mysql 连接到网桥中(确保容器运行)。

        完成后就可以在 dd 里成功 ping mysql了,(没有加入网桥的 nginx 就不能 ping 到


 7.项目部署

  7.1 后端部署

        导入黑马商城项目,开启“跳过测试”并打包(package)将得到的 jar 包移动至虚拟机内。

构建 hmall 镜像,同时删除占用 8080 端口的 dd 镜像,之后运行 hmall 容器,查看 log 日志。

        显示运行成功,后端部署成功。


  7.2 前端部署

        将资料中的 nginx 移动至虚拟机内,并将之前部署的 nginx 删除,再使用下面的指令重新部署 nginx。

docker run -d \
  --name nginx \
  -p 18080:18080 \
  -p 18081:18081 \
  -v /root/nginx/html:/usr/share/nginx/html \
  -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
  --network hmall \
  nginx

注意:需将 nginx.conf 配置文件的如下图位置的更改成你设置的后端容器名

        之后在浏览器地址栏输入 宿主机地址:18080 就可访问到前端页面了。


8.DockerCompose

        上面的手动部署费时费力,而Docker Compose 通过一个单独的 docker-compose.yml 模版文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的 Docker 容器的快速部署,提高了我们部署项目的速度。

        两者的对比

docker run 参数

docker compose 指令

说明

--name

container_name

容器名称

-p

ports

端口映射

-e

environment

环境变量

-v

volumes

数据卷配置

--network

networks

网络

        具体的 yml 配置文件如下所示,与 docker run 命令相比,表达的更加清晰。 

        我们可以使用 docker compose 参数 指令 来完成部署。具体指令作用如下。

类型

参数或指令

说明

Options

-f

指定compose文件的路径和名称

-p

指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念,没有默认root

Commands

up

创建并启动所有service容器

down

停止并移除所有容器、网络

ps

列出所有启动的容器

logs

查看指定容器的日志

stop

停止容器

start

启动容器

restart

重启容器

top

查看运行的进程

exec

在指定的运行中容器中执行命令

         首先将之前已经安装和部署的 mysql、nginx、hm 等全部删除,之后使用 docker compose up  -d 完成一键部署

        同样也可打开网站并登录访问,之后也可以使用 docker compose down 全部移除。


【~完结撒花~】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值