Docker之初体验

首先说一下背景,一个docker小白需要在容器中完成freeswitch的编译操作,并将镜像打包导出。

docker是什么?怎么去理解这个东西,有一篇帖子写得很棒,虽然他也是引用的别人的


 首先你有一个 100 平方的房子(服务器),已知你(PHP 应用)需要吃喝拉撒睡觉,所以整个房子划分了卧室、厨房、卫生间等,然后供你一个人享用,但其实挺浪费的,你一个人并不需要 100 平方这么大,可能需要 20 平方(服务器占用 20%)就好了。
    后来又来了个别人(Java 应用)也被安排到了这个房子里生活,他也需要吃喝拉撒睡,所以你们挤在了一个床上,用一个卫生间(比如 http 服务器)。如果你改了你的习惯(例如 http 服务配置项)同样会影响别人的生活。
    后来又来了人(Node 应用),这时候房东发现房子不够大了,所以搬家(迁移、升级服务器)到另一个 150 平的房子,但是搬家成本好高。由于户型不同(系统版本、环境等)需要装修好久,此外还要把住户(应用代码)搬过来,还需要把住户自定义的习惯都带过来简直麻烦死了。
    这时候,房东了解到了一个叫 Docker 的产品。
 

 Docker 是一个可自由伸缩的集装箱房屋。
    这个集装箱房屋虽小但是五脏俱全,而且可以满足一切用户需求,并支持高度自定义,比如 Node 这位住户不需要厨房,那么他的集装箱房子就小一点,当然房租(服务器消耗)也便宜一些。
    房东用了 Docker 这个产品之后,发现租房这个事情变简单了:
        (1)房东不需要划分卫生间、厨房、卧室并进行装修了,一切由用户自己定制集装箱。房东只需要把集装箱放到房间里即可。
        (2)住户也不需要打架了,以前一起付房租(消耗服务器资源),现在按照自己集装箱大小付费。而且你可以在你集装箱里面随便折腾,爱怎么改配置就怎么改,也不会影响到别人。
        (3)集装箱对于空间的使用,更加直观,房东可以更轻松了解到当前房间的空间使用率等,以便升级房间。
        (4)房东搬新家的时候也开心了,只要把一面墙炸开,把里面一个个集装箱直接移过去新房子就好了,啥也不需要配置,都在集装箱里面呢。
 

你就是房东。房间是服务器,空间大小表示服务器硬件配置。
    住户就是你的业务、应用,提供服务的。
    伸缩集装箱房屋,就是 Docker 容器,里面是完全分离、独立、自由的环境和业务代码。你可以在里面装一个 Ubuntu(消耗大)或者简版的、可以跑业务代码的环境(消耗低)。
    Docker 抹平系统差异,相当于把你多个房间都砸成长方形方便存放集装箱。这样你可以快速把独立容器丢到各个配置了 Docker 的不同系统、硬件配置的服务器上面。
    因此也可以得到很高的伸缩性,可以瞬间部署很多服务器很多容器,然后负载均衡来提供大促服务等。
 


我刚开始看到这个的时候内心有点窃喜,以后如果要练习linux的一些命令就不用再想着再装一个虚拟机或者系统了,docker内部根本就是个独立的小空间嘛。

因为使用容器也是要完成一些操作,我在网上随便找的docker安装教程安装好之后确实桌面有下面三个图标

高兴的太早就是会出现各种各样的问题,出现了虚拟机禁用的问题,这时需要重启修改BIOS,将虚拟机允许启动,保存重启

但是使用Quickstart时出现报错,提示Default Boot2Docker ISO is out-of-date, downloading the latest release...

遇到这个只需要下载最新的把原先的替换掉就可以https://github.com/boot2docker/boot2docker/releases/tag/v18.03.0-ce

原先这个ISO的位置在C:\Users\Administrator\.docker\machine\cache

现在就要开始使用容器了~

需要理清一下docker、容器、和镜像之间的关系,这里我的理解肯定是偏的,大概就是docker是整体管理的作用,在docker中可以拉取镜像,启动镜像后就能产生容器了。具体的用一些指令试了一下:

查看docker中所有镜像:

docker images

查看docker中所有的容器:

