服务器

服务器

cloud.loongnix.org 啥情况了还能申请吗?

天高地厚 回复了问题 • 4 人关注 • 5 个回复 • 572 次浏览 • 2018-04-28 19:09 • 来自相关话题

(精品)(龙芯公有云系列之一)搭建分布式存储服务etcd

renyafei 发表了文章 • 0 个评论 • 654 次浏览 • 2017-11-03 11:21 • 来自相关话题

etcd 是一个应用在分布式环境下的 key/value 存储服务。     由于Kubernetes要使用到etcd,所以第一步就 ...查看全部
etcd 是一个应用在分布式环境下的 key/value 存储服务。
 

timg.jpg

 

由于Kubernetes要使用到etcd,所以第一步就是进行etcd的搭建。
 
etcd是一个Go语言编写的软件。

 搭建环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170512版本。
GO版本:go1.7.5 linux/mips64le
 
开始搭建
 
首先打开终端,配置GOPATH
# export GOPATH=/usr/lib/golang
进入GOPATH目录下
# cd $GOPATH
在$GOPATH的src目录下创建嵌套文件夹github.com/coreos
# mkdir -p $GOPATH/src/github.com/coreos
进入创建的文件夹下
# cd $GOPATH/src/github.com/coreos
下载etcd 2.3.6版本
# git clone  -b  v2.3.6 https://github.com/coreos/etcd.git


