#示例
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无须任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行
容器由两部分组成:1.应用程序本身;2.依赖:比如应用程序需要的库或者其他软件容器在Host操作系统的用户空间中运行,与操作系统的其他进程隔离
传统的虚拟化技术,如VMWare,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖,还得安装整个操作系统
Q:为什么需要容器?容器到底解决的是什么问题?
A:容器使软件具备了超强的可移植能力
systemctl status docker.service
对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段
镜像是Docker容器的基石,容器是镜像的运行实例,有了镜像才能启动容器
base镜像有两层含义:1.不依赖其他镜像,从scratch构建;2.其他镜像可以以之为基础进行扩展
内核空间是kernel,linux刚启动时会加载bootfs文件系统,之后bootfs会被卸载掉。用户空间的文件系统是rootfs,包含我们熟悉的/dev、/proc、/bin等目录
不同linux发行版的区别主要就是rootfs
Docker将build context中的所有文件发送给Docker Daemon
build context为镜像构建提供所需要的文件或目录,该目录下的所有文件和子目录都会被发送给Docker Daemon
使用build context得小心
docker history会显示镜像的构建历史,也就是Dockerfile的执行过程
用docker run -it启动镜像的一个容器可用来调试镜像
RUN:执行命令并创建新的镜像层,RUN经常用于安装软件包
CMD:设置容器启动后默认执行的命令及其参数,但CMD能够被docker run后面跟的命令行参数替换,同下
ENTRYPOINT:配置容器启动时运行的命令,命令执行完后容器退出
只要命令不结束,容器就不会退出。可用“while true;do sleep 1;done”类似命令
#Shell格式
<instruction> <command>
#例子
RUN apt-get install python3
#Exec格式
<instruction> ["executable","param1","param2",...]
#例子
RUN ["apt-get","install","python3"]
p54:为镜像命名
#指定容器名字 --name "my_http_server"
docker run --name "my_http_server" -d httpd
ctrl + p然后 ctrl + q 退出容器
pause,让容器暂停工作一段时间
暂停状态的容器不会占用CPU资源,直到通过docker unpause 恢复运行
注意:docker rm是删除容器,而docker rmi是删除镜像
docker rm id1 id2
#批量删除所有已经退出的容器
docker rm -v $(docker ps -aq -f status=exited)
#-m或-memory:设置内存限额;--memory-swap:设置内存+swap的使用限额
#允许该容器最多使用200M的内存和100M的swap。两个参数默认为-1,即对容器内存和swap的使用没有限制
docker run -m 200M --memory-swap=300M ubuntu
#如果在启动容器时只指定-m而不指定--memory-swap,那么--memory-swap默认为-m的两倍
#--vm 1:启动1个内存工作线程
#--vm-bytes 280M:每个线程分配280M内存
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
cpu share并不是CPU资源的绝对数量,而是一个相对的权重值
通过cpu share可以设置容器使用CPU的优先级
#A的cpu share是B的两倍,即当两个容器都需要CPU资源时,A时B的两倍
docker run --name "container_A" -c 1024 ubuntu docker run --name "container_B" -c 512 ubuntu
linux操作系统通过cgroup可以设置进程使用CPU、内存和IO资源的限额。在、sys/fs/cgroup中找到它
namespace实现了容器间资源的隔离。linux使用了6种namespace,分别对应6种资源:Mount、UTS、IPC、PID、Network和User
Mount namespace让容器看上去拥有整个文件系统。容器有自己的 / 目录,可以执行mount和umount命令
UTS namespace让容器有自己的hostname。默认容器的hostname是它的短ID,可以通过-h或–hostname参数设置
IPC namespace让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与host和其他容器的IPC混在一起
容器在host中以进程的形式进行
ps axf
进程的PID不同于host中对应进程的PID,容器中的PID=1的进程当然也不是host的init进程
Network namespace让容器拥有自己独立的网卡、IP、路由等资源
User namespace让容器能够管理自己的用户,host不能看到容器中的创建的用户
Docker在安装时会自动在host上创建三个网络
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
8b0d117bc3e9 bridge bridge local
141547838fdc host host local
ccad61ac09be none null local
的网络配置与host完全一样。可以通过–network=host指定使用host网络。