docker生命周期
仓库
目前Docker官方维护了一个公共仓库Docker Hub,大部分需求可以在Docker Hub中下载镜像来实现。
可以通过命令进行搜索
docker search [OPTIONS] TERM
下载官方镜像到到本地可以通过
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
修改镜像的tag
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
将镜像上传到仓库
docker push [OPTIONS] NAME[:TAG]
镜像
Docker镜像和Docker容器的概念理解,可以通过编程语言中类和对象的关系进行理解。 一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系最多可以127层。
我们称第一层叫基础镜像,例如我们可以从docker hub上下载基础镜像,然后在基础镜像的基础上添加我们的需求,形成新一层镜像。
镜像通过ID进行识别,可以通过
docker images
列举出本地所有有效镜像。
可以通过docker history Image
查看镜像的层级信息。容器
容器可以使用命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
进行创建。
容器是一个在所有镜像层之上增加了一个可写层。容器有两种状态:运行态和退出态。当我们使用docker run 启动一个容器的时候,容器进入运行态,当使用docker stop或其他方式停止docker容器时,容器进入退出态。 我们对容器的变更都会写到**容器的文件系统中**,**而不是写到镜像中**。
docker概念介绍
namespace(命名空间)
每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样,容器和容器之间互不影响。
cgroup(控制组)
对共享资源进行隔离、限制、审计等,控制分配到容器的资源,避免过多的容器同时运行对系统资源的竞争。
UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对 文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
docker优势
- 作为云主机使用
- 环境标准化和版本控制
- 隔离性
docker劣势
- 系统服务docker化的障碍
- 并非所有的应用程序都适合docker化
- 公用Linux内核,存在安全隐患
docker应用场景
- Web 应用的自动化打包和发布
- 持续集成和持续部署
- 微服务架构使用
docker与虚拟机对比
Docker容器 | VM |
---|---|
操作系统 | 与宿主主机共享OS |
存储大小 | 镜像小,便于存储和传输 |
运行性能 | 几乎没有额外的性能损失 |
移植性 | 轻便、灵活适用于Linux |
硬件亲和性 | 面向软件开发者 |
部署速度 | 快速、秒级 |
docker命令
docker image ls
docker image ls -a
docker system df #查看容器、镜像、数据卷所占用的控件
docker image ls -f dangling=true
docker image prune
docker image ls -f since=[镜像名]
docker image ls -f before=[镜像名]
docker image ls -f label=[label]
docker image rm [镜像] #删除本地镜像
docker rmi [镜像] #删除本地镜像
docker image rm $(docker iamge ls -q redis)
docker image rm $(docker image ls -q -f before=mongo:3.2)
docker commit (供学习和其他特殊应用场合使用,不要使用该命令定制镜像,应使用Dockerfile)
docker run
docker exec
docker history
Dockerfile
Dockerfile是一个文本文件,其内包含一条一条指令,每条指令构建一层,因此一条指令的内容就是描述该层应该如何构建。Dockerfile功能很强大,提供了大概十多个指令供我们使用
指令介绍
- FROM 指定基础镜像,docker hub上有很多镜像,可以直接拿来使用作为基础镜像
- RUN 执行命令,因为一个命令会创建一层,所以可以使用RUN指令,并使用
&&
将各个需求指令串联起来,支持在行位添加\
的命令换行方式,以及行首使用#
进行注释 - COPY 将上下文中的某个文件复制到docker镜像里
COPY ./compose.json /usr/var
上下文在docker build -t 镜像名 .
最后的.
代表的就是上下文目录,注意源文件的各种元数据都会保留,比如读写执行权限,文件变更时间等信息。 - ADD 更高级的复制文件,可以是一个url,这时Docker引擎会去试图下载这个文件,如果是个tar压缩文件,ADD指令会去试图解压这个文件到目标路径
- CMD 和RUN指令相似
CMD <命令>
或者CMD ['可执行文件','参数1','参数2']
- ENTRYPOINT 入口点
- ENV 设置环境变量
- EXPOSE 声明端口
Docker-compose使用
我们可以使用Dockerfile方便的定义一个单独的容器,但是,在日常工作中,经常会碰到多个容器相互配合来完成某个任务的情况,这个时候我们就需要一种可以对docker容器集群进行快速编排的工具,docker-compose就是一种定义和运行多个Docker容器的应用。我们可以通过定义一个docker-compose.yml
文件来定义一组相互关联的应用容器
一个简单的docker-compose示例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
分析上述的docker-compose.yml
该项目含有两个service一个叫web 一个叫redis,其中web使用的是当前目录下的Dockerfile构建而来,redis使用redis:alpine
镜像构建。
运行docker-compose项目使用docker-compose up
Docker-compose指令
image
指令labels
为容器添加Docker元数据信息build
container_name
depends_on
解决容器的依赖、启动先后的问题dns
env_file
environment
expose
extra_hosts
类似--add-host
参数,会在启动后的服务容器中/etc/hosts
文件添加logging
配置日志选项,其下有两个参数driver
和options
ports
暴露端口信息,类似-p
sysctls
设置容器内核参数ulimits
设置容器ulimits
限制值volumes
设置数据卷挂载路径(HOST:CONTAINER:ro)类似-v
links
不推荐使用,类似--link