docker基础
docker用来解决什么问题?
先描述这样一个场景:伴随着公司业务的扩展,不可避免的会产生很多软件、配置等问题,为了解决用户体验、公司运营等需求,要求软件更新频率很高,但是又要求系统稳定运行。每一次上一个新的需求,开发人员小王将本地环境正常运行的war包、jar包交给运维人员小张,但是小张在测试(回归)环境验证总是报错,考虑到开发人员小王的水平一般,于是去咨询小王:你这个模块代码有问题吧,我在测试(回归)环境上怎么跑不出来。经过一番探讨,结果是环境问题,小王、小张相互一笑,一种鄙夷的眼神很默契的交汇在一起…总之,天下苦“传统模式”久矣,为了解决环境问题,为了运维、开发的美好未来,docker应运而生。(嘿嘿,当然不仅仅如此)
docker简介
为什么是Docker?Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源(百度百科)。通过开源以后,被Google等大公司率先使用,发展壮大,渐渐的成为了行业规范,为开发运维提供了新架构、新思路。所以是Docker。
原理
参考官方文档:https://docs.docker.com/get-started/overview/
基本架构
Docker使用客户端-服务器架构。Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以在同一系统上运行,或者您可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。
# 重启服务器后,需要重启docker服务
systemctl start docker.service
# 当docker起来不来的时候,先reload,然后重启服务试下看,如果不行只能一步步分析处理了
systemctl daemon-reload
systemctl restart docker.service
看了官方文档后还发现了,The underlying technology(底层技术):
Namespaces(命名空间):
Docker使用一种称为的技术namespaces
来提供称为容器的隔离工作区。运行容器时,Docker会为该容器创建一组名称空间。这些名称空间提供了一层隔离。容器的每个方面都在单独的名称空间中运行,并且对其的访问仅限于该名称空间。
Docker Engine在Linux上使用以下名称空间:
pid
命名空间:进程隔离(PID:进程ID)。net
命名空间:管理网络接口(NET:网络)。ipc
命名空间:管理访问IPC资源(IPC:进程间通信)。mnt
命名空间:管理文件系统挂载点(MNT:摩)。uts
命名空间:隔离内核和版本标识符。(unix时间共享系统)。
Control groups(控制组):
Linux上的Docker引擎还依赖于另一种称为控制组 (cgroups
)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。
Union file systems(联合文件系统):
联合文件系统或UnionFS是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。
Container format(容器格式化技术):
Docker Engine将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中。默认容器格式为libcontainer
。将来,Docker可以通过与BSD Jails或Solaris Zones等技术集成来支持其他容器格式。
安装
参考官方文档:https://docs.docker.com/engine/install/centos/
下面是基于centos7,安装docker
# 1、卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装yum工具包
sudo yum install -y yum-utils
# 3、更换yum源,以下任选其一
# 官方源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 清华大学
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 4、安装docker最新版引擎(推荐)
sudo yum install docker-ce docker-ce-cli containerd.io
# 有特殊需求可以选择其他版本
yum list docker-ce --showduplicates | sort -r # 可以查出<VERSION_STRING>
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 5、启动docker
sudo systemctl start docker
# 6、通过运行hello-world 映像来验证是否正确安装了Docker Engine
[root@localhost /]# sudo docker run hello-world
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 10 months ago 13.3kB
docker初体验
参考官方文档:https://docs.docker.com/get-started/part2/
# 1、从github下载测试包
curl -LO https://github.com/dockersamples/node-bulletin-board/archive/master.zip
# 2、解压
unzip master.zip
# 3、进入到测试目录
cd node-bulletin-board-master/bulletin-board-app
# 4、通过Dockerfile构建镜像
docker build --tag bulletinboard:1.0 .
# 5、通过镜像启动容器
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0
# 6、通过浏览器访问测试页面
localhost:8000
# 7、测试完成删除测试容器、镜像
docker rm --force bb
docker rmi bulletinboard:1.0
测试成功,就是下面这个页面
Docker CLI(command-line interface)
参考官方命令行文档:https://docs.docker.com/engine/reference/commandline/image_prune/
帮助命令
docker version # 显示docke