docker保存自定义容器

上一篇介绍如何搭建lnmp环境
现在基本的环境已经部署好了,想把整个容器保存起来,像备份系统一样把容器备份起来。
把容器先保存成镜像,下次直接用保存起来的镜像来生成容器实例来运行,这样运行起来的容器是自己定义好的(自己备份时候的)样子。
将容器保存成镜像

debian是容器名称
mydebian 是保存的镜像名称

再查看镜像列表,就已经多了一个mydebian容器了

保存成镜像后,你就可以用这个镜像生成无数个容器了,而你的镜像不受任务影响。

还可将镜像保存成本地文件

将mydebian镜像保存成当前目录的mydebian.tar的文件

当然也可以从当前的文件中导入到镜像

将mydebian.tar文件导入成testdebian镜像

再查看镜像列表

testdebian已成功导入
当然你还可以把mydebian.tar拷到别的机器上导入。

我觉得开发人员使用docker可以像使用git的分支一样使用。需要一个环境的时候,生成一个docker容器,然后在容器上折腾,等折腾完了,不需要了再把容器删除了即可。等需要另外一个环境,再生成一个容器折腾。
对于我这种时常需要切换不同环境的开发者来说,docker可比虚拟机要好用多了。

docker上搭建LNMP环境

上一篇介绍在一个nginx容器上,如何管理docker容器
继续扩展,搭建一整套的环境,如LNMP环境( nginx + mysql + php)。
网上有介绍是通过容器连接的方式来实现,也就是一个nginx容器,一个mysql容器,一个php容器,然后通过配置来连接起来。形成一整套开发环境。
但对于一个开发环境来说,我并不建议这样子来做,因为开发环境本来就是要一个独立的环境,增加复杂性不说,独立性还不能保证。
我建议的方式是在一个容器里直接搭好所有的环境,然后启动容器的时候,一整套环境就启动起来。
上一篇已经有一个nginx容器上,可以登录到nginx容器中,在上面继续把mysql和php都装了。
但我选择重新下载一个干净有debian容器
使用命令

命令把镜像下载到本地

多了一个debian镜像(当然也可以选择其它的如ubuntu,centos之类的系统,看个人喜好)

用debian新建一个容器并启动起来

 

绑定了80端口和3306端口,3306是方便以后要访问mysql用

登录容器并执行bash

先装些必要的工作,比如

于是开始你的安装环境之旅吧

具体的安装过程网络上有很多,比如这里
How To Install Linux, Nginx, MySQL, PHP (LEMP Stack) on Debian 8

这样lnmp环境就安装好了。但当你再次启动debina容器的时候,这些服务是不会自己起来的,还是要你再登录进容器来手动启动这些服务。

一个解决方法是在根目录下新建个脚本 startup.sh,

填入以下内容

这个脚本的内容是启动mysql,nginx和php服务
保存妈出

给脚本执行权限

 

退出并关闭容器,

 

然后试下再启动

然后执行容器里的 startup.sh脚本来启动服务

服务都启动成功了,环境搭建完成。
下一篇想介绍一下如何保存并导入自定义好的镜像。

管理docker容器

上一篇介绍了安装和启动一个容器,并通过端口绑定成功访问到启动的nginx服务。
然而围住一想,还是什么也做不了:
1.nginx的根目录在哪,我们怎么更改它,怎么让它访问我们想它它访问的文件?
2.nginx的配置文件在哪。怎么加一个服务?或者怎么修改配置文件?

带着这些疑问往下说

一,绑定本地目录到容器目录
和绑定端口一样,子可以绑定本地的目录到容器中,这样可以在本地编辑文件,通过容器中的服务来访问。
首先把昨天创建的容器删除

重新生成并启动容器

通过-v命令,可以把本地的目录绑定到容器中,上面命令是把本地的 /web目录绑定到/var/www/html。
为什么要绑定到/var/www/html目录,好吧,后台看配置文件的时候会看到,当然可以绑定到别的目录,到时候改nginx的配置文件即可。