进入下载的etcd 文件夹下
# cd etcd
开始编译
# ./build
出现如下错误
github.com/coreos/etcd/Godeps/_workspace/src/github.com/boltdb/bolt
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: undefined: maxMapSize
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: invalid array bound maxMapSize
根据maxMapSize关键字找原因,使用grep "maxMapSize"  ./* -r 找出路径
# grep "maxMapSize" ./* -r
搜索出如下内容
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go:	data     *[maxMapSize]byte
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if size > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if sz > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: sz = maxMapSize
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_windows.go: db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr)))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix_solaris.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))

 根据错误提示分析,是因为在 ./Godeps/_workspace/src/github.com/boltdb/bolt 文件夹下,
缺少了支持mips64le平台的文件。
进入这个目录下添加bolt_mips64le.go文件:
# cd ./Godeps/_workspace/src/github.com/boltdb/bolt
# cp bolt_arm.go bolt_mips64le.go
重新进入etcd文件夹下,开始编译
# cd $GOPATH/src/github.com/coreos/etcd
# ./build
出现如下错误
2017-11-02 11:58:50.257747 E | etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=mips64le set.
这是因为没有配置ETCD_UNSUPPORTED_ARCH环境变量
配置环境变量
# export ETCD_UNSUPPORTED_ARCH=mips64le
再次编译
# ./build
执行通过,在etcd文件夹里会生成bin文件夹,进入bin文件夹
# cd bin 
 
把bin文件夹下的etcd、etcdctl两个文件拷贝到/usr/bin文件夹下
# cp etcd  /usr/bin/ 
# cp etcdctl /usr/bin/


 进入/usr/bin下
# cd /usr/bin

 执行测试

 执行etcd文件
# ./etcd
2017-11-02 19:57:52.098590 W | etcdmain: running etcd on unsupported architecture "mips64le" since ETCD_UNSUPPORTED_ARCH is set
2017-11-02 19:57:52.099742 W | flags: unrecognized environment variable ETCD_UNSUPPORTED_ARCH=mips64le
2017-11-02 19:57:52.099870 I | etcdmain: etcd Version: 2.3.6
2017-11-02 19:57:52.099924 I | etcdmain: Git SHA: 128344c
2017-11-02 19:57:52.099974 I | etcdmain: Go Version: go1.7.5
2017-11-02 19:57:52.100021 I | etcdmain: Go OS/Arch: linux/mips64le
2017-11-02 19:57:52.100074 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-11-02 19:57:52.100145 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-11-02 19:57:52.101051 I | etcdmain: listening for peers on http://localhost:2380
2017-11-02 19:57:52.101273 I | etcdmain: listening for peers on http://localhost:7001
2017-11-02 19:57:52.101483 I | etcdmain: listening for client requests on http://localhost:2379
2017-11-02 19:57:52.101683 I | etcdmain: listening for client requests on http://localhost:4001
2017-11-02 19:57:52.105386 I | etcdserver: name = default
2017-11-02 19:57:52.105674 I | etcdserver: data dir = default.etcd
2017-11-02 19:57:52.105741 I | etcdserver: member dir = default.etcd/member
2017-11-02 19:57:52.105794 I | etcdserver: heartbeat = 100ms
2017-11-02 19:57:52.105845 I | etcdserver: election = 1000ms
2017-11-02 19:57:52.105896 I | etcdserver: snapshot count = 10000
2017-11-02 19:57:52.105968 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2017-11-02 19:57:52.106025 I | etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2017-11-02 19:57:52.106204 I | etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2017-11-02 19:57:52.115937 I | etcdserver: starting member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2017-11-02 19:57:52.116104 I | raft: ce2a822cea30bfca became follower at term 0
2017-11-02 19:57:52.116172 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-11-02 19:57:52.116223 I | raft: ce2a822cea30bfca became follower at term 1
2017-11-02 19:57:52.116829 I | etcdserver: starting server... [version: 2.3.6, cluster version: to_be_decided]
2017-11-02 19:57:52.118591 E | etcdmain: failed to notify systemd for readiness: No socket
2017-11-02 19:57:52.118642 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-11-02 19:57:52.119456 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.516914 I | raft: ce2a822cea30bfca is starting a new election at term 1
2017-11-02 19:57:52.517204 I | raft: ce2a822cea30bfca became candidate at term 2
2017-11-02 19:57:52.517241 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2017-11-02 19:57:52.517327 I | raft: ce2a822cea30bfca became leader at term 2
2017-11-02 19:57:52.517369 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2017-11-02 19:57:52.518315 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.518664 I | etcdserver: setting up the initial cluster version to 2.3
2017-11-02 19:57:52.525866 N | etcdserver: set the initial cluster version to 2.3

 再另一个终端中测试
# etcdctl set /foo/bar  “hello world”
输出“hello world”说明启动成功。
 
这样,etcd就搭建成功了,整个过程还是很简单的,改动的代码不算多,运行也比较顺利。
 
后面将继续移植Kubernetes,好期待啊!

制作好的Docker镜像,如何修改CMD信息?

回复

loongnix 回复了问题 • 1 人关注 • 1 个回复 • 1090 次浏览 • 2017-10-13 10:28 • 来自相关话题

龙芯小本 服务器快4年了,欢迎来做客

zzz19760225 回复了问题 • 3 人关注 • 3 个回复 • 585 次浏览 • 2017-10-11 10:12 • 来自相关话题

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

huangxg 发表了文章 • 0 个评论 • 541 次浏览 • 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 上,便于其他宿主机下载使用。

Dockerfile引用基础镜像时,基础镜像的CMD是否还会自动执行?

回复

loongnix 回复了问题 • 1 人关注 • 1 个回复 • 508 次浏览 • 2017-09-30 10:30 • 来自相关话题

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

huangxg 发表了文章 • 0 个评论 • 508 次浏览 • 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 个评论 • 789 次浏览 • 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系列之三)龙芯Fedora21平台制作feodra21-tools docker镜像

huangxg 发表了文章 • 0 个评论 • 586 次浏览 • 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 个评论 • 804 次浏览 • 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操作。
 
条新动态, 点击查看
loongnix

loongnix 回答了问题 • 2017-03-03 10:41 • 2 个回复 不感兴趣

fedora21怎样搭建网盘服务?

赞同来自:

《ownCloud-在龙芯上搭建你的私有网盘》

http://www.loongson.cn/news/company/516.html
《ownCloud-在龙芯上搭建你的私有网盘》

http://www.loongson.cn/news/company/516.html
Holoo

Holoo 回答了问题 • 2017-07-31 16:36 • 1 个回复 不感兴趣

龙芯服务器跑docker

赞同来自:

http://www.loongson.cn/news/company/495.html   
http://www.loongson.cn/news/company/495.html   

(精品)(龙芯公有云系列之一)搭建分布式存储服务etcd

renyafei 发表了文章 • 0 个评论 • 654 次浏览 • 2017-11-03 11:21 • 来自相关话题

etcd 是一个应用在分布式环境下的 key/value 存储服务。     由于Kubernetes要使用到etcd,所以第一步就 ...查看全部
etcd 是一个应用在分布式环境下的 key/value 存储服务。
 

timg.jpg

 

由于Kubernetes要使用到etcd,所以第一步就是进行etcd的搭建。
 
etcd是一个Go语言编写的软件。

 搭建环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170512版本。
GO版本:go1.7.5 linux/mips64le
 
开始搭建
 
首先打开终端,配置GOPATH
# export GOPATH=/usr/lib/golang
进入GOPATH目录下
# cd $GOPATH
在$GOPATH的src目录下创建嵌套文件夹github.com/coreos
# mkdir -p $GOPATH/src/github.com/coreos
进入创建的文件夹下
# cd $GOPATH/src/github.com/coreos
下载etcd 2.3.6版本
# git clone  -b  v2.3.6 https://github.com/coreos/etcd.git


进入下载的etcd 文件夹下
# cd etcd
开始编译
# ./build
出现如下错误
github.com/coreos/etcd/Godeps/_workspace/src/github.com/boltdb/bolt
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: undefined: maxMapSize
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: invalid array bound maxMapSize
根据maxMapSize关键字找原因,使用grep "maxMapSize"  ./* -r 找出路径
# grep "maxMapSize" ./* -r
搜索出如下内容
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go:	data     *[maxMapSize]byte
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if size > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if sz > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: sz = maxMapSize
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_windows.go: db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr)))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix_solaris.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))

 根据错误提示分析,是因为在 ./Godeps/_workspace/src/github.com/boltdb/bolt 文件夹下,
缺少了支持mips64le平台的文件。
进入这个目录下添加bolt_mips64le.go文件:
# cd ./Godeps/_workspace/src/github.com/boltdb/bolt
# cp bolt_arm.go bolt_mips64le.go
重新进入etcd文件夹下,开始编译
# cd $GOPATH/src/github.com/coreos/etcd
# ./build
出现如下错误
2017-11-02 11:58:50.257747 E | etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=mips64le set.
这是因为没有配置ETCD_UNSUPPORTED_ARCH环境变量
配置环境变量
# export ETCD_UNSUPPORTED_ARCH=mips64le
再次编译
# ./build
执行通过,在etcd文件夹里会生成bin文件夹,进入bin文件夹
# cd bin 
 
把bin文件夹下的etcd、etcdctl两个文件拷贝到/usr/bin文件夹下
# cp etcd  /usr/bin/ 
# cp etcdctl /usr/bin/


 进入/usr/bin下
# cd /usr/bin

 执行测试

 执行etcd文件
# ./etcd
2017-11-02 19:57:52.098590 W | etcdmain: running etcd on unsupported architecture "mips64le" since ETCD_UNSUPPORTED_ARCH is set
2017-11-02 19:57:52.099742 W | flags: unrecognized environment variable ETCD_UNSUPPORTED_ARCH=mips64le
2017-11-02 19:57:52.099870 I | etcdmain: etcd Version: 2.3.6
2017-11-02 19:57:52.099924 I | etcdmain: Git SHA: 128344c
2017-11-02 19:57:52.099974 I | etcdmain: Go Version: go1.7.5
2017-11-02 19:57:52.100021 I | etcdmain: Go OS/Arch: linux/mips64le
2017-11-02 19:57:52.100074 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-11-02 19:57:52.100145 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-11-02 19:57:52.101051 I | etcdmain: listening for peers on http://localhost:2380
2017-11-02 19:57:52.101273 I | etcdmain: listening for peers on http://localhost:7001
2017-11-02 19:57:52.101483 I | etcdmain: listening for client requests on http://localhost:2379
2017-11-02 19:57:52.101683 I | etcdmain: listening for client requests on http://localhost:4001
2017-11-02 19:57:52.105386 I | etcdserver: name = default
2017-11-02 19:57:52.105674 I | etcdserver: data dir = default.etcd
2017-11-02 19:57:52.105741 I | etcdserver: member dir = default.etcd/member
2017-11-02 19:57:52.105794 I | etcdserver: heartbeat = 100ms
2017-11-02 19:57:52.105845 I | etcdserver: election = 1000ms
2017-11-02 19:57:52.105896 I | etcdserver: snapshot count = 10000
2017-11-02 19:57:52.105968 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2017-11-02 19:57:52.106025 I | etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2017-11-02 19:57:52.106204 I | etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2017-11-02 19:57:52.115937 I | etcdserver: starting member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2017-11-02 19:57:52.116104 I | raft: ce2a822cea30bfca became follower at term 0
2017-11-02 19:57:52.116172 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-11-02 19:57:52.116223 I | raft: ce2a822cea30bfca became follower at term 1
2017-11-02 19:57:52.116829 I | etcdserver: starting server... [version: 2.3.6, cluster version: to_be_decided]
2017-11-02 19:57:52.118591 E | etcdmain: failed to notify systemd for readiness: No socket
2017-11-02 19:57:52.118642 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-11-02 19:57:52.119456 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.516914 I | raft: ce2a822cea30bfca is starting a new election at term 1
2017-11-02 19:57:52.517204 I | raft: ce2a822cea30bfca became candidate at term 2
2017-11-02 19:57:52.517241 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2017-11-02 19:57:52.517327 I | raft: ce2a822cea30bfca became leader at term 2
2017-11-02 19:57:52.517369 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2017-11-02 19:57:52.518315 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.518664 I | etcdserver: setting up the initial cluster version to 2.3
2017-11-02 19:57:52.525866 N | etcdserver: set the initial cluster version to 2.3

 再另一个终端中测试
# etcdctl set /foo/bar  “hello world”
输出“hello world”说明启动成功。
 
这样,etcd就搭建成功了,整个过程还是很简单的,改动的代码不算多,运行也比较顺利。
 
后面将继续移植Kubernetes,好期待啊!

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

huangxg 发表了文章 • 0 个评论 • 541 次浏览 • 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 个评论 • 508 次浏览 • 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 个评论 • 789 次浏览 • 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系列之三)龙芯Fedora21平台制作feodra21-tools docker镜像

huangxg 发表了文章 • 0 个评论 • 586 次浏览 • 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 个评论 • 804 次浏览 • 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操作。
 

(精品)(Docker系列之一)龙芯Fedora21平台上解决docker 1.12.2退出问题

loongnix 发表了文章 • 0 个评论 • 886 次浏览 • 2017-09-22 15:59 • 来自相关话题

   操作系统版本 loongnix(Fedora21) 20170726及以前版本,安装docker 1.12.2后,创建容器正常,但是docker stop容器会阻塞住,容器无法正常退出。 解 ...查看全部

docker.jpg

 
 操作系统版本

loongnix(Fedora21) 20170726及以前版本,安装docker 1.12.2后,创建容器正常,但是docker stop容器会阻塞住,容器无法正常退出。

解决方法

此问题是Docker官方版本缺少对MIPS平台的epoll支持。

现在龙芯已经修正这个问题,loongnix.org上已经提交了功能正常的docker包。

执行以下命令即可自动安装新版本的包。
# yum update docker
# service docker restart




 注意:测试的时候发现,只做service docker restart,并不能把所有docker进程都重新启动,需要手工kill所有的docker进程,才能保证新安装的文件得到运行。
具体步骤如下:
# ps aux | grep docker
loongson  7477  0.0  0.0 107488  1728 pts/5    S+   16:44   0:00 grep --color=auto docker
root     17693  0.0  0.2 492960  8560 ?        Ssl  9月21   0:54 /usr/libexec/docker/docker-containerd-current --listen unix:///run/containerd.sock --shim /usr/libexec/docker/docker-containerd-shim-current
root     17719  0.3  0.8 826192 35920 ?        Ssl  9月21   5:16 /usr/bin/dockerd-current --add-runtime oci=/usr/libexec/docker/docker-runc-current --default-runtime=oci --containerd /run/containerd.sock --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald
root     17902  0.0  0.0 196512  2544 ?        Sl   9月21   0:00 /usr/libexec/docker/docker-containerd-shim-current fac1ee0c5de07257e5d65215abae4728bd08ec245026693d2b0444fe3f9d0745 /var/run/docker/libcontainerd/fac1ee0c5de07257e5d65215abae4728bd08ec245026693d2b0444fe3f9d0745 /usr/libexec/docker/docker-runc-current
root     17986  0.0  0.2 351472 11776 pts/2    Sl+  9月21   0:00 /usr/bin/docker-current attach fac1



ps 命令输出的每一行是一个docker进程,第2列是进程号,对所有这些进程号执行kill命令,例如:
# kill -9 17693 17719  17902 17986
 
执行kill命令后,务必再次执行ps命令,保证所有docker进程都已经被kill掉。
最后,再重新启动docker服务:
# service docker restart
这样才能确保运行的docker是新版本。
 
如果觉得上面的步骤实在太费事,有一个简单的方法,重新启动整个机器。

附:源码包链接

http://ftp.loongnix.org/os/loongnix/1.0/SRPMS/d/docker-1.12.2-5.git8f1975c.2.fc21.loongson.src.rpm

原始patch
From 57de5faf811e68fea1828faba6cc5ac2bb60474d Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2017 20:46:26 +0800
Subject: [PATCH] docker 1.12.2 fix stop failed on mips64le

---
.../archutils/epoll.go | 2 +-
.../archutils/epoll_mips64le.go | 73 ++++++++++++++++++++++
2 files changed, 74 insertions(+), 1 deletion(-)
create mode 100644 containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go

diff --git a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
index 3f08d8f..bca5015 100644
--- a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
+++ b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
@@ -1,4 +1,4 @@
-// +build linux,!arm64
+// +build linux,!arm64,!mips64le

package archutils

diff --git a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
new file mode 100644
index 0000000..524f0cc
--- /dev/null
+++ b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
@@ -0,0 +1,73 @@
+// +build linux,mips64le
+
+package archutils
+
+// #include <sys/epoll.h>
+/*
+int EpollCreate1(int flag) {
+ return epoll_create1(flag);
+}
+
+int EpollCtl(int efd, int op,int sfd, int events, int fd) {
+ struct epoll_event event;
+ event.events = events;
+ event.data.fd = fd;
+
+ return epoll_ctl(efd, op, sfd, &event);
+}
+
+struct event_t {
+ uint32_t events;
+ int fd;
+};
+
+struct epoll_event events[128];
+int run_epoll_wait(int fd, struct event_t *event) {
+ int n, i;
+ n = epoll_wait(fd, events, 128, -1);
+ for (i = 0; i < n; i++) {
+ event[i].events = events[/i].events;
+ event.fd = events.data.fd;
+ }
+ return n;
+}
+*/
+import "C"
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+// EpollCreate1 calls a C implementation
+func EpollCreate1(flag int) (int, error) {
+ fd := int(C.EpollCreate1(C.int(flag)))
+ if fd < 0 {
+ return fd, fmt.Errorf("failed to create epoll, errno is %d", fd)
+ }
+ return fd, nil
+}
+
+// EpollCtl calls a C implementation
+func EpollCtl(epfd int, op int, fd int, event *syscall.EpollEvent) error {
+ errno := C.EpollCtl(C.int(epfd), C.int(syscall.EPOLL_CTL_ADD), C.int(fd), C.int(event.Events), C.int(event.Fd))
+ if errno < 0 {
+ return fmt.Errorf("Failed to ctl epoll")
+ }
+ return nil
+}
+
+// EpollWait calls a C implementation
+func EpollWait(epfd int, events syscall.EpollEvent, msec int) (int, error) {
+ var c_events [128]C.struct_event_t
+ n := int(C.run_epoll_wait(C.int(epfd), (*C.struct_event_t)(unsafe.Pointer(&c_events))))
+ if n < 0 {
+ return int(n), fmt.Errorf("Failed to wait epoll")
+ }
+ for i := 0; i < n; i++ {
+ events.Fd = int32(c_events.fd)
+ events.Events = uint32(c_events[i].events)
+ }
+ return int(n), nil
+}
--
2.1.0[/i]


