docker practice
Docker三个基本概念:
镜像Image:分层存储Union FS,静态不变;Ubuntu/Debian有UnionFS较优,而CentOS/RHEL只有devicemapper,loop-lvm、direct-lvm都较差,/var/lib/docker还会不断增大(删除镜像也没用)
容器Container:运行镜像时再封装容器存储层,容器可以创建、启动、停止、删除、暂停等,持久化数据应使用数据卷Volume、或绑定宿主目录
仓库Repository:user/image:tag,user默认library,tag默认latest,常用服务有hub.docker.com、quay.io,国内:daocloud.io,私服有Nexus
镜像补丁:
docker run --name webserver -d -p 80:80 nginx # 访问 http://localhost docker exec -it webserver bash # 修改 /usr/share/nginx/html/index.html
docker diff webserver # 查看有哪些变化,容器停止后会丢失修改;缺点:变化太多,暗箱操作,镜像臃肿
docker commit --author "name <email>" --message "vi index.html" webserver nginx:v2 # 保存容器为新镜像 nginx:v2
docker history nginx:v2 # 查看 nginx:v2 历史
docker run --name web2 -d -p 81:80 nginx:v2 # 运行新镜像
镜像定制:scratch,特殊空白镜像,是个虚拟概念,并不实际存在;swarm、coreos/etcd等不以系统为基础,直接复制可执行文件,因此镜像极为小巧,go语言特别适合容器微服务架构
FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
docker build -t nginx:v3 . # 构建镜像,最后的点是指定上下文,COPY ./package.json /app/,是从上下文来查找package.json文件
服务类:nginx、redis、mongo、mysql、httpd、php、tomcat;语言类:node、openjdk、python、ruby、golang;系统类:ubuntu、debian、centos、fedora、alpine
RUN有两种格式:RUN cmd,RUN ["exe", "arg1", "arg2"],每个RUN都会增加一层,docker限制127层(曾经是限42层),多个命令可以&&串联
FROM ubuntu:16.04 RUN apt-get update \ && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/* ENTRYPOINT [ "curl", "-s", "http://ip.cn" ] # CMD [ "curl", "-s", "http://ip.cn" ] CMD表示容器启动时执行命令,而ENTRYPOINT会将CMD当作参数
docker run myip -i # 对于CMD会被-i覆盖而报错,而ENTRYPOINT则会附加参数-i
VOLUME /data # 匿名卷,写入时不进入容器存储层,从而保证容器存储层的无状态化
docker run -d -v mydata:/data xxxx # 挂载宿主目录,数据持久化
容器管理
docker attach cli # exit退出会导致容器停止 docker exec -it cli bash # exit退出容器不会停止,-it表示有tty交互界面
docker rm -f $(docker ps -qa) # 停止所有运行容器,然后删除
docker conotainer prune # 删除所有已停止的容器
虚拟网络
docker network create -d bridge my-net # -d 支持bridge、overlay,后者用于swarm mode
docker run -it --rm --name busybox1 --network my-net busybox sh # 运行容器并加入网络
docker run -it --rm --name busybox2 --network my-net busybox sh # ping busybox1,会自动解析成ip并成功