概述
我们常常使用虚拟机来搭建环境,然而,虚拟机比较笨重,对于有时需要同时虚拟多个环境(例如发布网站,做分布式实验等)创建多个虚拟机往往花大量时间且需要分配大量内存与硬盘空间(动则几十G)。Docker作为一个容器,真正解决了我们仅仅是需要一个运行环境的需求,一个容器可能只有1,200M,且新建与删除容器都十分简便,搭建好的环境可以做新的镜像方便异地部署,并且可以同时开许多个容器(共用宿主资源而不是重新单独分配)。下面,就ubuntu系统下探索docker。(因为ubuntu作为服务器端有更广泛的应用)。
安装docker
使用管理员帐号登录ubuntu系统,保证该管理员拥有 root 权限,或者可以执行sudo命令。
安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
安装 GPG 证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/dockerce/linux/ubuntu $(lsb_release -cs) stable
更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
确认 Docker 是否安装成功。
sudo docker ps -a
设置国内下载镜像
Docker 默认的 hub 服务器位于国外速度奇慢,推荐用国内的阿里云镜像或 daocloud 的镜像。 笔者注册在这两个网站都进行了注册,可选择使用。 经过实测,在下载大文件(超过 2G)的 docker 镜像时, 阿里云镜像更稳定一些,不会出现连接超时错误。
使用 daocloud 镜像:
echo "DOCKER_OPTS=\"--registry-mirror=http://2851a677.m.daocloud.io\"" | sudo tee -a /etc/default/docker
使用阿里云镜像:
echo "DOCKER_OPTS=\"--registry-mirror=https://bqr1dr1n.mirror.aliyuncs.com\"" | sudo tee -a /etc/default/docker
修改完成后,重启 docker 服务。
sudo service docker restart
下载版 ubuntu 系统镜像并查看本地镜像
下载 14.04 版的 ubuntu 系统。此操作需要网络环境,实验用的机器中已经下载完成,
可直接使用。
sudo docker pull ubuntu:14.04
查看已有本地镜像:
sudo docker images
创建并启动容器
创建并启动容器
docker run -it --name=ubuntu_demo ubuntu:14.04 "/bin/bash
这里,参数-it 代表启动交互式终端,新启动的容器名称为 ubuntu_demo, 使用刚下载
的 ubunt:14.04 镜像产生。
查看容器运行情况
运行以下命令, 可以查看已经运行的容器
sudo docker ps
运行以下命令,查看全部容器:
Sudo docker ps -a
执行以下命令, 创建一个新的容器,并按 ctrl+d 退出。
sudo docker run -ti --name=ubuntu_demo2 ubuntu:14.04 '/bin/bash
删除容器
按ctrl+p+q退出容器登录,注意容器仍在后台运行
停止容器
sudo docker stop ubuntu_test
删除容器
sudo docker rm ubuntu_test
退出容器
退出容器且关闭
ctrl+d
// 或者
exit
后续若要使用这个容器,需要先重启,再连接连接。(start+attach)
退出容器但不关闭
ctrl+p+q
容器在后台继续运行。 后续继续使用容器, 只需要连接上去即可。(attach)
启动、 停止已有容器
重新启动已经关闭的容器
sudo docker start ubuntu_demo
关闭容器
sudo docker stop ubuntu_demo
连接到已启动容器
attach
可以连接到用启动时指定交互终端的容器,如前(已创建好)面的命令,这种命令执行完毕后会直接切换到容器终端
docker run -it --name=ubuntu_demo ubuntu:14.04 "/bin/bash"
连接到已经启动的容器,命令输完后, 可能需要再次按 enter 键才能进入容器系统
sudo docker attach ubuntu_demo
可以使用以下命令, 一次完成启动+连接两个操作
sudo docker start -i ubuntu_demo
exec
当我们需要 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下,
可以使用-d 参数。 d 参数运行的容器为后台进程, 这种方式启动的好处在于不会用 ctrl+d误 停止掉容器, 要想停止容器,只能使用 sudo docker stop 命令。
sudo docker run -d --name centos7-d centos-hadoop
这时不能使用 sudo docker attach master 命令进行连接(打开并连接状态但是在后台运行),可以使用
docker exec -it centos7-d /bin/bash
修改容器并提交为镜像
镜像 image: docker 镜像从概念上讲类似于 vm 里面的 iso 文件,就是一个只读的模
板。一个镜像可以包含一个 Linux 操作系统,里面安装了一系列的软件。镜像可以拷到任
何装了 docker 的机器上运行。
仓库 Repository:存储 docker 镜像的地方就是镜像仓库, 全球最大的 docker 镜像仓库
是 docker.io, 里面有大量官方和民间的优秀镜像可以直接拿过来使用,如 mysql, centos
等等。阿里也有自己的 docker 仓库 docker.alibaba-inc.com。
容器 container:容器与镜像的关系有点像进程与程序的关系,运行中的镜像就叫容器。
从原理上讲, 容器事实上是镜像上面加了一层读写层,以及一个被隔离的进程空间。这样
就可以在不更改镜像的基础上还能像普通 vm一样读写数据。
操作后提交为一个新的镜像
sudo docker run -it --name=centos_test centos7-ssh '/bin/bash' # 创建容器
# 修改容器, 安装 hadoop、 spark 等, 做了一堆操作
sudo docker commit centos_test centos7-hadoop_demo # 将容器提交为镜像
删除镜像
可以很方便的删除镜像。这里注意两点:
一是删除的镜像必须没有依赖它允许的容器,如果有,则需要删除依赖它的容器;
二是删除默认的 TAG 为 latest。 一个好的习惯是创建和删除镜像时都加上个性化(如
时间) 标签,一个镜像名下不同的标签值创建、删除等操作是独立的。
sudo docker rmi centos7-hadoop_demo