目录
- Docker简介
- docker下载安装
- 常用命令
- 帮助启动类命令
- 镜像命令
- 容器命令
- 镜像分层概念
- commit命令
- 本地镜像发布到腾讯云
- docker容器数据卷
- 宿主机和容器内添加容器卷案例
- 读写规则
- 容器卷的继承
学习视频来自 https://www.bilibili.com/video/BV1gr4y1U7CY
Docker简介
Docker出现原因
开发一个程序,如何保证在服务器能跑,如何保证在部署过程中不出现令人头疼的版本、配置问题,答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。
安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。
docker理念
Docker是基于Go语言实现的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
什么是Docker
Docker 是在Linux容器技术的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
与虚拟机的比较
虚拟机(virtual machine)就是带环境安装的一种解决方案。
它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
但是虚拟机存在以下缺点
1 资源占用多 2 冗余步骤多 3 启动慢
docker三要素
仓库:存放镜像的地方
镜像:初学可以理解java中的类
容器:初学可以理解java中的对象
也是一个CS的架构,类似Mysql
docker下载安装
官网:https://www.docker.com/
官方仓库:https://hub.docker.com
linux上安装
以下内容在官网可以看到
官网安装步骤
1,确认是centos7以上版本 cat /etc/redhat-release
2,卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
3,yun安装gcc相关
yun -y install gcc
yun -y install gcc-c++
4,安装需要的软件包
sudo yum install -y yum-utils
5,设置镜像仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6,安装docker引擎,按y下一步就行
sudo yum install docker-ce docker-ce-cli containerd.io
7,启动docker
sudo systemctl start docker
8,测试
docker version
9,运行一个docker镜像
docker run hello-world
阿里云镜像加速
在这个地址
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
一步步执行2里面的命令即可
常用命令
帮助启动类命令
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl status docker
#开机启动docker
systemctl enable docker
docker info
docker --help
docker 具体命令 --help
镜像命令
#列出本地主机的所有镜像
#REPOSITORY:表示镜像的仓库源,TAG:镜像的标签版本号,IMAGE ID:镜像ID,CREATED:镜像创建时间,SIZE:镜像大小
docker images
#从远程仓库搜索镜像,stars为点赞数,official为官方认证,AUTOMATED是否自动构建
docker search hello
#拉取镜像,不写tag默认是最新的
docker pull 镜像名字:tag
#查看镜像,容器所占空间等信息
docker system df
#删除镜像
docker rmi -f 名字/或者id
#删除多个
docker rmi -f 名字/或者id,名字/或者id
#传参删除
docker rmi -f $(docker images -aq)
什么是虚悬镜像?
仓库名、标签都是的镜像,俗称虚悬镜像dangling image
容器命令
以安装ubuntu为例
创建运行容器docker run -it ubuntu /bin/bash
· 新建+启动容器
· docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
· OPTIONS说明
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名字" 为容器指定一个名称;
docker run -it --name=myubuntu ubuntu bash
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);
-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
列出所有的容器docker ps
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
退出容器
两种方式
exit :退出时容器会关闭
ctrl+p+q :退出时容器不会关闭
启动已经停止的容器
docker start 容器id或者名字
停止容器
docker stop 容器id或者名字
强制停止容器
docker kill 容器id或者名字
删除已经停止的容器
docker rm 容器id或者名字
##强制删除,正在运行的也可以删除
docker rm -f 容器id或者名字
#删除所有的的
docker rm -f $(docker ps -a -q)
启动守护式容器(后台服务器)
docker run -d 容器名
查看容器的日志
docker logs 容器id
查看容器内部细节
docker inspect 容器id
进入正在运行的容器
docker exec -it 容器id /bin/bash
docker attach 容器id
两个的区别是attach相当于直接进入,exec相当于远程连接进入,attach进入后exit退出会直接把容器关掉,exec进入退出是相当于关闭远程连接
从容器复制文件到主机
docker cp 容器id:容器内路径 目的路径
导入和导出容器
#导出容器的内容留作为一个tar归档文件[对应import命令]
docker export 容器ID > 文件名.tar
#从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
镜像分层概念
镜像
是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。
分层的镜像
以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载。
UnionFS(联合文件系统)
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
为什么 Docker 镜像要采用这种分层结构呢
镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。
比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
重点理解
Docker镜像层都是只读的,容器层是可写的 当容器启动时,一个新的可写层被加载到镜像的顶部。 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
commit命令
docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
· 案例演示ubuntu安装vim
· 原始的默认Ubuntu镜像是不带着vim命令的
1,运行容器
docker run -it ubuntu /bin/bash
2,在容器内使用vim ,发现vim not found
3,先更新apt,再安装vim,测试之后发现能使用vim
apt-get update
apt-get install vim
4,退出容器,提交成一个新的镜像
docker commit -m "添加vim" -a "Xiao" f4ec3bdba1c3 myubuntu:1.0
5,再运行这个容器,发现是有vim的
本地镜像发布到腾讯云
1,先进到容器镜像服务
2,创建一个命名空间,创建完成之后创建仓库,选中你创建的命名空间
3,点击快捷指令,按照需求执行即可
docker容器数据卷
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
将运用与运行的环境打包镜像,run后形成容器实例运行 ,但是我们对数据的要求希望是持久化的
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
为了能保存数据在docker中我们使用卷
特点:
1:数据卷可在容器之间共享或重用数据
2:卷中的更改可以直接实时生效,爽
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
命令如下
docker run -it -v /宿主机目录:/容器内目录 ubuntu /bin/bash
宿主机和容器内添加容器卷案例
docker run -it -v /tem/hostdockerdata:/tem/dockerdata --name=u1 ubuntu
#在该目录下,我们发现创建修改文件都会同步到宿主机或者容器中
#如果失败,尝试加上参数 --privileged=true
#如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限
使用命令docker inspect 容器id
进行查看
读写规则
默认是rw 上面的案例等于
docker run -it -v /tem/hostdockerdata:/tem/dockerdata:rw --name=u1 ubuntu
ro:容器内部只能读,不能写
docker run -it -v /tem/hostdockerdata:/tem/dockerdata:ro --name=u1 ubuntu
我们在容器内想去修改,会提升如下
容器卷的继承
docker run -it --volumes-from 父容器id或者名字--name u2 ubuntu