docker - 简单了解

容器化技术

  1. 物理机时代 :Physical server >> Operating System >> Application
    存在的问题: 部署非常慢、成本很高、资源浪费、难于扩展与迁移、受制于硬件
  2. 虚拟机时代:Physical server >> Host Operating System >> Hypervisor组件:资源分配,对虚拟机管理 >> 多个VM (Guest Operating System -> Application)
    优势:多部署、资源池、资源隔离、很容易扩展
    问题:VM需要安装操作系统 (浪费CPU、内存资源)
  3. 容器化时代:Physical server >> Host Operating System >> Docker >> Container

容器和虚拟机具有类似的资源隔离和分配优势,但是功能不同,因为容器虚拟化的是操作系统而不是硬件,容器更加便携和高效。
在这里插入图片描述

容器化是应用程序层面的隔离 虚拟化是物理资源层面的隔离
容器是应用程序层的抽象,它将代码和依赖项打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器作为独立的进程在用户空间中运行。容器比vm占用更少的空间(容器映像通常有几十个MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。 虚拟机(VM)是将一个服务器转换为多个服务器的物理硬件的抽象。管理程序允许在一台机器上运行多个VM。每个VM都包含一个操作系统、应用程序、必要的二进制文件和库的完整副本——占用数十个GBs。VM的启动速度也可能很慢。

容器化意义

标准化应用打包、运行与部署。
在这里插入图片描述

Docker介绍

Docker是一个用于开发,交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

  • 开源的应用容器引擎,基于 Go 语言开发
  • 容器是完全使用沙箱机制,容器开销极低
  • Docker就是容器化技术的代名词
  • Docker也具备一定虚拟化职能

Docker引擎

是一个客户端-服务器应用程序,主要组件如下:

  • docker daemon,服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
  • REST API,用于指定程序可以用来与守护程序进行通信并指示其操作的接口。
  • docker CLI,命令行界面(CLI)客户端(docker命令)。
    在这里插入图片描述

CLI使用Docker REST API通过脚本或直接CLI命令来控制Docker守护进程或与之交互。,许多其他Docker应用程序都使用基础API和CLI,守护程序创建和管理Docker 对象,例如镜像,容器,网络和卷。

Docker架构

Docker使用客户端-服务器架构。Docker客户端与Docker守护进程进行对话,后者负责构建、运行和分发Docker容器。Docker客户端和守护进程可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
在这里插入图片描述

Docker组件

Docker daemon
Docker守护进程(dockerd)监听Docker API请求并管理Docker对象,例如镜像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

Docker client
Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。

Docker registries
Docker registries存储Docker镜像。Docker Hub是任何人都可以使用的registries,并且Docker配置为默认在Docker Hub上查找镜像。您甚至可以运行自己的私人registry。如果使用Docker数据中心(DDC),则其中包括Docker受信的registry(DTR)。
使用docker pulldocker run命令时,所需的镜像将从配置的registry中抽取。使用docker push命令时,会将镜像推送到配置的registry。

Docker objects
使用Docker,可以创建和使用镜像,容器,网络,卷,插件和其他对象。本节简要概述其中一些对象。

  • IMAGES
    镜像是一个只读模板,带有创建Docker容器的指令,包含运行应用程序所需的一切:代码、运行时环境、系统工具、系统库和设置,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"。
    通常,一个镜像基于另一个镜像,并进行一些额外的定制。例如,您可以构建一个基于ubuntu镜像的镜像,但是安装Apache web服务器和您的应用程序,以及运行该应用程序所需的配置详细信息。
    您可以创建自己的镜像,也可以只使用其他人创建并发布在registries中的镜像。要构建自己的镜像,您需要创建一个Dockerfile,它具有简单的语法,用于定义创建镜像和运行镜像所需的步骤。Dockerfile中的每条指令都会在镜像中创建一个层。当您更改Dockerfile并重新构建映像时,只会重新构建那些已更改的层。与其他虚拟化技术相比,这就是映像如此轻量级、小巧和快速的部分原因。
  • CONTAINERS
    容器是镜像的可运行实例。您可以使用Docker API或CLI创建,启动,停止,移动或删除容器。您可以将容器连接到一个或多个网络,将存储附加到该网络,甚至根据其当前状态创建新镜像。
    默认情况下,容器与其他容器及其宿主机是相对隔离的。您可以控制容器的网络、存储或其他底层子系统与其他容器或宿主机的隔离程度。
    容器由其镜像在创建或启动时为其提供的任何配置选项定义。删除容器后,未存储在持久性存储中的状态更改将消失。
    容器是一个标准的软件单元,它将代码及其所有依赖项打包,从而使应用程序能够从一个计算环境快速可靠地运行到另一个计算环境。
  • SERVICES
    服务允许您跨多个Docker守护进程扩展容器,这些守护进程与多个管理器和工作人员一起工作。集群中的每个成员都是一个Docker守护进程,这些守护进程都使用Docker API进行通信。服务允许您定义所需的状态,例如在任何给定时间必须可用的服务副本数。默认情况下,该服务在所有工作节点之间实现负载平衡。对于消费者而言,Docker服务似乎是一个单独的应用程序。Docker Engine在Docker 1.12及更高版本中支持集群模式。

Docker搭建与部署

搭建

yum install -y yum-utils device-mapper-persistent-data lvm2
> yum-utils:yum的工具包
> device-mapper-persistent-data lvm2:安装数据存储驱动包
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    #添加软件源信息
yum makecache fast    #自动检测优先数据源
yum -y install docker-ce    #更新并安装docker-ce
service docker start    #开启Docker服务
docker version    #验证docker版本号,拥有服务器和客户端
docker pull hello-world    #从远程docker中央仓库中将名为hello-worls镜像抽取到本地
docker run hello-world    #基于hello-world镜像创建容器并运行
> 阿里云加速代理:https://developer.aliyun.com/ 搜索容器镜像服务,进去后点击镜像加速,按照提示执行

部署

docker pull 镜像名<:tags>    #从远程仓库抽取镜像    docker pull tomcat
docker images    #查看本地镜像
docker run 镜像名<:tags>    #创建容器,启动应用    docker run tomcat
docker ps    #查看正在运行中的镜像
docker rm <-f> 容器id    #删除容器
docker rmi <-f> 镜像名:<tags>    #删除镜像
docker stop 容器id    #停止容器

Docker容器

宿主机与容器通信

 docker run -p 8000:8080 tomcat    #启动时配置端口映射  宿主机端口:应用程序端口
 docker run -d tomcat    #后台运行
 netstat -tulpn     #看看应用端口号

容器内部结构

在这里插入图片描述

docker exec [-it] 容器id 命令
exec    #在对应容器中执行命令
-it    #采用交互方式执行命令
docker exec -it 0738ed2fe68b /bin/bash

/var/lib/docker 默认docker目录

容器生命周期

状态:stopped(Created,Exited),running(Up),paused,deleted
在这里插入图片描述
stop与kill的区别:再次启动后容器id是否变化。

容器间Link单向通信

在这里插入图片描述
docker下的虚拟 ip,每个docker环境下创建容器后都会创建一个虚拟的ip,这个ip无法从外界直接访问,只是在docker内部环境彼此通信的表示,当这两个容器被创建后,它们天然拥有自己的虚拟ip,而且在docker内部这两个ip是互通互联的。但是在日常中不使用ip通信,而是使用容器名通信。

docker run -d --name web tomcat    #为容器起别名
docker run -d --name database -it centos /bin/bash    #为容器起别名
docker inspect 容器id    #查看容器元数据
docker run -d --name web --link database tomcat    #单向通信 tomcat可以访问database

Bridge网桥双向通信

在这里插入图片描述
bridge 相当于分组,一个分组内的容器是互联互通的。

docker network ls    #列出当前网络服务明细
docker network create -d bridge my-bridge    #创建一个新的网桥
docker network connect my-bridge web    #使web容器与网桥绑定
docker network connect my-bridge database    #使database容器与网桥绑定

Volume容器间共享数据

在这里插入图片描述
通过设置-v挂载宿主机目录

  • 格式:docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
  • 实例:docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat

通过–volumes-from 共享容器内挂载点

  • 创建共享容器:docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true
  • 共享容器挂载点:docker run --volumes-from webpage --name t1 -d tomcat
    在这里插入图片描述

Dockerfile

构建镜像

Dockerfile镜像描述文件

  • Dockerfile是一个包含用于组合镜像的命令的文本文档
  • Docker通过读取Dockerfile中的指令按步自动生成镜像
  • docker build -t 机构/镜像名<:tags> Dockerfile目录

Dockerfile自动部署Tomcat应用

FROM tomcat:latest    #基准镜像
MAINTAINER mashibing.com    #拥有/维护机构
WORKDIR /usr/local/tomcat/webapps    #切换工作目录
ADD docker-web ./docker-web    #将指定文件/目录复制到容器指定目录下

镜像分层(layer)概念

在这里插入图片描述
散列码:创建临时容器,只能用于容器的构建,不能直接使用。每一步执行完之后docker都会对当前的运行环境做一个快照,这个快照是以临时容器的方式体现的。临时容器可以复用。
在这里插入图片描述

基础命令

FROM - 基于基准镜像

FROM centos #制作基准镜像(基于centos:lastest)
FROM scratch #不依赖任何基准镜像base image
FROM tomcat: 9.0.22-jdk8-openjdk
尽量使用官方提供的Base Image

LABEL & MAINTAINER - 说明信息

MAINTAINER mashibing.com
LABEL version = “1.0”
LABEL description = “马士兵教育”

WORKDIR - 设置工作目录

WORKDIR /usr/local
WORKDIR /usr/local/newdir #自动创建
尽量使用绝对路径

ADD & COPY - 复制文件

ADD hello / #复制到根路径
ADD test.tar.gz / #添加根目录并解压
ADD 除了复制,还具备添加远程文件功能

ENV - 设置环境常量

ENV JAVA_HOME /usr/local/openjdk8 #设置环境常量
RUN ${JAVA_HOME}/bin/java -jar test.jar #${ENV}使用环境常量
尽量使用环境常量,可提高程序维护性

EXPOSE - 暴露容器端口

将容器内部端口暴露给物理机
EXPOSE 8080

执行指令

RUN & CMD & ENTRYPOINT

RUN : 在构建镜像时执行命令
ENTRYPOINT : 容器启动时执行的命令
CMD : 容器启动后执行默认的命令或参数

RUN-构建时运行

RUN yum install -y vim #Shell 命令格式
RUN [“yum”,“install”,"-y",“vim”] #Exec命令格式

  • Shell运行方式

使用Shell执行时,当前shell是父进程,生成一个子shell进程
在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。

  • Exec运行方式

使用Exec方式,会用Exec进程替换当前进程,并且保持PID不变
执行完毕,直接退出,并不会退回之前的进程环境

ENTRYPOINT启动命令

ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
ENTRYPOINT [“ps”] #推荐使用Exec格式

CMD默认命令

CMD用于设置默认执行的命令
如Dockerfile中出现多个CMD,则只有最后一个被执行
如容器启动时附加指令,则CMD被忽略
CMD [“ps” , “-ef”] #推荐使用Exec格式

注意:构建mysql镜像如果需要初始化数据库则需要把初始化脚本放到/docker-entrypoint-initdb.d下

FROM mysql:5.7
WORKDIR /docker-entrypoint-initdb.d
ADD init-db.sql .

构建Redis镜像

Dockerfile

FROM centos
RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"]
WORKDIR /usr/local
ADD redis-4.0.14.tar.gz .
WORKDIR /usr/local/redis-4.0.14/src
RUN make && make install
WORKDIR /usr/local/redis-4.0.14
ADD redis-7000.conf .
EXPOSE 7000
CMD ["redis-server","redis-7000.conf"]

redis-7000.conf

port 7000
bind 0.0.0.0

Docker Compose

容器编排工具

  • Docker Compose 单机多容器部署工具
  • 通过yml文件定义多容器如何部署
  • WIN/MAC默认提供Docker Compose,Linux需安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -version    #检测是否安装成功

安装wordpress博客

cd /usr
mkdir wordpress
cd wordpress
vim docker-compose.yml
version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}
docker-compose up -d    #对docker-compose.yml脚本解析和执行
docker-compose logs    #查看日志
docker-compose logs 容器名    #查看日志
docker-compose down 下线

编写docker-compose.yml

version: '3.3'
services:
  db:
    build: ./db/    #使用Dockerfile所在目录构建镜像
    restart: always    #容错机制
    environment:
      MYSQL_ROOT_PASSWORD: root
  app:
    build: ./app/    #使用Dockerfile所在目录构建镜像
    depends_on:    #依赖容器保持可以访问
      - db
    ports:
      - "80:80"    #宿主机端口:容器端口
    restart: always    #容错机制
发布了15 篇原创文章 · 获赞 0 · 访问量 373

猜你喜欢

转载自blog.csdn.net/weixin_44601009/article/details/104179945