龙芯3A2000移植RethinkDB指南

RayWang 发表了文章 • 0 个评论 • 454 次浏览 • 2017-03-14 11:23 • 来自相关话题

一、RethinkDB简介 用于构建实时Web应用程序的开源数据库NoSQL数据库,存储无模式JSON文档易于扩展的分布式数据库具有自动故障转移和稳健容错的高可用性数据库         其核心是一个高度并行的B树实现。 ...查看全部
一、RethinkDB简介
  • 用于构建实时Web应用程序的开源数据库
  • NoSQL数据库,存储无模式JSON文档
  • 易于扩展的分布式数据库
  • 具有自动故障转移和稳健容错的高可用性数据库

        其核心是一个高度并行的B树实现。

二、移植环境
        软件环境:
       (1)loongnix1.0系统。下载地址:www.loongnix.org
       (2)内核版本:3.10.84
        硬件环境:
       (1)开发板类型:Loongson-3A2000-780E-4w-V0.1-demo
       (2)固件版本:loongson-PMON-V3.3.0

三、移植过程
        安装依赖软件:
sudo yum install gcc-c++ protobuf-devel ncurses-devel jemalloc-devel \
boost-static wget protobuf-compiler which zlib-devel \
openssl-devel libcurl-devel make m4

wget http://ftp.loongnix.org/others/server/RethinkDB/jemalloc-4.2.1-1.fc21.loongson.mips64el.rpm
wget http://ftp.loongnix.org/others/server/RethinkDB/jemalloc-devel-4.2.1-1.fc21.loongson.mips64el.rpm

sudo rpm -Uvh jemalloc-4.2.1-1.fc21.loongson.mips64el.rpm jemalloc-devel-4.2.1-1.fc21.loongson.mips64el.rpm

        下载源码及patch文件:
        本例中使用的rethinkdb的版本为官方2.3.5版本
wget https://download.rethinkdb.com/dist/rethinkdb-2.3.5.tgz

tar xf rethink-2.3.5.tgz

wget http://ftp.loongnix.org/others/server/RethinkDB/sources/0001-rethinkdb-2.3.5-add-mips64el-support.patch

cd rethinkdb-2.3.5

patch –p1 < ../ 0001-rethinkdb-2.3.5-add-mips64el-support.patch

        编译安装RethinkDB:
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --dynamic jemalloc
make THREADED_COROUTINES=1 -j4
sudo make THREADED_COROUTINES=1 install

        配置RethinkDB(root用户):
groupadd –r rethinkdb
useradd --system --no-create-home --gid %{name} --shell /sbin/nologin --comment "RethinkDB Daemon" rethinkdb

cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/default.conf(可根据需求进行修改)

        启动服务:
/etc/init.d/rethinkdb start
启动过程可能出现Permission错误,解决方法见FAQ。
        运行后可在浏览器中访问数据库:
        http://localhost:8080

屏幕快照_2017-03-14_上午11.49_.12_.png


四、二进制rpm包的使用
        如果觉得重新编译麻烦,可直接使用编译好的二进制rpm包:
sudo wget http://ftp.loongnix.org/others/server/RethinkDB/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo
sudo yum install rethinkdb
sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/default.conf
sudo /etc/init.d/rethinkdb start

注:如启动过程出现Permission错误,见FAQ。
FAQ:
(1)启动提示permission错误
需要修正目录权限
chown rethinkdb:rethinkdb /var/lib/rethinkdb –R
chown rethinkdb:rethinkdb /run/rethinkdb –R
然后重新执行启动命令。
/etc/init.d/rethinkdb start

cloud.loongnix.org 啥情况了还能申请吗?

回复

天高地厚 回复了问题 • 4 人关注 • 5 个回复 • 572 次浏览 • 2018-04-28 19:09 • 来自相关话题

制作好的Docker镜像,如何修改CMD信息?

回复

loongnix 回复了问题 • 1 人关注 • 1 个回复 • 1090 次浏览 • 2017-10-13 10:28 • 来自相关话题

龙芯小本 服务器快4年了,欢迎来做客

回复

zzz19760225 回复了问题 • 3 人关注 • 3 个回复 • 585 次浏览 • 2017-10-11 10:12 • 来自相关话题

Dockerfile引用基础镜像时,基础镜像的CMD是否还会自动执行?

回复

loongnix 回复了问题 • 1 人关注 • 1 个回复 • 508 次浏览 • 2017-09-30 10:30 • 来自相关话题

3a3000开发板能放进1U机箱么?

回复

drkwils 回复了问题 • 5 人关注 • 4 个回复 • 461 次浏览 • 2017-09-08 16:33 • 来自相关话题

龙芯服务器跑docker

