Docker 是目前运维必掌握技能之一,它可以将一个开发环境的部署变得非常方便,其内部是基于一个镜像创建容器,让应用程序在容器内运行的模型。
比如,我们pull了一个Ubuntu 14.04的镜像,那么它就相当于一个“底包”,基于这个镜像,你可以开启多个容器(container),每一个容器都是一个独立的运行环境,可以运行各自的应用程序。
下面记录一下一些基本的操作,本文适用于小白简单实践,如有错误,敬请指正。
-
Docker的安装
这里我采用的是daocloud的镜像源。系统为Ubuntu 16.04 LTS 64位。
直接运行命令安装稳定版docker:
curl -sSL https://get.daocloud.io/docker | sh
安装完后运行
docker -v
可以看到docker版本
$ docker -v
Docker version 17.05.0-ce, build 89658be
即安装成功。
如果你在使用docker时遇到
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.29/containers/create: dial unix /var/run/docker.sock: connect: permission denied
这个问题,是因为当前登录用户不在docker执行组,所以需要添加进去
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
newgrp - docker
这样就可以了。
-
拉取Docker镜像
这里我们也是用daocloud的镜像源进行镜像拉取。镜像搜索地址:http://hub.daocloud.io/
搜索完毕后查看镜像地址,比如Ubuntu14.04的地址为
执行命令
sudo docker pull daocloud.io/library/ubuntu:14.04
拉取镜像成功
同样的操作再拉取一个mongodb的镜像。
查看当前拥有的镜像:
sudo docker images
看这里已经列出刚刚拉取的两个镜像了,接下来就可以基于镜像创建容器。
-
创建容器,对容器简单操作
容器交互.png
创建容器并启动的命令是docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
比如,我们要启动一个简单容器(基于mongo镜像)可以执行
sudo docker run -it 51f03b16565e /bin/bash
此时docker会随机分配一个name给此容器并且命令窗口会进入此容器交互:
可以看到容器内是一个精简版linux系统。
然后我们在这里就可以像操作实体linux系统一样操作这个容器,比如查看目录,文件,开启服务等等。
运行exit
即可退出容器,回到主机命令窗口交互。
查看当前运行以及所有容器使用命令:docker ps [-a]
查看所有容器
那么,到这里我们可以看到这个容器的一些状态和信息,本身的container id,基于的image id, 交互命令,创建时间,当前运行状态,端口映射,别名等。
如果我想要重新启动这个容器,怎么办呢?
sudo docker start 49addd9c43a3
就可以了,同理你也可以stop它。
但是执行完毕后,并没有像run那样直接进入容器内交互,要想再进入容器中进行交互需要:
sudo docker attach 49addd9c43a3
即可,当然这得需要容器已经运行才可以。
那串数字就是容器id,所以你会发现每次都用id很麻烦,name就派上用场了。
我们可以在创建新容器启动时就赋予它一个别名用来代替id进行后续操作。
重新启动一个新的容器如下:
sudo docker run -it --name mongo 51f03b16565e /bin/bash
再次查看sudo docker ps -a
设置容器name
可以看到,这个容器拥有了我们指定的别名“mongo”。有了这个名字,上面的命令中用到container id的地方就可以用这个别名来替代,是不是方便了许多。 -
在容器内开启mongo服务并将端口映射到宿主端口
端口未映射
如果我们不做端口映射,那么容器只会出现下图PORTS这样,宿主机是访问不到容器的。
所以我们需要映射,容器端口映射可在创建时加上port参数-p。
先将之前的容器删除,使用rm
sudo docker stop mongo
sudo docker rm mongo
重新开启端口映射的守护式容器
sudo docker run -itd -p 27016:27017 --name mongo 51f03b16565e /bin/bash
其中
-d是指开启守护式容器,就是直接在后台运行,不进入容器交互shell
-p参数就是我们的端口映射,参数为hostPort:containerPort,可以加多个映射。
结果如下:
开启端口映射
这样就实现了宿主机27016端口映射到容器内27017端口。
下面我们用简单的php程序来验证我们的端口映射成功。用宿主机php-mongo驱动连接27016端口,看是否可以用到容器内的27017即mongo服务
本文所用工具为php7.1 + nginx 1.10 + mongodb3.4.4
php 7.1mongodb驱动与php7之前的mongo驱动有变动,并非之前的php-mongo扩展,请使用pecl安装最新驱动。安装好的标志是,进入phpinfo()页面可以看到mongo驱动在列表中。如下图
编写php程序,连接mongodb并写入一些数据,这里就直接用菜鸟教程中的示例代码:
<?php
// 连接数据库
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27016");
// 插入数据
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1, 'name'=>'菜鸟教程', 'url' => 'http://www.runoob.com']);
$bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']);
$bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']);
$manager->executeBulkWrite('test.sites', $bulk);
?>
注意这里的端口并非mongodb默认端口27017,而是宿主机的27016端口,而27016映射到我们的docker中的27017,所以如果这里程序可以连接成功,说明我们的端口映射成功,即在外部宿主机即可向容器内mongodb数据库中写入数据
接下来,看结果:
直接将之前创建好的mongo docker启动,并进入开启其mongod服务,等待外部php程序执行写操作。
sudo docker start mongo
sudo docker ps
docker mongo已启动,端口已映射
进入交互界面,启动mongod服务(即打开27017端口服务):
sudo docker exec -it mongo /bin/bash
nohup mongod &
mongo
容器启动mongod成功
(当然这里启动mongod也可以不进入shell启动,直接在exec命令后加上shell命令即可,如
sudo docker exec -it mongo /bin/bash nohup mongod &
就可以了,如想查看数据库内容,直接
sudo docker attach mongo
就可以再次进入容器交互,查看数据)好,服务启动完毕,执行上面的php代码,无报错。查看mongodb内容
show dbs
发现多了一个test库,查看此库
use test
show tables
发现多一张表,查看其中数据
db.sites.find().pretty()
至此,我们用简单的程序验证了docker 容器端口映射的实践,这对多容器服务非常重要。
如有错误,敬请指正~
网友评论