(精品)(Docker系列之十)搭建龙芯平台Docker Swarm集群

mangoooo 发表了文章 • 2 个评论 • 1097 次浏览 • 2017-10-16 17:57 • 来自相关话题

本教程将指导完成如下工作: 初始化一个Docker swarm集群;添加节点到swarm;部署swarm服务;管理swarm。 准备工作: 三台Linux系统的主机(可以是物理机、虚拟机或者docker容器,本文选择了三台龙 ...查看全部
本教程将指导完成如下工作:
  1. 初始化一个Docker swarm集群;
  2. 添加节点到swarm;
  3. 部署swarm服务;
  4. 管理swarm。

准备工作:
  1. 三台Linux系统的主机(可以是物理机、虚拟机或者docker容器,本文选择了三台龙芯3A3000+Loongnix(Fedora21-20170927));
  2. 每台主机安装Docker Engine且版本为1.12及以上;
  3. 其中一台主机作为管理节点,需知道其IP地址;
  4. 主机彼此之间开放下面几个端口:

  • TCP 端口2377用于集群管理通信,
  • TCP/UDP端口7946用于节点间通信,
  • UDP端口4789用于overlay网络通信。
         默认情况这些端口都是开放的,如果不确定可以执行下面的命令打开这3个端

iptables -A INPUT -p tcp --dport 2377 -j ACCEPTiptables -A INPUT -p tcp --dport 7946 -j ACCEPTiptables -A INPUT -p udp --dport 7946 -j ACCEPTiptables -A INPUT -p udp --dport 4789 -j ACCEPT

初始化一个Docker swarm集群首先确认各主机的Docker deamon已经启动:
Screenshot.png
如果服务状态不是active(running),执行命令service docker start来启动Docker deamon。接下来就可以正式开始了。1.选择一台主机作为管理节点(manager1),获取到主机IP为10.20.42.45。终端输入命令docker swarm init 初始化swarm。

[root@worker1 ~]# docker swarm init --advertise-addr 10.20.42.45Swarm initialized: current node (892ozqeoeh6fugx5iao3luduk) is now a manager. To add a worker to this swarm, run the following command:     docker swarm join \    --token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp \    10.20.42.45:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

 --advertise-addr 配置管理节点的广播地址为10.20.42.45,其他的节点要想加入集群需要能够访问该地址。输出信息显示了其他节点分别作为管理节点和工作节点加入该集群的方法。2.输入命令docker info查看当前状态的swarm信息,截取部分关键信息如下:

[root@worker1 ~]# docker infoContainers: 10 Running: 0 Paused: 0 Stopped: 10Images: 22Server Version: 1.12.2... ...Swarm: active NodeID: 250tj9l3mnrrtprdd0990b2t3 Is Manager: true ClusterID: atrevada8k0amn83zdiig6qkb Managers: 1 Nodes: 1 Orchestration:  Task History Retention Limit: 5... ...

 3.输入命令docker node ls查看节点信息:

[root@localhost loongson]# docker node lsID                                      HOSTNAME      STATUS    AVAILABILITY    MANAGER STATUS250tj9l3mnrrtprdd0990b2t3 *  manager1        Ready        Active              Leader

*表示你连接到的节点ID。添加两个节点到swarm另外选择一台主机作为工作节点(worker1),第三台主机也作为工作节点(worker2)。1.worker1上打开终端。上文我们在创建swarm时,输出提示信息展示了如何作为工作节点加入swarm:

[root@worker1 ~]# docker swarm join /--token SWMTKN-1-5vs5ndm8k5idcxeckprr61kg6a7h90dp3uihdhr3kwl1ejwtwg-58jqj86p1nqfh225t51p5h8lp /10.20.42.45:2377This node joined a swarm as a worker.

如果你丢失了上面命令的信息,可以在manager1上执行docker swarm join-token worker重新获取。2.worker2上重复worker1的步骤,作为工作节点加入swarm。3.回到管理节点mgnager1,输入命令docker node ls查看swarm内所有节点状态:

[root@manager1 ~]# docker node lsID                                          HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS250tj9l3mnrrtprdd0990b2t3 *   manager1   Ready     Active             Leadera24i9nu2943niy8eq239bbpwv  worker1      Ready     Active         e0lh6c2zb57qg8db7usvg17r6    worker2     Ready     Active         

*显示本机连接到的节点,MANAGERSTATUS一栏为Leader表示该节点为管理节点,空表示为工作节点。 部署一个服务到swarm为了更直观的观察集群的服务编排,我们在管理节点启动portainer,其中swarm visualizer模块能直观地看到每个节点的服务详情。portainer 下载:

[root@manager1 ~]# docker pull jiangxinshang/portainer

启动portainer(9000端口不要被其他应用占用):

[root@manager1 ~]# docker run -t -i -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/jiangxinshang/portainer2017/10/13 07:55:28 Starting Portainer 1.14.3 on :9000

浏览器输出127.0.0.1:9000就能看到集群图示了,下图为服务部署之前的情况: 
Screenshot-Portainer_-_Mozilla_Firefox.png
1.manager1上打开终端,输入命令:

[root@manager1 ~]# docker service create  --replicas 1 --name hello 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"an85njt7e5dadfpwcfyr21sfs

docker service create命令是创建服务--name 将该服务命名为hello-- replicas 规定了该服务的期望状态为一个运行示例参数10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"定义了服务是用镜像10.20.42.45:5000/fedora(三台主机节点上必须有同一个pull下来的镜像)创建一个容器,并在容器内执行/bin/bash -c "ping loongnix.org"。2.执行如下命令,可以查看当前服务状态:

[root@manager1 ~]# docker service lsID                NAME   REPLICAS  IMAGE                                       COMMANDan85njt7e5da  hello    1/1   10.20.42.45:5000/fedora  /bin/bash -c ping loongnix.org

3. 查看该服务信息

[root@manager1 ~]# docker service ps helloID                                          NAME         IMAGE            NODE     DESIRED STATE  CURRENT STATE      ERRORcwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2  Running        Running 5 minutes ago  

当前状态是服务运行在worker2上,但也可能运行在worker1或者manager1上,因为管理节点同时作为工作节点也会运行服务。在下面的步骤中你会看到更详细的演示。在swarm visualizer上观察当前三个节点的服务。
Screenshot-Portainer_-_Mozilla_Firefox-6.png
 查看服务的详细信息1.登录manager1,终端执行命令docker service inspect --pretty <SERVICE-ID>,能查看该服务可读性良好的格式化输出:

[root@manager1 ~]# docker service inspect --pretty helloID:        an85njt7e5dadfpwcfyr21sfsName:        helloMode:        Replicated Replicas:    1Placement:UpdateConfig: Parallelism:    1 On failure:    pauseContainerSpec: Image:        10.20.42.45:5000/fedora Args:        /bin/bash -c ping loongnix.orgResources:

2. 如果把--pretty去掉,看到的则是json形式的格式化输出:

[root@manager1 ~]# docker service inspect hello[    {        "ID": "an85njt7e5dadfpwcfyr21sfs",        "Version": {            "Index": 230        },        "CreatedAt": "2017-10-13T02:14:33.706598Z",        "UpdatedAt": "2017-10-13T02:14:33.706598Z",        "Spec": {            "Name": "hello",            "TaskTemplate": {                "ContainerSpec": {                    "Image": "10.20.42.45:5000/fedora",                    "Args": [                        "/bin/bash",                        "-c",                        "ping",                        "loongnix.org"                    ]                },                "Resources": {                    "Limits": {},                    "Reservations": {}                },                "RestartPolicy": {                    "Condition": "any",                    "MaxAttempts": 0                },                "Placement": {}            },            "Mode": {                "Replicated": {                    "Replicas": 1                }            },            "UpdateConfig": {                "Parallelism": 1,                "FailureAction": "pause"            },            "EndpointSpec": {                "Mode": "vip"            }        },        "Endpoint": {            "Spec": {}        },        "UpdateStatus": {            "StartedAt": "0001-01-01T00:00:00Z",            "CompletedAt": "0001-01-01T00:00:00Z"        }    }]

 伸缩服务1.manager1上执行命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKA>可修改当前运行任务的个数,例如:

[root@manager1 ~]# docker service scale hello=5hello scaled to 5

 2. 通过命令查看当前运行任务个数,REPLICAS变为了5/5。

[root@manager1 ~]# docker service lsID                    NAME   REPLICAS  IMAGE                                     COMMANDan85njt7e5da  hello    5/5    10.20.42.45:5000/fedora   /bin/bash -c ping loongnix.org

3.查看hello服务在各节点分配情况:

[root@manager1 ~]# docker service ps helloID                                              NAME       IMAGE                      NODE         DESIRED STATE     CURRENT STATE                   ERRORcwk9d8b67n20lmglhbz7jewne  hello.1  10.20.42.45:5000/fedora  worker2   Running        Running 7 minutes ago            9wyodmvvf77ucbums23ortuj0  hello.2  10.20.42.45:5000/fedora  worker1   Running        Running 41 seconds ago           19ev4tcj0be2t1xbdkf7evp4f  hello.3  10.20.42.45:5000/fedora  manager1  Running        Running 44 seconds ago           1tm1tc2r8xdgdry2hu0pjilmy  hello.4  10.20.42.45:5000/fedora  manager1  Running        Running less than a second ago   cfqh34h9e6jv7l0iiwau8jhsf  hello.5  10.20.42.45:5000/fedora  worker2   Running        Running less than a second ago   

 通过swarm visualizer查看服务直观图示: 
Screenshot-Portainer_-_Mozilla_Firefox-8.png
swarm会负载均衡地编排服务在各节点的运行。4. 在manager1节点上我们也可以观察到对应的两个容器信息:

[root@manager1 ~]# docker ps  CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS                    NAMES2f6be7870988        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.4.1tm1tc2r8xdgdry2hu0pjilmya2da3bb3c4f0        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   5 minutes ago       Up 5 minutes                                 hello.3.19ev4tcj0be2t1xbdkf7evp4f

 worker1上通过命令观察到一个对应容器信息:

[root@worker1 ~]# docker psCONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS               NAMES954af2601ac2        10.20.42.45:5000/fedora:latest   "/bin/bash -c 'ping l"   6 minutes ago       Up 6 minutes                            hello.2.9wyodmvvf77ucbums23ortuj0

worker2 略。删除运行的服务1.在管理节点manager1上,删除服务通过命令dockr service rm <SERVICE-ID>实现:

[root@manager1 ~]# docker service rm hellohello

2. 管理节点再查看该服务信息会报错:

[root@manager1 ~]# docker service ps helloError: No such service: hello

3.工作节点查看容器也关闭了

[root@worker1 ~]# docker ps  CONTAINER ID      IMAGE       COMMAND      CREATED      STATUS       PORTS       NAMES

 滚动更新服务在这个环节我们部署一个服务来创建基于fedora:21.0镜像的容器,然后演示滚动更新服务,升级镜像容器到fedora:21.1。1.首先在manager1节点部署服务,并配置swarm的更新间隔时间为10秒:

[root@manager1 ~]# docker service create --replicas 5 --name fedora --update-delay 10s fedora:21.0 ping loongnix.orgdes35b3cu097uelo8n8zv5gez

我们在部署服务时指定滚动更新策略。--update-delay 表示更新服务的一个任务或一组任务之间的时间间隔。时间间隔用数字和单位组成,m 表示分,h 表示时,例如10m30s表示指定了10分30秒的间隔。默认情况下,调度器一次更新一个任务。也可以通过参数 --update-parallelism 配置调度器每次同时更新的最大任务数量。默认情况下,若更新一个任务返回了RUNNING状态,调度器会转去更新下一个,直到所有任务都更新完成;若更新一个任务返回了FAILED,调度器则暂停更新。我们可以在执行docker service create 命令或 docker service update 命令时使用 --update-failure-action 参数来指定更新返回失败之后的行为。2. 查看集群内各节点的服务编排:
Screenshot-5.png
 3.开始更新fedora镜像,swarm管理器将依据update的配置测略实施更新:

[root@manager1 ~]# docker service update --image fedora:21.1 fedorafedora

调度器按照如下步骤实现滚动更新:
  • 停止第一个任务
  • 为已停止的任务调度更新
  • 为已更新的任务开启容器
  • 如果一个任务的更新结果返回RUNNING,等待指定的时间间隔后开始更新下一个任务;如果更新一个任务的任意阶段返回了FAILED,中止更新任务。
4.通过portainer能看到服务的实时更新情况: 
Screenshot-6.png
Screenshot-7.png
Screenshot-8.png
Screenshot-9.png
Screenshot-10.png
 5.输入命令docker service ps <SERVICE-ID>观察滚动更新:

[root@manager1 ~]# docker service ps fedoraID                         NAME          IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR6t6p5r9ujrsq0e1kf3k0yta6n  fedora.1      fedora:21.1  worker1   Running        Running 8 minutes ago    2vctv5ay741c7z6vlx2kqdwje   \_ fedora.1  fedora:21.0  worker2   Shutdown       Shutdown 8 minutes ago   8vrfziykhn7ar7b7zyhxlsarr  fedora.2      fedora:21.1  manager1  Running        Running 6 minutes ago    cy0zvhqawk1j9g0jb112sq482   \_ fedora.2  fedora:21.0  worker1   Shutdown       Shutdown 6 minutes ago   0yojbjr1omf46qycc2c6at4b7  fedora.3      fedora:21.1  worker2   Running        Running 7 minutes ago    cisqv46430hy7p3kj5xaefgd8   \_ fedora.3  fedora:21.0  manager1  Shutdown       Shutdown 7 minutes ago   17ailb36wdeg4zvkl9mytoxhu  fedora.4      fedora:21.1  manager1  Running        Running 6 minutes ago    cvpl0svmlyj1ozdb6r0eiovts   \_ fedora.4  fedora:21.0  manager1  Shutdown       Shutdown 6 minutes ago   4lt4ax7ezyqid6ndk89ksngc5  fedora.5      fedora:21.1  worker2   Running        Running 7 minutes ago    8sbzju1llogo7d6s9t4h0e1ia   \_ fedora.5  fedora:21.0  worker2   Shutdown       Shutdown 7 minutes ago   

 输出显示全部任务已经更新完毕。 下线某个节点在前面所有的步骤中,所有节点都是运行状态且可用性为ACTIVE。swarm管理器会向ACTIVE状态的节点分配任务,目前为止各节点都能接收任务。有时,像计划中的维护时段,需要将一个节点可用性设置为DRAIN。DRAIN的节点不能从swarm管理器接收任务。管理器会将DRAIN节点的任务停止掉,分发给其他ACTIVE的节点。1.开始之前,先确认集群内各节点状态都是ACTIVE:

[root@manager1 ~]# docker node lsID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS250tj9l3mnrrtprdd0990b2t3 *  manager1  Ready   Active        Leadera24i9nu2943niy8eq239bbpwv    worker1   Ready   Active         e0lh6c2zb57qg8db7usvg17r6    worker2   Ready   Active         

2.重新执行之前的服务部署,将任务个数设为3,保证每个节点都被分发有任务:

[root@manager1 ~]# docker service create --replicas 3 --name helloagain 10.20.42.45:5000/fedora /bin/bash -c "ping loongnix.org"0rxfbv9fwrs0fv06hfnp8j5je[root@manager1 ~]# docker service ps helloagainID                         NAME          IMAGE                    NODE      DESIRED STATE  CURRENT STATE            ERROR8xszceewi2dj9xhbce53rkq1a  helloagain.1  10.20.42.45:5000/fedora  worker1   Running        Preparing 6 seconds ago   6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2  10.20.42.45:5000/fedora  worker2   Running        Running 1 seconds ago     395a7pk7e4vby3jd1sihv0gic  helloagain.3  10.20.42.45:5000/fedora  manager1  Running        Running 5 seconds ago   

3.执行命令docker node update --availability drain <NODE-ID>将一个存在任务的节点下线:

[root@manager1 ~]# docker node update --availability drain worker1worker1

4.查看下线节点的详细信息,其中Availability显示为Drain:

[root@manager1 ~]# docker node inspect --pretty worker1ID:            a24i9nu2943niy8eq239bbpwvHostname:        worker1Joined at:        2017-10-13 01:16:01.272489 +0000 utcStatus: State:            Ready Availability:        DrainPlatform: Operating System:    linux Architecture:        mips64Resources: CPUs:            4 Memory:        7.598 GiBPlugins:  Network:        bridge, host, null, overlay  Volume:        localEngine Version:        1.12.2

5.查看该服务当前的编排情况:

[root@manager1 ~]# docker service ps helloagainID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERRORe6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 4 minutes ago    8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 4 minutes ago   6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 10 minutes ago   395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 10 minutes ago  

Screenshot-Portainer_-_Mozilla_Firefox-9.png
worker1节点的任务已经关闭,被分发到了worker2上。6.重新将worker1的Availability从DRAIN改回为ACTIVE,再观察:

[root@manager1 ~]# docker node update --availability active worker1worker1[root@manager1 ~]# docker node inspect --pretty worker1ID:            a24i9nu2943niy8eq239bbpwvHostname:        worker1Joined at:        2017-10-13 01:16:01.272489 +0000 utcStatus: State:            Ready Availability:        ActivePlatform: Operating System:    linux Architecture:        mips64Resources: CPUs:            4 Memory:        7.598 GiBPlugins:  Network:        bridge, host, null, overlay  Volume:        localEngine Version:        1.12.2[root@manager1 ~]# docker service ps helloagainID                         NAME              IMAGE                    NODE      DESIRED STATE  CURRENT STATE           ERRORe6mh01ekb4dcpnnu3yez7qqdx  helloagain.1      10.20.42.45:5000/fedora  worker2   Running        Running 8 minutes ago    8xszceewi2dj9xhbce53rkq1a   \_ helloagain.1  10.20.42.45:5000/fedora  worker1   Shutdown       Shutdown 8 minutes ago   6mwhdnseq3wkkxbc3dmxhwoey  helloagain.2      10.20.42.45:5000/fedora  worker2   Running        Running 13 minutes ago   395a7pk7e4vby3jd1sihv0gic  helloagain.3      10.20.42.45:5000/fedora  manager1  Running        Running 13 minutes ago  

可以看到,worker1的Availability状态变回Active,状态为Ready。因为当前没有任务变化还暂时没有被分配任务。一个可用性为Active的节点可以在以下情况接收新的任务:
  • 当伸缩一个服务时
  • 当任务滚动更新时
  • 当其他某个节点被设为Drain时
  • 当某个任务在其他 Active 节点上启动失败时

(精品)(Docker系列之九)龙芯Fedora21平台portainer部署方案

jiangxinshang 发表了文章 • 8 个评论 • 936 次浏览 • 2017-10-15 22:38 • 来自相关话题

一、下载portainer官方镜像   1.在loongnix上下载镜像[root@loongson ~]# docker pull docker.io/portainer/portainer:1.14.3 Using default ...查看全部
一、下载portainer官方镜像
  1.在loongnix上下载镜像
[root@loongson ~]# docker pull docker.io/portainer/portainer:1.14.3
Using default tag: 1.14.3
Trying to pull repository docker.io/portainer/portainer ...
unauthorized: authentication required
  2.根据控制台反馈结果unauthorized: authentication required,提示无权限,因为该镜像不支持       mips64el,所以无法下载镜像到本地,可使用X86机器进行下载该镜像
[root@X86 ~]# docker pull docker.io/portainer/portainer:1.14.3
  3.提示下载成功,查看本地镜像
[root@X86 ~]# docker images
REPOSITORY TAG IMAGE ID
docker.io/portainer/portainer 1.14.3 457fb8fa57b0
  4.确认本地镜像docker.io/portainer/portainer已存在,运行该镜像
[root@X86 ~]# docker run -i -t docker.io/portainer/portainer:1.14.3


  5.使用Docker export命令导出当前镜像创建的容器为tar包
[root@X86 ~]# docker export 36ceef361070 > loongson-portainer.tar
  6.将loongson-portainer.tar包拷贝到loongson机器上,这里使用scp命令进行拷贝
[root@X86 ~]# scp loongson-portainer.tar root@10.20.42.19:/root/portainer/
  7.在loongnix机器上解压loongson-portainer.tar
[root@loongson portainer]# tar xf loongson-portainer.tar
  8.经分析,需要重新编译的二进制文件为portainer
[root@loongson portainer]# file portainer 
portainer: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped


    接下来,从github下载portainer源代码,重新编译portainer
二、从github下载portainer源代码
  1.设置GO语言参数—GOPATH
export GOPATH=/usr/share/gocode
  2.使用go get 从github中下载源代码
[root@loongson portainer]# go get github.com/portainer/portainer

package github.com/portainer/portainer: no buildable Go source files in /usr/share/gocode/src/github.com/portainer/portainer



    这里出现了错误提示,但是没有关系,go get 命令相当于先下载,再安装两个步骤,上面的提示是安装失败,我们需要的是源代码,因此可以忽略此提示
3.打开源代码所在文件夹
[root@loongson portainer]# cd $GOPATH/src/github.com/portainer/portainer
  4.因为只需要编译源代码中的api部分所以将此文件夹下的其他内容全部删除
[root@loongson portainer]# rm -rf app assets bower.json build build.sh codefresh.yml CODE_OF_CONDUCT.md CONTRIBUTING.md gruntfile.js index.html LICENSE package.json README.md test vendor.yml distribution
  5.因为go语言文件中的的目录的相对路径和源代码中的相对路径不同,所以需要对源代码的相对路径做调整
[root@loongson portainer]# cp -rf api/* $GOPATH/src/github.com/portainer/portainer
  6.删除源代码中的api文件夹
[root@loongson portainer]# rm -rf api/
三、编译portainer源代码
  1.打开main.go所在目录
[root@loongson portainer]# cd $GOPATH/src/github.com/portainer/portainer/cmd/portainer
  2.执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../../../../gopkg.in/alecthomas/kingpin.v2/usage.go:10:2: cannot find package "github.com/alecthomas/template" in any of:
/usr/lib/golang/src/github.com/alecthomas/template (from $GOROOT)


  3.根据提示需要加载github.com/alecthomas/template
[root@loongson portainer]# go get github.com/alecthomas/template
  4.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../../../../gopkg.in/alecthomas/kingpin.v2/parsers.go:9:2: cannot find package "github.com/alecthomas/units" in any of:
/usr/lib/golang/src/github.com/alecthomas/units (from $GOROOT)
/usr/share/gocode/src/github.com/alecthomas/units (from $GOPATH)


  5.根据提示需要加载github.com/alecthomas/units
[root@loongson portainer]# go get github.com/alecthomas/units
  6.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../http/handler/auth.go:11:2: cannot find package "github.com/asaskevich/govalidator" in any of:
/usr/lib/golang/src/github.com/asaskevich/govalidator (from $GOROOT)
/usr/share/gocode/src/github.com/asaskevich/govalidator (from $GOPATH)


  7.根据提示需要加载github.com/asaskevich/govalidator
[root@loongson portainer]# go get github.com/asaskevich/govalidator
  8.再次执行go build 命令,开始进行代码编译
[root@loongson  portainer]# go build main.go 
../../bolt/datastore.go:8:2: cannot find package "github.com/boltdb/bolt" in any of:
/usr/lib/golang/src/github.com/boltdb/bolt (from $GOROOT)
/usr/share/gocode/src/github.com/boltdb/bolt (from $GOPATH)


  9.根据提示需要加载github.com/boltdb/bolt
[root@loongson  portainer]# go get github.com/boltdb/bolt
# github.com/boltdb/bolt
../../../../boltdb/bolt/db.go:101: undefined: maxMapSize
../../../../boltdb/bolt/db.go:101: invalid array bound maxMapSize


  10.根据提示缺少变量maxMapSize,那么接下来创建变量,首先打开boltdb所在目录
[root@loongson  portainer]# cd $GOPATH/src/github.com/boltdb/bolt
  11.创建适用于mips64el平台的bolt
[root@loongson  bolt]# cp bolt_amd64.go bolt_mips64el.go
  12.打开main.go所在目录
[root@loongson bolt]# cd $GOPATH/src/github.com/portainer/portainer/cmd/portainer/
  13.再次执行go build 编译文件
[root@loongson portainer]# go build main.go 
../../jwt/jwt.go:9:2: cannot find package "github.com/dgrijalva/jwt-go" in any of:
/usr/lib/golang/src/github.com/dgrijalva/jwt-go (from $GOROOT)
/usr/share/gocode/src/github.com/dgrijalva/jwt-go (from $GOPATH)


  14.根据提示需要加载github.com/dgrijalva/jwt-go
[root@loongson portainer]# go get github.com/dgrijalva/jwt-go
  15.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../http/handler/auth.go:12:2: cannot find package "github.com/gorilla/mux" in any of:
/usr/lib/golang/src/github.com/gorilla/mux (from $GOROOT)
/usr/share/gocode/src/github.com/gorilla/mux (from $GOPATH)


  16.根据提示需要加载github.com/gorilla/mux
[root@loongson portainer]# go get github.com/gorilla/mux
  17.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../jwt/jwt.go:10:2: cannot find package "github.com/gorilla/securecookie" in any of:
/usr/lib/golang/src/github.com/gorilla/securecookie (from $GOROOT)
/usr/share/gocode/src/github.com/gorilla/securecookie (from $GOPATH)









  18.根据提示需要加载github.com/gorilla/securecookie
[root@loongson portainer]# go get github.com/gorilla/securecookie
  19.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../http/proxy/manager.go:7:2: cannot find package "github.com/orcaman/concurrent-map" in any of:
/usr/lib/golang/src/github.com/orcaman/concurrent-map (from $GOROOT)
/usr/share/gocode/src/github.com/orcaman/concurrent-map (from $GOPATH)









  20.根据提示需要加载github.com/orcaman/concurrent-map
[root@loongson portainer]# go get github.com/orcaman/concurrent-map
  21.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../cron/watcher.go:5:2: cannot find package "github.com/robfig/cron" in any of:
/usr/lib/golang/src/github.com/robfig/cron (from $GOROOT)
/usr/share/gocode/src/github.com/robfig/cron (from $GOPATH)









  22.根据提示需要加载github.com/robfig/cron
[root@loongson portainer]# go get github.com/robfig/cron
  23.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go 
../../crypto/crypto.go:4:2: cannot find package "golang.org/x/crypto/bcrypt" in any of:
/usr/lib/golang/src/golang.org/x/crypto/bcrypt (from $GOROOT)
/usr/share/gocode/src/golang.org/x/crypto/bcrypt (from $GOPATH)
../../http/handler/websocket.go:21:2: cannot find package "golang.org/x/net/websocket" in any of:
/usr/lib/golang/src/golang.org/x/net/websocket (from $GOROOT)
/usr/share/gocode/src/golang.org/x/net/websocket (from $GOPATH)









  24.根据提示需要加载golang.org/x/crypto/bcrypt和golang.org/x/net/websocket
  注意:$GOPATH的路径已经不再是/usr/share/gocode/src/github.com/...
       而是/usr/share/gocode/src/golang.org/x/...
       所以需要先创建文件夹
[root@loongson portainer]# mkdir -p $GOPATH/src/golang.org/x/
  25.切换至该文件夹下
[root@loongson portainer]# cd $GOPATH/src/golang.org/x/
  26.加载golang.org/x/crypto/bcrypt
[root@loongson x]# git clone https://github.com/golang/crypto.git
27.加载golang.org/x/net/websocket
[root@loongson x]# git clone https://github.com/golang/net.git
28.切换至main.go所在目录
[root@loongson x]# cd $GOPATH/src/github.com/portainer/portainer/cmd/portainer/
  29.再次执行go build 命令,开始进行代码编译
[root@loongson portainer]# go build main.go
  30.编译完成,当前目录生成文件名为main的二进制可执行文件,下面需要拷贝到loongson-portainer.tar 解压目录,替换掉二进制文件portainer
 
四、loongson-portainer.tar二进制文件替换
  1.修改编译完成后二进制文件的文件名
[root@loongson portainer]# mv main portainer
  2.拷贝loongson-portainer.tar 解压目录,替换掉二进制文件portainer
[root@loongson portainer]# cp -f portainer /root/portainer/
  3.切换至loongson-portainer.tar 解压目录
[root@loongson portainer]# cd /root/portainer/
  4.运行二进制文件portainer
[root@loongson portainer]# ./portainer
  5.打开浏览器,输入网址http://localhost:9000
1.png

  6.切换至loongson-portainer.tar 解压目录的上级目录
[root@loongson portainer]# cd /root/
  7.压缩整个portainer文件夹
[root@loongson ~]# tar -cvf portainer.tar portainer/
五、制作portainer镜像
  1.在loongnix上下载fedora21-tools基础镜像
[root@loongson ~]# docker pull docker.io/huangxg20171010/feodra21-tools
REPOSITORY TAG
docker.io/huangxg20171010/fedora21-tools latest









  2.运行feodra21-tools基础镜像
[root@loongson ~]# docker run -i -t docker.io/huangxg20171010/fedora21-tools
  3.基础镜像运行成功后,会自动进入镜像控制台,由[root@loongson ~]变成[root@1cb98e167e49 /],说明容器创建成功,下面切换目录至root下
[root@1cb98e167e49 /]# cd /root/
  4.将第四节第7步压缩的portainer.tar拷贝到当前容器的root目录下
[root@1cb98e167e49 ~]# scp root@10.20.42.48:/root/portainer.tar /root/
  5.将portainer.tar解压到当前目录
[root@1cb98e167e49 ~]# tar xvf portainer.tar
  6.删除压缩文件portainer.tar
[root@1cb98e167e49 ~]# rm -f portainer.tar
  7.切换至portainer目录下
[root@1cb98e167e49 ~]# cd /root/portainer
  8.创建执行文件run-portainer.sh
[root@1cb98e167e49 ~]# vi /root/portainer/run-portainer.sh
  9.run-portainer.sh文件内容如下
#!/bin/bash
export LC_ALL=zh_CN.UTF-8
export LANG=zh_CN.UTF-8
cd /root/portainer
./portainer









  10.修改run-portainer.sh文件权限
[root@1cb98e167e49 ~]#chmod +x /root/portainer/run-portainer.sh
  11.创建portainer所需文件夹
[root@1cb98e167e49 ~]#mkdir -p /data/tls
  12.退出当前容器
[root@1cb98e167e49 ~]# exit
  13.展示所有已创建容器
[root@loongson /]# docker ps -a
CONTAINER IMAGE
1cb.... docker.io/huangxg20171010/fedora21-tools









  14.使用Docker commit生成一个新镜像
[root@loongson /]# docker commit --change='CMD ["/root/portainer/run-portainer.sh"]' 1cb98e167e49 portainer









  15.查看制作的新镜像
[root@loongson /]# docker images
REPOSITORY TAG IMAGE ID CREATED
portainer latest 085a675a35d7 12 seconds ago









六、上传portainer镜像
  1.申请docker hub 帐号
    打开 docker hub官网:https://hub.docker.com 进行注册
 

2.png

  2.邮件激活后登录docker hub 点击 Create --> Create repository 创建一个仓库

3.png

  3.本机登录Docker hub帐号
[root@loongson /]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: jiangxinshang
Password:
Login Succeeded









  4.将本机已经存在的镜像名称做格式化,保证和仓库名称:jiangxinshang/portainer 一致,操作如下:
[root@loongson /]# docker tag portainer:latest jiangxinshang/portainer
  5.使用 docker push 将镜像上传至hub上,操作如下:
[root@loongson /]# docker push jiangxinshang/portainer
The push refers to a repository [docker.io/jiangxinshang/portainer]
572868387250: Pushed









  6.查看所上传镜像
[root@loongson /]# docker search jiangxinshang/portainer
  
4.png

 
七、下载并运行portainer镜像
  1.下载portainer镜像
[root@loongson /]# docker pull jiangxinshang/portainer
  2.查看已下载镜像
[root@loongson /]# docker images
REPOSITORY TAG
docker.io/jiangxinshang/portainer latest









  3.运行该镜像
[root@loongson /]# docker run -i -t --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock docker.io/jiangxinshang/portainer
  4.打开浏览器,输入网址http://localhost:9000

5.png

==================================================================================
 X86版本的portainer官方镜像docker.io/portainer/portainer 已更新版本,可通过docker pull portainer/portainer:1.14.3来获取镜像,portainer的github源代码请下载版本v1.14.3
                                                                                                           文章更新日期:2017年10月24日

“龙芯杯”全国大学生计算机系统能力培养大赛总决赛胜利闭幕

yangkun 发表了文章 • 0 个评论 • 556 次浏览 • 2017-10-12 09:57 • 来自相关话题

“龙芯杯”全国大学生计算机系统能力培养大赛(以下简称“大赛”)是以学科竞赛推动专业建设、培养大学生创新能力为目标,面向高校大学生举办的全国性大赛。大赛旨在选拔未来我国计算机系统的设计、分析、优化与应用人才,激发学生的创新实践能力并培养其团队协作精神,进一步推动 ...查看全部
“龙芯杯”全国大学生计算机系统能力培养大赛(以下简称“大赛”)是以学科竞赛推动专业建设、培养大学生创新能力为目标,面向高校大学生举办的全国性大赛。大赛旨在选拔未来我国计算机系统的设计、分析、优化与应用人才,激发学生的创新实践能力并培养其团队协作精神,进一步推动计算机等相关专业教学改革,为高质量专业人才搭建交流、展示、合作的平台,助力我国高校与企业产学研合作的健康快速发展。
    大赛由教育部高等学校计算机类专业教学指导委员会主办,由教指委主任单位北京航空航天大学承办,龙芯中科技术有限公司、赛灵思(Xilinx)公司、进想科技(Imagination Technologies)公司、中国计算机学会体系结构专委会、安全可靠技术和产业联盟、机械工业出版社华章分社协办。
    本次大赛共有40多所高校近70支队伍参赛,参赛学生近280人,指导老师近140人。本次大赛通过初赛评选出20支队伍参加了9月23日在北京航空航天大学的全国总决赛。总决赛分为A、B两组进行,A组为初赛成绩排名前10的队伍,竞争一、二、三等奖。B组为初赛成绩第11至20名的队伍,均获得优胜奖,并竞争三个特别奖。
 
    第一届“龙芯杯”全国大学生计算机系统能力培养大赛颁奖典礼于9月24日在北京航空航天大学第二报告厅举行,北京航空航天大学计算机学院院长吕卫锋主持了本次颁奖仪式。北京航空航天大学党委副书记程基伟、教指委副主任王志英、教指委秘书长马殿富、龙芯中科技术有限公司总裁胡伟武、CCF体系结构专委会主任窦勇、机械工业出版社华章分社总编温莉芳、北京航空航天大学计算机学院副院长高小鹏分别 对大赛进行了致辞及总结发言。龙芯中科总裁胡伟武还为同学和老师作了《自主CPU发展道路》的精彩报告。
北京航空航天大学计算机学院院长吕卫锋主持了本次颁奖仪式

嘉宾致辞

龙芯中科总裁胡伟武发表演讲
 
    随后,现场领导及专家宣布了获奖名单并进行了颁奖,本次 “龙芯杯”全国大学生计算机系统能力培养大赛获奖名单如下:
    一等奖:清华大学一队
龙芯总裁胡伟武和获得一等奖的清华大学代表队合影
        
    二等奖:南京大学一队,西北工业大学二队,北京航空航天大学二队
二等奖获奖队合影
      
     三等奖:武汉大学,北京航空航天大学一队,南京航空航天大学一队,西北工业大学一队,南京大学二队,中国科学院大学一队
三等奖获奖队合影    
 
    优胜奖特别奖: CPU设计奖:中山大学、东北大学二队
                                 FPGA应用奖:天津大学
优胜奖特别奖获奖队合影
优胜奖特别奖获奖队合影 
 
    优胜奖:重庆大学,金陵科技学院,济南大学一队,济南大学二队,河北地质大学一队,东北大学一队。
优胜奖获奖队合影
    最后进行了大赛的交接仪式,由北京航空航天大学高小鹏老师将赛旗交到了南京大学袁春风老师的手中,第二届“龙芯杯”全国大学生计算机系统能力培养大赛将由南京大学来承办,希望明年再接再厉,通过比赛共同促进大学计算机教育的系统能力培养。
大赛交接仪式
本次大赛领导、专家与参赛师生合影留念
 

(精品)(Docker系列之八)Fedora21部署Docker registry

mangoooo 发表了文章 • 3 个评论 • 587 次浏览 • 2017-10-11 16:59 • 来自相关话题

1. Docker registry简介 Docker registry作为一个镜像仓库,主要功能是通过网络存储和分发Docker镜像。 在本文中,Docker registry的编译结果是生成一个Docker镜像,可以方便的提供给管理 ...查看全部
1. Docker registry简介
Docker registry作为一个镜像仓库,主要功能是通过网络存储和分发Docker镜像。
在本文中,Docker registry的编译结果是生成一个Docker镜像,可以方便的提供给管理员直接部署使用。

2. 谁需要部署Docker registry?
通常情况下,Docker用户会从Docker公有仓库(hub.docker.com)进行镜像的发行,即开发者提交镜像、使用者拉取镜像,对应于docker的命令push、pull。对于部分用户来说,只需要使用公有仓库上的镜像就完全能够满足需求了,但是很多情况下是不够的,比如用户自己开发的应用、不想公开代码到公有仓库,或者是公司开发的、面向特定用户的镜像,就需要维护一个私有仓库;或者对于一些项目,在开发、测试和持续整合阶段,也需要一个本地镜像仓库。

3. Docker registry部署过程
实验环境:3A3000+Loongnix(Fedora21-20170726);
准备条件:本机已经安装好Docker Engine平台,并且制作好一个 fedora21-base 镜像,
具体过程请参照http://ask.loongnix.org/?/article/81 。

3.1 下载源码
# git clone git://github.com/docker/docker-registry.git

若本机没有安装git命令,请首先执行yum install git。

3.2 编译registry镜像
编译命令如下:
# cd docker-registry
# docker build -t fedora-registry:1 .

上面的命令中,fedora-registry:1为要编译成的镜像名称及tag号。
由于官方的docker-registry是适配X86平台,基础镜像也是X86平台的Ubuntu,因此直接在龙芯上进行编译会出现各种错误。
所以需要对源代码进行修改,按照下面各节的方法进行解决。

3.2.1 默认编译平台为x86_64,修改为mips64el
# cd docker-registry
# grep x86_64 . -r
 
能找到4个文件,需要修改如下3个:
contrib/golang_impl/fixtures/index/images/e0acc43660ac918e0cd7f21f1020ee3078fec7b2c14006603bbc21499799e7d5/json
contrib/golang_impl/fixtures/index/images/0e03f25112cd513ade7c194109217b9381835ac2298bd0ffb61d28fbe47081a8/json
tests/data/511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158/json

将文件中”"architecture":"x86_64"”修改为“"architecture":"mips64el"”。

3.2.2 修改Dockerfile
 问题类型和修改思路:
● 官方代码的Dockerfile中,基础镜像的名称是Ubuntu ,需要改成龙芯镜像的名称,fedora21-base:21(tag号若不是latest,则必须写明);
● docker-registry镜像的制作,需要编译源代码,依赖很多其它软件。这些软件在默认Ubuntu软件源是都能够提供的,但是Loongnix的yum源并不一定都提供。如果Loongnix的yum源没有提供,需要找替代的软件包,比如另一个相同功能、但是名称不同的软件包。如果仍然找不到合适软件包,可以尝试暂时去掉,绕过这个软件包,先保证编译成功。如果在编译或者运行时发现还是存在依赖问题,再回头找到依赖软件包的源代码进行编译以解决问题。
下面我们对修改前的Dockerfile文件进行逐条指令分析。

Step 1:


# Latest Ubuntu LTS
FROM ubuntu:14.04


默认依赖镜像从dockerhub获取Ubuntu,我们制作的镜像依赖于龙芯平台的fedora21-base,需要修改为


# Latest Loongnix
FROM fedora21-base:21


如果你遇到如下报错,那就需要检查你的基础镜像是否能够成功获取。
Trying to pull repository docker.io/library/fedora21-base ...  
Pulling repository docker.io/library/fedora21-base
Network timed out while trying to connect to
https://index.docker.io/v1/repositories/library/fedora21-base/images.
You may want to check your internet connection or if you are behind a proxy

Step 2:


# Update
RUN apt-get update \
# Install pip
    && apt-get install -y \
        swig \
        python-pip \
# Install deps for backports.lzma (python2 requires it)
        python-dev \
        python-mysqldb \
        python-rsa \
        libssl-dev \
        liblzma-dev \
        libevent1-dev \
    && rm -rf /var/lib/apt/lists/*


这条命令比较长,意思是在基础镜像上,进行软件升级以及对registry所依赖却不包含在基础镜像的软件进行下载。
首先Fedora属RedHat系列,常用安装包为rpm包,常见包管理方式为yum,那么apt-get就应该替换为yum。
另外我们在本地对loongnix yum源进行yum search发现python-mysqldb、libssl-dev和liblzma-dev没有找到,暂且先注释掉;而python-dev和libevent1-dev在loongnix yum源中命名为python-devel和libevent-devel,修改好。
这一步的主要错误都是找不到软件包,按照上述修改步骤就不会报该种错误。在后面的其他步骤会出现缺少软件包或缺少头文件的错误,我们再返回来修改step 2。

Step 3, 4:


COPY . /docker-registry
COPY ./config/boto.cfg  /etc/boto.cfg


拷贝命令。

Step 5:


# Install core
RUN pip install /docker-registry/depends/docker-registry-core


安装registry core。这步会暴露出下面的错误:
unable to execute 'gcc': No such file or directory
error: command 'gcc' failed with exit status 1
->这是因为基础镜像缺少gcc,需要在Step 2中的RUN命令行中添加gcc软件包;
Downloading/unpacking boto==2.34.0 (from docker-registry-core==2.0.3)
Cannot fetch index base URL https://pypi.python.org/simple/
Could not find any downloads that satisfy the requirement boto==2.34.0 (from docker-registry-core==2.0.3)
Cleaning up...
No distributions at all found for boto==2.34.0 (from docker-registry-core==2.0.3)
Storing debug log for failure in /root/.pip/pip.log
The command '/bin/sh -c pip install /docker-registry/depends/docker-registry-core' returned a non-zero code: 1
->国外服务器连接不上,这个情况时有发生,最好的解决办法就是修改软件源到国内服务器。解决办法为在docker-registry源码中添加pip配置文件pip.conf,拷贝到镜像中。代码如下:


[global]
 
index-url=http://pypi.douban.com/simple/



Step 6:


# Install registry
RUN pip install file:///docker-registry#egg=docker-registry[bugsnag,newrelic,cors]


安装registry。这步会出现如下错误:
backports/lzma/_lzmamodule.c:115:18: fatal error: lzma.h: No such file or directory

->这个是缺少软件包liblzma,不安装不可行。loongnix源没有liblzma,在yum search lzma结果中搜索头文件为”lzma.h”的软件包,发现xz-devel,Step 2 中install xz_devel后该错误解决;
Running setup.py install for M2Crypto
building 'M2Crypto.__m2crypto' extension
swigging SWIG/_m2crypto.i to SWIG/_m2crypto_wrap.c
swig -python -I/usr/include/python2.7 -I/usr/include -I/usr/include/openssl -includeall -modern -D__x86_64__ -o SWIG/_m2crypto_wrap.c SWIG/_m2crypto.i
SWIG/_m2crypto.i:30: Error: Unable to find 'openssl/opensslv.h'
SWIG/_m2crypto.i:33: Error: Unable to find 'openssl/safestack.h'
SWIG/_evp.i:12: Error: Unable to find 'openssl/opensslconf.h'
SWIG/_ec.i:7: Error: Unable to find 'openssl/opensslconf.h'
error: command 'swig' failed with exit status 1

 -> pip install的m2crypto是x86_64架构的,这里需要修改源码,不使用pip命令对该软件进行下载:requirements/main.txt中删除行M2Crypto==0.22.3,然后Dockerfile在Step 2添加mips64el架构的软件包:install m2crypto。

Step 7:


RUN patch \
 $(python -c 'import boto; import os; print os.path.dirname(boto.__file__)')/connection.py \
 < /docker-registry/contrib/boto_header_patch.diff


这步是打补丁,出现如下错误:
/bin/sh: patch: command not found
->缺少patch命令,说明依赖镜像中不包含该命令软件包。同理,Step 2中install patch。

Step 8, 9, 10, 11:


ENV DOCKER_REGISTRY_CONFIG /docker-registry/config/config_sample.yml
ENV SETTINGS_FLAVOR dev
 
EXPOSE 5000
 
CMD ["docker-registry"]


ENV 配置registry镜像的环境变量。
EXPOSE 指定容器映射到宿主机的端口号为5000。
CMD 指定运行容器时的操作指令。

3.2.3 修改完成的Dockerfile
至此Dockerfile修改完成,代码如下:


# Latest Loongnix
FROM fedora21-base:21
 
# Update
RUN yum update \
# Install pip
    && yum install -y \
        swig \
        python-pip \
        gcc \            
        patch \    
        m2crypto \
# Install deps for backports.lzma (python2 requires it)
        python-devel \
        #python-mysqldb \
        python-rsa \
        #libssl-dev \
        xz-devel \
        libevent-devel \
    && rm -rf /var/lib/apt/lists/*
 
COPY . /docker-registry
COPY ./config/boto.cfg /etc/boto.cfg
 
# Install core
RUN pip install /docker-registry/depends/docker-registry-core
 
# Install registry
RUN pip install
file:///docker-registry#egg=docker-registry[bugsnag,newrelic,cors]
 
RUN patch \
 $(python -c 'import boto; import os; print os.path.dirname(boto.__file__)')/ connection.py \
 < /docker-registry/contrib/boto_header_patch.diff
 
ENV DOCKER_REGISTRY_CONFIG /docker-registry/config/config_sample.yml
ENV SETTINGS_FLAVOR dev  
 
EXPOSE 5000
 
CMD ["docker-registry"]



3.2.4 编译通过
使用前面修改后的Dockerfile,再次进行编译,
# docker build -t fedora-registry:1 .
编译成功后会有提示:Successfully built 46b2003cb477(IMAGE ID)。
为了确认镜像生成的结果,输入命令docker images能看到生成的镜像:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest 46b2003cb477 2 minutes ago 589.2 MB

3.3 run registry
# docker run -d -p 5000:5000 fedora-registry:1

Screenshot-5.png


-p参数将容器5000端口号与宿主机5000端口号进行映射,-d后台运行该容器。docker ps查看容器是否启动成功,其标志是“STATUS”为“Up”:
 
3.4 push镜像进行验证
搭建好registry服务器之后,就可以使用另外一台机器作为客户端,向服务器进行push、pull操作。
在客户端上,执行下面命令,提交一个新的镜像:
# docker tag fedora21-base:21 10.20.42.45:5000/fedora:latest
# docker push 10.20.42.45:5000/fedora

10.20.42.45:5000为registry服务器的IP和映射后的端口号。
有可能在push过程中出现的下面的错误:
# docker push 10.20.42.45:5000/fedora
The push refers to a repository [10.20.42.45:5000/fedora]
Get https://10.20.42.45:5000/v1/_ping: EOF

此时需要修改客户端上的docker配置文件 /etc/sysconfig/docker


OPTIONS='--selinux-enabled --insecure-registry 10.20.42.45:5000'


这步之后重启docker服务,重新执行步骤3.4(如果客户端就是宿主机重新执行3.3)再push镜像。
push成功显示如下:
 
Screenshot-1.png


浏览器输入如下网址能看到push成功的镜像:

Screenshot.png


3.5 pull镜像进行验证
在客户端进行pull验证,如果客户端上已经有要拉取的同名镜像,要先执行docker rmi命令把镜像删除之后再进行拉取。
#docker pull 10.20.42.45:5000/fedora-registry

pull结果参考下图能看到10.20.42.45:5000/fedora:latest。
 
Screenshot-6.png


并能正确运行该容器:
 
Screenshot-8.png


4.总 结
部署docker registry一定要明确每一步的意义是什么,比如我们为什么需要移植registry而不是直接pull一个registry镜像就能建立这个私有仓库?编译docker镜像必须理解Dockerfile的语法,明确每一条指令的意义,才能更好的理解编译报错的根本原因以及如何解决。

(精品)(Docker系列之七)龙芯Fedora21平台上传docker镜像到docker hub

huangxg 发表了文章 • 0 个评论 • 544 次浏览 • 2017-10-10 14:37 • 来自相关话题

 申请docker hub 帐号   打开 docker hub官网:https://hub.docker.com 进行注册   邮件 ...查看全部
Screenshot-1.png

 申请docker hub 帐号
 
打开 docker hub官网:https://hub.docker.com 进行注册

Screenshot.png

 
邮件激活后登录docker hub 点击 Create --> Create repository 创建一个仓库。
 


Screenshot.png

仓库名称:huangxg20171010/fedora21-base
huangxg20171010是帐号,fedora21-base在docker hub上是Repository,可以理解为镜像名称。
 
在本机登录hub帐号:
# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: huangxg20171010
Password:
Login Succeeded

 
将本机已经存在的镜像名称做格式化,保证和仓库名称:huangxg20171010/fedora21-base 一致,操作如下:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora21-base 21 65e35642a4da 12 days ago 206.9 MB

# docker tag fedora21-base:21 huangxg20171010/fedora21-base:20170726
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora21-base 21 65e35642a4da 12 days ago 206.9 MB
huangxg20171010/fedora21-base 20170726 65e35642a4da 12 days ago 206.9 MB

使用 docker push 将镜像上传至hub上,操作如下:
# docker push huangxg20171010/fedora21-base:20170726
The push refers to a repository [docker.io/huangxg20171010/fedora21-base]
409f8b08daf6: Layer already exists
20170726: digest: sha256:6ec30e213ad3df532c8cad07985c7a522c08e3b1ed7ac491e60156b512484b63 size: 528

 
上传一个tag为latest的镜像,操作如下:
# docker tag fedora21-base:21 huangxg20171010/fedora21-base
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora21-base 21 65e35642a4da 12 days ago 206.9 MB
huangxg20171010/fedora21-base 20170726 65e35642a4da 12 days ago 206.9 MB
huangxg20171010/fedora21-base latest 65e35642a4da 12 days ago 206.9 MB

# docker push huangxg20171010/fedora21-base
The push refers to a repository [docker.io/huangxg20171010/fedora21-base]
409f8b08daf6: Layer already exists
latest: digest: sha256:6ec30e213ad3df532c8cad07985c7a522c08e3b1ed7ac491e60156b512484b63 size: 528

 
验证是否可以正常pull镜像,操作如下:
# docker rmi huangxg20171010/fedora21-base
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora21-base 21 65e35642a4da 12 days ago 206.9 MB
# docker pull huangxg20171010/fedora21-base
Trying to pull repository docker.io/huangxg20171010/fedora21-base ...
sha256:6ec30e213ad3df532c8cad07985c7a522c08e3b1ed7ac491e60156b512484b63: Pulling from docker.io/huangxg20171010/fedora21-base

Digest: sha256:6ec30e213ad3df532c8cad07985c7a522c08e3b1ed7ac491e60156b512484b63
Status: Downloaded newer image for docker.io/huangxg20171010/fedora21-base

# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fedora21-base 21 65e35642a4da 12 days ago 206.9 MB
huangxg20171010/fedora21-base latest 65e35642a4da 12 days ago 206.9 MB

 
通过docker hub 官网查看验证是否上传成功,操作如下:
  1. 打开 docker hub官网:https://hub.docker.com 登录。 
  2. 如下图所示,点击“DETAILS”。


Screenshot.png

      3. 如下图所示,点击“Tags”,表示两个镜像提交成功,其中一个镜像的tag是20170726,另一个镜像的tag是latest

Screenshot-1.png



总 结
 
按照本文方法,可以将做好的镜像上传至docker hub 上,便于其他宿主机下载使用。

(精品)(Docker系列之五)龙芯Fedora21平台制作feodra21-loongson-app docker镜像

huangxg 发表了文章 • 0 个评论 • 511 次浏览 • 2017-09-28 20:46 • 来自相关话题

在按照本文的方式制作镜像之前,首先要先创建基础镜像feodra21-apache-php-mysql,可以参考: http://ask.loongnix.org/?/article/85    创建feodra21-loon ...查看全部
在按照本文的方式制作镜像之前,首先要先创建基础镜像feodra21-apache-php-mysql,可以参考:
http://ask.loongnix.org/?/article/85 

 
创建feodra21-loongson-app docker镜像的必要性
 
可以方便快捷的搭建和使用龙芯“应用公社”。
 
实验环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170726版本,
docker是1.12.2版本。
 
镜像内容
 
feodra21-loongson-app镜像包含龙芯“应用公社”的代码和数据库,可以直接运行。
 
制作镜像前期准备
 
本文将演示使用Dockerfile如何创建镜像,Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。
 
在宿主机下创建一个 loongson-app 文件夹,将Dockerfile和run.sh文件存到 loongson-app 文件夹内,具体步骤为:
# mkdir /root/image/loongson-app -p
# cd /root/image/loongson-app
#
vi run.sh






  • 编写run.sh文件,如下代码所示:
#!/bin/bashcd '/usr' ; /usr/bin/mysqld_safe --datadir='/var/lib/mysql' &/usr/sbin/httpd &export LC_ALL=zh_CN.UTF-8export LANG=zh_CN.UTF-8/bin/bash
可见run.sh所执行的操作是启动httpd和mysql,并运行/bin/bash文件。
  • 编写Dockerfile文件,如下代码所示:
# vi Dockerfile以下是Dockerfile文件包含的内容FROM feodra21-apache-php-mysql:latestRUN git clone https://github.com/jinguojie-loongson/loongson-app.gitRUN rm -rf /var/www/html/appRUN cp -rf /loongson-app /var/www/html/appRUN /bin/sh -c ' /run.sh && sleep 2 && mysql -u root -e " source /var/www/html/app/sql/sql.txt " 'RUN cp -rf /var/www/html/app/data /opt/dataRUN chmod 777 /opt/data -RADD run.sh /RUN chmod 777 /run.shCMD ["/run.sh"]
 
  • Dockerfile文件描述:          
           1、FROM:  FROM指令指定的基础image,本文中指定已经创建好的fedora21-apache-php-mysql镜像,格式为: 镜像名称:镜像标签(TAG)。           2、RUN:  RUN可以运行任何被基础image支持的命令。            3、ADD: 构建指令,格式为:ADD <src> <dest>  从src复制文件到container的dest路径。本文中将上文提及到的run.sh复制到container的 / 目录下。           4、CMD:设置指令,用于container启动时指定的操作。本文中在container启动时运行ADD复制的run.sh文件。 运行Dockerfile文件创建镜像​
  • 通过docker build命令创建镜像,代码如下所示:
# docker build -t feodra21-loongson-app .
当Dockerfile文件中所有命令都Complete以后,最后会有如下输出,代表创建镜像成功:
Removing intermediate container ac88f28d2a6bSuccessfully built 117acaf888ef
  • 验证feodra21-loongson-app镜像是否创建成功,代码如下:

# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
feodra21-loongson-app latest 117acaf888ef 5 minutes ago 988.1 MB
feodra21-apache-php-mysql latest 0ac06cb06032 6 hours ago 857.5 MB
fedora21-base 21 65e35642a4da 27 hours ago 206.9 MB
feodra21-tools latest 50f2048daeb1 28 hours ago 487.2 MB
通过查看docker images的执行结果可以确定feodra21-loongson-app镜像创建成功,fedora21-apache-php-mysql镜像就是Dockerfile文件中FROM 指定的基础镜像。
 
创建docker容器
 
创建好feodra21-loongson-app镜像,就可以创建容器了,为了其他机器可以访问容器,在创建容器的时候要做网络桥接,代码如下:
[root@localhost loongson-app]# docker run -i -t -d -p 8082:80 feodra21-loongson-app
da0c0158c364322d2218195ca3116e0e75f1aa4712b67c3ddb82a0f02084dc45

[root@localhost loongson-app]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da0c0158c364 feodra21-loongson-app "/app-run.sh" 6 seconds ago Up 5 seconds 0.0.0.0:8082->80/tcp drunk_mcnulty

[root@localhost loongson-app]# docker attach da0c0158c364
[root@da0c0158c364 usr]#
docker run命令中,-i 代表容器可以接收键盘上的输入(主要用于在容器的命令上运行程序);-t 和 -i 配合使用;-d后台运行容器,并返回容器ID;-p 指定容器暴露的端口;8082:80 将容器的80端口暴露出来,并桥接到宿主机的8082端口上。
 容器运行成功后可以看见一个明显的变化,就是命令行提示符已经由本机的机器名称(localhost)变成了容器的ID(da0c0158c364)。
 
至此,龙芯feodra21-loongson-app容器创建成功,并且开始正常运行了!
 
验证Apache和mysql是否正常启动,具体步骤如下:
[root@da0c0158c364 usr]# ps aux | grep mysql
root 7 0.1 0.0 4496 2608 ? S 12:21 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql
mysql 122 1.0 1.7 1305104 137936 ? Sl 12:21 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root 154 0.0 0.0 3552 528 ? S+ 12:22 0:00 grep --color=auto mysql
[root@da0c0158c364 usr]# ps aux | grep httpd
root 8 1.8 0.2 49376 19680 ? S 12:21 0:00 /usr/sbin/httpd
apache 134 0.0 0.1 49376 9440 ? S 12:21 0:00 /usr/sbin/httpd
apache 135 0.0 0.1 49376 9440 ? S 12:21 0:00 /usr/sbin/httpd
apache 136 0.0 0.1 49376 9440 ? S 12:21 0:00 /usr/sbin/httpd
apache 137 0.0 0.1 49376 9440 ? S 12:21 0:00 /usr/sbin/httpd
apache 138 0.0 0.1 49376 9440 ? S 12:21 0:00 /usr/sbin/httpd
root 156 0.0 0.0 3552 512 ? S+ 12:22 0:00 grep --color=auto httpd
可见Apache和mysql正常启动了。
 
验证mysql数据库脚本是否正常执行,具体步骤如下:
[root@da0c0158c364 usr]# mysql -u root
MariaDB [(none)]> use app
MariaDB [app]> select id, name from app;
+--------+--------------+
| id | name |
+--------+--------------+
| 1 | WPS Office |
| 2 | QQ |
| 3 | 扫雷 |
| 4 | Photoshop |
| 5 | 百度盘 |
| 6 | 同花顺 |
| 999999 | 应用公社 |
+--------+--------------+






验证data目录是否正常复制到/opt目录下,具体步骤如下:
[root@da0c0158c364 usr]# cd /opt/
[root@da0c0158c364 opt]# ll
total 4
drwxrwxrwx 7 root root 4096 Sep 28 12:14 data
[root@da0c0158c364 opt]# cd data
[root@da0c0158c364 data]# ll
total 20
drwxrwxrwx 2 root root 4096 Sep 28 12:14 app
drwxrwxrwx 2 root root 4096 Sep 28 12:14 hot
drwxrwxrwx 2 root root 4096 Sep 28 12:14 icon
drwxrwxrwx 2 root root 4096 Sep 28 12:14 screen
drwxrwxrwx 2 root root 4096 Sep 28 12:14 tmp





可见data目录成功复制到/opt目录下,并且权限修改成功。
 
容器内、宿主机、局域网测试:
 
容器内: w3m http://localhost/app/php/index.php
宿主机: http://localhost:8082/app/php/index.php
局域网: 
 

Screenshot-龙芯应用公社_-_Chromium.png

 
 
总结
 
本文描述在龙芯平台上通过Dockerfile制作龙芯应用公社镜像的方法,并成功运行容器。
如果没有创建fedora21-apache-php-mysql,在执行Dockerfile文件时会提示基础镜像不存在的错误。
以上论述可供开发者和部署服务器应用的管理员参考。

(精品)(Docker系列之四)龙芯Fedora21平台制作feodra21-apache-php-mysql docker镜像

huangxg 发表了文章 • 1 个评论 • 794 次浏览 • 2017-09-27 17:58 • 来自相关话题

   在按照本文的方式制作镜像之前,首先要先创建基础镜像fedora21-tools,可以参考: http://ask.loongnix.org/?/article/82    创建feodra21 ...查看全部
a.jpg

 
 在按照本文的方式制作镜像之前,首先要先创建基础镜像fedora21-tools,可以参考:
http://ask.loongnix.org/?/article/82 

 

创建feodra21-apache-php-mysql docker镜像的必要性
 
在已经创建的feodra21-tools镜像中只包含常用命令,并不包含Apache、PHP、Mysql,执行Apache、PHP、Mysql相关命令会有“command not found”错误提示,如下:
[root@04ee408d1304 /]# httpd -v
bash: httpd: command not found
[root@04ee408d1304 /]# php -v
bash: php: command not found
[root@04ee408d1304 /]# mysql -u root
bash: mysql: command not found
所以,为了方便开发者和部署服务器应用的管理员,快速的搭建Apache+PHP+Mysql服务器,做此镜像。
 实验环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170726版本,
docker是1.12.2版本。
 
镜像内容
 
feodra21-apache-php-mysql镜像整合了Apache、PHP、Mysql
 
制作镜像前期准备
 
本文将演示使用Dockerfile如何创建镜像,Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。
 
在宿主机下创建一个 apache-php-mysql 文件夹,将Dockerfile和run.sh文件存到 apache-php-mysql 文件夹内,具体步骤为:
# mkdir /root/image/apache-php-mysql -p
# cd /root/image/apache-php-mysql/
# vi run.sh







  • 编写run.sh文件,如下代码所示:
#!/bin/bashcd '/usr' ; /usr/bin/mysqld_safe --datadir='/var/lib/mysql' &/usr/sbin/httpd &export LC_ALL=zh_CN.UTF-8export LANG=zh_CN.UTF-8/bin/bash
 可见run.sh所执行的操作是启动httpd和mysql,并运行/bin/bash文件。
  • 编写Dockerfile文件,如下代码所示:
# vi Dockerfile以下是Dockerfile文件包含的内容FROM feodra21-tools:latestRUN yum install -y "httpd"RUN yum install -y "php"RUN yum install -y "mysql"RUN yum install -y "php-mysql"RUN yum install -y "mariadb-server"RUN mysql_install_db --user=mysql --datadir=/var/lib/mysqlRUN sed -i /datadir=/a"character_set_server=utf8\ninit_connect='SET NAMES utf8'" /etc/my.cnfRUN sed -i /pid-file=/a"[client]\ndefault_character_set=utf8" /etc/my.cnfRUN sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 500M/g' /etc/php.iniRUN sed -i 's/post_max_size = 8M/post_max_size = 800M/g' /etc/php.iniADD run.sh /RUN chmod 777 /run.shCMD ["/run.sh"]
 
  • Dockerfile文件描述:
          1、FROM:  FROM指令指定的基础image,本文中指定已经创建好的fedora21-base镜像,格式为:                          镜像名称:镜像标签(TAG)。           2、RUN:  RUN可以运行任何被基础image支持的命令。本文中运行yum install 命令,下载安装                                  httpd、php、mysql等相关内容。            3、ADD: 构建指令,格式为:ADD <src> <dest>  从src复制文件到container的dest路径。本文中将上文提及到的run.sh复制到container的 / 目录下。           4、CMD:设置指令,用于container启动时指定的操作。本文中在container启动时运行ADD复制的run.sh文件。
  •  
 运行Dockerfile文件创建镜像​
  • 通过docker build命令创建镜像,代码如下所示:
# docker build -t feodra21-apache-php-mysql .
当Dockerfile文件中所有命令都Complete以后,最后会有如下输出,代表创建镜像成功:
Removing intermediate container da84d9ffbcd7Successfully built 204d157f7074
  
  • 验证feodra21-apache-php-mysql镜像是否创建成功,代码如下:
 
# docker imagesREPOSITORY                 TAG      IMAGE ID        CREATED         SIZEfeodra21-apache-php-mysql  latest   ed1f04fd6883    2 minutes ago   857.4 MBfeodra21-tools             latest   204d157f7074    20 hours ago    487.2 MBfedora21-base              21       099b24f7ff5a    2 days ago      206.9 MB
通过查看docker images的执行结果可以确定feodra21-apache-php-mysql镜像创建成功,fedora21-tools镜像就是Dockerfile文件中FROM 指定的基础镜像。 创建docker容器 创建好feodra21-apache-php-mysql镜像,就可以创建容器了,为了其他机器可以访问容器,在创建容器的时候要做网络桥接,代码如下:
[root@localhost apache-php-mysql]# docker run -i -t -d -p 8081:80 feodra21-apache-php-mysql1e0db6c0e675987f2ce688bd9b139238fa632c52c5c2261f3d53b6b74a6c5059[root@localhost apache-php-mysql]# docker psCONTAINER ID   IMAGE                       COMMAND      CREATED         STATUS          PORTS                  NAMES1e0db6c0e675   feodra21-apache-php-mysql   "/run.sh"    28 seconds ago  Up 26 seconds   0.0.0.0:8081->80/tcp   angry_lamport[root@localhost apache-php-mysql]# docker attach 1e0db6c0e675[root@1e0db6c0e675 usr]# 
docker run命令中,-i 代表容器可以接收键盘上的输入(主要用于在容器的命令上运行程序);-t 和 -i 配合使用;-d后台运行容器,并返回容器ID;-p 指定容器暴露的端口;8081:80 将容器的80端口暴露出来,并桥接到宿主机的8081端口上。 容器运行成功后可以看见一个明显的变化,就是命令行提示符已经由本机的机器名称(localhost)变成了容器的ID(1e0db6c0e675)。 至此,龙芯feodra21-apache-php-mysql容器创建成功,并且开始正常运行了! 验证Apache和mysql是否正常启动,具体步骤如下:
[root@1e0db6c0e675 /]# ps aux | grep httpdroot        10  0.0  0.2  49376 19680 ?        S    08:52   0:00 /usr/sbin/httpdapache     135  0.0  0.1  49520 11392 ?        S    08:52   0:00 /usr/sbin/httpdapache     136  0.0  0.1  49520 11392 ?        S    08:52   0:00 /usr/sbin/httpdapache     137  0.0  0.1  49376  9440 ?        S    08:52   0:00 /usr/sbin/httpdapache     138  0.0  0.1  49376  9440 ?        S    08:52   0:00 /usr/sbin/httpdapache     139  0.0  0.1  49376  9440 ?        S    08:52   0:00 /usr/sbin/httpdapache     148  0.0  0.1  49376  9424 ?        S    09:09   0:00 /usr/sbin/httpdroot       152  0.0  0.0   3552   528 ?        S+   09:14   0:00 grep --color=auto httpd[root@1e0db6c0e675 /]# ps aux | grep mysqlroot         9  0.0  0.0   4432  2576 ?        S    08:52   0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysqlmysql      110  0.0  1.7 911856 138176 ?       Sl   08:52   0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sockroot       154  0.0  0.0   3552   512 ?        S+   09:14   0:00 grep --color=auto mysql
可见Apache和mysql正常启动了。 整合测试Apache+PHP+Mysql、容器内访问、宿主机访问、局域网访问,具体步骤如下:
  • 创建测试数据库:

[root@1e0db6c0e675 /]# mysql -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.0.14-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database loongson;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use loongson;
Database changed
MariaDB [loongson]> create table test (
-> id int(5) NOT NULL auto_increment key,
-> name varchar(50)
-> );
Query OK, 0 rows affected (0.07 sec)

MariaDB [loongson]> insert into test(name) value('loongson');
Query OK, 1 row affected (0.02 sec)

MariaDB [loongson]> select * from test;
+----+----------+
| id | name |
+----+----------+
| 1 | loongson |
+----+----------+
1 row in set (0.01 sec)
可见,进入数据库、创建数据库和表、插入数据、查询数据都正常并显示无误。
 创建测试PHP代码和页面,首先Ctrl+C退出数据库编辑,具体步骤如下:
# cd /var/www/html/
# mkdir app
# cd app
# mkdir php
# cd php

           1、创建_db.inc文件,代码如下:
# vi _db.inc

_db.inc包含的内容如下:

<?php

function db_init()
{
global $conn;
$mysql_server_name='localhost';
$mysql_username='root';
$mysql_password='';
$mysql_database='loongson';

$conn = mysql_connect($mysql_server_name, $mysql_username, $mysql_password)
or
fatal_error("error connecting database");

mysql_query("set names 'utf8'");

mysql_select_db($mysql_database);
}

function db_get_one_value($sql)
{
global $conn;

$result = mysql_query($sql, $conn);

while ($row = mysql_fetch_row($result))
{
return $row[0];
}

return "";
}

db_init();
?>

           2、创建_index.inc文件,代码如下:
# vi _index.inc

_index.inc包含内容如下:

<?php
include_once('_db.inc');

function get_test_name()
{
global $conn;

$sql = "select name from test";

return db_get_one_value($sql);
}

?>

           3、创建index.php文件,代码如下:
# vi index.php

index.php包含内容如下:

<?php
include_once('_index.inc');
?>

<h3>Test PHP to mysql</h3>
<?= get_test_name(); ?>

容器内、宿主机、局域网测试:
 
容器内: w3m http://localhost/app/php/index.php  显示 Test PHP to mysql  loongson
宿主机: http://localhost:8081/app/php/index.php   显示 Test PHP to mysql  loongson
局域网: http://<宿主机IP>:8081/app/php/index.php   显示 Test PHP to mysql  loongson
 

apache1.png



总结
 
本文描述在龙芯平台上通过Dockerfile制作Apahce+PHP+Mysql镜像的方法,并成功运行容器。
如果没有创建fedora21-tools,在执行Dockerfile文件时会提示基础镜像不存在的错误。
以上论述可供开发者和部署服务器应用的管理员参考。

(精品)(Docker系列之六)龙芯平台搭建容器管理工具dockerUI,并解决dockerUI启动容器的bug

renyafei 发表了文章 • 1 个评论 • 882 次浏览 • 2017-09-27 10:36 • 来自相关话题

整体制作过程: dockerUI是基于本地容器的部署 第一步:要制作出龙芯fedora21-base镜像 第二步:下载ui-for- ...查看全部
整体制作过程:

dui.png


dockerUI是基于本地容器的部署
第一步:要制作出龙芯fedora21-base镜像
第二步:下载ui-for-docker的官方镜像,因为ui-for-docker官方镜像是在x86下正常运行的,所有提取跟平台无关的文件,例如:js、css、html等文件。
第三步:从github上下载dockerUI的源码文件,编译龙芯平台支持的二进制文件,通过分析源码中的gruntFile.js,只需要编译api
第四步:把第三步提取跟平台无关的文件(js、css、html),和第四步编译好的龙芯平台支持的二进制文件(api),传输到fedora21-base镜像创建的容器内,并运行ui-for-docker文件

第五步:在浏览器地址栏中输入:localhost:9000


dockerUI是基于本地容器的部署,所以首先要制作龙芯fedora21-base镜像


    创建基础镜像fedora21-base,可以参考: http://ask.loongnix.org/?/article/81 ”
  • 验证feodra21-base镜像是否创建成功,代码如下:
# docker images   REPOSITORY       TAG        IMAGE ID        CREATED         SIZE   fedora21-base    latest     099b24f7ff5a    33 hours ago    206.9 MB
  • 创建docker容器
  •     创建好feodra21-base镜像,就可以创建容器了,代码如下:
# docker run -i -t fedora21-base /bin/bash[root@6253a4c3f078 /]#
到这里feodra21-base的镜像制作好了,并且创建好容器6253a4c3f078和进入到容器6253a4c3f078里了, 这个窗口不要关闭,重新打开另一个终端,在容器外面进行制作dockerUI镜像2.制作龙芯支持的dockerUI镜像
  • dockerUI官方镜像是在x86上正常运行的镜像,所以要测试在龙芯平台上是否正常运行
  • 下下载官方镜像,并查看镜像
[b] # docker pull uifd/ui-for-docker # docker images     REPOSITORY TAG IMAGE ID CREATED SIZE     docker.io/uifd/ui-for-docker latest 965940f98fa5 12 months ago 8.096 MB [/b]
  • 测试dockerUI官方镜像在龙芯平台上是否可用
  # docker run -i -t docker.io/uifd/ui-for-docker:latest /bin/bash       panic: standard_init_linux.go:175: exec user process caused "exec  format    error" [recovered]	   panic: standard_init_linux.go:175: exec user process caused "exec format error"       goroutine 1 [running, locked to thread]:       panic(0x1203d0060, 0xc42014e0e0)	    /usr/lib/golang/src/runtime/panic.go:500 +0x4c4       github.com/urfave/cli.HandleAction.func1(0xc4201072d0)[b]提示“exex  format  error”错误,容器不能正常运行,可见dockerUI官方镜像在龙芯平台上是不可用的[/b]
  • 虽然容器不能正常运行,但是docker.io/uifd/ui-for-docker镜像能够成功创建容器,查看容器
 # docker ps -a    CONTAINER ID   IMAGE COMMAND   CREATED  STATUS  PORTS  NAMES    433b60b7cbd2   docker.io/uifd/ui-for-docker:latest   "/ui-for-docker /bin/"     3 minutes ago    Exited (2) 3 minutes ago   grave_lovelace
  • 查看报错的原因,是因为包含了x86的二进制
    # file ui-for-dockerui-for-docker: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
  • 因为要提取docker.io/uifd/ui-for-docker镜像里跟平台无关的文件(js、css、html)等文件,所以把docker.io/uifd/ui-for-docker镜像创建的容器433b60b7cbd2导出1.tar,并把1.tar解压到dockerui文件夹里
    # docker export 433b60b7cbd2 >1.tar
  • 把1.tar解压 
     # tar xf 1.tar # ls     angular.js data dev etc fonts ico images img index.html     proc run sys ui-for-docker uifordocker.css uifordocker.js var     vendor.css vendor.js 
3.编译龙芯平台支持的二进制文件,通过分析源码中的gruntFile.js,只需要编译api
  • 先下载dockerUI的源代码, https://github.com/kevana/ui-for-docker
            
  [root@localhost 20170926-dockerui]# git clone https://github.com/kevana/ui-for-docker
  • 进入到源码中api目录下:
             
 # cd /ui-for-docker/api 
  • DockerUI使用grunt作为编译工具。但是在龙芯上不需要编译源代码,只需要编译api下go语言源代码,通过分析gruntFile.js,找出用于编译api的编译命令,具体命令如下:
           
  # export GOPATH=/usr/share/gocode  # go get github.com/gorilla/csrf  # go get github.com/gorilla/securecookie  # go build 
  • 到这里就把龙芯平台支持的api编译好了,把编译好的api拷贝到解压后的1.tar的dockerui文件夹里    
  # cp api /dockerui  # cd /home/loongson/dockerui
  • 把dockerui文件夹里的ui-for-docker删除
           
  # rm -rf ui-for-docker
  • 把编译好的api重命名为ui-for-docker 
 # mv api ui-for-docker
到这里就把ui-for-docker官方镜像中跟平台无关的文件(js、css、html),和编译好的龙芯平台支持的二进制文件api,整合到一起了。
  • 把整合到一起的文件夹dockerui压缩
        
  # tar cvf dockerui.tar dockerui/
    • 回到第一步的终端页面,进入feodra21-base生成的容器6253a4c3f078里
                 
     [root@6253a4c3f078/]#
    • 创建文件夹ui,用来存放dockerui.tar
                
      [root@6253a4c3f078/]# mkdir ui
    • 把dockerui.tar传入到容器6253a4c3f078里:
       [root@6253a4c3f078/]# scp root@10.20.42.96:/home/loongson/dockerui.tar /ui
    • 把dockerui.tar解压
                
      [root@6253a4c3f078 ui/]# tar xvf dockerui.tar
    • 进入到解压后的dockerui文件夹里
       [root@6253a4c3f078 ui/]# cd dockerui
     
    • 运行文件ui-for-docker
           
       [root@6253a4c3f078 dockerui/]# ./ui-for-docker
     
    • 回到容器6253a4c3f078外面的终端运行
                  在镜像fedora21-base 创建的容器内安装完dockerUI后,重新导出一个镜像,是为了使容器内部和本机有一个端口映射,使本机可以访问容器内的dockerUI
        [root@localhost loongson]# docker commit 6253a4c3f078  dockerui-loongson    [root@localhost loongson]# docker stop 6253a4c3f078    [root@localhost loongson]# docker run -i  -t --name f2 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock    dockerui-loongson   /bin/bash
    在启动的容器中执行:
    [root@6253a4c3f078 /]# cd ui/dockerui[root@6253a4c3f078 /]# ./ui-for-docker
    • 在浏览器里输入:  http://localhost:9000    

           
    d1.png


    解决容器dockerUI启动容器的bug:
    复现bug:进入到localhost:9000页面后,点击按钮“Start Container”创建容器后,点击按钮“stop”,再点击按钮“start”,容器不能正常启动
    点击下图中的按钮“stop”

    u1.png


    再点击“start”按钮:提示“Container Started”,其实容器是没有启动成功的,

    u2.png

     
    排查问题,是containersNetworkController.js中传入容器id的参数值错误,


    DockerUI截图.png



    由于镜像中用到js都是经过编译后的压缩文件,在源码中改过之后还要进行编译和压缩,所以提供修改后的压缩文件uifordocker.js_.zip,把uifordocker.js_.zip文件下载,解压后的文件uifordocker.js替换容器内的文件uifordocker.js,再测试容器"stop"再“start”,运行正常。

    (精品)(Docker系列之三)龙芯Fedora21平台制作feodra21-tools docker镜像

    huangxg 发表了文章 • 0 个评论 • 594 次浏览 • 2017-09-26 20:05 • 来自相关话题

    在按照本文的方式制作镜像之前,首先要先创建基础镜像fedora21-base,可以参考: http://ask.loongnix.org/?/article/81   创建feodra21-tools镜像的必要性 ...查看全部
    在按照本文的方式制作镜像之前,首先要先创建基础镜像fedora21-base,可以参考:
    http://ask.loongnix.org/?/article/81 


     创建feodra21-tools镜像的必要性
     
    在已经创建的feodra21-base镜像中不包含常用命令,如:ifconfig、w3m、wget、vim等命令。当在feodra21-base容器的命令行中输入这些命令时,会有错误提示,如下:
    [root@c6f646635bf1 /]# ifconfig
    bash: ifconfig: command not found
    [root@c6f646635bf1 /]# w3m
    bash: w3m: command not found
    [root@c6f646635bf1 /]# wget
    bash: wget: command not found
    [root@c6f646635bf1 /]# vim
    bash: vim: command not found








    所以,还需要在创建一个只包含基本命令的镜像。
     实验环境
     
    本文的实验都是在龙芯3A3000机器上。
    操作系统是loongnix(Fedora21)20170726版本,
    docker是1.12.2版本。
     
    镜像内容
     
    feodra21-tools镜像中包含一些常用命令,如:ifconfig、w3m、wget、vim
     
    制作镜像前期准备
     
    本文将演示使用Dockerfile如何创建镜像,Dockfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。
    在宿主机下 /root/image 目录下创建一个 tools 文件夹,将Dockerfile和run.sh文件存到 tools 文件夹内,具体步骤为:
    # mkdir /root/image/tools  -p
    # cd /root/image/tools/
    # vi run.sh




    编写run.sh文件,如下代码所示:
    #!/bin/bash

    export LC_ALL=zh_CN.UTF-8
    export LANG=zh_CN.UTF-8

    /bin/bash
    编写Dockerfile文件,如下代码所示:
    # vi Dockerfile

    以下是Dockerfile包含的内容:

    FROM fedora21-base:21

    RUN yum install -y "net-tools"
    RUN yum install -y "w3m"
    RUN yum install -y "wget"
    RUN yum install -y "vim-enhanced"
    RUN yum install -y "tar"
    RUN yum install -y "git"

    RUN mkdir /usr/lib/locale -p
    RUN /bin/sh -c 'cd /usr/lib/locale && sleep 2 && yum reinstall -y "glibc-common"'
    RUN echo zh_CN.UTF-8 > /etc/locale.conf

    ADD run.sh /
    RUN chmod 777 /run.sh
    CMD ["/run.sh"]

     
    Dockerfile文件描述的几个解释:
               1、FROM:  FROM指令指定的基础image,本文中指定已经创建好的fedora21-base镜像,格式为:                          镜像名称:镜像标签(TAG)

               2、RUN:  RUN可以运行任何被基础image支持的命令。本文中运行yum install 命令,下载安装                                  net_tools、w3m、wget、vim。
     
               3、CMD: 设置指令,用于container启动时指定的操作。
     
               4、CMD:设置指令,用于container启动时指定的操作。本文中在container启动时运行ADD复制的run.sh文件。

    运行Dockerfile文件创建镜像
    • 通过docker build命令创建镜像,代码如下所示:
    # docker build -t feodra21-tools .
    当Dockerfile文件中的四条RUN命令都Complete以后,最后会有如下输出,代表创建镜像成功:
    Removing intermediate container da84d9ffbcd7Successfully built 204d157f7074
    • 验证feodra21-tools镜像是否创建成功,代码如下:

    # docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE
    feodra21-tools latest 204d157f7074 3 minutes ago 487.2 MB
    fedora21-base 21 099b24f7ff5a 33 hours ago 206.9 MB
    通过查看docker images的执行结果可以确定feodra21-tools镜像创建成功,fedora21-base镜像就是Dockerfile文件中FROM 指定的基础镜像。
     

    d1.png


     
    创建docker容器
     
    创建好feodra21-tools镜像,就可以创建容器了,代码如下:
    [root@localhost tools]# docker run -i -t feodra21-tools
    [root@34df78e5bf37 /]#
    docker run命令中,-i 代表容器可以接收键盘上的输入(主要用于在容器的命令上运行程序);-t 和 -i 配合使用。
     容器运行成功后可以看见一个明显的变化,就是命令行提示符已经由本机的机器名称(localhost)变成了容器的ID(34df78e5bf37)。
     
    至此,龙芯feodra21-tools容器创建成功,并且开始正常运行了!

    验证安装的命令是否可以正常使用
     
    在验证安装的命令是否可以正常使用,可以在容器里的命令行分别输入:ifconfig、w3m、wget、vim。只要不提示 “command not found” 就代表安装成功,并可以正常使用,使用ifconfig举例测试:
    # ifconfig

    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 172.18.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
    inet6 fe80::42:acff:fe12:2 prefixlen 64 scopeid 0x20<link>
    ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet)
    RX packets 3 bytes 238 (238.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 4 bytes 328 (328.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10<host>
    loop txqueuelen 0 (Local Loopback)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

     
    总结
     
    本文描述在龙芯平台上通过Dockerfile制作镜像的方法,并成功运行容器。
    如果没有创建fedora21-base,在执行Dockerfile文件时会提示基础镜像不存在的错误。
    以上论述可供开发者和部署服务器应用的管理员参考。

    (精品)(Docker系列之二)龙芯Fedora21平台制作docker镜像,并且解决vi乱码问题

    huangxg 发表了文章 • 0 个评论 • 808 次浏览 • 2017-09-25 15:32 • 来自相关话题

    实验环境   本文的实验都是在龙芯3A3000机器上。 操作系统是loongnix(Fedora21)20170726版本, docker是1.12.2版本。   安装docker工具 ...查看全部
    实验环境
     
    本文的实验都是在龙芯3A3000机器上。
    操作系统是loongnix(Fedora21)20170726版本,
    docker是1.12.2版本。
     
    安装docker工具
     
    loongnix已经编译好docker的安装包,通过网络源即可安装:
    # yum install docker
    # service docker restart

    制作docker镜像
     
    制作镜像有很多种方法,本文使用了网络上提供的一个脚本文件,可以使制作镜像的过程简单、自动化的完成。
    具体步骤如下:
    • 下载脚本:使用wget命令下载这个文件
    # wget https://raw.githubusercontent.com/docker/docker/master/contrib/mkimage-yum.sh2017-09-25 14:59:53 - 已保存 “mkimage-yum.sh”
    • 为脚本增加可执行权限
    # chmod a+x ./mkimage-yum.sh
    • 使用脚本制作龙芯的Docker镜像

    # ./mkimage-yum.sh -y /etc/yum.conf fedora21-base

    + yum -c /etc/yum.conf --installroot=/tmp/mkimage-yum.sh.iDuoUP -y clean all

    + tar --numeric-owner -c -C /tmp/mkimage-yum.sh.iDuoUP .
    + docker import - fedora21-base:21
    脚本执行结束后,通过docker images的输出可见,已经正常生成了一个镜像,名称为“fedora21-base”:
    # docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    fedora21-base 21 25bca293a55c 3 minutes ago 206.9 MB







    创建docker容器并运行容器

    有了fedora21-base镜像,现在就可以创建一个运行的容器了。使用docker run命令:
    [root@localhost /]# docker run -i -t fedora21-base:21 /bin/bash
    [root@f38d097e3d72 /]#


    docker run命令中,-i 代表容器可以接收键盘上的输入(主要用于在容器的命令上运行程序);-t 和 -i 配合使用。
     容器运行成功后可以看见一个明显的变化,就是命令行提示符已经由本机的机器名称(localhost)变成了容器的ID(f38d097e3d72)。
     
    至此,第一个龙芯容器创建成功,并且开始正常运行了!
     
    d.png


    现在可以在容器的命令行上输入任何命令了。注意,这样命令都是在容器的虚拟机中运行,不会对本机的文件系统造成任何破坏。
     
    vi的乱码问题
     
    通过上述方法创建的镜像,虽然可以正确的运行命令行,但是存在一个小问题,vi编辑器中不能正常显示中文
     
    为了演示这个问题,创建一个文本文件,其中包含中文(可以通过本机的输入法切换到中文进行输入“龙芯中科”四个字):
    # echo 龙芯中科 > 1.txt
    使用 vi 打开
    # vi 1.txt
    这样就显示出了问题:vi中打开的文本文件,原来的四个中文字符,现在都是乱码:
    ~Y~J�中~Q






    vi.png


     
    解决方法
     
    通过分析发现,问题原因是使用前文的脚本制作的镜像,缺少一些必要的文件,
    具体来说:没有安装 glibc-common, LC_ALL 和 LANG 两项中编码格式不正确,在 /etc 目录下缺少 locale.conf 文件。对于一般用户,不需要具体了解这几个文件的含义。
     
    解决方法是,再使用yum命令安装这些文件。具体步骤为:
    # cd /usr/lib
    # mkdir locale
    # cd locale
    # yum reinstall glibc-common -y

    # echo zh_CN.UTF-8 > /etc/locale.conf



    除此之外,每次进入容器或重启容器以后,还需在命令行执行如下两条命令:
    export LC_ALL=zh_CN.UTF-8
    export LANG=zh_CN.UTF-8

    验证效果
     

    经过上面的配置后,再使用 vi 打开文件,可以看到已经能够正常显示中文了。
    # vi /1.txt 

    龙芯中科
    ~
    ~

     上面的操作,对于容器重新启动后仍然有效。

    总 结
     
    本文描述在龙芯平台上搭建docker环境、制作基本镜像的方法,并成功运行容器。
    并且解决了在容器中 vi 不能正常显示中文的问题。
    可供开发者和部署服务器应用的管理员参考。
     
     参考文献:
    [1] 《 Docker 从零开始制作基础镜像[centos]》
         http://www.cnblogs.com/2018/p/4633940.html 
     
    这个脚本自动的制作镜像,并且导入到本机的镜像仓库中。
    原理仍然是 yum groupinstall "Core" --installroot="target" 
    自动到源上去下载包,保证是一个干净的环境。
    然后自动打tar包,执行docker import操作。