Skip to content

1.docker基本概念

1.1环境配置/应用部署的难题

环境配置的难题

  • 软件开发最大的麻烦事之一,就是环境配置,用户计算机环境各不相同,配置也要根据环境相应变化。
  • 操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行,比如开发Java应用,计算机必须配置JDK。
  • 如果某些依赖过时与当前环境不兼容,那更是一场灾难

应用部署的问题

  • 同样在应用部署时,由于组件较多,运行环境复杂,也会遇到类似问题将不同的软件集成起来的过程中有很多不可控的风险,由于依赖关系复杂,容易出现兼容性问题
  • 由于开发、测试、生产环境的差异,一旦需要重新迁移服务器或者重新部署套环境,还将重新执行一遍

如何解决

  • 环境配置如此麻烦,换一台机器,就要重来一次,能不能从根本上解决问题呢
  • 如果软件连同环境一起打包,那就解决了上述问题,也就是说,使用软件时把原始环境一模一样地复制过来

1.2什么是docker

1.2.1Docker如何解决依赖的兼容问题

将应用的Bins/Libs与应用一起打包

将每个应用放到一个隔离容器去运行,避免互相干扰

image-20231030142009100

1.2.2Docker如何解决不同系统环境的问题

  1. Docker将用户程序与所需要调用的系统函数库一起打包
  2. Docker在运行到不同操作系统时,直接通过内核创建虚拟的操作系统实例(内核和库),来隔离不同的进程和资源

image-20231030142854222

1.2.3docker好处

docker好处

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
  • Docker应用运行在容器中,使用沙箱机制,相互隔离
  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核因此可以在任意Linux操作系统上运行

1.2.4主要用途

主要用途

  1. 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
  2. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容
  3. 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构

1.3docker与虚拟机

image-20231030143720476

1.3.1缺点

image-20231030143912931

1.3.2docker与虚拟机

image-20231030144243220

1.4Docker的组成

1.4.1镜像

镜像

Docker 把应用程序及其依赖,打包在image 文件里面。只有通过这个文件才能生成 Docker 容器

image文件可以看作是容器的模板,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数( 如名卷环境变量、用户等)

Docker 根据image 文件生成容器的实例。同一个image 文件,可以生成多个同时运行的容器实例。

镜像不包含任何动态数据,其内容在构建之后也不会被改变

image-20231030145240064

1.4.2仓库

仓库

image-20231030150251735

image-20231030150329180

