部署docker容器虚拟化平台

Posted superpython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署docker容器虚拟化平台相关的知识,希望对你有一定的参考价值。

部署docker容器虚拟化平台

本文一共有五个小部分分别是:

  • Docker概述

  • docker平台的基本使用方法

  • docker镜像的制作与发布

  • Container容器的端口映射


Docker的概述

操作环境:CentOS7.6 - 64 bit

docker概述

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包装系统

Tips扩展:沙盒

沙盒也叫沙箱,英文sandbox。在计算机领域指一种虚拟技术,且多用于计算机安全技术。安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。

Docker是dotCloud公司开源的一个基于LXC的高级容器引擎,源代码托管在Github上, 基于go语言并遵从Apache2.0协议开源。

Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。

docker的创新:docker镜像一次构建,到处运行。

技能扩展:LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。LXC主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。

官方网站:https://www.docker.com/

docker实际上还有一个名字叫做码头工人

而我们的container就是我们的容器,在docker的图标上就是鲸鱼上的集装箱

docker的源代码开源在Github上面:https://github.com/moby/moby

docker技术和虚拟机技术有什么不同?

相同点:docker容器技术和虚拟机技术,都是虚拟化技术。

部署docker容器虚拟化平台

本图为作者在网站上查找后进行更改

从上图来看我们docker容器是比虚拟机快的,因为docker容器少了操作系统这一层的要求

Docker的架构

部署docker容器虚拟化平台

工作流程:服务器A上运行docker Engine 服务,在docker Engine上启动很多容器container , 从外网Docker Hub上把image操作系统镜像下载来,放到container容器运行。这样一个容器的实例就运行起来了。最后,通过Docker client 对docker 容器虚拟化平台进行控制。

dockerhub:dockerhub是docker官方的镜像存储站点,其中提供了很多常用的镜像供用户下载,如ubuntu, centos等系统镜像。通过dockerhub用户也可以发布自己的docker镜像,为此用户需要注册一个账号,在网站上创建一个docker仓库。

作为一个运维和开发人士你必须拥有Github和dockerhub账号

dockerhub网址:https://hub.docker.com/

个人注册选择免费计划即可

Docker 核心技术

1.Namespace — 实现Container的进程、网络、消息、文件系统和主机名的隔离。2.Cgroup — 实现对资源的配额和度量。注:Cgroup的配额,可以指定实例使用的cpu个数,内存大小等。

Docker的特性
优点:

1.一些优势和VM一样,但不是所有都一样。比虚拟机小,比虚拟机快,Docker容器的尺寸减小相比整个虚拟机大大简化了分布到云和从云分发时间和开销。Docker启动一个容器实例时间很短,一两秒就可以启动一个实例。2.对于在笔记本电脑,数据中心的虚拟机,以及任何的云上,运行相同的没有变化的应用程序,IT的发布速度更快。Docker是一个开放的平台,构建,发布和运行分布式应用程序。Docker使应用程序能够快速从组件组装和避免开发和生产环境之间的摩擦。3.您可以在部署在公司局域网或云或虚拟机上使用它。4.开发人员并不关心具体哪个Linux操作系统使用Docker,开发人员可以根据所有依赖关系构建相应的软件,针对他们所选择的操作系统。然后,在部署时一切是完全一样的,因为一切都在DockerImage的容器在其上运行。开发人员负责并且能够确保所有的相关性得到满足。5.Google,微软,亚马逊,IBM等都支持Docker。6.Docker支持Unix/Linux操作系统,也支持Windows或Mac

缺点局限性:

1.Docker用于应用程序时是最有用的,但并不包含数据。日志,跟踪和数据库等通常应放在Docker容器外。一个容器的镜像通常都很小,不适合存大量数据,存储可以通过外部挂载的方式使用。比如使用:NFS,ipsan,MFS等, -v 映射磁盘分区一句话:docker只用于计算,存储交给别人。oracle 不适合使用docker来运行,存储的数据太多,特别大。

Docker版本简单介绍

我们现在先讨论一下docker的安装命令,这里不需要大家安装,等一下我们一起安装

首先docker一共有三个安装命令,但是其实安装的都是同一个东西

yum install docker
yum install docker-engine
yum install docker-ce

Docker最早的版本名是docker 和 docker-engine,现在名字是docker-ce和docker-ee。如下图,官方网站上有明确说明:

https://docs.docker.com/install/linux/docker-ce/centos/

部署docker容器虚拟化平台

版本介绍:

2017年,docker公司将原先的docker开源项目改名为moby。moby是继承了原先的docker的项目,是社区维护的的开源项目,谁都可以在moby的基础打造自己的容器产品。docker-ce是docker公司维护的开源项目,是一个基于moby项目的免费的容器产品docker-ee是docker公司维护的闭源产品,是docker公司的商业产品,所以我们一般会在使用docker容器的公司使用到这个版本

注:moby是源代码 ;docker-ce和docker-ee是容器产品,是rpm包。所以,现在我们经常使用到的版本就是docker-ce版本了。


部署docker容器虚拟化平台并配置docker镜像加速地址

安装环境

CentOS 7.6系统


安装环境依赖包

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

docker yum源配置

我们然后配置一下国内的阿里yum源,因为默认走的是国外线路的docker源,导致下载比较慢或者根本无法下载

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

安装docker-ce

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

注:

docker-ce-cli 作用是docker命令行工具包containerd.io 作用是容器接口相关包 yun info 软件包的命令,可以查看一个包的具体作用。

启动docker并设置开机自启动

systemctl start docker && systemctl enable docker

docker版本查看

然后我们来查看一下docker版本

docker version

显示docker系统信息,包括镜像和容器数量

docker info

Docker镜像的下载

部署docker容器虚拟化平台

搜索符合条件的镜像
docker search centos

方法一:从docker hub拉取docker镜像

docker pull centos

等待命令执行完成后就可以使用了

方法二:使用阿里云docker镜像加速器,提升pull的速度:

顺便给大家附上网易镜像:https://c.163.com/hub#/m/home/

如何配置加速镜像库

方法1:创建配置文件daemon.json

 vim  /etc/docker/daemon.json

写入如下内容:

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

然后输入

systemctl daemon-reload

重启docker

systemctl restart docker

在最后就可以看到我们的加速镜像库了

docker info
Registry Mirrors:
方法2:修改docker服务启动脚本
 vim /usr/lib/systemd/system/docker.service

改14 行ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

改为 ExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://rncxm540.mirror.a liyuncs.com --containerd=/run/containerd/containerd.sock

推荐大家使用创建配置文件daemon.json的方法

重启docker服务使daemon.json生效

重新加载daemon

 systemctl daemon-reload

重启docker

systemctl restart docker
方法3:把之前下载好的image镜像导入image:

运行

docker load -i  /root/docker-centos-httpd.tar

把docker-centos-httpd.tar  镜像上传到linux上参数: -i  docker-centos-httpd.tar  指定载入的镜像归档。

方法4:直接下载其他站点的镜像
docker pull hub.c.163.com/library/tomcat:latest
docker images

开启动网络转发功能

开启动网络转发功能,默认会自动开启.

 vim /etc/sysctl.conf

插入一下内容

net.ipv4.ip_forward = 1

让他生效一下

 sysctl  -p

查看一下是否添加成功

 cat /proc/sys/net/ipv4/ip_forward

然后关闭防火墙

 systemctl stop firewalld && systemctl disable firewalld

然后我们把docker服务重启一下,不然后docker 的ip包转发功能无法使用。即使防火墙关了,docker会调用内核模块netfilter增加规则,所以有防火墙规则。


Docker平台的基本使用

例1:运行一个 container并加载镜像centos,运行起来这个实例后,在实例中执行 /bin/bash命令

docker常用参数:run  运行-i   以交互模式运行容器,通常与 -t 同时使用;-t  为容器重新分配一个伪输入终端,通常与 -i 同时使用;

然后我们查看一下镜像

docker images

然后我们启动一下实例

docker run -it centos:latest bash

然后输入ls查看实例环境

 cat /etc/redhat-release

退出容器:

exit

例2:在 container 中启动一个长久运行的进程,不断向stdin输出 hello world 。模拟一个后台运行的服务

docker常用参数:-d  后台运行容器,并返回容器ID;-c  后面跟待完成的命令

运行一下容器

docker run  -d centos:latest /bin/sh -c "while true;do echo hello world; sleep 1; done"

它会给我们返回出来一共容器的id,例如

1b3493487c4fde6eb233d59fa9ab9a204ad993cd3debbd5a9a28be6816694605

