day03-(docker)

发布于:2024-04-23 ⋅ 阅读:(15) ⋅ 点赞:(0)

Docker

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

Docker和虚拟机的差别

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

镜像只能只读 需要写文件要拷贝到独立文件系统中实现隔离
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

docker在linux安装配置

linux安装Docker文档

镜像命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导出的意思 导出成一个压缩文件 :docker save -o[压缩文件名称] [名称]:[版本号]
加载压缩文件:docker load -i [文件名称]
查看镜像(文件):docker images
删除:docker rmi [文件名称]:[版本]

在这里插入图片描述

容器命令介绍

在这里插入图片描述
在这里插入图片描述
docker run --name mn -p 80:80 -d nginx

查看容器运行状态:docker ps
查看日志:docker logs [容器名称]
在这里插入图片描述

Docker-容器(基本操作)

在这里插入图片描述
在这里插入图片描述
###运行安装练习

在这里插入图片描述

  1. 首先在linux启动docker命令 docker
systemctl start docker  # 启动docker服务
  1. 查看镜像文件
docker images

3.创建容器 根据官网复制

docker run --name [mr](容器名称) -p 6379:6379 -d redis[镜像名称]

4.查看开启容器

docker ps
docker exec -it mr bash

5.进入容器然后之后就可以操作了

docker基本操作(数据卷)

(3.6) 挂载本地目录
容器不仅仅可以挂载数据卷,也可以直接挂载到宿主机目录上。关联关系如下:

  • 带数据卷模式:宿主机目录 --> 数据卷 —> 容器内目录

  • 直接挂载模式:宿主机目录 —> 容器内目录
    目录挂载与数据卷挂载的语法是类似的:

  • -v [宿主机目录]:[容器内目录]

  • -v [宿主机文件]:[容器内文件]

特点:

  • 数据卷挂载耦合度低,由docker来管理目录,但是目录较深,不好找
  • 目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看

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

数据卷挂载

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

直接挂载

在这里插入图片描述

docker run \
--name mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-p 3306:3306 \
-v /tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf \
-v /tmp/mysql/data:/var/lib/mysql \
-d \
mysql:5.7.25

在这里插入图片描述

四.Dockerfile自定义镜像

常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

而要自定义镜像,就必须先了解镜像的结构才行。

(1) 镜像结构
镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

我们以MySQL为例,来看看镜像的组成结构:
在这里插入图片描述
简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

我们要构建镜像,其实就是实现上述打包的过程。
在这里插入图片描述

(2) Dockerfile语法
构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

而描述上述信息的文件就是Dockerfile文件。

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer,而第一行必须是FROM,从一个基础镜像来构建。基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
在这里插入图片描述
更多详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder
(3) 案例
(3.1) 基于Ubuntu构建Java项目
需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目

步骤1:在电脑上新建一个空文件夹docker-demo
步骤2:拷贝资料中的docker-demo.jar文件到docker-demo这个目录
步骤3:拷贝资料中的jdk8.tar.gz文件到docker-demo这个目录
步骤4:拷贝资料提供的Dockerfile到docker-demo这个目录

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

步骤5:将上述准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下
步骤6:构建镜像:
docker build -t javaweb:1.0 .
注意:(空格)加(.) : 代表所在的目录路径下 (这样才能构建当前目录)
在这里插入图片描述

五.Docker-Compose

在这里插入图片描述
上面的Compose文件就描述一个项目,其中包含两个容器:

mysql:一个基于mysql:5.7.25镜像构建的容器,并且挂载了两个目录
web:一个基于docker build临时构建的镜像容器,映射端口时8090
DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/
使用基本类似
在这里插入图片描述
2) 安装
(2.1) 下载
在Linux下使用需要通过命令下载:

安装

curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
1
2
(2.2) 修改文件权限
修改文件权限,让其变成可执行文件:

修改权限

chmod +x /usr/local/bin/docker-compose
1
2
(2.3) Base自动补全命令:
在使用时会有提示


 1. # 补全命令
 2. curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

在这里插入图片描述

(3) 部署微服务集群
需求:将资料中的cloud-demo微服务集群利用DockerCompose部署

实现思路:

① 查看资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件

② 修改自己的cloud-demo项目,将数据库、nacos地址都命名为docker-compose中的服务名

③ 使用maven打包工具,将项目中的每个微服务都打包为app.jar

④ 将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中

⑤ 将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署

(3.1) compose文件
查看资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件,而且每个微服务都准备了一个独立的目录:
在这里插入图片描述
内容如下:

version: "3.2"

services:
  nacos:
    image: nacos/nacos-server
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql:
    image: mysql:5.7.25
    environment:
      MYSQL_ROOT_PASSWORD: 123
   #$PWD:表示当前路径(前面一页的意思)
    volumes:
      - "$PWD/mysql/data:/var/lib/mysql"
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:
    build: ./gateway
    ports:
      - "10010:10010"

可以看到,其中包含5个service服务:

nacos:作为注册中心和配置中心
image: nacos/nacos-server: 基于nacos/nacos-server镜像构建
environment:环境变量
MODE: standalone:单点模式启动
ports:端口映射,这里暴露了8848端口
mysql:数据库
image: mysql:5.7.25:镜像版本是mysql:5.7.25
environment:环境变量
MYSQL_ROOT_PASSWORD: 123:设置数据库root账户的密码为123
volumes:数据卷挂载,这里挂载了mysql的data、conf目录,其中有我提前准备好的数据
userservice、orderservice、gateway:都是基于Dockerfile临时构建的
查看mysql目录,可以看到其中已经准备好了cloud_order、cloud_user表:
在这里插入图片描述
查看微服务目录,可以看到都包含Dockerfile文件:
在这里插入图片描述

FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
ENTRYPOINT java -jar /tmp/app.jar

镜像仓库在这里插入图片描述