基于Linux的Docker平台搭建及使用

1,239 阅读7分钟

1 概述

本文档主要介绍基于多个不同linux平台的docker部署及应用。

2 背景及价值

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

本文实现在多个不同平台上部署docker,使用portainer结合swarm进行集群管理。实现应用的灵活部署、弹性、状态管理及监控,提高部署效率,提升运维能力。

3 总体方案

3.1 系统架构

系统方案如图1所示,IaaS层为树莓派、ubuntu服务器与飞腾服务器通过交换机组成一个局域网;PaaS层为各个服务器的linux系统与在其之上部署的docker;SaaS层为运行在docker 的应用。

图片1.png

3.2 硬件类型及系统版本

综合当前比较成熟的解决方案,本文选用如表1所示的芯片类型。

屏幕截图 2021-07-09 135411.jpg

4 技术实现

4.1 docker安装与卸载

4.1.1 docker安装

a.环境信息准备

分别在ubuntu、Raspbian和Kylin后台执行lsb_release -a,记录Codename值。

image.png

b.docker安装包下载

登录download.docker.com/linux/ 结合查询到的Codename值,进入对应的软件包地址,在软件包列表选取需要的版本进行下载。

image.png

c.上传docker安装包至各个服务器

将步骤b中下载的软件包上传(例如U盘传输)至ubuntu、raspberryi、FT2000/4服务器文件夹下,分别如下所示

image.png

d. 执行安装指令

image.png

安装过程截图(以ubuntu系统为例)

image.png

安装完后执行docker -v查询docker版本,有如下回显(以ubuntu系统为例)表示docker安装成功。

image.png

e.启动docker,并设置docker自启动

需要在3个服务器上均执行如下指令(截图以ubuntu为例)。

systemctl start docker   #启动docker
systemctl enable docke  #设置docker开机自启

如图所示,docker启动成功。

image.png

4.1.2 Docker卸载

a.卸载docker

sudo apt-get remove docker
sudo apt-get remove docker-engine docker.io

b.卸载docker-ce

sudo apt-get remove docker-ce

c.卸载安装依赖

sudo apt-get autoremove --purge docker-ce

上面的命令不会移除镜像、容器、卷或者是用户创建的配置文件,如果想卸载所有的镜像、容器、卷,可运行

rm -rf /var/lib/docker

执行docker -v,若查询不到版本,则说明卸载成功。

4.2 Docker镜像程序打包

4.2.1 dockerfile编译docker镜像

dockerfile是编译自定义docker的一种工具,dockerfile是一个无后缀文件,在里面定义基础镜像、docker运行时路径和执行程序等一系列操作。本次实验是在树莓派开发板上打包基于ARM平台下的C++程序镜像,并且把镜像上传到局域网中的私有仓库。

以下步骤以节点Raspberrypi为例,进行docker镜像程序打包。进入Raspberrypi命令行,执行以下命令:

mkdir docker #在当前目录新建一个docker文件夹
cd docker #进入docker文件夹
vim wxmtest.cpp #新建一个CPP文件,并进入编辑模式(i)
输入以下代码:
#include <iostream>
using namespace std;
int main () {
cout << "hello-world" << endl;
cout << "my first docker-----wxm" << endl;
}
esc退出编辑模式 然后输入:wq!保存
vim my_dockerfile #新建一个docker文件

输入以下代码:
FROM gcc  #构建基础镜像,下载ARM-gcc编译器,可以有网下载或者无网下载
RUN mkdir -p /usr/myapp    #新建docker工作路径
ADD lytest.cpp /usr/myapp   #把源文件添加到docker工作路径
WORKDIR /usr/myapp  #设置docker运行时路径
RUN g++ lytest.cpp -o hello  #编译cpp源文件
CMD ["./hello"]       #执行.o可执行文件
docker build -f ./my_dockerfile -t xttest_docker:v1.0 . #编译dockerfile并生成镜像(名字自己取)等待编译成功即可。

sudo docker images  #查看自己创建的镜像是否存在

注:下面说一种在线上传镜像的方法:

hub.docker.com/ 进入网站注册自己的仓库名,设置密码,例如wangxueming66

sudo docker login #远程登录镜像库 输入以上注册的用户名和密码,显示登录成功