通过绑定后,就可以在你本地 /web下加任务你想加html文件,就可以通过浏览器访问了。就和编辑你本地的服务器文件一样。

二,登录到容器
运行起来的nginx容器,其它就是一个linux系统,当然也可以登录上去。
通过命令

就可以登录到正在运行的webserver容器了。命令行也已经切换到了容器里面。
-u 是指定登录的用户名
webserver 是当前运行的容器实例
bash 是登录上去运行的命令

登录上去后,这就是一个linux系统,可以查看系统信息

可以

还可以

不过安装软件前先apt-get update

当然也可以登录上去后运行任何命令,比如 ls 命令

这条命令的意思是登录到webserver容器上执行 ls 命令,执行完后就退出了

三,修改容器上的文件
1,直接在服务器上修改
既然已经登录到容器上了,就像使用linux系统一样,怎么改都可以。
但当你很高兴地打出vi /etc/nginx/nginx.conf的时候,会发现

啥?vi都没有,是的,vi也没有,这是一个相当干净的系统。
你只有自己装个vim再修改

安装完成后就可以用vi /etc/nginx/nginx.conf来修改配置文件了

2.在本地和容器间拷贝文件

docker的拷贝命令

这个命令和scp命令有点像

现在拷贝webserver容器中的/etc/nginx/nginx.conf文件 到当前目录

拷贝下来后,在你本地修改这个配置文件

修改完成后,再拷贝到容器中
拷贝当前目录下的nginx.conf文件到web容器的/etc/nginx/目录下

同理也可以用这种方式修改其它的文件和文件夹

好了,有时候光有了nginx还不行,还需要php,mysql等等。
下一篇打算写写如何打造真正的开发环境

开发人员打开docker的方式

以前写过一篇mac下利用docker搭建开发环境的文,但那时是用的boot2docker作为客户端搭建的,现在docker原生支持mac了,方便了许多。
首先,我是不建议直接在macOS系统中直接搭建各种开发环境的,一来会把软件装多了会把mac系统扰乱。会出现各种莫名其妙的环境问题。二来如果遇到环境要升级的问题也会很乱,三来macOS系统基本上也是一年升级一次,也会使各种搭好的环境出现问题。
一个解决办法是用VirtualBox来装虚拟机来解决,以前我也是这么干的,但虚拟机很重,想重新搭个环境要花比较长的时间,比如突然想下ubuntu16.10系统搭个开发环境。先下载系统,安装系统进虚拟机,然后再启动系统装环境。
现在有了docker一切问题都得到解决了欧耶。
就像船和集装箱一样。只要符合标准的集装箱,不用处理都可以直接往轮船上搬。而docker就是轮船这样的一种角色。一个装容器的容器,只是符合它的标准的容器都可以往上面装。
如果你想装个python环境,直接放个已经装好python环境的容器去运行起来,就是一个现成的python环境;
如果你想装一个nginx来运行web,直接放个已经装好nginx环境的容器。就是一个nginx环境了。
如果你现在用的是python2.7的环境,突然要用到python3,也可以直接装个python3的环境就是了,还避免了环境干扰。而且用完即删。
docker的发明最大的意义就是用于运维,但对于一个开发人员,也同样需要。

一.mac上装docker
到这里去下载安装即可
安装完成后运行,在右上角有一个小鲸鱼图标,docker就正常启动了,可以在终端里使用docker命令。

二.列出本地镜像
1.列出已存在本地的镜像

 

现在是空的,一个镜像也没有
假如我要装个nginx环境。怎么办?先去搜索一下吧

2.搜索镜像

 

搜出一大堆,下载第一个吧

3.下载镜像
$ docker pull nginx
等待完成,然后再用docker images命令列出本地镜像

 

nginx镜像已下载到本地

4.运行镜像,也就是用镜像来实例化一个容器并运行(可以拿面向对象中的类和实例来作比)

 

