docker入门

一句话介绍Docker:

Docker 使用 Go 语言开发实现,基于 Linux 内核的 cgroup、namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的 虚拟化技术,也被称之为容器。Docker 在容器的基础上,进行了进一步的封装,极大的简化了容器的创建和维护,使得 Docker 技术比虚拟机技术更为轻便、快捷。

 

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

 

Docker 自开源后受到广泛的关注和讨论,至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆,在 2013 年底,dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的;Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持;Google 也在其 PaaS 产品中广泛应用 Docker。

 

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroupnamespace,以及AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd

 

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

 

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

传统虚拟化:

docker:

Docker 两个主要部件:

  • Docker: 开源的容器虚拟化平台
  • Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台 – Docker Hub

Docker 使用客户端-服务器 (C/S) 架构模式。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。

1.1 Docker 守护进程

如上图所示,Docker 守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过

Docker 客户端间接和其通信。

 

1.2 Docker 客户端

Docker 客户端,实际上是 docker 的二进制程序,是主要的用户与 Docker 交互方式。它接收用户指令并且与背后的 Docker 守护进程通信,如此来回往复。

 

1.3 Docker 内部

要理解 Docker 内部构建,需要理解以下三种部件:

  • Docker 镜像 - Docker images
  • Docker 仓库 - Docker registeries
  • Docker 容器 - Docker containers

Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

底层技术

Docker使用Go语言编写,并且使用了一系列Linux内核提供的性能来实现我们已经看到的这些功能。

命名空间(Namespaces)

Docker充分利用了一项称为namespaces的技术来提供隔离的工作空间,我们称之为 container(容器)。当你运行一个容器的时候,Docker为该容器创建了一个命名空间集合。

这样提供了一个隔离层,每一个应用在它们自己的命名空间中运行而且不会访问到命名空间之外。

一些Docker使用到的命名空间有:

  • pid命名空间: 使用在进程隔离(PID: Process ID)。
  • net命名空间: 使用在管理网络接口(NET: Networking)。
  • ipc命名空间: 使用在管理进程间通信资源 (IPC: InterProcess Communication)。
  • mnt命名空间: 使用在管理挂载点 (MNT: Mount)。
  • uts命名空间: 使用在隔离内核和版本标识 (UTS: Unix Timesharing System)。

二、关于安装Docker

Docker版本:

Docker 划分为 CE 和 EE。CE 即社区版(免费,支持周期三个月),EE 即企业版,强调安全,付费使用。官方网站上有各种环境下的 安装指南, Docker CE 在 Linux 、Windows 10 (PC) 和 macOS 上的安装。

其中Linux有:Ubuntu、CentOS、Redhat、Debian。因为服务器系统都是CentOS,所有这里只介绍CentOS的安装及使用,其它版本有需求再讨论。

2.1 Docker安装 准备工作(CentOS)

系统要求

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无法使用,并且部分功能可能不太稳定。

卸载旧版本

可以使用yum命令卸载docker。

  • 查询已经安装的docker包:

$ yum list installed | grep docker docker-engine.x86_64 1.7.1-0.1.el7@/docker-engine-1.7.1-0.1.el7.x86_64

  • 停止docker进程(如果旧版本还在运行)

systemctl stop docker

  • 删除包

$ sudo yum -y remove docker-engine.x86_64

这个命令会卸载docker,但是不会删除镜像,容器,卷或其他用户创建的配置文件。

  • 删除所有镜像容器和卷

$ rm -rf /var/lib/docker

自行删除用户自己创建的配置文件。

1.使用yum命令安装

      • 使用root账号登录或者可以使用sudo特权的账号登录。
      • 确保所有的软件已经更新到最新版本

$ sudo yum update

      • 添加yum的源

$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF' [dockerrepo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg EOF

鉴于国内网络问题,强烈建议使用国内源。

      • 安装docker的包

$ sudo yum install docker

      • 启用docker的服务

$ sudo systemctl enable docker.service

      • 启动Docker的守护线程

$ sudo systemctl start docker

      • 运行一下测试镜像验证docker是否安装完成

$ sudo docker run --rm hello-world

 