回复

Holoo 回复了问题 • 2 人关注 • 1 个回复 • 441 次浏览 • 2017-07-31 16:36 • 来自相关话题

fedora21怎样搭建网盘服务?

回复

loongnix 回复了问题 • 2 人关注 • 2 个回复 • 409 次浏览 • 2017-03-03 10:41 • 来自相关话题

(精品)(龙芯公有云系列之一)搭建分布式存储服务etcd

renyafei 发表了文章 • 0 个评论 • 654 次浏览 • 2017-11-03 11:21 • 来自相关话题

etcd 是一个应用在分布式环境下的 key/value 存储服务。     由于Kubernetes要使用到etcd,所以第一步就 ...查看全部
etcd 是一个应用在分布式环境下的 key/value 存储服务。
 

timg.jpg

 

由于Kubernetes要使用到etcd,所以第一步就是进行etcd的搭建。
 
etcd是一个Go语言编写的软件。

 搭建环境
 
本文的实验都是在龙芯3A3000机器上。
操作系统是loongnix(Fedora21)20170512版本。
GO版本:go1.7.5 linux/mips64le
 
开始搭建
 
首先打开终端,配置GOPATH
# export GOPATH=/usr/lib/golang
进入GOPATH目录下
# cd $GOPATH
在$GOPATH的src目录下创建嵌套文件夹github.com/coreos
# mkdir -p $GOPATH/src/github.com/coreos
进入创建的文件夹下
# cd $GOPATH/src/github.com/coreos
下载etcd 2.3.6版本
# git clone  -b  v2.3.6 https://github.com/coreos/etcd.git


进入下载的etcd 文件夹下
# cd etcd
开始编译
# ./build
出现如下错误
github.com/coreos/etcd/Godeps/_workspace/src/github.com/boltdb/bolt
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: undefined: maxMapSize
Godeps/_workspace/src/github.com/boltdb/bolt/db.go:98: invalid array bound maxMapSize
根据maxMapSize关键字找原因,使用grep "maxMapSize"  ./* -r 找出路径
# grep "maxMapSize" ./* -r
搜索出如下内容
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go:	data     *[maxMapSize]byte
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if size > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: if sz > maxMapSize {
./Godeps/_workspace/src/github.com/boltdb/bolt/db.go: sz = maxMapSize
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_windows.go: db.data = ((*[maxMapSize]byte)(unsafe.Pointer(addr)))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_386.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_amd64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_ppc64le.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix_solaris.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm64.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_s390x.go:const maxMapSize = 0xFFFFFFFFFFFF // 256TB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:// maxMapSize represents the largest mmap size supported by Bolt.
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_arm.go:const maxMapSize = 0x7FFFFFFF // 2GB
./Godeps/_workspace/src/github.com/boltdb/bolt/bolt_unix.go: db.data = (*[maxMapSize]byte)(unsafe.Pointer(&b[0]))

 根据错误提示分析,是因为在 ./Godeps/_workspace/src/github.com/boltdb/bolt 文件夹下,
缺少了支持mips64le平台的文件。
进入这个目录下添加bolt_mips64le.go文件:
# cd ./Godeps/_workspace/src/github.com/boltdb/bolt
# cp bolt_arm.go bolt_mips64le.go
重新进入etcd文件夹下,开始编译
# cd $GOPATH/src/github.com/coreos/etcd
# ./build
出现如下错误
2017-11-02 11:58:50.257747 E | etcdmain: etcd on unsupported platform without ETCD_UNSUPPORTED_ARCH=mips64le set.
这是因为没有配置ETCD_UNSUPPORTED_ARCH环境变量
配置环境变量
# export ETCD_UNSUPPORTED_ARCH=mips64le
再次编译
# ./build
执行通过,在etcd文件夹里会生成bin文件夹,进入bin文件夹
# cd bin 
 
把bin文件夹下的etcd、etcdctl两个文件拷贝到/usr/bin文件夹下
# cp etcd  /usr/bin/ 
# cp etcdctl /usr/bin/


 进入/usr/bin下
# cd /usr/bin

 执行测试

 执行etcd文件
# ./etcd
2017-11-02 19:57:52.098590 W | etcdmain: running etcd on unsupported architecture "mips64le" since ETCD_UNSUPPORTED_ARCH is set
2017-11-02 19:57:52.099742 W | flags: unrecognized environment variable ETCD_UNSUPPORTED_ARCH=mips64le
2017-11-02 19:57:52.099870 I | etcdmain: etcd Version: 2.3.6
2017-11-02 19:57:52.099924 I | etcdmain: Git SHA: 128344c
2017-11-02 19:57:52.099974 I | etcdmain: Go Version: go1.7.5
2017-11-02 19:57:52.100021 I | etcdmain: Go OS/Arch: linux/mips64le
2017-11-02 19:57:52.100074 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2017-11-02 19:57:52.100145 W | etcdmain: no data-dir provided, using default data-dir ./default.etcd
2017-11-02 19:57:52.101051 I | etcdmain: listening for peers on http://localhost:2380
2017-11-02 19:57:52.101273 I | etcdmain: listening for peers on http://localhost:7001
2017-11-02 19:57:52.101483 I | etcdmain: listening for client requests on http://localhost:2379
2017-11-02 19:57:52.101683 I | etcdmain: listening for client requests on http://localhost:4001
2017-11-02 19:57:52.105386 I | etcdserver: name = default
2017-11-02 19:57:52.105674 I | etcdserver: data dir = default.etcd
2017-11-02 19:57:52.105741 I | etcdserver: member dir = default.etcd/member
2017-11-02 19:57:52.105794 I | etcdserver: heartbeat = 100ms
2017-11-02 19:57:52.105845 I | etcdserver: election = 1000ms
2017-11-02 19:57:52.105896 I | etcdserver: snapshot count = 10000
2017-11-02 19:57:52.105968 I | etcdserver: advertise client URLs = http://localhost:2379,http://localhost:4001
2017-11-02 19:57:52.106025 I | etcdserver: initial advertise peer URLs = http://localhost:2380,http://localhost:7001
2017-11-02 19:57:52.106204 I | etcdserver: initial cluster = default=http://localhost:2380,default=http://localhost:7001
2017-11-02 19:57:52.115937 I | etcdserver: starting member ce2a822cea30bfca in cluster 7e27652122e8b2ae
2017-11-02 19:57:52.116104 I | raft: ce2a822cea30bfca became follower at term 0
2017-11-02 19:57:52.116172 I | raft: newRaft ce2a822cea30bfca [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
2017-11-02 19:57:52.116223 I | raft: ce2a822cea30bfca became follower at term 1
2017-11-02 19:57:52.116829 I | etcdserver: starting server... [version: 2.3.6, cluster version: to_be_decided]
2017-11-02 19:57:52.118591 E | etcdmain: failed to notify systemd for readiness: No socket
2017-11-02 19:57:52.118642 E | etcdmain: forgot to set Type=notify in systemd service file?
2017-11-02 19:57:52.119456 N | etcdserver: added local member ce2a822cea30bfca [http://localhost:2380 http://localhost:7001] to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.516914 I | raft: ce2a822cea30bfca is starting a new election at term 1
2017-11-02 19:57:52.517204 I | raft: ce2a822cea30bfca became candidate at term 2
2017-11-02 19:57:52.517241 I | raft: ce2a822cea30bfca received vote from ce2a822cea30bfca at term 2
2017-11-02 19:57:52.517327 I | raft: ce2a822cea30bfca became leader at term 2
2017-11-02 19:57:52.517369 I | raft: raft.node: ce2a822cea30bfca elected leader ce2a822cea30bfca at term 2
2017-11-02 19:57:52.518315 I | etcdserver: published {Name:default ClientURLs:[http://localhost:2379 http://localhost:4001]} to cluster 7e27652122e8b2ae
2017-11-02 19:57:52.518664 I | etcdserver: setting up the initial cluster version to 2.3
2017-11-02 19:57:52.525866 N | etcdserver: set the initial cluster version to 2.3

 再另一个终端中测试
# etcdctl set /foo/bar  “hello world”
输出“hello world”说明启动成功。
 
这样,etcd就搭建成功了,整个过程还是很简单的,改动的代码不算多,运行也比较顺利。
 
后面将继续移植Kubernetes,好期待啊!

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

huangxg 发表了文章 • 0 个评论 • 541 次浏览 • 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 个评论 • 508 次浏览 • 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 个评论 • 789 次浏览 • 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系列之三)龙芯Fedora21平台制作feodra21-tools docker镜像

huangxg 发表了文章 • 0 个评论 • 586 次浏览 • 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 个评论 • 804 次浏览 • 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操作。
 

(精品)(Docker系列之一)龙芯Fedora21平台上解决docker 1.12.2退出问题

loongnix 发表了文章 • 0 个评论 • 886 次浏览 • 2017-09-22 15:59 • 来自相关话题

   操作系统版本 loongnix(Fedora21) 20170726及以前版本,安装docker 1.12.2后,创建容器正常,但是docker stop容器会阻塞住,容器无法正常退出。 解 ...查看全部

docker.jpg

 
 操作系统版本

loongnix(Fedora21) 20170726及以前版本,安装docker 1.12.2后,创建容器正常,但是docker stop容器会阻塞住,容器无法正常退出。

解决方法

此问题是Docker官方版本缺少对MIPS平台的epoll支持。

现在龙芯已经修正这个问题,loongnix.org上已经提交了功能正常的docker包。

执行以下命令即可自动安装新版本的包。
# yum update docker
# service docker restart




 注意:测试的时候发现,只做service docker restart,并不能把所有docker进程都重新启动,需要手工kill所有的docker进程,才能保证新安装的文件得到运行。
具体步骤如下:
# ps aux | grep docker
loongson  7477  0.0  0.0 107488  1728 pts/5    S+   16:44   0:00 grep --color=auto docker
root     17693  0.0  0.2 492960  8560 ?        Ssl  9月21   0:54 /usr/libexec/docker/docker-containerd-current --listen unix:///run/containerd.sock --shim /usr/libexec/docker/docker-containerd-shim-current
root     17719  0.3  0.8 826192 35920 ?        Ssl  9月21   5:16 /usr/bin/dockerd-current --add-runtime oci=/usr/libexec/docker/docker-runc-current --default-runtime=oci --containerd /run/containerd.sock --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --selinux-enabled --log-driver=journald
root     17902  0.0  0.0 196512  2544 ?        Sl   9月21   0:00 /usr/libexec/docker/docker-containerd-shim-current fac1ee0c5de07257e5d65215abae4728bd08ec245026693d2b0444fe3f9d0745 /var/run/docker/libcontainerd/fac1ee0c5de07257e5d65215abae4728bd08ec245026693d2b0444fe3f9d0745 /usr/libexec/docker/docker-runc-current
root     17986  0.0  0.2 351472 11776 pts/2    Sl+  9月21   0:00 /usr/bin/docker-current attach fac1



ps 命令输出的每一行是一个docker进程,第2列是进程号,对所有这些进程号执行kill命令,例如:
# kill -9 17693 17719  17902 17986
 
执行kill命令后,务必再次执行ps命令,保证所有docker进程都已经被kill掉。
最后,再重新启动docker服务:
# service docker restart
这样才能确保运行的docker是新版本。
 
如果觉得上面的步骤实在太费事,有一个简单的方法,重新启动整个机器。

附:源码包链接

http://ftp.loongnix.org/os/loongnix/1.0/SRPMS/d/docker-1.12.2-5.git8f1975c.2.fc21.loongson.src.rpm

原始patch
From 57de5faf811e68fea1828faba6cc5ac2bb60474d Mon Sep 17 00:00:00 2001
Date: Thu, 21 Sep 2017 20:46:26 +0800
Subject: [PATCH] docker 1.12.2 fix stop failed on mips64le

---
.../archutils/epoll.go | 2 +-
.../archutils/epoll_mips64le.go | 73 ++++++++++++++++++++++
2 files changed, 74 insertions(+), 1 deletion(-)
create mode 100644 containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go

diff --git a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
index 3f08d8f..bca5015 100644
--- a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
+++ b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll.go
@@ -1,4 +1,4 @@
-// +build linux,!arm64
+// +build linux,!arm64,!mips64le

package archutils

diff --git a/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
new file mode 100644
index 0000000..524f0cc
--- /dev/null
+++ b/containerd-0366d7e9693c930cf18c0f50cc16acec064e96c5/archutils/epoll_mips64le.go
@@ -0,0 +1,73 @@
+// +build linux,mips64le
+
+package archutils
+
+// #include <sys/epoll.h>
+/*
+int EpollCreate1(int flag) {
+ return epoll_create1(flag);
+}
+
+int EpollCtl(int efd, int op,int sfd, int events, int fd) {
+ struct epoll_event event;
+ event.events = events;
+ event.data.fd = fd;
+
+ return epoll_ctl(efd, op, sfd, &event);
+}
+
+struct event_t {
+ uint32_t events;
+ int fd;
+};
+
+struct epoll_event events[128];
+int run_epoll_wait(int fd, struct event_t *event) {
+ int n, i;
+ n = epoll_wait(fd, events, 128, -1);
+ for (i = 0; i < n; i++) {
+ event[i].events = events[/i].events;
+ event.fd = events.data.fd;
+ }
+ return n;
+}
+*/
+import "C"
+
+import (
+ "fmt"
+ "syscall"
+ "unsafe"
+)
+
+// EpollCreate1 calls a C implementation
+func EpollCreate1(flag int) (int, error) {
+ fd := int(C.EpollCreate1(C.int(flag)))
+ if fd < 0 {
+ return fd, fmt.Errorf("failed to create epoll, errno is %d", fd)
+ }
+ return fd, nil
+}
+
+// EpollCtl calls a C implementation
+func EpollCtl(epfd int, op int, fd int, event *syscall.EpollEvent) error {
+ errno := C.EpollCtl(C.int(epfd), C.int(syscall.EPOLL_CTL_ADD), C.int(fd), C.int(event.Events), C.int(event.Fd))
+ if errno < 0 {
+ return fmt.Errorf("Failed to ctl epoll")
+ }
+ return nil
+}
+
+// EpollWait calls a C implementation
+func EpollWait(epfd int, events syscall.EpollEvent, msec int) (int, error) {
+ var c_events [128]C.struct_event_t
+ n := int(C.run_epoll_wait(C.int(epfd), (*C.struct_event_t)(unsafe.Pointer(&c_events))))
+ if n < 0 {
+ return int(n), fmt.Errorf("Failed to wait epoll")
+ }
+ for i := 0; i < n; i++ {
+ events.Fd = int32(c_events.fd)
+ events.Events = uint32(c_events[i].events)
+ }
+ return int(n), nil
+}
--
2.1.0[/i]


