掌握Docker:让你的应用轻松部署和管理

文章目录

      • 一、引言(为什么要学习docker?)
        • [1.1 环境不一致](#1.1 环境不一致)
        • [1.2 隔离性](#1.2 隔离性)
        • [1.3 弹性伸缩](#1.3 弹性伸缩)
        • [1.4 学习成本](#1.4 学习成本)
      • 二、Docker介绍
        • [2.1 Docker的由来](#2.1 Docker的由来)
        • [2.2 什么是Docker](#2.2 什么是Docker)
        • [2.3 为什么要用Docker](#2.3 为什么要用Docker)
          • [2.3.1 虚拟机](#2.3.1 虚拟机)
          • [2.3.2 Linux容器](#2.3.2 Linux容器)
        • [2.4 Docker与传统虚拟机的区别](#2.4 Docker与传统虚拟机的区别)
        • [2.5 Docker的思想](#2.5 Docker的思想)
      • 三、Docker的安装
        • [3.1 下载Docker依赖的环境](#3.1 下载Docker依赖的环境)
        • [3.2 指定Docker镜像源](#3.2 指定Docker镜像源)
        • [3.3 安装Docker](#3.3 安装Docker)
        • [3.4 启动Docker并测试](#3.4 启动Docker并测试)
      • 四、Docker的中央仓库【`重点`】
      • 五、镜像的操作【`重点`】
        • [5.1 拉取镜像](#5.1 拉取镜像)
        • [5.2 查看本地全部镜像](#5.2 查看本地全部镜像)
        • [5.3 删除本地镜像](#5.3 删除本地镜像)
        • [5.4 镜像的导入导出](#5.4 镜像的导入导出)
      • 六、容器操作【`重点`】
        • [6.1 运行容器](#6.1 运行容器)
        • [6.2 查看正在运行的容器](#6.2 查看正在运行的容器)
        • [6.3 查看容器日志](#6.3 查看容器日志)
        • [6.4 进入容器内容部](#6.4 进入容器内容部)
        • [6.5 复制内容到容器](#6.5 复制内容到容器)
        • [6.6 重启&启动&停止&删除容器](#6.6 重启&启动&停止&删除容器)
      • 七、数据卷【`重点`】
        • [7.1 创建数据卷](#7.1 创建数据卷)
        • [7.2 查看数据卷详情](#7.2 查看数据卷详情)
        • [7.3 查看全部数据卷](#7.3 查看全部数据卷)
        • [7.4 删除数据卷](#7.4 删除数据卷)
        • [7.5 容器映射数据卷](#7.5 容器映射数据卷)
      • 八、Dockerfile自定义镜像【`重点`】
        • [8.1 Dockerfile](#8.1 Dockerfile)
        • [8.2 通过Dockerfile制作镜像](#8.2 通过Dockerfile制作镜像)
      • [九. Docker-Compose【`重点`】](#九. Docker-Compose【重点】)
        • [9.1 下载并安装Docker-Compose](#9.1 下载并安装Docker-Compose)
          • [9.1.1 下载Docker-Compose](#9.1.1 下载Docker-Compose)
          • [9.1.2 设置权限](#9.1.2 设置权限)
          • [9.1.3 配置环境变量](#9.1.3 配置环境变量)
          • [9.1.4 测试](#9.1.4 测试)
        • [9.2 Docker-Compose管理MySQL和Tomcat容器](#9.2 Docker-Compose管理MySQL和Tomcat容器)
        • [9.3 使用docker-compose命令管理容器](#9.3 使用docker-compose命令管理容器)
        • [9.4 docker-compose配合Dockerfile使用](#9.4 docker-compose配合Dockerfile使用)
          • [9.4.1 docker-compose文件](#9.4.1 docker-compose文件)
          • [9.4.2 Dockerfile文件](#9.4.2 Dockerfile文件)
          • [9.4.3 运行](#9.4.3 运行)

一、引言(为什么要学习docker?)


1.1 环境不一致

我本地运行没问题啊:由于环境不一致,导致相同的程序,运行结果却不一致。

1.2 隔离性

哪个哥们又写死循环了,怎么这么卡:在多用户的操作系统下,会因为其他用户的操作失误影响到你自己编些的程序。

1.3 弹性伸缩

淘宝在双11的时候,用户量暴增:需要很多很多的运维人员去增加部署的服务器,运维成本过高的问题。

1.4 学习成本

学习一门技术,得先安装啊:学习每一门技术都要先安装响应的软件,但是还有他所依赖的各种环境,安装软件成本快高过学习成本啦。

二、Docker介绍


2.1 Docker的由来

一帮年轻人创业,创办了一家公司,2010年的专门做PAAS平台(平台即服务,把应用服务的运行和开发环境作为一种服务提供 )。但是到了2013年的时候,像亚马逊,微软,Google都开始做PAAS平台。到了2013年,公司资金链断裂,不得不倒闭,于是将公司内的核心技术对外开源,核心技术就是Docker。由于开源了Docker,到了2014年的时候,得到了C轮的融资 $4000W,2015年的时候,得到了D轮的融资.$9500W。于是公司开始全神贯注的维护Docker。

Docker主要作者-所罗门
Docker的作者已经离开了维护Docker的团队
2.2 什么是Docker

Docker时Docker.Lnc公司开源的一个基于LXC(Linux Container容器是一种内核虚拟化技术)技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。

Docker将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。

2.3 为什么要用Docker
2.3.1 虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真机系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其它部分毫无影响。

虚拟机的缺点

资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有1M,虚拟机依然需要几百MB的内容才能运行。

启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

2.3.2 Linux容器

由于虚拟机存在这个缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机又很多优势。 Docker在一定程度上是LXC的增强版

(1)启动快

启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

2.4 Docker与传统虚拟机的区别

1、docker直接构建在Linux操作系统之上,其使用的内核为当前宿主机的内核;虚拟机一般构建在虚拟机管理软件之上,拥有独立的内核

2、由于docker直接使用宿主机内核所以其性能接近宿主机性能;虚拟机使用自己的内核,但是其内核也是虚拟出来的所以需要进行两级调度性能相对较差。

3、docker相对虚拟机更加轻量,其他和部署更加方便快捷。

bins/libs:应用的中所用的库文件

HostOs:是一种虚拟化技术是在物理机器上安装操作系统,然后在这个操作系统上安装

Hypervisor:虚拟化软件,这样就可以在物理机上虚拟化出若干分区,可以分别安装不同的操作系统。那么在这个物理机器上安装的操作系统就叫做Host OS,对应的安装在虚拟分区上的操作系统叫做Guest OS。

hypervisor:称虚拟机监视器,是用来建立与执行虚拟机器的软件、固件或硬件。

infrastructure:基础设备

2.5 Docker的思想
  • 集装箱:会将所有需要的内容放到不同的集装箱中,谁需要这些环境就直接拿到这个集装箱就可以了。

  • 标准化:

    • 运输的标准化:Docker有一个码头,所有上传的集装箱都放在了这个码头上,当谁需要某一个环境,就直接指派大鲸鱼去搬运这个集装箱就可以了。
    • 命令的标准化:Docker提供了一些列的命令,帮助我们去获取集装箱等等操作。
    • 提供了REST的API:衍生出了很多的图形化界面,Rancher。
  • 隔离性:Docker在运行集装箱内的内容时,会在Linux的内核中,单独的开辟一片空间,这片空间不会影响到其他程序。

  • 中央仓库|注册中心:超级码头,上面放的就是集装箱,存放镜像的地方。

  • 镜像:就是集装箱

  • 容器:运行起来的镜像

三、Docker的安装


3.1 下载Docker依赖的环境

想安装Docker,需要先将依赖的环境全部下载,就像Maven依赖JDK一样

sh 复制代码
yum -y install yum-utils device-mapper-persistent-data lvm2
3.2 指定Docker镜像源

默认下载Docker回去国外服务器下载,速度较慢,我们可以设置为阿里云镜像源,速度更快。

Docker有两个版本,ce版(社区版,免费),ee版(企业版,收费)

sh 复制代码
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.3 安装Docker

依然采用yum的方式安装

sh 复制代码
yum -y install docker-ce
3.4 启动Docker并测试

安装成功后,需要手动启动,设置为开机自启,并测试一下Docker

sh 复制代码
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world

四、Docker的中央仓库【重点


json 复制代码
# 需要创建/etc/docker/daemon.json,并添加如下内容
{
  "registry-mirrors": ["https://4p6hldmh.mirror.aliyuncs.com"]
}
# 重启两个服务
systemctl daemon-reload
systemctl restart docker

五、镜像的操作【重点


5.1 拉取镜像

从中央仓库拉取镜像到本地

sh 复制代码
docker pull 镜像名称[:tag]

# 举个栗子:docker pull daocloud.io/library/tomcat:8.5.15-jre8
5.2 查看本地全部镜像

查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小

sh 复制代码
docker images
5.3 删除本地镜像

镜像会占用磁盘空间,可以直接手动删除,表示通过查看获取

sh 复制代码
docker rmi 镜像的标识
5.4 镜像的导入导出

如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名称和版本都是null,需要手动修改

sh 复制代码
# 将本地的镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本

六、容器操作【重点


6.1 运行容器

运行容器需要制定具体镜像,如果镜像不存在,会直接下载

sh 复制代码
# 简单操作
docker run 镜像的标识|镜像名称[:tag]

# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d:代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:指定容器的名称
6.2 查看正在运行的容器

查看全部正在运行的容器信息

sh 复制代码
docker ps [-qa]
# -a:查看全部的容器,包括没有运行
# -q:只查看容器的标识
6.3 查看容器日志

查看容器日志,以查看容器运行的信息

sh 复制代码
docker logs -f 容器id
# -f:可以滚动查看日志的最后几行
6.4 进入容器内容部

可以进入容器内部进行操作

sh 复制代码
docker exec -it 容器id bash
6.5 复制内容到容器

将宿主机的文件复制到容器内部的指定目录

sh 复制代码
docker cp 文件名称 容器id:容器内部路径
6.6 重启&启动&停止&删除容器

容器的启动,停止,删除等操作,后续经常会使用到

sh 复制代码
# 重新启动容器
docker restart 容器id

# 启动停止运行的容器
docker start 容器id

# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)

# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)

七、数据卷【重点


在部署SSM的工程中,需要使用到cp的命令将宿主机内的ssm.war文件复制到容器内部。

数据卷:将宿主机的一个目录映射到容器的一个目录中。

可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着一起改变。

7.1 创建数据卷

创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volumes/数据卷名称/_data

sh 复制代码
docker volume create 数据卷名称
7.2 查看数据卷详情

查看数据卷的详细信息,可以查询到存放路径,创建时间等等

sh 复制代码
docker volume inspect 数据卷名称
7.3 查看全部数据卷

查看全部数据卷信息

sh 复制代码
docker volume ls
7.4 删除数据卷

删除指定数据卷

sh 复制代码
docker volume rm 数据卷名称
7.5 容器映射数据卷

映射有两种方式:

  • 通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。
  • 通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。
sh 复制代码
# 通过数据卷名称映射
docker run -v 数据卷名称:容器内部的路径 镜像id
# 通过路径映射数据卷
docker run -v 路径:容器内部的路径 镜像id

八、Dockerfile自定义镜像【重点


我们可以从中央仓库下载一个镜像,也可以自己手动去制作一个镜像,需要通过Dockerfile去指定自定义镜像的信息

8.1 Dockerfile

创建自定义镜像就需要创建一个Dockerfile,如下为Dockerfile的语言

sh 复制代码
from: 指定当前自定义镜像依赖的环境
copy: 将相对路径下的内容复制到自定义镜像中
workdir: 声明镜像的默认工作目录
run: 执行的命令,可以编写多个
cmd: 需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)

# 举个例子,创建一个dockerfile文件,制作SSM容器镜像,而且ssm.war要放在Dockerfile的同级目录下
from daocloud.io/library/tomcat:8.5.16-jre8-alpine
copy ssm.war /usr/local/tomcat/webapps
8.2 通过Dockerfile制作镜像

编写完Dockerfile后需要通过命令将其制作为镜像,并且要在Dockerfile的当前目录下,之后即可在镜像中查看到指定的镜像信息,注意最后的 .

sh 复制代码
docker build -t 镜像名称[:tag] .

这里的.指的dockerfile的路径,一般都在dockerfile所在目录制作镜像,所以设置.会在当前目录找dockerfile文件。

九. Docker-Compose【重点


之前运行一个镜像,需要添加大量的参数,可以通过Docker-Compose编写这些参数。而且Docker-Compose可以帮助我们批量的管理容器。这些信息只需要通过一个docker-compose.yml文件去维护即可。

9.1 下载并安装Docker-Compose
9.1.1 下载Docker-Compose

去github官网搜索docker-compose,下载1.24.1版本的Docker-Compose

下载路径:https://github.com/docker/compose/releases/download/1.24.1/docker-compose-Linux-x86_64

9.1.2 设置权限

需要将DockerCompose文件的名称修改一下,给予DockerCompose文件一个可执行的权限

sh 复制代码
mv docker-compose-Linux-x86_64 docker-compose
chmod 777 docker-compose
9.1.3 配置环境变量

方便后期操作,配置一个环境变量

将docker-compose文件移动到了/usr/local/bin , 修改了/etc/profile文件,给/usr/local/bin配置到了PATH中

sh 复制代码
mv docker-compose /usr/local/bin

vi /etc/profile
# 添加内容: export PATH=$JAVA_HOME:/usr/local/bin:$PATH

source /etc/profile
9.1.4 测试

在任意目录下输入docker-compose

测试效果
9.2 Docker-Compose管理MySQL和Tomcat容器

yml文件以key: value方式来指定配置信息

多个配置信息以换行+缩进的方式来区分

在docker-compose.yml文件中,不要使用制表符

yml 复制代码
version: '3.1'
services:
  mysql:           # 服务的名称
    restart: always   # 代表只要docker启动,那么这个容器就跟着一起启动
    image: daocloud.io/library/mysql:5.7.4  # 指定镜像路径
    container_name: mysql  # 指定容器名称
    ports:
      - 3306:3306   #  指定端口号的映射
    environment:
      MYSQL_ROOT_PASSWORD: root   # 指定MySQL的ROOT用户登录密码
      TZ: Asia/Shanghai        # 指定时区
    volumes:
     - /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql   # 映射数据卷
  tomcat:
    restart: always
    image: daocloud.io/library/tomcat:8.5.16-jre8-alpine
    container_name: tomcat
    ports:
      - 8080:8080
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /opt/docker_mysql_tomcat/tomcat_webapps:/usr/local/tomcat/webapps
      - /opt/docker_mysql_tomcat/tomcat_logs:/usr/local/tomcat/logs

version 字段是表明使用那个版本的compose ,compose 有如下的版本,目前的最新版是 3.7

  • 1
  • 2
  • 2.x
  • 3.x

不同版本的 compose 支持了不同的 docker 版本

9.3 使用docker-compose命令管理容器

在使用docker-compose的命令时 ,默认会在当前目录下找docker-compose.yml文件

sh 复制代码
# 1. 基于docker-compose.yml启动管理的容器
docker-compose up -d

# 2. 关闭并删除容器
docker-compose down

# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart

# 4. 查看由docker-compose管理的容器
docker-compose ps

# 5. 查看日志
docker-compose logs -f
9.4 docker-compose配合Dockerfile使用

使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像的同时启动当前镜像,并且由docker-compose去管理容器

9.4.1 docker-compose文件

编写docker-compose.yml文件

yml 复制代码
# yml文件
version: '3.1'
services:
  ssm:
    restart: always
    build:            # 构建自定义镜像
      context: ../      # 指定dockerfile文件的所在路径
      dockerfile: Dockerfile   # 指定Dockerfile文件名称
    image: ssm:1.0.1
    container_name: ssm
    ports:
      - 8081:8080
    environment:
      TZ: Asia/Shanghai
9.4.2 Dockerfile文件

编写Dockerfile文件

from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
9.4.3 运行

测试效果

sh 复制代码
# 可以直接启动基于docker-compose.yml以及Dockerfile文件构建的自定义镜像
docker-compose up -d
# 如果自定义镜像不存在,会帮助我们构建出自定义镜像,如果自定义镜像已经存在,会直接运行这个自定义镜像
# 重新构建的话。
# 重新构建自定义镜像
docker-compose build
# 运行当前内容,并重新构建
docker-compose up -d --build

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹

相关推荐
xlsw_2 分钟前
java全栈day21--Web后端实战之利用Mybaits查询数据
java·开发语言
什么想法都无16 分钟前
stream
java·java stream
m0_7482336417 分钟前
WebService简介
java
Murphy202317 分钟前
.net4.0 调用API(form-data)上传文件及传参
开发语言·c#·api·httpwebrequest·form-data·uploadfile·multipart/form-
love静思冥想17 分钟前
Stream `Collectors.toList()` 和 `Stream.toList()` 的区别(Java)
java·stream
我曾经是个程序员27 分钟前
C#Directory类文件夹基本操作大全
服务器·开发语言·c#
白云~️29 分钟前
uniappX 移动端单行/多行文字隐藏显示省略号
开发语言·前端·javascript
编码浪子34 分钟前
构建一个rust生产应用读书笔记7-确认邮件2
开发语言·后端·rust
Ch.yang36 分钟前
【Spring】 Bean 注入 HttpServletRequest 能保证线程安全的原理
java·spring·代理模式
web1508509664137 分钟前
基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)
java