sudo docker tag xttest_docker:v1.0 wangxueming66/wxmtest_docker:v1.0 #把镜像名打上标签,自己的用户名一定在前面,否侧上传失败。

sudo docker push wangxueming66/wxmtest_docker:v1.0 #push自己的镜像,ps:一定要加自己的用户名

sudo docker pull wangxueming66/wxmtest_docker:v1.0 #拉取镜像,本机或其他主机

4.2.2 搭建私有仓库

Docker仓库是存放docker镜像的地方,不管是官方镜像还是自己制作的镜像,都需要放到一个仓库里面,供下载使用。本次实验是基于局域网搭建,所以不能使用基于公网的公有仓库,需搭建基于局域网的私有仓库。Docker官方已经提供私有仓库镜像,直接使用即可。私有仓库运行在管理主机Ubuntu中,在Ubuntud中的私有仓库搭建过程如下:

a. 先准备一台可以连接互联网的电脑(Linux系统),部署docker环境,并且直接从公共仓库拉取registry(私有仓库)镜像:

sudo docker pull registry

b. 把拉取的镜像保存成本地压缩文件registry.tar:

sudo docker save -o registry.tar registry # registry.tar是保存本地的文件名,registry是镜像名

c. 把压缩文件registry.tar通过U盘或者其他传输介质导出到局域网中的管理主机(Ubuntu)的磁盘中。

d. 在管理主机中加载压缩文件registry.tar,使之成为本地镜像:

sudo docker load --input registry.tar #导入本地镜像

e. 使用sudo docker images查看registry镜像是否存在

docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest  #运行本地镜像

如果成功执行,则表示我们的docker私有仓库搭建成功。下面对这条命令的部分内容做下说明:

  • /registry表示宿主机目录,该目录如果不存在会自动创建。
  • docker -v 宿主机目录:容器目录在网上看到的解释:把宿主机的目录挂载到容器中或者把docker 容器中某目录的数据加载到宿主机的某个目录这样做的目的是为了防止docker私有仓库这个容器被删除时,仓库里的镜像也会被删除。
  • 最后进入localhost:5000查看私有仓库,该私有仓库的名称为:localhost:5000,类似于自己在docker.hub上所创建的用户名:wangxueming66

4.2.3 自建镜像上传到私有仓库

4.2.1和4.2.2节已经知道如何构建的自己的镜像和私有仓库,这一节主要解决如何把自建镜像上传到私有仓库。

说明:本次实验的管理主机Ubuntu ip为192.168.5..112,所以私有仓库名为:192.168.5..112:5000。

以Raspberrypi客户端节点为例,在Raspberrypi上自建镜像然后上传到管理主机Ubuntu上的私有仓库中。以具体步骤如下:

a. 查看镜像名称,选择需要上传的镜像id或者名称,说明:以xttest_docker:v1.0为例。

sudo docker images

b.给本地镜像打标签

docker tag xttest_docker:v1.0 192.168.5.112:5000/ xttest_docker:v1.0  #给本地镜像打标签,格式需加上私有仓库的ip和端口号,负责不能上传到私有仓库。

c. docker私有仓库服务器默认是基于https传输的,所以我们需要做相关设置,不使用https传输:

vi /etc/docker/daemon.json
将下面的代码放进去保存并退出。
"insecure-registries":["192.168.5.112:5000"]
最终如下所示:
{
"registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.5.112:5000"]
}

依次执行下面两条命令,重新启动docker:

systemctl daemon-reload
systemctl restart docker

d. 执行镜像推送命令

sudo docker push 192.168.5.112:5000/ xttest_docker:v1.0  #执行镜像推送命令,把镜像上传到私有仓库。

e. 查看私有仓库里面是否存在该镜像:

ls /registry/docker/registry/v2/repositories
curl http:// 192.168.5.112:5000/v2/_catalog 

如果显示{"repositories":["hello-world"]},则代表成功。

4.2.4 客户端下载docker镜像

使用局域网中的客户端节点FT2000/4服务器从私有仓库中下载镜像:

sudo docker pull 192.168.5.112:5000/ xttest_docker:v1.0 #私有仓库拉取镜像
sudo docker images #查看是否拉取成功

4.3. 使用Portainer结合swarm进行集群搭建