龙芯移植docker指南

RayWang 发表了文章 • 2 个评论 • 1096 次浏览 • 2017-04-06 17:32 • 来自相关话题

一、docker简介     Docker是PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github 上, 基于go语言并遵从Apache2.0协议开源。     Docker采用 C/S架构 Dock ...查看全部
一、docker简介
    Docker是PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github 上, 基于go语言并遵从Apache2.0协议开源。
    Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以>运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
    Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令>实现跟 Docker daemon 交互。

    LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
    隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
    网络管理相对简单,主要是基于namespace隔离

二、移植环境
软件环境:
(1)fedora25系统。下载地址:http://ftp.loongnix.org/os/fedora25/liveinst
(2)内核版本:4.4.30
硬件环境:
(1)开发板类型:Loongson-3A2000-780E-4w-V0.1-demo
(2)固件版本:loongson-PMON-V3.3.0

三、移植过程
    本次移植源码使用的为fedora社区的source rpm包,未采用github上的源码,版本为:docker-1.12.2-5
    以下方法均为制作rpm包的编译方法。

源码下载地址:https://kojipkgs.fedoraproject.org//packages/docker/1.12.2/5.git8f1975c.fc25/src/docker-1.12.2-5.git8f1975c.fc25.src.rpm

补丁下载地址:http://ftp.loongnix.org/os/fedora25/loongson/patches/0001-docker-1.12.2-5.git8f1975c-add-mips64le-support.patch
 安装源码包:
rpm -i docker-1.12.2-5.git8f1975c.fc25.src.rpm
安装依赖软件包:
dnf builddep ~/rpmbuild/SPECS/docker.spec
添加补丁文件到spec文件:~/rpmbuild/SPECS/docker.spec
编译生成docker软件包:
rpmbuild -bb ~/rpmbuild/SPECS/docker.spec
最终编译完成,生成rpm格式软件包。