1.4.3容器

  • 镜像(lmage)和容器 (Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。
  • 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境,容器可以被创建、启动、停止、删除、暂停等。
  • 容器的实质是进程,但与直接在宿主执行的进程不同,:容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。
  • 容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行 更加安全

1.5Docker架构

image-20231030152950279

2.Docker安装与镜像操作

2.1Docker安装

  • Docker 分为 CE 和EE 两大版本。CE 即社区版(免费,支持周期7个月)EE 即企业版,强调安全,付费使用,支持周期 24 个月
  • Docker CE 支持64 位版本 Centos 7,并且要求内核版本不低于3.10Centos7满足最低内核的要求

安装yum工具

shell
yum install yum-utils device-mapper-persistent-data lvm2

更新yum本地软件源

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

更新yum缓存

shell
yum makecache fast

安装docker

shell
yum insta11 -y docker-ce

Docker使用中会涉及到各种端口,为了方便使用最好关闭防火墙

shell
#关闭防火墙
systemctl stop firewalld
#禁止开机启动防火墙
systemctl disable firewalld

查看docker版本

shell
docker -v

配置Docker国内镜像加速___容器镜像服务 (aliyun.com)

复制执行

image-20231030195431891

启动docker

shell
systemctl start docker# 启动docker服务
systemctl stop docker # 停止docker服务
systemctl restart docker# 重启docker服务

2.2镜像操作

2.2.1镜像名称

  • 一个仓库会包含同一个软件不同版本的镜像
  • 镜像名称一般分两部分组成:[仓库名]:[标签],如果不给出标签,将以latest作为默认标签
  • 如: redis:6.0

2.2.2镜像操作

image-20231030200619124
  • 访问DockerHub搜索镜像,https://hub.docker.com/,搜索redis
  • 拉取镜像: docker pull redis
  • 查看本地镜像: docker images
  • 将镜像导出到磁盘: docker save -o 文件名称 镜像名称/ID
  • 删除本地镜像: docker rmi 镜像名称/ID
  • 导入镜像: docker load -i 文件名称
shell
docker pull redis
docker save -o redis.tar redis:latest(TAG)
docker rmi redis:latest(TAG)
docker load -i redis.tar

3.Docker容器操作

3.1Docker容器操作命令

  • docker run 新建并启动容器docker
  • start/stop/pause/unpause 启动/停止/停/恢复容器
  • docker exec 进入容器执行命令
  • docker logs 查看容器运行日志
  • docker ps 查看容器的状态
  • docker rm 删除指定容器

3.2Nginx与Redis容器示例

Nginx

  • 拉取nginx镜像 docker pull nginx

  • 创建并启动容器 docker run --name mynginx -d -p 80:80 nginx

  • --name: 指定容器名称

  • - p:将宿主机端口与容器端口映射,格式:宿主机端口:容器端口

  • -d:后台运行容器

Redis

  • 拉取redis镜像 docker pull redis
  • 创建并启动容器 docker run --name myredis -d -p 6379:6379 redis
  • 进入容器: docker exec -it myredis bash
  • -it:给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
  • bash: 进入容器后执行的命令
  • 进入容器后执行: redis-cli,使用redis客户端操作redis

注意:

容器不能重名,需要唯一标识,改换端口是重新创建了容器

4.Docker数据卷

容器中的数据问题

一个容器运行了一段时间会产生一些数据,比如日志、数据库数据、新改的配置文件,如果这些数据文件存放在容器中,当我们删除容器时,这些数据也会被随之删除。

在docker中,提供了一种存储数据的方法,叫做“数据卷”,可以达到数据共享的目的。

4.1数据卷基本概念

我们可以把“数据卷”Data Volumes理解成“宿主机中的目录”当把某个卷和容器中的某个目录建立映射关系后,就相当于把宿主机中的某个目录和容器中的某个目录建立了映射关系

image-20231030213823571

数据卷提供了很多有用的特性:

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便
  • 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像,解耦开应用和数据
  • 卷会一直存在,直到没有容器使用,可以安全地卸载它

4.2数据卷操作指令

数据卷操作的基本语法为: docker volume [COMMAND],其中COMMAND可选值

  • create:创建一个volume
  • inspect: 显示一个或多个volume的信息
  • ls:列出所有的volume
  • prune:删除未使用的volume
  • rm:删除一个或多个指定的volume

挂载卷

image-20231030220501709

绑定挂载

image-20231030221420262

image-20231030221604256

4.3数据卷应用案例

……

5.Docker自定义镜像

5.1前置知识

5.1.1为什么要自定义镜像

对于Docker用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的数据库中间件、应用软件等都有现成的Docker官方镜像或其他人和组织创建的镜像,我们只需要稍作配置就可以直接使用。

某些情况下我们也不得不自己构建镜像,比如:

  • 找不到现成的镜像,比如自己开发的应用程序
  • 需要在镜像中加入特定的功能

5.1.2镜像的内部结构

如果我们想创建自己的镜像,或者想理解Docker为什么是轻量级的,就非常有必要学习这部分知识了。

  • 下载官方hello-world镜像: docker pull hello-world
  • 运行: docker run hello-world

5.1.3Dockerfile

Dockerfile是镜像的描述文件,定义了如何构建Docker镜像hello-world的Dockerfile:

shell
FROM scratch
COPY hello
CMD ["/hello"]
  • FROM scratch: 表示镜像从白手起家,从0开始构建
  • COPY hello/将文件“hello”复制到镜像的根目录。
  • CMD["/hello”]容器启动时,执行/hello。
  • 镜像hello-world中就只有一个可执行文件“hello”,其功能就是打印出"Hello from Docker ......等信息。

5.1.4bash镜像

image-20231031152306760

5.1.5为什么系统镜像这么小

image-20231031152658779

5.1.6Docker支持运行多种Linux OS

image-20231031153054013

5.2构建镜像

FROM指定基础镜像FORM centos:6
ENV拷贝本地文件到镜像的指定目录ENV key value
COPY拷贝本地文件到镜像的指定目录COPY ./mysql-5.7.rpm /tmp
RUN执行Linux的shell命令,一般是安装过程的命令RUN yum install gcc
EXPOSE指定容器运行时监听的端口,是给镜像使用者看的EXCOPE 8080
ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

实例

Released under the MIT License.