Part 1
章节一 欢迎来到docker
安全:想安装某个软件,但又担心中病毒?别担心,有docker。
省时:上班忙,但又担心下班没时间照顾老婆孩子?别担心,有docker。
分发应用:制作了一个很棒的软件,但又担心用户安装起来麻烦?别担心,有docker。
简单:系统庞大,难以管理?别担心,有docker。
docker的权威解释(垃圾翻译)
Docker是一个命令行程序,一个后台守护进程,并且提供了一系列的远程服务–解决通用问题、简化安装、运行、发布和移除软件。Docker使用了UNIX技术–容器(Containers)。
docker的特点(划重点,突然觉得事情变得更加有趣了)
- 是一个容器,
- 和虚拟机的本质区别是:虚拟机需要依靠硬件虚拟化,而docker直接依赖主机的linux内核,没有其他添加,保证原汁原味。
- 隔离应用。开启docker,实际上开启了docker cli和docker daemon,每个容器都作为docker daemon的子进程,每个容器里面有独有的内存空间和资源。
- 集装箱。把容器比作集装箱。镜像(image)是docker中可装载的单元。registries和indexes用来简化镜像的分发。(不明觉厉)
为什么使用docker?
想象一下,一个软件,你要考虑这个软件在哪个平台运行,需要哪些依赖软件或资源,怎么卸载,怎么保证安全?
- 便于管理软件。如果不使用docker,软件越多,需要引用的依赖就越复杂,整个软件系统一片混乱。使用docker,我们将软件放在一个个的容器里,互不干扰。
- 移植性。软件要在不同平台运行。(说的我很想用docker啊,这正是我想要的)
- 安全性。保护计算机不受恶意软件的攻击,反正软件在容器里面,你病毒再怎么强大,也跑不出来。
为什么docker这么重要?
- docker提供了抽象的特性。我们要安装一个软件,我们只需要告诉docker我们要安装这个软件,其他的事情docker会帮我们解决。
- docker为各大大公司所使用和维护,比如谷歌、微软、亚马逊,你还用担心docker不好用?
- docker之于PC,乃app store之于移动端。
什么时候什么地点使用docker
很不幸,docker只能用在linux系统软件。。
案例:Helloworld
- 注册docker,安装docker win客户端,貌似需要重启两次,第二次docker会为我们开启Hyper-v(坑,开启Hyper-v后不能使用vmware,也就是说,docker和vmware你只能二选一,所以我还是把docker装虚拟机吧。)
- 打开cmd,运行
docker run dockerinaction/hello_world
docker run的运行流程:先在本地找镜像,如果没有,那么在docker hub(docker提供的公用注册中心)上找,如果有,下载安装,创建容器运行程序。
注意:因为镜像地址在国外,所以可以使用国内的镜像资源。这里我选择阿里云的容器镜像服务,百度搜索即可。在镜像中心-镜像加速器中找到加速器地址。
win版docker配置:右下角找到docker客户端-settings-daemon-basis✔
{
"registry-mirrors": ["https://dh3y1ni0.mirror.aliyuncs.com"],
"insecure-registries": [],
"debug": true,
"experimental": false
}
附:docker linux环境(来自官网,一切都很顺利执行下来)
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 更新apt-get
sudo apt-get update
# 允许apt获取https的资源
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 添加docker的key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 验证是否有key
sudo apt-key fingerprint 0EBFCD88
# 添加稳定的资源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 安装docker ce
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 验证
sudo docker run hello-world
章节二 在容器中跑软件
获取docker的命令
# 列出所有顶层命令
docker help
# 列出某个命令的用法:如 docker cp --help
docker 命令名 --help
案例:创建一个监控网站
- 安装并启动nginx镜像
docker run --detach --name web nginx:latest
安装成功后生成一串唯一标识符:a60d96d03c2f23a1fa9cacea194c42f64506c69bf5ecf06a3eff3bd254e11329
detach的意思是启动一个后台程序,也叫做守护进程daemon。
- 安装并启动mail镜像
# -d是--detach的缩写
docker run -d --name mailer dockerinaction/ch2_mailer
- 安装并启动交互程序
# interactive表示启动一个交互程序,支持标准输入流stdin
# tty表示分配一个虚拟终端
# link表示和nginx联系起来
docker run --interactive --tty --link web:web --name web_test busybox /bin/sh
交互程序开启了一个unix shell,跟nginx联系
测试是否连通nginx:
wget -O - http://web:80/
ctrl+p+q:终端后台挂起
- 安装并启动监听代理
docker run -it --name agent --link web:insideweb --link mailer:insidemailer dockerinaction/ch2_agent
代理监听的作用是监听nginx服务器,如果挂掉,那么通过mailer发送消息。
- 测试
5.1 查看容器状态
docker ps
5.2 重启容器
docker restart nginx
刚才启动了nginx,但是由于重启了电脑,导致docker ps找不到nginx的记录,可以通过restart命令重启nginx。
5.3 查看日志
# --follow 或 -f
docker logs --follow web
由于代理会一直测试nginx的状态,所以nginx会产生日志,从而可以判断nginx是否运行。但是这样会导致日志越来越大,第四章我们会看到volumes的使用。
5.4 关闭容器
docker stop web
关闭nginx时,代理监听到变化,调用mailer发送消息,同时mailer中也存有该日志
docker logs mailer
PID命名空间
- PID是linux中用来唯一标识进程的,PID命名空间是一组PID的集合
docker run -d --name namespaceA busybox /bin/sh -c "sleep 30000"
docker run -d --name namespaceB busybox /bin/sh -c "nc -l -p 0.0.0.0:80"
docker exec namespaceA ps
docker exec namespaceB ps
# 输出
PID USER TIME COMMAND
1 root 0:00 sleep 30000
6 root 0:00 ps
- 当然可以不使用命名空间
docker run --pid host busy ps
- 如果一个容器已经占用一个应用程序的资源,那么另一个容器使用这个应用程序会访问不到资源。
docker run -d --name webConflict nginx:latest
docker logs webConflict
上面开启了另一个nginx,但是获取不到日志内容。原因是nginx的资源已经被web占用了。
docker exec webConflict nginx -g 'daemon off;'
执行上面命令,会提示端口占用错误。
排除冲突
假设你要创建多个nginx实例,如果容器名称一样,会冲突,最简单的办法是使用id去标识,我