介绍
一次封装,到处运行
仓库:存放镜像的地方,dockerhub
镜像:容器的模板
容器:
镜像的实例就是容器(模板)
每个容器相互隔离
可以看做是一个简易版的linux环境(包括 用户权限,进程空间,用户空间,网络空间)和运行在其中的应用程序。
集装箱:容器
鲸鱼:docker
linux 容器:linux containers, LXC
容器与虚拟机不同,不需要捆绑一套操作系统,只需要软件工作需要的库资源和设置
虚拟机:
hypervisor 硬件虚拟化,需要单独的操作系统
docker:
操作系统层虚拟化(容器),直接利用宿主机内核
容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。
操作系统层虚拟:
亦称容器化
可以实现软件的即时迁移(Live migration),使一个软件容器中的实例,即时移动到另一个操作系统下,再重新运行起来。但是在这种技术下,软件即时迁移,只能在同样的操作系统下进行。
由于在同一台服务器上的容器实例共享同一个系统内核,因此在运行上不会存在实例与主机操作系统争夺RAM的问题发生,从而能够保证实例的性能
hypervisor vs container
命令
docker run hello-world
docker version
docker info
docker --help
docker images --help
docker images 本地镜像
docker images -a 本地镜像,包含镜像的中间层
docker search -s 30 --no-trunc tomcat 星超过30的
docker pull tomcat =>docker pull tomcat:lastst
docker rmi -f image1 image2:lastst 不加tag默认最新
docker rmi -f $(docker images -qa) 删除所有镜像
docker run --name="容器名字" -it centos(镜像名称) 交互式启动
docker start -ia 2ea90f309a16 重新进入exit的容器
--name="容器新名字": 为容器指定一个名称,不指定随机生成
-d: 后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
exit:容器停止并退出
ctrl+p+q:容器不停止退出
docker start xx
docker kill/stop xx
docker rm -f $(docker ps -a -q) docker ps -a -q |xargs docker rm //删除多个容器
docker run -d centos 后台式启动
docker ps --no-trunc 正在运行
-a 所有
-l 最近一次
-n 2 指定最近次数
docker容器后台运行,必须有一个前台进程,解决方式,将你要运行的程序以前台进程的形式运行
docker logs -t -f --tail 10 3bcfb8b57a88
-t 打印时间
-f 追加
--tail 最近条数
docker inspect 3bcfb8b57a88 查看容器内部细节
#会启动新进程
docker exec -it 3bcfb8b57a88 ls -al
docker exec -it 3bcfb8b57a88 ls /bin/sh
#不启动新进程
docker attach xxx
docker cp 3fa4e2af10c6:/tmp/ /tmp/a 拷贝文件到宿主机
端口映射
docker run -it -p 8888(主机端口):8080(docker端口) tomcat
制作新镜像
docker commit 提交容器副本使其成为一个新的镜像
docker commit -m"提交信息" containerId
commit -a'jksong' -m"tomcat_new" 2e78acdfa04c jksong/tomcat:1.0
镜像
阿里云镜像加速器
#brew镜像 https://mirror.tuna.tsinghua.edu.cn/help/homebrew/ git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask.git git -C "$(brew --repo homebrew/cask-fonts)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-fonts.git git -C "$(brew --repo homebrew/cask-drivers)" remote set-url origin https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-cask-drivers.git
unionfs:联合文件系统
对文件的修改作为一次提交来一层层的叠加,同时可以把不同的目录挂载到同一个虚拟文件系统下。
一次同时加载多个文件系统,但从外面看只来只有一个文件系统
优点:共享资源
镜像:
轻量级,可独立执行的软件包,用来打包软件运行环境和基于运行环境开发的软件,包括代码、运行库、环境变量、配置文件。
镜像都是只读的
数据卷
卷就是目录或文件,存在一个或多个容器中,由docker挂载到容器但不属于联合文件系统
解决:容器删除后数据丢失
目的:数据持久化,容器间共享数据
特点:
卷中的更改可以立刻生效
卷的更改不包含在镜像中
卷的生命周期一直持续到没有容器使用它为止
docker run -it -v /tmp/dataVolumeHost(宿主机):/dataVolumeContainer(容器) centos 目录不存在则自动创建
docker run -it -v /tmp/dataVolumeHost:/dataVolumeContainer:ro centos 容器中只读权限
docker inspect containerId 查看 Mounts 部分
"Mounts": [ { "Type": "bind", "Source": "/tmp/dataVolumeHost", "Destination": "/dataVolumeContainer", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
Dockerfile
dockerfile是用来构建docker镜像的构建文件,dockerfile->docker build->docker run
样例文件
FROM scratch #基础镜像 ADD centos-7-x86_64-docker.tar.xz / LABEL \ org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20200504" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-05-04 00:00:00+01:00" CMD ["/bin/bash"] #默认执行命令
每条指令都会创建一个新的镜像,并对镜像进行提交
执行流程:
1、docker从基础镜像运行一个容器
2、执行每一条指令并对容器作出修改,类似commit操作提交一个新镜像
3、基于提交的镜像运行一个容器
4、执行下一个命令,直到所有命令执行完成
参考:
操作系统层虚拟化
Hypervisor(硬件虚拟化)
LXC,其名称来自Linux软件容器(Linux Containers)
清华大学开源软件镜像站