问题导读:
1.为什么在这里需要swift?
2.swift如何为其他容器提供服务?
3.还可以怎样扩展这个部署?
首先,让我说明一下这不是关于如何在docker中运行一个OpenStack Swift集群。而是关于运行一个部署了OpenStack Swift all in one的容器。特别地,这只有一个储存设备(一个docker volume),并配置为只有一个副本在该设备上。
为什么要称为Swift OnlyOne?
我之所以把它称之为SwiftOnlyOne是因为它只有一个服务器,一个设备,并配置为只做一个副本。Swift All-in-one,在另一方面,需要设置4个服务器和设备,尽管只是在一个虚拟机当中。
大多数人都是在一个庞大的环境中使用Swift,并典型地把Swift用于储存大量的数据(PB级)。但在这里我只是想要一个小规模的部署并未其他几个容器提供对象储存服务,或者是再次做开发工作。
一个例子,我认为OpenStack Swift对于docker来说是一个好搭档。但不是说使用docker部署Swift,而是使Docker容器使用Swift储存数据。
如果你在多个主机上有多个容器,并且一些容器运行着一些需要访问同一个文件的应用,接着你需要共享这些文件。一般用分布式文件系统(DFS)可以解决,但是这包含了太多复杂的关系,并且,我认为在惯用的方法中会导致docker变得难用。假如我们用Swift取代DFS,并因此使你的应用用对象储存取代对文件系统的依赖,我想你会感觉更好的。
使用Swift OnlyOne
首先,因为swfit需要文件系统拥有xattr,docker必须被配置使用btrfs或XFS(或其他支持xattr的文件系统)。我只用了btrfs,所以/var/lib/docker是一个btrfs volume并且docker守护进程使用“-s btrfs”参数运行。
注意:我在github上有一个Vagrant配置文件和Ansible脚本用于设置一个拥有docker和btrfs的基于Vagrant的虚拟机。所以你们都需要clone那个repo并运行“vagrant up”以获得docker和btrfs。
- vagrant@host1:~$ sudo btrfs fi show /var/lib/docker
- Label: none uuid: 732ee044-4b3a-4391-8b53-fd7da224c008
- Total devices 1 FS bytes used 1.99GiB
- devid 1 size 20.00GiB used 4.04GiB path /dev/sdb
-
- Btrfs v3.12
- vagrant@host1:~$ ps ax | grep [d]ocker
- 997 ? Sl 6:40 /usr/bin/docker.io -d -s btrfs
复制代码
这里有个github库,包含此例中使用的Dockerfile和Swift配置文件。你也可以从docker库中pull下来:
- vagrant@host1:~$ docker pull serverascode/swift-onlyone
- Pulling repository serverascode/swift-onlyone
- 7e8283467cba: Download complete
- SNIP!
- d7279e38d8cd: Download complete
复制代码
现在你可以运行一个可以交互的Swift OnlyOne容器:
- vagrant@host1:/vagrant/dockerfiles/swift-onlyone$ docker run -i -t serverascode/swift-onlyone /bin/bash
- root@f2f8ccb82c0e:/# /usr/local/bin/startmain.sh
- Device d0r1z1-127.0.0.1:6010R127.0.0.1:6010/sdb1_"" with 1.0 weight got id 0
- Reassigned 128 (100.00%) partitions. Balance is now 0.00.
- Device d0r1z1-127.0.0.1:6011R127.0.0.1:6011/sdb1_"" with 1.0 weight got id 0
- Reassigned 128 (100.00%) partitions. Balance is now 0.00.
- Device d0r1z1-127.0.0.1:6012R127.0.0.1:6012/sdb1_"" with 1.0 weight got id 0
- Reassigned 128 (100.00%) partitions. Balance is now 0.00.
- Starting to tail /var/log/syslog...(hit ctrl-c if you are starting the container in a bash shell)
- ^C
复制代码
请注意当它提示“Starting to tail…”时我按了“ctrl-c”,因为当你在非交互模式下运行这个容器时,我tail /var/log/syslog使能够执行“docker logs $ID”并获取Swift日志。
我们可以看到进程已经在运行中,但这里有相当多的内容,包括rsyslog和memcache。通常是使用docker模块处理(Usually Docker models processes),但在这里我通过基于角色的方式去使用docker。
- root@f2f8ccb82c0e:/# ps ax
- PID TTY STAT TIME COMMAND
- 1 ? Ss 0:00 /bin/bash
- 43 ? Ss 0:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
- 45 ? S 0:00 /usr/bin/python /usr/bin/swift-container-server /etc/swift/container-server.conf
- 46 ? S 0:00 /usr/bin/python /usr/bin/swift-account-reaper /etc/swift/account-server.conf
- 47 ? S 0:00 /usr/bin/python /usr/bin/swift-object-replicator /etc/swift/object-server.conf
- 48 ? S 0:00 /usr/bin/python /usr/bin/swift-account-auditor /etc/swift/account-server.conf
- 49 ? S 0:00 /usr/bin/python /usr/bin/swift-object-server /etc/swift/object-server.conf
- 50 ? S 0:00 /usr/bin/python /usr/bin/swift-container-sync /etc/swift/container-server.conf
- 51 ? S 0:00 /usr/bin/python /usr/bin/swift-account-replicator /etc/swift/account-server.conf
- 52 ? S 0:00 /usr/bin/python /usr/bin/swift-account-server /etc/swift/account-server.conf
- 53 ? S 0:00 /bin/bash -c source /etc/default/rsyslog && /usr/sbin/rsyslogd -n -c3
- 54 ? S 0:00 /usr/bin/python /usr/bin/swift-proxy-server /etc/swift/proxy-server.conf
- 55 ? S 0:00 /usr/bin/python /usr/bin/swift-object-updater /etc/swift/object-server.conf
- 56 ? Sl 0:00 /usr/bin/memcached -u memcache
- 57 ? Sl 0:00 /usr/sbin/rsyslogd -n -c3
- 86 ? S 0:00 /usr/bin/python /usr/bin/swift-object-server /etc/swift/object-server.conf
- 87 ? S 0:00 /usr/bin/python /usr/bin/swift-container-server /etc/swift/container-server.conf
- 88 ? S 0:00 /usr/bin/python /usr/bin/swift-account-server /etc/swift/account-server.conf
- 89 ? S 0:00 /usr/bin/python /usr/bin/swift-proxy-server /etc/swift/proxy-server.conf
- 91 ? R+ 0:00 ps ax
复制代码
现在我们可以使用Swift
- root@f2f8ccb82c0e:/# swift -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing stat
- Account: AUTH_test
- Containers: 0
- Objects: 0
- Bytes: 0
- Content-Type: text/plain; charset=utf-8
- X-Timestamp: 1402590362.23352
- X-Trans-Id: tx1c32b455aa7c4178a4add-005399d49a
- X-Put-Timestamp: 1402590362.23352
- root@f2f8ccb82c0e:/# swift -A http://127.0.0.1:8080/auth/v1.0 -U test:tester -K testing upload etc_swift /etc/swift
- etc/swift/dispersion.conf
- etc/swift/account-server.conf
- etc/swift/backups/1402588704.container.ring.gz
- etc/swift/backups/1402588704.object.ring.gz
- etc/swift/backups/1402588704.container.builder
- etc/swift/proxy-server.conf
- etc/swift/object-server.conf
- etc/swift/swift.conf
- etc/swift/backups/1402588704.object.builder
- etc/swift/container-server.conf
- etc/swift/backups/1402588704.account.builder
- etc/swift/backups/1402588705.account.ring.gz
- etc/swift/object.builder
- etc/swift/backups/1402588705.account.builder
- etc/swift/object.ring.gz
- etc/swift/container.builder
- etc/swift/account.ring.gz
- etc/swift/supervisord.log
- etc/swift/container.ring.gz
- etc/swift/account.builder
- etc/swift/supervisord.pid
- root@f2f8ccb82c0e:/#
复制代码
我们也可以以非交互模式启动一个容器,并添加端口映射:
- vagrant@host1:~$ ID=$(docker run -d -p 8080 -t serverascode/swift-onlyone)
复制代码
现在容器应该是在运行中,并已经有一个端口映射到8080端口。
- vagrant@host1:~$ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 0c57f60e1de6 serverascode/swift-onlyone:latest /bin/sh -c /usr/loca 3 seconds ago Up 3 seconds 0.0.0.0:49162->8080/tcp loving_hawking
复制代码
通过以上这些操作,我们可以看到运行容器的主机的49162端口已经被映射到了容器的8080端口,我们可以查看它的日志:
- vagrant@host1:~$ docker logs $ID
- Device d0r1z1-127.0.0.1:6010R127.0.0.1:6010/sdb1_"" with 1.0 weight got id 0
- Reassigned 128 (100.00%) partitions. Balance is now 0.00.
- Device d0r1z1-127.0.0.1:6011R127.0.0.1:6011/sdb1_"" with 1.0 weight got id 0
- Reassigned 128 (100.00%) partitions. Balance is now 0.00.
- Device d0r1z1-127.0.0.1:6012R127.0.0.1:6012/sdb1_"" with 1.0 weight got id 0
- Reassigned 128 (100.00%) partitions. Balance is now 0.00.
- Starting to tail /var/log/syslog...(hit ctrl-c if you are starting the container in a bash shell)
复制代码
这次我们在来再运行swift stat一次,但这次是在容器主机上,并非容器内(注意不是使用8080作为认证端口,而是49162):
- vagrant@host1:~$ swift -A http://127.0.0.1:49162/auth/v1.0 -U test:tester -K testing stat
- Account: AUTH_test
- Containers: 0
- Objects: 0
- Bytes: 0
- Content-Type: text/plain; charset=utf-8
- X-Timestamp: 1402590701.15270
- X-Trans-Id: txfebf58919cbf4c61ac73c-005399d5ed
- X-Put-Timestamp: 1402590701.15270
- vagrant@host1:~$ swift -A http://127.0.0.1:49162/auth/v1.0 -U test:tester -K testing upload test swift.txt
- swift.txt
- vagrant@host1:~$ swift -A http://127.0.0.1:49162/auth/v1.0 -U test:tester -K testing list test
- swift.txt
复制代码
再次检查log:
- vagrant@host1:~$ docker logs $ID | tail
- Jun 12 16:33:16 0c57f60e1de6 account-replicator: Replication run OVER
- Jun 12 16:33:16 0c57f60e1de6 account-replicator: Attempted to replicate 1 dbs in 0.00341 seconds (292.99204/s)
- Jun 12 16:33:16 0c57f60e1de6 account-replicator: Removed 0 dbs
- Jun 12 16:33:16 0c57f60e1de6 account-replicator: 0 successes, 0 failures
- Jun 12 16:33:16 0c57f60e1de6 account-replicator: no_change:0 ts_repl:0 diff:0 rsync:0 diff_capped:0 hashmatch:0 empty:0
- Jun 12 16:33:16 0c57f60e1de6 object-replicator: Starting object replication pass.
- Jun 12 16:33:16 0c57f60e1de6 object-replicator: 1/1 (100.00%) partitions replicated in 0.00s (767.48/sec, 0s remaining)
- Jun 12 16:33:16 0c57f60e1de6 object-replicator: 1 suffixes checked - 0.00% hashed, 0.00% synced
- Jun 12 16:33:16 0c57f60e1de6 object-replicator: Partition times: max 0.0003s, min 0.0003s, med 0.0003s
- Jun 12 16:33:16 0c57f60e1de6 object-replicator: Object replication complete. (0.00 minutes)
复制代码
在这里,我们已经拥有了一套极佳的,能通过链接到其他容器并被使用的openstack swift。
运行一个只有数据的容器(Using a data only container):
同样,运行一个只有数据的容器也是很好的,这使用在/srv中的volume。
所以,首先创建一个只有数据的容器:
- vagrant@host1:~$ docker run -v /srv --name SWIFT_DATA busybox
- vagrant@host1:~$ docker ps --all |grep SWIFT_DATA
- 6c13b4e27320 busybox:buildroot-2014.02 /bin/sh 7 seconds ago Exit 0 SWIFT_DATA
复制代码
接着使用“—volumes-from”从SWIFT_DATA容器创建一个新的docker容器:
- vagrant@host1:~$ ID=$(docker run -d -p 8080 --volumes-from SWIFT_DATA -t serverascode/swift-onlyone)
复制代码
当我们检查容器时,我们可以看到容器的volume的所在。
- vagrant@host1:~$ docker inspect $ID | grep VolumesFrom
- "VolumesFrom": "SWIFT_DATA",
- vagrant@host1:~$ docker inspect $ID | grep "\/srv"
- "/srv": "/var/lib/docker/vfs/dir/8d437b57f36a2d849cece0752c8316c6916c31ec12fd9049d4203662806d3fe2"
- "/srv": true
- vagrant@host1:~$ sudo ls /var/lib/docker/vfs/dir/8d437b57f36a2d849cece0752c8316c6916c31ec12fd9049d4203662806d3fe2
- sdb1
复制代码
我认为只有数据的容器是使用docker的最好方法。
备注:代理没有使用SSL,在代理前也没有SSL保护,这一切都是为了简化。你不会想把它用在生产环境中。
########################################################
本文译自:http://serverascode.com/2014/06/12/run-swift-in-docker.html
译者:hochikong
|