【云计算导论实验4】Docker

  • 一、Docker的安装
  • 二、 容器操作
  • 1.启动容器
  • 1)新建并启动
  • 2)启动已终止容器
  • 守护态运行
  • 终止容器
  • 三、 搭建一个Docker应用栈
  • 1.获取镜像
  • 2.应用栈容器节点互连
  • 3.应用栈容器节点启动
  • 应用栈节点启动:
  • 启动Django容器
  • 启动HAProxy容器
  • 4.应用栈容器节点配置
  • 1)Redis Morningtune主数据库容器节点的配置
  • 2)Redis Slave从数据库容器节点的配置
  • 3)Redis数据库容器节点的测试
  • 4)App容器节点(Django)的配置
  • 5)HAProxy容器节点的配置
  • 四、实现私有云
  • 1.启动Docker
  • 2.实现SSHD,在Base镜像的基础上生成一个新镜像
  • 3.开始分配容器
  • 4.搭建自己的私有仓库


一、Docker的安装

使用下列命令进行安装:

sudo apt-get install docker.io

可能会很慢,可以考虑更换国内源,click

运行如下命令,检查docker是否安装成功:

sudo docker info

在云服务器上docker最低使用标准 docker云计算_docker

安装之后启动docker服务:

sudo service docker start

安装完成之后,建议更换一下docker镜像源
1、修改/etc/docker/daemon.json配置文件

sudo vim /etc/docker/daemon.json

2、修改daemon.json文件的内容

{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
systemctl restart docker.service

保存文件之后重启一下docker就完成配置了

sudo systemctl restart docker

二、 容器操作

1.启动容器

1)新建并启动

命令:docker run 例1:输出一个“hello world”后终止容器

sudo docker run ubuntu:14.04 /bin/echo 'hello world'

在云服务器上docker最低使用标准 docker云计算_hadoop_02


第一次运行需要拉取ubuntu:14.04源,耐心等待即可,如果完成了上述更换docker源的操作的话,拉取速度应该挺快的

例2:启动一个bash终端,允许用户进行交互

sudo docker run -t -i ubuntu:14.04 /bin/bash

-t 让docker分配一个伪终端并绑定到容器的标准输入上

-i 让容器的标准输入保持打开

在云服务器上docker最低使用标准 docker云计算_docker_03

2)启动已终止容器

命令:docker start

守护态运行

-d 参数完成docker容器在后台以守护态形式运行,如下面的例子:

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

容器启动后会返回一个唯一的id

在云服务器上docker最低使用标准 docker云计算_redis_04

也可以通过下面的命令来查看容器信息

sudo docker ps

在云服务器上docker最低使用标准 docker云计算_hadoop_05

也可以通过logs命令获取输出信息

sudo docker logs <NAMES|CONTAINER ID>

在云服务器上docker最低使用标准 docker云计算_在云服务器上docker最低使用标准_06

终止容器

命令:docker stop

在云服务器上docker最低使用标准 docker云计算_redis_07


终止状态的容器可以用下面命令查看:

sudo docker ps -a

在云服务器上docker最低使用标准 docker云计算_redis_08

三、 搭建一个Docker应用栈

1.获取镜像

sudo docker pull ubuntu
sudo docker pull django
sudo docker pull haproxy
sudo docker pull redis
sudo docker images

2.应用栈容器节点互连

这部分没啥好说的,就看看书就行了,然后是查看hosts文件

cat /etc/hosts

在云服务器上docker最低使用标准 docker云计算_云计算_09