从一个容器中取日志,查看输出的内容,可用于后期检查docker实例在标准输出中弹出的错误信息或正常的信息。

语法:docker  logs   容器实例的Name/ID

我们查看一下日志

 docker logs 1b3493487c4

Tips:容器的ID可以写全,也可以不写全,只要唯一就可以

查看正在运行的容器
 docker ps

也可以使用短ID或docker实例的名字查看日志输出

短ID查看

docker logs 4109c3446284

名称查看

docker logs flamboyant_davinci

使用-a 列出所有容器(包含沉睡/退出状态的容器)

 docker ps -a

例3:强制关闭一个容器。比如:杀死一个正在后台运行的容器

先使用我们上一条命令,列出所有容器

 docker ps -a

然后把我们的ID复制下来

然后在命令行输入

假设ID为123

docker kill  123

然后我们查看一下结果

 docker ps

看看我们刚才杀掉的容器还存不存在

例4:启动、停止、重启 container容器实例

启动:run  创建并运行docker实例

 docker run  -d  centos:latest /bin/sh -c "while true;do echo hello world; sleep 1; done"

查看容器

 docker ps

关闭容器

ID:1a63ddea6571

 docker stop 1a63ddea6571

删除指定 container :rm

删除容器命令

docker rm 8683629d2925

如果报错

Error response from daemon: You cannot remove a running container 8683629d29252eac84786bc6a0a930a10e997e4a30c071a803673f3b0d30c42d. Stop the container before attempting removal or force remove

你可以尝试把这个容器的ID先关闭之后进行删除,第二种方法这个是最不推荐的方法就是使用-f强制删除

例如

docker rm -f 1a63ddea6571

docker镜像制作方法

Docker Image 的制作两种方法

方法1:docker commit

保存 container 的当前状态到 image后,然后生成对应的image


方法2:docker build

使用 Dockerfile 文件自动化制作 image


方法一:docker commit实现方法

创建一个安装好apache web服务器的容器镜像

docker run -it centos:latest /bin/bash

在 container 中安装 apache 软件包

yum -y install  httpd

然后输入exit退出容器

查看一下images列表

docker images


根据容器当前状态做一个image镜像:创建一个安装了apache工具的centos镜像

语法:docker commit <container的ID>  <新的image_name>

例:查看容器ID:

docker ps -a
docker commit 1d3563200047 centos:apache
docker images

使用新创建的centos:apache镜像,生成一台容器实例

docker run -it centos:apache /bin/bash

查看已经安装好的apache

 rpm -qa httpd

如果输出版本号即为安装成功


方法二:通过:。docker build创建一个基于centos的httpd web服务器镜像。

使用docker build创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像

注:Dockerfile有点像源码编译时./configure后产生的Makefile

我们以前安装web服务器:1、安装系统, 2、安装web  至少需要10-20分钟,现在要求2秒安装好一个web服务器

解决方案

提前生成web服务器的docker镜像,然后直接加载web docker镜像启动服务。


以下操作要在docker物理机上操作:

  1. 创建工作目录:
mkdir /docker-build
cd /docker-build
touch Dockerfile

注:make自动化编译时需要Makefile文件,自动化创建docker镜像时,需要Dockerfile

  1. 编辑docker file
vim  Dockerfile

文件中有如下内容

FROM centos:latest
MAINTAINER <icbug@xyzxsuper.club>
RUN yum -y install httpd
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh

注释:FROM  centos:latest  # FROM 基于哪个镜像MAINTAINER  mk@xuegod.cn  # MAINTAINER 镜像创建者RUN yum -y install httpd   #RUN 安装软件用ADD start.sh /usr/local/bin/start.sh  ADD index.html /var/www/html/index.htmlCMD /usr/local/bin/start.sh

ADD  将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0

CMD /usr/local/bin/start.sh    #当docker实例启动成功后,会执行CMD 后面的命令。所以CMD后面一般跟需要开机启动的服务或脚本。一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.

  1. 创建 start.sh脚本启动httpd服务和apache默认首页index.html文件
echo "/usr/sbin/httpd -DFOREGROUND" > start.sh

注:/usr/sbin/httpd -DFOREGROUND  参数的含意:Systemd is designed to run processes "in the foreground", that is, they don't have to specifically run themselves as daemons.  The processes don't exactly run in the foreground, they run under systemd and it captures their input and output, but from the process's perspective, it is the same as running in the foreground.  That is systemd's preferred method of operation, but it does have compatibility with traditional daemons.

 chmod a+x start.sh
