黑马程序员Docker快速入门到项目部署
视频对应笔记

快速入门

Docker安装

安装docker:参考文档

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

检测是否安装成功:docker -v

启动和校验:执行前三条命令

# 设置开机自启
systemctl enable docker
# 启动Docker
systemctl start docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker

配置阿里云镜像加速:
阿里云官网 --> 容器镜像服务ACR --> 左侧镜像工具,镜像加速器

部署mysql

docker将mysql及各种依赖打包,相当于下载了一个绿色免安装版本

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

远程连接阿里云的mysql,需要在防火墙添加协议,开放3306端口

使用Docker完全不用考虑运行的操作系统环境。注意:这里下载的不是安装包,而是镜像container。镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,可以跨系统运行,也不需要手动再次配置环境。这套独立运行的隔离环境我们称为容器image

由于环境隔离,配置多个MySQL服务也是没有问题的。

提供存储、管理Docker镜像的服务器,被称为DockerRegistry,可以翻译为镜像仓库
请添加图片描述

命令解读

请添加图片描述
如果不加 -d,进程会卡住,等待程序结束,此时无法执行其他命令

容器有自己的内存空间、文件系统、ip地址,但由于容器是隔离的,需要通过端口映射才能访问到。
-p 3306:3306 前面是宿主机端口,后面是容器端口。容器端口取决于进程,一般不需要改动。比如配置两个mysql,容器端口始终为3306,而宿主机端口不同

设置环境变量需要查看docker文档,有一些镜像的环境变量是必须配置的。

mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像
格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号
在未指定TAG的情况下,默认是最新版本,也就是mysql:latest

Docker基础

常见命令

请添加图片描述
区分docker run 和 docker start:
docker run 创建容器,同一个镜像可以创建多个容器
docker start 启动某个已停止的容器
请添加图片描述
请添加图片描述

# 从仓库拉取镜像
docker pull nginx
docker images

# 将镜像保存到本地
docker save --help
docker save -o nginx.tar nginx:latest

# 删除镜像
docker rmi nginx:latest

# 从镜像包读取镜像
docker load --help
docker load -i nginx.tar

# 创建并运行容器
docker run -d --name nginx -p 80:80 nginx

# 查看运行中的容器
docker ps
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 查看所有容器,包括已停止的
docker ps -a

# 查看日志
docker logs nginx
docker logs nginx -f # 持续跟踪日志,进程会卡住,ctrl^c停止跟踪

# 进入容器内部,使用bash命令行交互
docker exec -it mysql bash
ls -l
mysql -uroot -p
exit

注:linux可以给命令起别名,在 /root/.bashrc 中配置

vi ~/.bashrc

alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

# 使命令生效
source ~/.bashrc

数据卷挂载

请添加图片描述
查docker文档可知nginx镜像的静态资源在 /usr/share/nginx/html

docker exec -it nginx bash
cd /usr/share/nginx/html
vi index.html

想要用vi指令修改index.html,结果发现没有 vi 指令
所有的镜像只有最小化的系统环境,只具备其运行必须的环境。像vi等指令是没有的

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
请添加图片描述
创建了两个数据卷:conf、html,数据卷 conf 和 html 分别指向了宿主机的 /var/lib/docker/volumes/conf/_data目录和 /var/lib/docker/volumes/html/_data目录
此时,容器内的 conf 和 html 目录就与宿主机的 conf 和 html 目录关联起来,我们称为挂载

注意:/var/lib/docker/volumes/ 是宿主机固定的目录

数据卷相关命令:
请添加图片描述

docker run -v 数据卷:容器内目录 可以完成挂载
如果容器已经创建了(执行过docker run -d),是不能进行挂载的
创建容器时,如果挂载了数据卷但数据卷不存在,会自动创建数据卷

docker rm -f nginx # 先删除nginx容器,-f强制删除运行中的容器
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
docker volume ls
docker volume inspect html # 查看html数据卷的详情
cd /var/lib/docker/volumes/html/_data

xshell 查看 --> 文件管理器,可以更方便的上传文件。但最好还是用winscp

本地目录挂载

请添加图片描述

docker inspect mysql

执行以上命令,会发现mysql容器已经被挂载了(Mounts),是一个名字很长的匿名卷,该匿名卷存储着mysql的数据(相当于mysql的data文件夹)。用docker volume ls命令也可以查到该匿名卷。
注:nginx没有匿名卷。