四、使用注意事项
    由于docker对于内核的特性依赖问题,需要内核移植时开启相应的配置。可使用附脚本检测内核是否支持docker的运行。
使用方法:脚本后加上内核配置文件。
脚本下载地址:http://ftp.loongnix.org/os/fedora25/loongson/patches/docker-kernel.sh

    由于redhat系的系统内核中未集成UnionFS相关驱动,所以后端存储引擎是基于已有的Device Mapper技术。对于fedora/rhel这类没有相关驱动的系统,一般使用devicemapper驱动利用LVM的一些机制来模拟分层存储。这样的做法除了性能比较差之外,稳定性一般也不好,而且配置相>对复杂。不过这个问题在fedora26系统中得到了解决,在即将发布的fedora26中,将可以使用UnionFS。

五、二进制的直接使用
可以直接使用编译好的二进制包来安装
dnf install docker

注:本次移植完全使用golang编译器来编译,未使用gcc-go。

龙芯3A2000移植RethinkDB指南

RayWang 发表了文章 • 0 个评论 • 454 次浏览 • 2017-03-14 11:23 • 来自相关话题

一、RethinkDB简介 用于构建实时Web应用程序的开源数据库NoSQL数据库,存储无模式JSON文档易于扩展的分布式数据库具有自动故障转移和稳健容错的高可用性数据库         其核心是一个高度并行的B树实现。 ...查看全部
一、RethinkDB简介
  • 用于构建实时Web应用程序的开源数据库
  • NoSQL数据库,存储无模式JSON文档
  • 易于扩展的分布式数据库
  • 具有自动故障转移和稳健容错的高可用性数据库

        其核心是一个高度并行的B树实现。

二、移植环境
        软件环境:
       (1)loongnix1.0系统。下载地址:www.loongnix.org
       (2)内核版本:3.10.84
        硬件环境:
       (1)开发板类型:Loongson-3A2000-780E-4w-V0.1-demo
       (2)固件版本:loongson-PMON-V3.3.0

三、移植过程
        安装依赖软件:
sudo yum install gcc-c++ protobuf-devel ncurses-devel jemalloc-devel \
boost-static wget protobuf-compiler which zlib-devel \
openssl-devel libcurl-devel make m4

wget http://ftp.loongnix.org/others/server/RethinkDB/jemalloc-4.2.1-1.fc21.loongson.mips64el.rpm
wget http://ftp.loongnix.org/others/server/RethinkDB/jemalloc-devel-4.2.1-1.fc21.loongson.mips64el.rpm

sudo rpm -Uvh jemalloc-4.2.1-1.fc21.loongson.mips64el.rpm jemalloc-devel-4.2.1-1.fc21.loongson.mips64el.rpm

        下载源码及patch文件:
        本例中使用的rethinkdb的版本为官方2.3.5版本
wget https://download.rethinkdb.com/dist/rethinkdb-2.3.5.tgz

tar xf rethink-2.3.5.tgz

wget http://ftp.loongnix.org/others/server/RethinkDB/sources/0001-rethinkdb-2.3.5-add-mips64el-support.patch

cd rethinkdb-2.3.5

patch –p1 < ../ 0001-rethinkdb-2.3.5-add-mips64el-support.patch

        编译安装RethinkDB:
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --dynamic jemalloc
make THREADED_COROUTINES=1 -j4
sudo make THREADED_COROUTINES=1 install

        配置RethinkDB(root用户):
groupadd –r rethinkdb
useradd --system --no-create-home --gid %{name} --shell /sbin/nologin --comment "RethinkDB Daemon" rethinkdb

cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/default.conf(可根据需求进行修改)

        启动服务:
/etc/init.d/rethinkdb start
启动过程可能出现Permission错误,解决方法见FAQ。
        运行后可在浏览器中访问数据库:
        http://localhost:8080

屏幕快照_2017-03-14_上午11.49_.12_.png


四、二进制rpm包的使用
        如果觉得重新编译麻烦,可直接使用编译好的二进制rpm包:
sudo wget http://ftp.loongnix.org/others/server/RethinkDB/rethinkdb.repo -O /etc/yum.repos.d/rethinkdb.repo
sudo yum install rethinkdb
sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/default.conf
sudo /etc/init.d/rethinkdb start

注:如启动过程出现Permission错误,见FAQ。
FAQ:
(1)启动提示permission错误
需要修正目录权限
chown rethinkdb:rethinkdb /var/lib/rethinkdb –R
chown rethinkdb:rethinkdb /run/rethinkdb –R
然后重新执行启动命令。
/etc/init.d/rethinkdb start

龙芯3A2000移植Hadoop指南

代表月亮消咩尼 发表了文章 • 0 个评论 • 294 次浏览 • 2017-01-24 11:12 • 来自相关话题