创建 index.html
echo "docker image build test" > index.html
  1. 使用命令build来创建新的image

语法:docker build -t  父镜像名:镜像的tag   Dockerfile文件所在路径  

-t :表示tage,镜像名

例:使用命令docker build来创建新的image,并命名为centos:httpd

 docker build -t  centos:httpd ./

注:./ 表示当前目录。另外你的当前目录下要包含Dockerfile

Sending build context to Docker daemon 4.096 kB

Step 1 : FROM centos:latest
---> 0f0be3675ebb
Step 2 : MAINTAINER userabc <mk@xuegod.cn>
---> Using cache
---> 9d1cc5ad2a7b
Step 3 : RUN yum -y install httpd

...

Complete!
---> bce6b3f0a700
Removing intermediate container c9567092d67b
Step 4 : ADD start.sh /usr/local/bin/start.sh
---> 521463f9bbeb
Removing intermediate container 18b34849606d
Step 5 : ADD index.html /var/www/html/index.html
---> 585eb8e1d7ad
Removing intermediate container ecdbd06a3c1e
Successfully built 585eb8e1d7ad
查看 images 列表
docker images

如下:

REPOSITORY          TAG        IMAGE ID            CREATED             SIZE
centos httpd bfaf1b0488d1 31 seconds ago 324.5 MB

注:docker镜像主要的内容:应用/程序+库

Docker Image 的发布

方法1:Save Image To TarBall方法2:Push Image To Docker Hub

方法一:

保存 Image 到 tar 包语法:docker save -o 导出的镜像名.tar  本地镜像名:镜像标签

例子:

docker save -o docker-centos-httpd-image.tar centos:httpd
ll -h docker-centos-httpd.tar
-rw------- 1 root root 265M 1月   2 22:43 docker-centos-httpd.tar
例:使用导入本地镜像

删除镜像,这里写自己镜像的ID或名字

docker rmi  centos:httpd

发现在镜像已经被删除

docker images
docker load -i docker-centos-httpd-image.tar
方法2
1、Signup on docker hub & create repo    注册一个帐号
https://hub.docker.com/
2、Login to docker hub
# docker login -u userabc -p abc123 -e userab@gmail.com
3、Push image to docker hub #上传镜像
# docker push centos:httpd
4、Pull image from docker hub #下载镜像
# docker pull userabc/centos:httpd # 用户名/镜像名
方法3: 使用阿里云的私有仓库来发布你的镜像

等之后的文章会讲到阿里云私有仓库的搭建,之后在讲如何使用


Container容器端口映射

实战:Container 端口映射

 iptables -F
systemctl restart docker

启动 container

docker run -d -p 80:80  centos:httpd

注:-p 物理机的80端口:容器实例的80端口  ,把容器中的80端口映射到物理机上的80端口

在物理机上查看状态

docker ps

然后查看80端口是否被占用,被docker占用了即为成功

netstat  -antup | grep 80

注:现在docker实例运行的网络模式像VMware的NAT模式。后期会讲给docker配置静态IP,就像VMware的桥接模式。多个docker实例映射一个端口,使用k8s负载均衡,像LVS-NAT模式

实战6:访问正在运行的 container 容器实例

语法:docker exec -it <container id | name> /bin/bash

查看正在运行的容器ID

docker ps

返回如下:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
87fadc0249a9 centos:httpd "/bin/sh -c /usr/loca" 4 minutes ago Up 4 minutes 0.0.0.0:9000->80/tcp elated_perlman

进入容器

docker exec -it 87fadc0249a9 /bin/bash

创建 test.html 文件

echo icbug > /var/www/html/test.html

测试:在物理机上查看新添加的test.html文件

curl http://192.168.1.63/test.html

返回结果为icbug

查看物理机和容器的网络:查看容器的IP:

 ip addr

返回如下

22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

物理机的IPifconfig

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0

注:相当于虚拟机的NAT网络模式

测试网络:

ping  172.17.0.2

单台docker的网络结构如下


以上是关于部署docker容器虚拟化平台的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器与虚拟化技术——部署KVM虚拟化平台

Docker容器与虚拟化技术——部署KVM虚拟化平台

在SAP云平台上部署和运行Docker应用

Docker基础

Docker是什么?

Docker基础操作