1、docker基础介绍

1.1、什么是docker?

官方网站
image.png

  • Docker是基于Go语言实现的开源容器项目。诞生于2013年年初,最初发起者是dotCloud公司
  • 容器是一个标准化软件单元
  • Docker是容器引擎,对进程进行封装隔离,属于 操作系统层面的虚拟化技术,为用户提供了创建和管理容器的便捷操作
  • Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,
    即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组件,
  • 既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群

1.2、Docker Vs VM

image.png

DockerVM
容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,​​并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要的VM和操作系统更少虚拟机(VM)是将一台服务器转变为多台服务器的物理硬件的抽象。系统管理程序允许多个VM在单台计算机上运行。每个VM包含操作系统,应用程序,必要的二进制文件和库的完整副本-占用数十GB。VM也可能启动缓慢
image.png

1.3、Docker的生态圈

image.png

2、docker三大核心

三大核心交互:
image.png

2.1、镜像

  • Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

  • Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。

  • 镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。

  • Docker镜像采用分层的结构

Dockerfile(镜像模板)
下面是一个redis镜像的模板,

# 依赖的基础镜像,这里依赖了debian系统
FROM debian:stretch

# RUN 运行系统命令
RUN apt-get update
RUN apt-get install -y gcc libc6-dev make wget
RUN wet -0 redis.tar.gz"http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),
每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

有了Dockerfile我们可以在任何装有docker容器的机器上编译这个镜像,并运行它

2.2、仓库

  • 一个集中的存储、分发镜像的服务
  • Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。
  • 根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
  • 镜像使用仓库名称+tag进行区分,tag类似于版本号,如ubuntu:16.04、ubuntu:18.04

官方镜像仓库: https://hub.docker.com/

操作仓库docker命令

docker login               命令行登录dockerHub
docker search centos       在官方仓库中搜索镜像
docker pull centos         下载镜像到本地
docker tag centos centos:1.0.1    给镜像打标签
docker push centos:1.0.1   将自己的镜像推送到dockerHub中

2.3、容器

  • 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。
  • 可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

操作容器的docker命令
docker run 新建并启动一个容器

docker run ubuntu:18.04 /bin/echo 'Hello world’
docker run -t -i ubuntu:18.04 /bin/bash

-i: 则让容器的标准输入保持打开
-t: 选项让Docker分配一个伪终端并绑定到容器的标准输入上, -i -t 通常一起使用,直接登入到容器中
-d: 后台运行

docker container ls           列出当前的容器
docker container stop         终止一个运行中的容器
docker container start        启动已终止的容器
docker container rm           删除一个已停止的容器,-f 强制删除一个正在运行的容器
docker exec -it 69d1 bash     进入容器

3、docker实践案例

3.1、运行一个redis服务

#搜索
docker search redis
#下载镜像
docker pull redis
#运行容器
docker run -itd --name redis-test -p 16379:6379 redis
#--name  指定名称
#-p      指定端口映射,主机暴露端口:容器内服务端口
#连接
redis-cli –p 16379

3.2、运行一个javaweb服务

3.2.1、对自己的项目进行打包

任意javaweb的项目均可以

# mvn 打包
mvn clean package

3.2.2、编写Dockerfile文件

# 依赖jdk8的lunix环境
FROM ascdc/jdk8
VOLUME /tmp
ADD docker-test.jar app.jar
RUN bash -c 'touch app.jar'
# 执行运行java命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/ ./urandom", "-jar", "app.jar"]

3.2.3、构建镜像

将你编译的java jar和Dockerfile文件放在同一个文件夹下,然后运行下面的命令

docker build -t docker-test:1.0.3 ./

3.2.4、运行镜像

docker run -it --link d76dd9d00a79:redis -p 38080:38080 docker-test:1.0.3