1. 什么是容器
首先 —— 容器是一种虚拟化的方案,但与传统的虚拟机不同
传统虚拟机—— 通过中间层将一台或多台独立的机器虚拟运行在物理硬件之上
容器 —— 直接运行在操作系统上的用户空间,所以也被成为操作系统虚拟化,
只能运行相同或相似内核的操作系统
docker —— 依赖于linux的内核特性,所以只能运行以linux为基础的系统
有点 —— 不需要包含操作系统(虚拟机包含),所以资源占用减少,虚拟机需要模拟硬件行为,对内存和cup损
耗比较大,容器技术较复杂,不易管理,不易自动化,而docker很好的解决了这一系列行为
docker —— 将应用程序自动部署到容器的开源引擎,go语言,拥有应用程序部署引擎
docker特点 —— 简单轻量的建模方式、职责的逻辑分离、快速高效的开发生命周期(环境一直),面向服务的架
构(单个容器只运行一个)
docker作用 —— 使用docker容器开发、测试、部署;隔离运行环境;测试环境;PaaS;SaaS
2. docker的基本组成
-
Client 客户端
-
Daemon 守护进程
-
Image 镜像
-
Container 容器
-
Registry 仓库
-
客户端/守护进程 ——> c/s
客户端发送命令,命令传给守护进程,守护进程将结果返回给客户端
-
镜像
容器的基石,基于镜像启动与运行,层叠的只读文件系统
-
容器
通过镜像启动,执行单元,从镜像的可写层中(镜像顶层),写时复制
-
仓库
保存用户构建的镜像,docker hub(公用镜像)
关系 —— 客户端访问docker的守护进程,从而操作docker的容器,而容器是通过镜像进行启动与执行的,而镜像
保存在仓库之中,以上几位docker各部分的关系
3. docker容器相关技术
docker依赖的linux内核特性
-
Namespaces 命名空间
-
Control groups(cgroups) 控制组
Namespaces
变成语言包含命名空间的概念,可以理解为是一种封装的概念,而封装本省就是代码隔离
在操作系统中命名空间提供系统资源隔离(进程、网络、文件系统等)
Control groups(cgroups)
分配资源。资源限制,优先级设定,资源计量,资源控制
docker容器的能力
-
文件隔离系统——每个容器都有自己的root文件系统
-
进程隔离——每个容器都运行在自己的进程环境之中
-
网络隔离——容器间的虚拟网络接口和IP地址都是分开的
-
资源隔离与分组——使用cgroups将cpu和内存之类的资源独立分配给每个docker容器
4. 安装命令
-
检查内核版本
uanme -a
-
检查device mapper(存储驱动)
ls -l /sys/class/misc/device-mapper、
推荐使用docker维护的版本
-
检查APT的https支持查看/usr/lib/apt/methods/https文件是否存在,如果不存在则运行安装命令进行安装(apt-get update) ,然后 apt-get install -y apt-transport-https
-
添加docker的APT仓库
echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list
-
添加仓库的key
apt-key adv --keyserver hkp://keysever.ubuntu.com:80 --recv-keys 36.......E9(此处为key,省略)
-
安装
apt-get update
apt-get install -y lxc-docker
由于以上安装比较繁琐,所以推出了建议安装版本
-
sudo apt-get install -y curl
-
curl -sSL https://get.docker.com/ubuntu/ | sudo sh
5. 容器的基本命令
-
启动容器
docker run image【command】【arg...】
docker run -i -t image /bin/bash 提供交互式的容器
-i --interactive=true|false 默认为false 始终打开标准输入
-t --tty=true|false 默认为false 为创建的容器分配一个伪tty终端
-
查看容器
docker ps 【-a】(列出所有的容器)【-l】(列出最新的容器)
不加参数时是列出运行中的容器
docker inspect 容器名字或者容器Id
-
自定义容器名
docker run --name (自定义名字) -i -t image /bin/bash
-
重启启用停止的容器
docker start 【-i】 容器名
-
删除不在运行中的容器
docker rm 容器名称或ID
守护式容器
什么是守护式容器——能够长期运行、没有交互式回话、适合运行应用程序与服务
启动守护式容器的方法
-
以交互式容器的方式启动,然后以ctrl+P,ctrl+Q的方式退出该交互式容器,注意两个ctrl命令是连续的
-
以run命令启动一个守护式容器 docker run -d image 【command】【arg...】
附加到运行中的容器(即重新进入守护式容器)
docker attach 容器名
查看容器日志
docker logs 【-f】【-t】【--tail】 容器名
-f --follows=true|false 默认为false 跟踪日志并返回结果
-t --timestamps=true|false 默认为false 返回的结果上加上时间戳
--tail ="all" 返回结尾处日志数量
查看容器内进程
docker top 容器名
在运行中的容器中启动新进程
docker exec 【-d】【-i】【-t】容器名【command】【args...】
停止守护式容器
-
docker stop 容器名
发送一个信号等待容器结束
-
docker kill 容器名
直接停止容器
man docker -run/man docker -logs查看清晰命令
6. 容器的使用(部署静态网站)
-
设置容器的端口映射
run -P -p
-P,--publish -all=true|false 默认为false 为容器暴露的所有端口进行映射
docker run -P -i -t ubuntu /bin/bash
-p,--publish=[] 指定映射那些容器的端口
docker run -p 80 -i -t ubuntu /bin/bash
其中端口的映射有多种方式,推荐下面两种
指定宿主机和容器的端口,即 8080:80 ——将容器80端口映射到宿主机的8080端口
指定宿主机IP+port:容器端口 ,即0.0.0.0:8080:80
-
安装Nginx
-
docker run -p 80 --name web -i -t ubuntu /bin/bash
-
运行apt-get install -y nginx
-
如果提示Unable to locate package nginx,则先运行 apt-get update
-
安装vim apt-get install -y vim
-
创建包 mkdir -p /var/www/html
-
切换目录 创建一个index.html vim index.html
-
书写简单的页面内容
-
通过whereis nginx查看nginx的安装目录
-
ls /etc/nginx/sites-enabled/
-
vim /etc/nginx/sites-enabled/default
-
编辑 增加 root /var/www/html
-
切换到根目录运行nginx(直接输入nginx便可以直接运行)
-
通过ps -ef便可以查到nginx已经运行
-
以守护容器退出(上述方法)
-
可以使用docker ps 查看端口使用情况,也可以使用docker port 容器名称,查看端口情况
-
使用curl http://127.0.0.1:32768 查看是否可以返回index.html页面
当容器停止后,端口号也会随之发生变化,这点要注意
7.docker镜像的查看与删除
-
列出镜像
docker images 【optsions】【repository】
-a,--all=false 不显示中间层镜像
-f,--filter=[] 显示式的过滤条件
--no-trunc = false 指定不使用截断的形式(id长度)
-q,--quiet=false 只显示镜像的唯一Id
-
镜像的仓库与标签组成一个完整的镜像,获得唯一Id
-
查看镜像的完整信息
docker inspect 【options】container|image (容器或镜像)
-
删除一个镜像
docker rmi 【options】image
-f,--force 强制删除镜像
--no-prune=false 不删除被打标签的父镜像
docker rmi $(docker images ubuntu -q) 删除ubuntu的所有镜像 ,原因是docker images ubuntu -q
只返回镜像id,而rmi支持多个删除,中间用空格间隔
8. 获取与推送镜像
-
查找镜像
通过docker search 【options】trem
--automated=false 只会显示自动化构建的
--no-trunc=false 不截断
-s,--stars=0 星级,限制最低星级
只会返回最多25条
-
拉取镜像
docker pull 【options】name【:tag】
-a,--all-tags=false 所有镜像
加速镜像拉取得方法
修改/etc/default/docker
添加DOCKER_OPTS="--registry-mirror=http://MIRROR-ADDR(该部分的地址为在daocloud.io中获
取的地址)"
重新启动守护进程 service docker restart
-
推送镜像
docker push 【name】
push 前先进行账号登录
docker login -u 账号 -p 密码
9. 构建镜像
为什么要构建镜像
-
保存对容器的修改,并再次使用
-
自定义镜像的能力
-
一软件的形式打包并分发服务及其运行环境
构建方式
-
docker commit 通过容器构建
-
docker build 通过Dockerfile文件构建
通过docker commit 构建镜像
-
docker commit 【OPTIONS】container【repository】【:tag】
-a,--author="" 作者
-m,message="" 提交信息
-p,--pause=true 不暂停正在运行的容器
通过docker build构建镜像
创建dockerfile
使用docker build命令
10. docker的远程访问
-
修改vim /lib/systemd/system/docker.service 文件
-
在ExecStart=/usr/bin/dockerd增加参数设置
-
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock --label name=docker_service_1
其中--label name=docker_service_1 为标识 tcp://0.0.0.0:2375代表可以通过ip+2375端口进行远程访问
-
验证在另一台可以访问的docker端访问curl http://ip:2375/info 可以查到信息,并能从中找到标示
docker_service_1 ,代表远程访问成功
上面是服务端的配置,那么客户端如何进行远程调用,向服务端的守护线程发送命令呢
-
在运行命令的时候添加-H tcp://ip:2375 例如docker -H tcp://29.106.21.163:2375 info
-
在客户端添加docker_host 命令行为export DOCKER_HOST="tcp://ip:2375"
然后便可以像调用本地的守护线程一样调用,当不适用远程的服务端时,直接将docker_host 置空
export DOCKER_HOST=""
-
-