docker run -v 本地目录:容器内目录 可以实现本地目录挂载
注意,本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名

请添加图片描述
创建本地目录

mkdir mysql
cd mysql
mkdir data
mkdir init
mkdir conf

将资料里的mysql配置文件和mysql脚本移动到挂载的本地目录,然后创建容器,并实现本地目录挂载

docker rm -f mysql # 删除mysql镜像,注意挂载的匿名卷并没有被删除
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql

/root/mysql/data里有很多mysql文件,其中hmall文件夹是新建的数据库,证明本地目录挂载成功

Dockerfile语法

自定义镜像 的本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成。

镜像文件是分层叠加的,每一层形成的文件都会单独打包并标记一个唯一的id,称为 Layer(层)
如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作(如基础镜像,不需要自己制作)。
请添加图片描述
下载镜像的时候,会检测层是否被下载过。已经被下载过的层,会提示 Already exist

Dockerfile是一个文本文件,其中包含很多指令,用来说明执行什么操作来构建镜像。
docker通过Dockerfile来构建镜像
在这里插入图片描述
请添加图片描述

自定义镜像

编写好了Dockerfile之后,使用 docker build 命令构建镜像
请添加图片描述
注意:Dockerfile 文件必须叫Dockerfile,不能改成其他的名字

将资料里的demo文件夹上传到 /root。jdk.tar最好也上传到虚拟机,否则还要下载 openjdk 基础镜像

cd /root
docker load -i jdk.tar # openjdk基础镜像
docker build -t docker-demo . # 构建镜像
docker run -d --name demo1 -p 8080:8080 docker-demo
docker ps
docker log -f demo1

访问 http://ip地址:8080/hello/count

容器网络互连

docker安装后,会自动创建一个虚拟网卡。默认情况下,所有容器以bridge的形式连接到Docker的一个虚拟网桥
请添加图片描述
/16表示ip地址前16为固定不动。由于容器的ip地址是docker网桥自动分配的,该ip地址会发生变化,为了解决以上问题,需要自定义网络

加入自定义网络的容器才可以通过容器名互相访问。
在这里插入图片描述

ip addr # 查看ip地址
docker network ls
docker network create net1 # 创建网络
docker network connect net1 mysql # 先网络名后容器名,将指定容器加入网络
docker inspect mysql # 发现mysql有了新的网桥
docker exec -it demo1 bash 
ping mysql # 注意demo1容器内部才有ping命令,在Dockerfile文件里配置了;mysql容器没有ping命令

创建容器的时候就可以加入网络:

docker run -d --name demo --p 8080:8080 --network net1 docker-demo

项目部署

部署Java应用

资料里下载hmall,要修改 application-dev.yaml 和 application-local.yaml
application-dev.yaml 的 host 是容器名,将来Java项目部署到容器中后,就是通过容器名访问mysql

pom.xml修改mybatis-plus的版本为3.5.3.1,还需要改两处bug(lambdaQuery)

maven -> package 打包项目(忽略单元测试),把target目录下的 .jar 和 Dockerfile放进虚拟机

docker rm demo1 -f # 把之前创建过的java容器删掉,避免8080端口冲突
docker build -t hmall .
docker run -d --name hm -p 8080:8080 --network net1 hmall # 和mysql连在同一个网络里

访问地址:http://ip地址:8080/search/list?pageNo=1&pageSize=5

部署前端

将资料里的 html文件夹 和 nginx.conf 一起挂载

修改 nginx.conf,后台接口的配置(/api,有两处),请求的路径应该是容器名,改为 hm:8080

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 net1 \
  nginx

访问地址:http://ip地址:18080/

DockerCompose

Docker Compose 可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器
请添加图片描述
A depends_on B,A容器依赖B容器,先创建B后创建A。

由于配置的Java容器叫hmall,要把nginx.conf 的后端接口配置改成hmall

version: "3.8"

services:
  mysql:
    image: mysql
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - hm-net
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hmall
    ports:
      - "8080:8080"
    networks:
      - hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
      - hmall
    networks:
      - hm-net

networks:
  hm-net:
    name: hmall

请添加图片描述

docker rm -f mysql nginx dm
docker rmi hmall
docker compose up -d # -d在后台运行
docker compose ps

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部