意思是:用nginx镜像,来运行一个容器,容器的名字叫webserver,-d 是后台运行,-p是绑定端口,在这里只绑定了80端口(即把本机的80端口和容器的80端口绑定,访问本机的80端口相当于访问容器的80端口)
成功生成容器并运行,查看一下运行的实例吧

5.查看运行实例

 

从左到右分别是容器id,所使用的镜像,运行时的命令,创建时间,状态,绑定的端口,名字
容器已经运行起来
在浏览器上输入http://localhost/,会出现nginx 欢迎页面

6.关闭容器

7.其它的一些常用命令

列出所有的容器(包括运行中的,和已经停止的)
docker ps -a

启动一个容器

 

删除容器

docker rm -f webserver (强制删除,如果容器正在运行,这条命令会先关闭容器,再删除之)

删除镜像(记住是镜像,不是容器)

 

这个是基础,下一篇打算写写可以更高效利用docker来开发

配置mac自带的php-fpm和安装phpreids插件

直接运行,有报错找不到配置文件。
$ php-fpm
[11-Jan-2014 16:03:03] ERROR: failed to open configuration file ‘/private/etc/php-fpm.conf’: No such file or directory (2)
[11-Jan-2014 16:03:03] ERROR: failed to load configuration file ‘/private/etc/php-fpm.conf’
[11-Jan-2014 16:03:03] ERROR: FPM initialization failed
可以在/private/etc/ 目录下生成配置文件,需要root权限(sudo)
或者在普通用户有权限的目录里放置配置文件,通过–fpm-config参数指定配置文件的位置,如下:
# cp /private/etc/php-fpm.conf.default /usr/local/etc/php-fpm.conf

$ php-fpm –fpm-config /usr/local/etc/php-fpm.conf
[11-Jan-2014 16:10:49] ERROR: failed to open error_log (/usr/var/log/php-fpm.log): No such file or directory (2)
[11-Jan-2014 16:10:49] ERROR: failed to post process the configuration
[11-Jan-2014 16:10:49] ERROR: FPM initialization failed
错误信息显示:不能正确的打开”日志“文件,原因是默认在/usr/var目录下工作,可以修改配置文件指定正确的日志文件路径

$ vim /usr/local/etc/php-fpm.conf
修改php-fpm.conf文件中的error_log项,默认前缀是/usr/var ,但并没有这个路径

error_log = /usr/local/var/log/php-fpm.log
pid = /usr/local/var/run/php-fpm.pid
或者不修改配置文件中配置项的路径,在php-fpm的运行参数中(-p)指定放置运行时文件的相对路径前缀

$ php-fpm –fpm-config /usr/local/etc/php-fpm.conf –prefix /usr/local/var
到此,php-fpm守护进程已经基本可以正确的启动了。

下面我们看下php.ini配置

# cp /etc/php.ini.default /etc/php.ini

变更own,以后修改不用老是切换root,生产环境最好不要改

# chown …

mac下通过docker搭建LEMP环境

在mac下通过docker搭建LEMP环境境

1.安装virtualbox。由于docker是在lxc环境的容器

2.安装boot2docker,用于与docker客户端通讯

> brew update
> brew install docker
> brew install boot2docker
3.初始化boot2docker,也就是在virtualbox上安装一个docker的host环境

boot2docker init
此时会下载一个镜像

4.启动虚拟机host

复制代码
:~$ boot2docker up
Waiting for VM and Docker daemon to start…
………………..ooo
Started.

To connect the Docker client to the Docker daemon, please set:
export DOCKER_HOST=tcp://192.168.59.103:2375
unset DOCKER_CERT_PATH
复制代码
这样host环境就启动起来了,根据提示设置环境变量

export DOCKER_HOST=tcp://192.168.59.103:2375
后boot2docker就能与host环境的docker客户端连接了

5.连接host环境的docker客户端

复制代码
MacBook-Pro:~$ boot2docker ssh
## .