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 # 删除所有已停止的容器

猜你喜欢

转载自www.cnblogs.com/xingqi/p/9048064.html