注意这一项主机名为morningtune的连接信息(之前建立hadoop的实验,名字不一定是这个,IP也不一定,看个人设置,下面出现morningtune的地方换成自己的就行

应用栈节点间的连接信息如下:

  • 启动Morningtune-redis容器节点
  • 两个Slave-redis容器节点启动时要连接到Morningtune-redis上
  • 3个App容器节点启动时要连接到Morningtune-redis上
  • HAProxy容器节点启动时要连接到3个App节点上

启动顺序如下:
Morningtune-redis→Slave-redis→App→HAProxy

3.应用栈容器节点启动

以下启动命令,一个窗口执行一个(或者-it改为-itd来后台运行)

应用栈节点启动:

sudo docker run -it --name morningtune-redis redis /bin/bash
sudo docker run -it --name redis-slave1 --link morningtune-redis:morningtune redis /bin/bash
sudo docker run -it --name redis-slave2 --link morningtune-redis:morningtune redis /bin/bash

启动Django容器

sudo docker run -it --name App1 --link morningtune-redis:db -v ~/projects/Django/App1:/usr/src/app django /bin/bash
sudo docker run -it --name App2 --link morningtune-redis:db -v ~/projects/Django/App2:/usr/src/app django /bin/bash
sudo docker run -it --name App3 --link morningtune-redis:db -v ~/projects/Django/App3:/usr/src/app django /bin/bash

启动HAProxy容器

sudo docker run -it --name HAProxy --link App1:App1 --link App2:App2 --link App3:App3 -p 6301:6301 -v ~/projects/HAProxy:/tmp haproxy /bin/bash

在云服务器上docker最低使用标准 docker云计算_hadoop_10


sudo docker ps查看启动的容器信息如下:

在云服务器上docker最低使用标准 docker云计算_hadoop_11

4.应用栈容器节点配置

1)Redis Morningtune主数据库容器节点的配置

使用命令查看所挂载volume的情况

sudo docker inspect --format "{{.Mounts}}" morningtune-redis

在云服务器上docker最低使用标准 docker云计算_hadoop_12


从上述信息中可以看出volume在主机的目录为/var/lib/docker/volumes/fdbd4689bc86d6b2447d30f719f6a7c6a38d73e462b42ad95c9077ab95f3ebf8/_data,在容器中的目录为/data(每个人都不一样)

先切换root用户进行权限赋予,

su root
chmod 777 /var/lib/docker/

如果是第一次使用root用户,先执行下面的命令进行创建用户。

sudo passwd root

接下来来创建主数据库的启动配置文件,命令如下:

cd /var/lib/docker/volumes/fdbd4689bc86d6b2447d30f719                                                                                                                     f6a7c6a38d73e462b42ad95c9077ab95f3ebf8/_data
sudo vim redis.conf

其内容见链接,redis.conf

执行命令,切换到容器中的volume目录:

sudo docker exec -it morningtune-redis /bin/bash

复制启动配置文件到Redis的执行工作目录中,然后启动Redis服务器:

cp redis.conf /usr/local/bin
cd /usr/local/bin
redis-server redis.conf

可能会报错,信息如下:

在云服务器上docker最低使用标准 docker云计算_redis_13


使用命令mkdir /temp/手动创建该目录即可,并重新执行redis-server redis.conf

2)Redis Slave从数据库容器节点的配置

使用命令查看所挂载volume的情况

sudo docker inspect --format "{{.Mounts}}" redis-slave1

类似的创建启动配置文件,内容同上,但要添加一行

slaveof master 6379

完成后,使用下面命令切换到Redis的执行工作目录,然后启动redis服务器

sudo docker exec -it redis-slave1 /bin/bash

同理,完成redis-slave2容器节点的设置

3)Redis数据库容器节点的测试

找到启用morningtune-redis的终端窗口,依次执行下面命令:

redis-cli
set morningtune morningtune-redis
get morningtune

在云服务器上docker最低使用标准 docker云计算_在云服务器上docker最低使用标准_14

随后在另外两个Redis Slave容器中执行如下命令:

redis-cli
get morningtune

在云服务器上docker最低使用标准 docker云计算_云计算_15

可以看到已经同步到Slave数据库中了

4)App容器节点(Django)的配置

在App容器节点中安装python语言的Redis支持包

pip install redis

在云服务器上docker最低使用标准 docker云计算_在云服务器上docker最低使用标准_16


在容器内的/usr/src/app/目录下创建App:

cd /usr/src/app
mkdir dockerweb
cd dockerweb
django-admin.py startproject redisweb
ls
cd redisweb
ls
python manage.py startapp helloworld
ls

在云服务器上docker最低使用标准 docker云计算_docker_17


切换到主机进行相应的编辑来配置App:

cd ~/projects/Django/App1
ls

然后修改helloword应用的视图文件views.py:

cd dockerweb/redisweb/helloworld
sudo vim views.py

内容如下:

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
import redis

def hello(requset):
    str=redis.__file__
    str+="<br>"
    r = redis.Redis(host='db', port=6379, db=0)
    info = r.info()
    str+=("Set Hi <br>")
    r.set('Hi', 'HelloWorld-APP1')
    str+=("Get Hi: %s <br>" % r.get('Hi'))
    str+=("Redis Info: <br>")
    str+=("Key: Info Value")
    for key in info:
        str+=("%s: %s<br>" % (key, info[key]))
    return HttpResponse(str)