龙芯3A2000移植Hadoop指南 一、hadoop 简介             hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 ...查看全部
龙芯3A2000移植Hadoop指南
一、hadoop 简介             hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
hadoop实现了一个分布式文件系统(hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
        hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
        hadoop是一个能够对大量数据进行分布式处理的软件框架, 它以一种可靠、高效、可伸缩的方式进行数据处理。维护多个工作数据副本,确保能够针对失败的节点重新分布处理。并行工作方式,提高处理速度,之处处理PB级数据。
        hadoop是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在hadoop上开发和运行处理海量数据的应用程序。它主要有以下几个优点:
                高可靠性: hadoop按位存储和处理数据的能力值得人们信赖。
                高扩展性: hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地扩展到数以千计的节点中。
                高效性: hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
                高容错性:hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
                低成本: 与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
        本文主要涉及以下内容:hadoop源码编译,hadoop在分布式计算云存储系统中的部署和应用,同时也将记录hadoop搭建过程的FAQ和相对解决方案。
        hadoop 集群(cluster) 支持如下3种操作模式:
        1. Local/Standalone Mode
         完成下载后,默认情况下hadoop 被配置为Standalone 模式,作为单个Java进程运行。
        2. Pseudo Distributed Mode
        此种模式下,每个hadoop 守护进程,如hdfs,yarn,MapReduce 等分布式部署在不同的机器上,分别作为独立的Java 进程,这种模式有助于开发。
        3. Fully Distributed Mode
        完全分布式部署,需要至少2台机器,作为一个集群,稍后进行详解。
二、移植环境
首先给出本机的软硬件信息,
软件环境:
(1)loongnix1.0 系统(2016.8.10版本)。下载地址 www.loongnix.org
(2)内核版本:3.10.84-all
(3)JDK版本:1.8.0_25-rc16-b17 or later
(4)MAVEN:3.2.2 or later
硬件环境:
(1)开发板类型: Loongson-3B-780E-2w-V0.2-demo
(2)固件版本: loongson-PMON-V3.3.0
本例中使用的hadoop的版本为2.7.2, hadoop 源码下载地址,参见附录中的”hadoop downloads” 链接。hadoop 编译依赖findbugs和cmake软件包,建议在编译前通过yum 命令进行自动安装,安装方式如下:
[hadoop@localhost log]$ sudo yum -y install java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless \ java-1.8.0-openjdk findbugs cmake  protobuf-compiler
完成安装后,需要设置如下环境变量,建议将以下内容追加到/et       c/profile文件,并用source 命令使其生效。
export FINDBUGS_HOME=/usr/share/findbugs
export MAVEN_HOME=/usr/share/maven
export MAVEN_OPTS="-Xms256m -Xmx512m"
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-5.rc16.fc21.loongson.m
PATH=/usr/lib64/ccache:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/h
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
Build From Scratch:首先解压源码到自定义目录(本例采用/usr/local)利用mvn clean package -Pdist,native,src -DskipTests -Dtar 命令进行编译。
tar xvf hadoop-2.7.2.src.gz -C mkdir /usr/local/
cd  /usr/local/hadoop-2.7.2
mvn clean package -Pdist,native,src -DskipTests -Dtar
三、注意事项
(1)本例中采用/usr/local 作为工作目录需要root权限
(2)编译过程报错,可参见对应FAQ,问题解决后,通过mvn package -Pdist,native,src -DskipTests -Dtar 命令再次启动编译。
(3)FAQ的标识由序号(从001开始)和模块名组成,其中者通过冒号间隔。模块名源自maven Reactor 涉及的modules名称。
四、FAQ
001:Apache hadoop Common
终端报错:
 #
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000ffe18f46fc, pid=5300, tid=1099154321904
#
# JRE version: OpenJDK Runtime Environment (8.0_25-b17) (build 1.8.0_25-rc16-b17)
# Java VM: OpenJDK 64-Bit Server VM (25.25-b02 mixed mode linux- compressed oops)
# Problematic frame:
# J 62748 C2 scala.tools.asm.ClassWriter.get(Lscala/tools/asm/Item;)Lscala/tools/asm/Item; (49 bytes) @ 0x000000ffe18f46fc [0x000000ffe18f46a0+0x5c]
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#
解决方法:
此问题与JDK的并行GC相关,编译hadoop和spark均有遇到,目前的解决方法:调整/etc/profile 文件MAVEN_OPTS 环境变量为如下内容:
export MAVEN_OPTS="-Xms3560m -Xmx3560m -XX:-UseParallelGC -XX:-UseParallelOldGC"002: any-modules 终端现象: maven 编译过程中构件(xxx.jar和xxx.pom) 无法下载。
 解决方法: 打开maven 配置文件的代理设置选项,并重新安装ca-certificates
#为maven 设置代理
<proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |-->
    <proxy>
      <id>proxy01</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>ip_address</host>
      <port>port</port>
      <nonProxyHosts>localhost</nonProxyHosts>
    </proxy>
    <proxy>
      <id>proxy02</id>
      <active>true</active>
      <protocol>https</protocol>
      <host>ip_address</host>
      <port>port</port>
      <nonProxyHosts>localhost</nonProxyHosts>
    </proxy>
  </proxies>
 
#重新安装ca-certificates
Sudo yum -y install ca-certificates
注意事项: 凡出现Maven 编译过程构件无法下载,均可参考本FAQ内容进行适当修改。
五、编译结果
Maven编译通过后,将在终端显示hadoop 的maven Reactor(本次编译的所有maven 模块)和编译时间信息。下面给出的时耗信息,进攻参考不同软硬件平台将会产生差异。
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Apache hadoop Main ................................. SUCCESS [ 10.769 s]
[INFO] Apache hadoop Project POM .......................... SUCCESS [  8.793 s]
[INFO] Apache hadoop Annotations .......................... SUCCESS [ 18.834 s]
[INFO] Apache hadoop Assemblies ........................... SUCCESS [  2.414 s]
[INFO] Apache hadoop Project Dist POM ..................... SUCCESS [  9.653 s]
[INFO] Apache hadoop Maven Plugins ........................ SUCCESS [ 25.215 s]
[INFO] Apache hadoop MiniKDC .............................. SUCCESS [ 20.682 s]
[INFO] Apache hadoop Auth ................................. SUCCESS [ 26.240 s]
[INFO] Apache hadoop Auth Examples ........................ SUCCESS [ 23.112 s]
[INFO] Apache hadoop Common ............................... SUCCESS [45:23 min]
[INFO] Apache hadoop NFS .................................. SUCCESS [ 45.079 s]
[INFO] Apache hadoop KMS .................................. SUCCESS [01:27 min]
[INFO] Apache hadoop Common Project ....................... SUCCESS [  1.104 s]
[INFO] Apache hadoop HDFS ................................. SUCCESS [21:45 min]
[INFO] Apache hadoop HttpFS ............................... SUCCESS [02:13 min]
[INFO] Apache hadoop HDFS BookKeeper Journal .............. SUCCESS [ 47.832 s]
[INFO] Apache hadoop HDFS-NFS ............................. SUCCESS [ 34.029 s]
[INFO] Apache hadoop HDFS Project ......................... SUCCESS [  1.075 s]
[INFO] hadoop-yarn ........................................ SUCCESS [  1.354 s]
[INFO] hadoop-yarn-api .................................... SUCCESS [07:20 min]
[INFO] hadoop-yarn-common ................................. SUCCESS [35:51 min]
[INFO] hadoop-yarn-server ................................. SUCCESS [  1.020 s]
[INFO] hadoop-yarn-server-common .......................... SUCCESS [01:42 min]
[INFO] hadoop-yarn-server-nodemanager ..................... SUCCESS [01:58 min]
[INFO] hadoop-yarn-server-web-proxy ....................... SUCCESS [ 25.288 s]
[INFO] hadoop-yarn-server-applicationhistoryservice ....... SUCCESS [01:05 min]
[INFO] hadoop-yarn-server-resourcemanager ................. SUCCESS [02:52 min]
[INFO] hadoop-yarn-server-tests ........................... SUCCESS [ 40.356 s]
[INFO] hadoop-yarn-client ................................. SUCCESS [ 54.780 s]
[INFO] hadoop-yarn-server-sharedcachemanager .............. SUCCESS [ 24.110 s]
[INFO] hadoop-yarn-applications ........................... SUCCESS [  1.017 s]
[INFO] hadoop-yarn-applications-distributedshell .......... SUCCESS [ 21.223 s]
[INFO] hadoop-yarn-applications-unmanaged-am-launcher ..... SUCCESS [ 17.608 s]
[INFO] hadoop-yarn-site ................................... SUCCESS [  1.145 s]
[INFO] hadoop-yarn-registry ............................... SUCCESS [ 42.659 s]
[INFO] hadoop-yarn-project ................................ SUCCESS [ 34.614 s]
[INFO] hadoop-mapreduce-client ............................ SUCCESS [  1.905 s]
[INFO] hadoop-mapreduce-client-core ....................... SUCCESS [33:18 min]
[INFO] hadoop-mapreduce-client-common ..................... SUCCESS [32:57 min]
[INFO] hadoop-mapreduce-client-shuffle .................... SUCCESS [ 28.868 s]
[INFO] hadoop-mapreduce-client-app ........................ SUCCESS [01:00 min]
[INFO] hadoop-mapreduce-client-hs ......................... SUCCESS [ 46.223 s]
[INFO] hadoop-mapreduce-client-jobclient .................. SUCCESS [ 29.643 s]
[INFO] hadoop-mapreduce-client-hs-plugins ................. SUCCESS [ 15.580 s]
[INFO] Apache hadoop MapReduce Examples ................... SUCCESS [ 40.229 s]
[INFO] hadoop-mapreduce ................................... SUCCESS [ 24.719 s]
[INFO] Apache hadoop MapReduce Streaming .................. SUCCESS [ 33.669 s]
[INFO] Apache hadoop Distributed Copy ..................... SUCCESS [ 59.792 s]
[INFO] Apache hadoop Archives ............................. SUCCESS [ 19.986 s]
[INFO] Apache hadoop Rumen ................................ SUCCESS [ 47.303 s]
[INFO] Apache hadoop Gridmix .............................. SUCCESS [ 30.258 s]
[INFO] Apache hadoop Data Join ............................ SUCCESS [ 22.306 s]
[INFO] Apache hadoop Ant Tasks ............................ SUCCESS [ 19.212 s]
[INFO] Apache hadoop Extras ............................... SUCCESS [ 27.362 s]
[INFO] Apache hadoop Pipes ................................ SUCCESS [  6.723 s]
[INFO] Apache hadoop OpenStack support .................... SUCCESS [ 34.857 s]
[INFO] Apache hadoop Amazon Web Services support .......... SUCCESS [ 37.631 s]
[INFO] Apache hadoop Azure support ........................ SUCCESS [ 30.848 s]
[INFO] Apache hadoop Client ............................... SUCCESS [01:02 min]
[INFO] Apache hadoop Mini-Cluster ......................... SUCCESS [  3.409 s]
[INFO] Apache hadoop Scheduler Load Simulator ............. SUCCESS [ 33.821 s]
[INFO] Apache hadoop Tools Dist ........................... SUCCESS [ 55.501 s]
[INFO] Apache hadoop Tools ................................ SUCCESS [  0.768 s]
[INFO] Apache hadoop Distribution ......................... SUCCESS [03:44 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:33 h
[INFO] Finished at: 2016-08-01T14:22:17+08:00
[INFO] Final Memory: 125M/3096M
[INFO] ------------------------------------------------------------------------
本例的编译结果位于/usr/local/hadoop-2.7.2/hadoop-dist/target/目录,源码包和二进制包分别为hadoop-2.7.2-src.tar.gz和hadoop-2.7.2.tar.gz。至此hadoop编译结束。
六、Hadoop 集群搭建测试
本节采用hadoop ”Fully Distributed Mode” 工作模式,在IP地址分别为 10.20.42.22(slave1),10.20.42.22(slave2),10.20.42.199(master)的机器上部署3节点的 hadoop集群。
1. 设置SSH免密码登录
SSH免密码登录,假设使用root用户,在每台服务器都生成公钥,再合并到authorized_keys,具体操作如下:
    (1)fadora21默认没有启动ssh无密登录,修改/etc/ssh/sshd_config注释掉以下2行。(每台机器都要设置)
#RSAAuthentication yes
#PubkeyAuthentication yes
    (2)在集群中的每台机器上,打开shell终端输入命令,ssh-keygen -t rsa,生成key,不要输入密码,一直回车,/root就会生成.ssh文件夹,这个文件一般是隐藏的。(每台服务器都要设置)
    (3)合并slave节点的公钥到authorized_keys文件。在Master服务器,进入/root/.ssh目录,使用如下命令:
cat id_rsa.pub>> authorized_keys
ssh root@10.20.42.22 cat ~/.ssh/id_rsa.pub>> authorized_keys
ssh root@10.20.42.10 cat ~/.ssh/id_rsa.pub>> authorized_keys
    (4)把Master服务器的authorized_keys、known_hosts复制到Slave服务器的/root/.ssh目录
    (5)终端输入ssh root@10.20.42.22和ssh root@10.20.42.10进行验证是否免密登陆配置成功
2. 搭建hadoop 3节点集群
搭建思路:准备1台主服务器和2台从服务器,从主服务器可以ssh免密登录从服务器器。hadoop压缩包采用上节编译结果:hadoop-2.7.2.tar.gz。 3台服务器的概要信息如下:
Master 10.20.42.199
Slave1 10.20.42.22
Slave2 10.20.42.10
搭建前提: 服务器需要安装JDK并设置好JAVA_HOM等环境变量。可参考下面的例子:
#编辑/etc/profile 文件并设置JAVA_HOME等环境变量
 vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-6.b17.rc16.fc21.loongson.mips64el
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#使环境变量生效 并且验证jdk 是否生效
source /etc/profile && java -version
 开始搭建
解压hadoop-2.7.2.tar.gz 软件包,笔者的工作目录为/home/loongson/,没有特殊说明下面的配置文件均来自master服务器。
(1)解压hadoop软件包: tar -xvf hadoop-2.7.2.tar.gz  -C  /home/loongson
(2)在/home/loongson/hadoop-2.7.2目录下手动创建tmp、hdfs、hdfs/data、hdfs/name文件夹。
(3)配置/home/hadoop/hadoop-2.7.2/etc/hadoop目录下的core-site.xml(ip设置成master的地址)
    <configuration>
       <property>
        <name>fs.defaultFS</name>
        <value>hdfs://10.20.42.199:9000</value>
        </property>
        <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/loongson/hadoop/tmp</value>
        </property>
        <property>
        <name>io.file.buffer.size</name>
        <value>131702</value>
        </property>
    </configuration>
(4)配置/home/loongson/hadoop-2.7.2/etc/hadoop目录下的hdfs-site.xml(ip设置成master的地址)
    <configuration>
        <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/loongson/hadoop/dfs/name</value>
        </property>
        <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/loongson/hadoop/dfs/data</value>
        </property>
        <property>
        <name>dfs.replication</name>
        <value>2</value>
        </property>
        <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>10.20.42.199:9001</value>
        </property>
        <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
        </property>
    </configuration>
(5)配置/home/loongson/hadoop-2.7.2/etc/hadoop目录下的mapred-site.xml.template(ip设置成master的地址)
    <configuration>
        <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
        </property>
        <property>
        <name>mapreduce.jobhistory.address</name>
        <value>10.20.42.199:10020</value>
        </property>
        <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>10.20.42.199:19888</value>
        </property>
    </configuration>
(6)配置/home/loongson/hadoop-2.7.2/etc/hadoop目录下的yarn-site.xml(ip设置成master的地址)
    <configuration>
        <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
        </property>
        <property>
        <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
        <property>
        <name>yarn.resourcemanager.address</name>
        <value>10.20.42.199:8032</value>
        </property>
        <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>10.20.42.199:8030</value>
        </property>
        <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>10.20.42.199:8031</value>
        </property>
        <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>10.20.42.199:8033</value>
        </property>
        <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>10.20.42.199:8088</value>
        </property>
        <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>768</value>
        </property>
    </configuration>
(7)修改位于/home/loongson/hadoop-2.7.2/etc/hadoop目录hadoop-env.sh,yarn-env.sh中的JAVA_HOME等环境变量。
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-6.b17.rc16.fc21.loongson.mips64el
(8)配置/home/loongson/hadoop-2.7.2/etc/hadoop目录下的slaves文件,增加2个从slave节点,
10.20.42.10
10.20.42.22
(9)将上述配置好的Hadoop-2.7.2(位于master机器上)使用scp复制到各个slave节点对应位置上
scp -r /home/loongson/hadoop-2.7.2 10.20.42.10:/home/loongson
scp -r /home/loongson/hadoop-2.7.2 10.20.42.22:/home/loongson
(10)在Master服务器启动hadoop,从节点会自动启动,进入/home/loongson/hadoop-2.7.2目录
    (1)关闭机器防火墙:service iptables stop (主从都设置)
    (2)初始化node节点:bin/hdfs namenode -format
    (3)启动全部node: sbin/start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
16/09/02 08:49:56 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable
Starting namenodes on [hadoop-master-001]
hadoop-master-001: starting namenode, logging to /home/loongson/hadoop-2.7.2/logs/hadoop-root-namenode-
        localhost.localdomain.out
        10.20.42.22: starting datanode, logging to /home/loongson/hadoop-2.7.2/logs/hadoop-root-datanode-localhost.localdomain.out
        10.20.42.22: /home/loongson/hadoop-2.7.2/bin/hdfs: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-6.b17.rc16.fc21.loongson.mips64el
        10.20.42.22: /home/loongson/hadoop-2.7.2/bin/hdfs: line 304: /usr/lib/jvm/java-1.8.0-
        openjdk-1.8.0.25-6.b17.rc16.fc21.loongson.mips64el/bin/java: 成功
        10.20.42.10: starting datanode, logging to /home/loongson/hadoop-2.7.2/logs/hadoop-root-datanode-localhost.localdomain.out
        Starting secondary namenodes [hadoop-master-001]
        hadoop-master-001: secondarynamenode running as process 18418. Stop it first.
        16/09/02 08:50:33 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java
        classes where applicable
        starting yarn daemons
        resourcemanager running as process 16937. Stop it first.
        10.20.42.10: starting nodemanager, logging to /home/loongson/hadoop-2.7.2/logs/yarn-root-nodemanager-localhost.localdomain.out
        10.20.42.22: starting nodemanager, logging to /home/loongson/hadoop-2.7.2/logs/yarn-root-nodemanager-localhost.localdomain.out
        10.20.42.22: /home/loongson/hadoop-2.7.2/bin/yarn: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.25-6.b17.rc16.fc21.loongson.mips64el
        10.20.42.22: /home/loongson/hadoop-2.7.2/bin/yarn: line 333: /usr/lib/jvm/java-1.8.0-
        openjdk-1.8.0.25-6.b17.rc16.fc21.loongson.mips64el/bin/java: 成功
    (4)暂停全部节点的命令: sbin/stop-all.sh
    (5)输入jps命令: 如果从节点和主节点显示类似如下,说明节点搭建成功
    master:
    32497 OServerMain
    3506 SecondaryNameNode
    3364 DataNode
    5654 Jps
    2582 OGremlinConsole
    16937 ResourceManager
    3263 NameNode
    slaves:
    21580 Jps
    20622 DataNode
(11)从浏览器访问: http://10.20.42.199:8088/或http://10.20.42.199:50070/ 查看hadop运行情况。下面给出从浏览器打开,看到的hadoop的运行情况截图:
Hadoop运行预览和概要信息:


81.png


七、下载成品
如果觉得上面的移植过程太复杂,笔者已经准备好了移植完的二进制,可以直接下载运行:
http://www.loongnix.org/index.php/Apache_hadoop-2.7.2
八、总结
hadoop-2.7.2 在loongnix1.0 系统上正确完成源码编译和搭建小集群测试,可以作为开发者移植hadoop和进行集群测试的示范过程。