• Docker


    快速入门

    什么是docker?
       Docker 的英文翻译是“集装箱”的意思,也通常叫 Container,Container 里面装的是任意类型的 App,我们的开发人员可以通过 Docker 将 App 变成一种标准化的、可移植的、自管理的组件,我们可以在任何主流的操作系统中开发、调试和运行。

    是一个 C/S 架构的应用程序,主要包含下面几个组件:

    常驻后台进程 Dockerd
       一个用来和 Dockerd 交互的 REST API Server
    命令行 CLI 接口,通过和 REST API 进行交互(我们经常使用的 docker 命令)
    从概念上来看 Docker 和我们传统的虚拟机比较类似,只是更加轻量级,更加方便使,          Docker 和虚拟机最主要的区别有以下几点:

    虚拟化技术依赖的是物理机器的 CPU 和内存,是硬件级别的;而 Docker 是构建在操作系统层面的,利用操作系统的容器化技术,同样是可以运行在虚拟机上面。
    我们知道虚拟机中的系统就是我们常说的操作系统镜像,比较复杂;而 Docker 比较轻量级,我们可以用 Docker 部署一个独立的 Redis,就类似于在虚拟机当中安装一个 Redis 应用,但是我们用 Docker 部署的应用是完全隔离的。
      我们都知道传统的虚拟化技术是通过快照来保存状态的;而 Docker 引入了类似于源码管理的机制,将容器的快照历史版本一一记录下来,切换成本非常之低。
      传统虚拟化技术在构建系统的时候非常复杂;而 Docker 可以通过一个简单的 Dockerfile 文件来构建整个容器,更重要的是 Dockerfile 可以手动编写,这样应用程序开发人员可以通过发布 Dockerfile 来定义应用的环境和依赖,这样对于持续交付非常有利。

    linux环境配置 / 虚拟机安装

    https://b11et3un53m.feishu.cn/wiki/FJAnwOhpIihMkLkOKQocdWZ7nUc

    Docker基础

    MySQL部署

    命令解读

    Docker常见命令

    用以下案例来演示常用的docker命令

    拉取nginx镜像docker pull nginx
    查看本地镜像列表docker images
    创建并运行Nginx容器

    docker run -d --name nginx -p 80:80 nginx

    查看容器docker ps

    停止容器

    docker stop nginx
    再次启动容器docker start nginx
    进入Nginx容器docker exec -it (加上目录等等)
    删除容器docker rm (容器名称)

    数据卷

    存在的意义是方便我们操作容器(隔离的环境)里面的文件

    通过数据卷将容器内的文件映射到宿主机上

    容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:​

    如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?​

    MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?​

    我想要让Nginx代理我的静态资源怎么办?​

    因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。

    数据卷将容器内目录和宿主机目录的文件建立双向映射, 让他们绑定起来, 使他们像量子纠缠一样  ,你怎么变我就怎么变, 因此可以通过数据卷, 简化对容器文件的操作.直接在宿主机操作.

    注意点:注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。


    镜像

    要想自己构建镜像,必须先了解镜像的结构。​
    之前我们说过,镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖。​
    因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成

    举个例子,我们要从0部署一个Java应用,大概流程是这样:​

    准备一个linux服务(CentOS或者Ubuntu均可)​

    安装并配置JDK​

    上传Jar包​

    运行jar包

    上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合

    但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

    例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

    Dockerfile​


    由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。​
    而这种记录镜像结构的文件就称为Dockerfile

    每次制作java镜像都重复制作前两层镜像很麻烦,所以就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

    1. # 基础镜像
    2. FROM openjdk:11.0-jre-buster
    3. # 设定时区
    4. ENV TZ=Asia/Shanghai
    5. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    6. # 拷贝jar包
    7. COPY docker-demo.jar /app.jar
    8. # 入口
    9. ENTRYPOINT ["java", "-jar", "/app.jar"]

    构建镜像

    我们将要拷贝的文件docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录

     然后,执行命令,构建镜像:

    1. # 进入镜像目录
    2. cd /root/demo
    3. # 开始构建
    4. docker build -t docker-demo:1.0 .

    查看镜像列表

    1. # 查看镜像列表:
    2. docker images
    3. # 结果
    4. REPOSITORY TAG IMAGE ID CREATED SIZE
    5. docker-demo 1.0 d6ab0b9e64b9 27 minutes ago 327MB
    6. nginx latest 605c77e624dd 16 months ago 141MB
    7. mysql latest 3218b38490ce 17 months ago 516MB

    尝试运行该镜像

    1. # 1.创建并运行容器
    2. docker run -d --name dd -p 8090:8090 docker-demo:1.0
    3. # 2.查看容器
    4. dps
    5. # 结果
    6. CONTAINER ID IMAGE PORTS STATUS NAMES
    7. 78a000447b49 docker-demo:1.0 0.0.0.0:8080->8080/tcp, :::8090->8090/tcp Up 2 seconds dd
    8. f63cfead8502 mysql 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp Up 2 hours mysql
    9. # 3.访问
    10. curl localhost:8080/hello/count
    11. # 结果:
    12. <h5>欢迎访问黑马商城, 这是您第1次访问<h5>

    项目部署

    部署项目         

    测试,通过浏览器访问:http://你的虚拟机地址:8080/search/list

    1. # 1.构建项目镜像,不指定tag,则默认为latest
    2. docker build -t hmall .
    3. # 2.查看镜像
    4. docker images
    5. # 结果
    6. REPOSITORY TAG IMAGE ID CREATED SIZE
    7. hmall latest 0bb07b2c34b9 43 seconds ago 362MB
    8. docker-demo 1.0 49743484da68 24 hours ago 327MB
    9. nginx latest 605c77e624dd 16 months ago 141MB
    10. mysql latest 3218b38490ce 17 months ago 516MB
    11. # 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
    12. docker run -d --name hmall --network hmall -p 8080:8080 hmall

    DockerCompose​


    大家可以看到,我们部署一个简单的java项目,其中包含3个容器​
    而稍微复杂的项目,其中还会有各种各样的其它中间件,需要部署的东西远不止3个。如果还像之前那样手动的逐一部署,就太麻烦了。​

    而Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署

    docker-compose.yml文件的基本语法可以参考官方

  • 相关阅读:
    【计算机网络】详解TCP协议(上) TCP协议头结构 | ACK确认应答 | 超时重传机制
    论文翻译: FREEVC:朝着高质量、无文本、单次转换声音的目标迈进
    vue源码分析(八)—— update分析(首次渲染)
    IDEA使用技巧
    C++基础与深度解析 | 输入与输出 | 文件与内存操作 | 流的状态、定位与同步
    Windows Server2019上安装CentOS7流程梳理
    Guitar Pro 8吉他新版功能特性简介
    考虑阶梯式碳交易机制与电制氢的综合能源系统热电优化(Matlab代码实现)
    十四天学会C++之第二天(函数和库)
    《canvas》之第2章 直线图形
  • 原文地址:https://blog.csdn.net/TheresaApocaly/article/details/133786822