Docker容器安装与案例总结


关于docker容器,对于开发人员来说,很大部分人员认为是运维方面的,但他对于开发也有重要的作用。
官网是这样介绍docker的:
Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications…
其实看完这句话还是不明白docker究竟是什么
我们可以把他想象成是一个用了一种新颖方式实现的超轻量虚拟机。当然在实现的原理和应用上还是和VM有巨大差别的,并且专业的叫法是应用容器(Application Container)。
在这里插入图片描述
比如现在想用MySQL,那就找个装好并配置好的MySQL的容器(可以认为是特殊的,轻量级的虚拟机),运行起来,那么就可以使用 MySQL了。

那么为什么不直接在操作系统中安装一个mysql,而是用容器呢?

安装MySql过程并不简单,要配置安装源,安装依赖包,对mysql进行配置…如果要在多台主机上安装,每台主机都要进行这些繁琐的操作,万一服务器挂了,这一系列操作还要再重来一遍

但有了docker,一个安装配置好的mysql容器,可以直接拿到另一台主机上启动,而不必重新安装mysql

使用Docker最重要的一点就是Docker能保证运行环境的一致性,不会出现开发、测试、生产由于环境配置不一致导致的各种问题,一次配置多次运行。使用Docker,可更快地打包、测试以及部署应用程序,并可减少从编写到部署运行代码的周期。

从这也可以看到开发人员掌握了docker相关技术,运维的事情顺便也解决了。而且速率也提高了,减少了没必要的时间成本。甚至有人还认为运维在未来可能因此而失业,这当然是一种看法,但也不是不可能,在北京的大厂招聘中,开发人员的技术要求中已经可以看到掌握docker技术的会成为加分项
技术的更新换代非常快,若只有需要的时候才去了解,你已经比其他人慢一拍了。对于一个项目的技术应用,要永远站在未来的角度思考,只满足于现状,那被别人打败的概率就会增大。

趁其他人还在满足现状,赶紧赶超他们!
OK!
开始docker学习之路!

1.Docker

1.1 Docker与虚拟机区别

上面简单的说了docker,但还是有些模糊。那容器和虚拟机的区别是啥呢?
虚拟机相信各位都几乎使用过,我们用的传统虚拟机如 VMware , VisualBox 等是需要模拟整台机器包括硬件。

虚拟机是通过虚拟化在物理机上虚拟一个或多个操作系统,并且每个系统之间是隔离的。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统,一旦开启,他就会占用分配的所有资源。

而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。

容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。进程也可以通俗认为是运行的某程序

容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。

通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。

容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。

容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。

对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。

程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker ,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

1.2 Docker 优势

Docker 相比于传统虚拟化方式具有更多的优势:

  1. Docker 启动快速属于秒级别。虚拟机通常需要几分钟去启动。
  2. Docker 需要的资源更少。Docker 在操作系统级别进行虚拟化,Docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化。
  3. Docker 更轻量。Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
  4. 与虚拟机相比,Docker 隔离性更弱。Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。
  5. 高可用和可恢复性。Docker 对业务的高可用支持是通过快速重新部署实现的。
  6. 虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性。
  7. 快速创建、删除。虚拟化创建是分钟级别的,Docker 容器创建是秒级别的,Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间
  8. 交付、部署。虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署。
    在这里插入图片描述

1.3 Docker相关概念

Docker 中包括三个基本的概念:

  1. Image(镜像)
  2. Container(容器)
  3. Repository(仓库)

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

镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
Container(容器)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

Repository(仓库)
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。

但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,16.04, 18.04。我们可以通过 ubuntu:16.04,或者 ubuntu:18.04 来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu,那将视为 ubuntu:latest。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。

2 Docker安装

服务器环境是cenos7

若有docker,则可以先卸载旧版

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

把yum包更新到最新

yum update

docker依赖于系统的一些必要的工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 

设置阿里云镜像源

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

更新 yum 缓存

sudo yum makecache fast

安装新版 docker

sudo yum install docker-ce docker-ce-cli containerd.io

启动 docker

sudo systemctl start docker

查看 docker运行

systemctl status docker

查看 docker信息

docker info 

重启 docker

sudo systemctl restart docker

设置 docker 开机启动

sudo systemctl enable docker

3. Docker实例

关闭防火墙

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

启动或重启docker

# 启动docker
systemctl start docker
# 重启docker
systemctl restart docker

安装jdk环境
先拉取cenos7镜像

docker pull centos:7

查看镜像
在这里插入图片描述

在/usr/local目录下创建jdk目录

mkdir jdk

将jdk-8u212-linux-x64.tar.gz复制到/usr/local/jdk目录下
在这里插入图片描述

创建Dockerfile

vi Dockerfile

内容是


from centos:7
maintainer huangbaokang
run mkdir /usr/local/jdk
workdir /usr/local/jdk
add jdk-8u212-linux-x64.tar.gz /usr/local/jdk

env JAVA_HOME /usr/local/jdk/jdk1.8.0_212
env JRE_HOME /usr/local/jdk/jdk1.8.0_212/jre
env PATH $JAVA_HOME/bin:$PATH

执行命令、注意末尾的点,表示构建过程中从当前目录寻找文件

docker build -t jdk1.8 .

看效果
在这里插入图片描述
查看镜像
在这里插入图片描述启动jdk容器

docker run -di --name=jdk1.8 jdk1.8

在这里插入图片描述
进入jdk容器

docker exec -it jdk1.8 /bin/bash

在这里插入图片描述
进入到容器后可以看到操作跟在Linux操作几乎一样

后续将会推出docker安装其他web部署相关镜像,以及如何运行项目,以及idea的结合使用等

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值