然后修改redisweb项目的配置文件setting.py:

cd ../redisweb
sudo vim setting.py

其内容如下:

# Application definition
ALLOWED_HOSTS=['*']  
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'helloworld',
]

最后修改redisweb项目的URL模式文件urls.py

sudo vim urls.py

其内容如下:

from django.conf.urls import * 
from django.contrib import admin
admin.autodiscover()
from helloworld.views import hello

urlpatterns = [ 
   url(r'^admin/', include(admin.site.urls)),
   url(r'^helloworld$', hello),
]

完成上述修改后,返回到容器中进行项目生成

cd /usr/src/app/dockerweb/redisweb
python manage.py makemigrations
python manage.py migrate

在云服务器上docker最低使用标准 docker云计算_云计算_18


至此App1的设置全部完成,App2和App3的设置和App1的相似。

以App1为例,启动服务器的过程如下:

python manage.py runserver 0.0.0.0:8001

在云服务器上docker最低使用标准 docker云计算_redis_19

5)HAProxy容器节点的配置

首先将主机中的HAProxy的启动配置文件复制到容器中

cd ~/projects/HAProxy/
sudo vim haproxy.cfg

其内容如下:

global
    log 127.0.0.1   local0
    maxconn 4096
    chroot /usr/local/sbin
    daemon
    pidfile /usr/local/sbin/haproxy.pid


defaults
    log     127.0.0.1   local3
    mode    http
    option  dontlognull
    option  redispatch
    retries 2
    maxconn 2000
    balance roundrobin 
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms

listen redis_proxy 
	bind 0.0.0.0:6301
    stats enable
    stats uri /haproxy-stats
        server APP1 APP1:8001 check inter 2000 rise 2 fall 5
        server APP2 APP2:8002 check inter 2000 rise 2 fall 5
        server APP3 APP3:8003 check inter 2000 rise 2 fall 5

随后,在HAProxy容器中执行如下命令,完成启动配置文件的复制:

cd /tmp
cp haproxy.cfg /usr/local/sbin
cd /usr/local/sbin
ls

执行到cp会报错“Permission Denied”,先执行exit 退出当前容器,执行以下语句,以root身份进入容器:

sudo docker start HAProxy
sudo docker exec -it -u root HAProxy /bin/bash

然后以root身份重新执行复制的指令即可

完成复制后,利用配置文件启用haproxy代理:

haproxy -f haproxy.cfg

如果修改了配置文件的内容,则需要先结束所有的HAProxy进程,并重新启动代理:

apt-get install psmisc
killall haproxy

至此,全部配置均完成

在云服务器上docker最低使用标准 docker云计算_redis_20

四、实现私有云

1.启动Docker

service docker start

2.实现SSHD,在Base镜像的基础上生成一个新镜像

docker run -t -i ubuntu:14.04 /bin/bash

安装supervisor服务

apt-get supervisor
cp supervisord.conf conf.d/
cd conf.d/  
vi supervisord.conf

内容如下:

; supervisor config file  
  
[unix_http_server]  
file=/var/run/supervisor.sock   ; (the path to the socket file)  
chmod=0700                       ; sockef file mode (default 0700)  
  
[supervisord]  
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)  
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)  
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)  
nodaemon=true                         ;(修改该软件的启动模式为非daemon,否则docker 在执行的时候会直接退出)  
[include]  
files = /etc/supervisor/conf.d/*.conf  
  
[program:sshd]  
command = /usr/sbin/sshd -D        ;
mkdir /var/run/sshd 
passwd root
vi /etc/ssh/sshd_config
exit

退出之后自动生成一个容器,接下来把容器commit生成封装了sshd的镜像

docker commit f3c8  ubuntu:sshd
docker images

3.开始分配容器

docker run -p 301:22 -d --name test ubuntu /usr/bin/supervisord

docker run -p 302:22 -d --name dev ubuntu /usr/bin/supervisord

docker run -p 303:22 -d --name client1 ubuntu /usr/bin/supervisord
.......
docker run -p xxxxx:22 -d --name clientN ubuntu /usr/bin/supervisord

4.搭建自己的私有仓库

服务的封装才是Docker的杀手锏,怎么可能让这种工作重复数十次?我们可以搭建自己的私有仓库。有点类似github的方式,将封装好的镜像push到仓库,其他主机装好docker后,pull下来即可,在这里不做说明。