docker ps -a

我这里的操作需要在centos7.4中进行(直接使用7.4出现版本找不到的情况,这里使用的是7.4.1708)

docker pull centos:7.4.1708

此时调用查看镜像的指令可以得到以下结果

其中freeswitch这个不用管,还没到这一步,现在的结果是能够看到centos7.4.1708的

借着镜像就能够创建容器,可以先使用

docker ps -a

试一下,此时是不存在容器的,使用下指令可以创建出来,其中image为镜像的ID

docker run -ti [image] /bin/bash

此时已经进入了容器,起初以为这条指令只是启动容器的指令,别无作用,每次关闭quickstart窗口都会执行一遍,结果导致docker中的容器越来越多,只能一个个全部删掉,删除容器的指令为:

docker rm [容器id]

当然镜像也是可以手动删除的

docker rmi [镜像id]

现在已经进入了容器内部,可以预先查看一下环境,相应命令为linux的那一套

像不像是anaconda安装不同版本python环境那种感觉~我觉得有点像

要走出容器也很简单,一个

exit 或者 Ctrl+P+Q

就可以出来,如果需要再次进入容器,使用

docker start [containerID]

启动容器,随后使用

docker exec -it [容器id] bash 或者 docker attach [容器id]

都可以进入到容器,不启动进不去的情况遇到过,执行下启动命令就好了

----------------------------------------------------

好了,现在centos的环境有了,需要拉取freeswitch的源码来做编译了

进入目录

cd usr/local/src

试过从GitHub上使用

git clone -b v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch

拉取代码,这个地址对应的是官网的,需要输入账号密码啥的,有点麻烦,这里用的是

https://github.com/signalwire/freeswitch 简单粗暴的找到release 1.6.20直接zip包下载到自己本地

现在需要将本地的文件复制到容器中去

docker cp [本地地址\\文件] [容器id全部字符:/usr/local/src/文件]

这里获取容器id全部字符也不难,使用下面的指令

docker inspect -f '{{.ID}}' NAMES

NAMES是容器的名字,查看所有容器的时候就能看到。这一步做完就能够在容器内部找到这个压缩包,安装zip和unzip

yum -y install zip unzip

对压缩包进行解压操作:

unzip freeswitch-1.6.20.zip

解压出来有个后缀不太好看就改个名字:

mv freeswitch-1.6.20 freeswitch

这一步结束后就去安装一些依赖

yum install -y git gcc-c++ wget alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel db-devel e2fsprogs-devel flite-devel g722_1-devel gdbm-devel gnutls-devel ilbc2-devel ldns-devel libcodec2-devel libcurl-devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsilk-devel libsndfile-devel libtiff-devel libtheora-devel libtool libvorbis-devel libxml2-devel lua-devel lzo-devel mongo-c-driver-devel ncurses-devel net-snmp-devel openssl-devel opus-devel pcre-devel perl perl-ExtUtils-Embed pkgconfig portaudio-devel postgresql-devel python26-devel python-devel soundtouch-devel speex-devel sqlite-devel unbound-devel unixODBC-devel libuuid-devel which yasm zlib-devel
依赖有些可能装不上,暂时不管

再一次编译 
运行 ./bootstrap.sh 
接着运行 ./configure

运行make指令,如果出现报错就看看这个帖子:https://blog.youkuaiyun.com/hnzwx888/article/details/88745276

我遇到了Neither yasm nor nasm have been found这个问题,使用

((which nasm) || (which yasm) || (git clone https://github.com/yasm/yasm.git && cd yasm && ./autogen.sh && make && make install))

完美解决,重新编译,对于用不到的一些包报错,去Makefile将报错位置#屏蔽掉就行

随后make install

基本上就成功了。


接下来是把容器打包成镜像,使用

docker commit [容器id] <打包名>

得到镜像,因为我这个是要在别的机子上去跑的,所以后面用了一个

docker save [IMAGE ID] 目标文件名.tar

能够在根目录下看到该文件的存在,还挺大,最后docker中文件转到本地就是

 

 

写在最后:

Github上如果直接拉取仓库代码太慢的话可以先将Git代码存在码云仓库里,再从仓库拉,速度要快很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值