2.使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装:

安装 Docker 官方的最新发行版, 支持 Ubuntu 12.04 以上版本

curl -sSL https://get.daocloud.io/docker | sh

阿里云:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

3.镜像加速器

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

我们以 阿里云加速器为例进行介绍。

cat /etc/docker/daemon.json

 

sudo tee /etc/docker/daemon.json <<-'EOF'

{ "registry-mirrors": ["https://l82y3ufb.mirror.aliyuncs.com"] }

EOF

 

 

三、Docker的基本操作

1.镜像操作

之前提到过,Docker Hub 上有大量的高质量的镜像可以用,这里我们就说一下怎么获取这些镜像。从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

docker pull mysql:5.7

  • 查看docker镜像

docker images

  • 运行docker镜像

docker run 就是运行容器的命令(查看Hub)

  • 查找镜像

$ docker search httpd

  • 删除镜像

$ docker rmi 名字 删除镜像(先删除对应的容器)

2.容器操作

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。

  • 新建并启动

当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

docker run --name pica-notice-service \

-h notice --privileged \

-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro \

-v /app/pica-notice-service/logs:/var/logs/pica-notice-service \

-v /app/pica-notice-service/app:/app \

java:8 \

java -jar /app/trajectory-positioning-0.0.1-SNAPSHOT.jar

 

 

docker run -d -p 80:80 --name demo \

-v /app/testapp/:/app \

java:8 \

java -jar /app/trajectory-positioning-0.0.1-SNAPSHOT.jar

  • 启动已终止容器

$ docker start 名字

  • 终止容器

$ docker stop 名字

  • 删除容器

$ docker rm 名字

如果要删除一个运行中的容器,可以添加 -f 参数。Docker 会发送 SIGKILL 信号给容器。

3.容器连接

使用 -p 标识来指定容器端口绑定到主机端口

两种方式的区别是:

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。

$ docker run -d -p 5000:5000 training/webapp python app.py

另外,我们可以指定容器绑定的网络地址,比如绑定127.0.0.1。

$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

这样我们就可以通过访问127.0.0.1:5001来访问容器的5000端口。

默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。

Docker容器连接

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。

四、基于Java jar包环境搭建及运行

1.下载Java镜像

$ docker pull java:8

2.运行项目

$ docker run -d -p 80:80 --name testapp \

-v /app/testapp/app:/app \

java:8 \

java -jar /app/trajectory-positioning-0.0.1-SNAPSHOT.jar

 

五、基于Java war包环境搭建及运行

1.下载Tomcat镜像

$ docker pull tomcat:8

2.运行Tomcat,并导入项目进Tomcat

$ docker run --name tomcatname -p 8888:8080 tomcat:8

docker cp /app/mediasystem/app/MediaSystem.war mediatomcat:/usr/local/tomcat/webapps

 

docker run --name tomcatname -p 8080:8080 \

-v /app/mediasystem:/usr/local/tomcat/webapps/ -d tomcat

3.进入容器查看

$ docker exec -it 容器名字 /bin/bash

 

六、扩展

日志打印:docker logs -f 容器名

查看监听端口: netstat -tnlp

备份容器

选择我们想要备份的容器,然后去创建该容器的备份。docker commit 命令来创建备份 生成的备份会在镜像中出现。

docker commit -p 30b8f18f20b4 container-backup

保存镜像(可以保存在Docker hub、和本地)

docker save -o /app/testapp/testapp-backup.tar testapp-backup

恢复容器

docker load -i /app/testapp/testapp-backup.tar

再运行容器

docker run -td --name HelloTest -p 80:80 htbackup:v1 java -jar /app

 

 

以上安装上用下面的方式安装

指定安装版本安装:

yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

 

yum list docker-ce --showduplicates | sort -r

 

yum install docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io-1.2.0。

curl方式安装:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

开机自启:

systemctl enable docker

切换镜像源(一般都需要除非你5G):

sudo tee /etc/docker/daemon.json <<-'EOF'

{ "registry-mirrors": ["https://l82y3ufb.mirror.aliyuncs.com"] }

EOF

完。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值