Portainer是开源轻量级管理 UI,轻松管理不同 Docker 环境(Docker 主机或 Swarm 集群)。

4.3.1安装Potainer

a. 先准备一台可以连接互联网的电脑(Linux系统),部署docker环境,并且直接从公共仓库拉取potainer(私有仓库)镜像:

sudo docker pull potainer

b. 把拉取的镜像保存成本地压缩文件potainer.tar:

sudo docker save -o potainer.tar potainer# potainer.tar是保存本地的文件名,potainer是镜像名。

c. 把压缩文件potainer.tar通过U盘或者其他传输介质导出到局域网中的管理主机(Ubuntu)的磁盘中。

d. 在管理主机中加载压缩文件potainer.tar,使之成为本地镜像:

sudo docker load --input potainer.tar #导入本地镜像

e. 使用sudo docker images查看potainer镜像是否存在

docker run -d -p 9000:9000 --restart=always --name prtainer-test docker.io/portainer/portainer #运行本地镜像,启动potainer。

f. 进入localhost:9000查看Potainer管理界面,如下所示:

image.png

4.3.2使用docker swarm进行集群搭建

Docker Swarm是Docker自己的Docker容器本地集群解决方案,具有与Docker生态系统紧密集成并使用自己的API的优势。它监视跨服务器群集的容器数量,是在没有其他硬件的情况下创建群集docker应用程序的最便捷方式。它为Dockerized应用程序提供了一个小规模但有用的编排系统。 本文选用ubuntu服务器作为manager节点,rasperrypi和FT2000作为worker1和worker2节点。

a. 创建swarm集群

docker swarm init --advertise-addr <manager-IP>

image.png

  • --advertise-addr选项表示管理节点公布它的IP是多少。其它节点必须能通过这个IP找到管理节点。
  • 命令输出了加入swarm集群的命令。通过--token选项来判断是加入为管理节点还是工作节点。

b. 将节点加入到swarm集群中

在两个worker节点执行4.3.2.1中回显中的红色部分,即可加入集群。

image.png 备注:如果找不到加入命令,可以在manager节点运行docker swarm join-token worker找回加入命令。

c. 运行docker node ls来查看节点信息

在manager节点执行docker node ls,查看集群节点:

image.png d. 退出集群

worker节点执行docker swarm leave

image.png manager节点执行docker swarm leave --force

image.png

4.3.3 potainer集群管理

a. 将各个节点加入到portainer

需要提前在各个docker节点设置一下2375端口的监听:打开配置文件/usr/lib/systemd/system/docker.service 或者通过systemctl status docker.service命令查看docker.service文件所在路径

image.png 修改配置项ExecStart中的值,若ExecStart中没有值,则直接添加-H tcp://0.0.0.0:2375,否则在已有参数后面添加,比如下面这样:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H fd:// --containerd=/run/containerd/containerd.sock

修改完之后保存文件,然后重启docker服务

systemctl daemon-reload
systemctl restart docker

注意:需要对所有的docker节点都进行上面的修改配置文件的操作。 登录portainer界面,选择左侧导航栏“Endpoints”,选择“Add endpoint”

image.png 根据界面显示输入name(自定义)、endpoint URL(worker的ip:2375)、 Public ip(worker的ip),然后点击“Add endpoint”即可。

image.png 选择左侧导航栏“home”,即可看到所加入的节点。

image.png

b. Potainer使用示例

进入home界面,地址为localhost:9000,然后点击管理主机ubuntu,查看容器、客户端节点运行情况。

image.png

可以查看该管理主机所存在的所有镜像和容器,并且可以看到容器的具体运行情况。

image.png

image.png

image.png

image.png

在管理主机中,存在swarm集群管理按钮,在这里面可以看到局域网下所有的节点运行情况。

image.png

我们在swarm管理中的节点可以任意添加所需要的容器,以FT2000/4节点为例,我们添加一个容器。

image.png

image.png 创建容器成功之后,会显示容器的运行情况,并且可以看到容器运行的日志、状态等。

image.png

5 总结

以上为整个docker平台环境搭建的流程,中间也遇到不少坑,但通过自己和同事还有网友的帖子一一解决了。Docker的内容还有很多地方去学习,以后还有更多相关内容的帖子发布,有啥问题欢迎留言交流。

时间:2021/7/9