目录
- 1、docker介绍
- 1.1 docker是什么
- 1.2 容器与虚拟机的比较
- 2、docker安装
- 2.1 docker 基本组成
- 2.2 安装步骤
- 2.3 阿里云镜像加速
- 2.4 run干了什么
- 3、docker常用命令
- 3.1 帮助命令及启动命令
- 3.2 镜像命令
- 3.3 容器命令
- 4、Docker镜像
- 4.1 镜像是什么?
- 4.2 分层镜像 UnionFS 联合文件系统
- 4.3 镜像加载原理
- 4.4 重点理解
- 4.5 修改原始镜像并保存为新的镜像(生成镜像的方法)
1、docker介绍
1.1 docker是什么
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker原理:一次镜像,处处运行,从搬家到搬楼。把能运行的程序以及环境打包成一个镜像文件,在docker上运行。
docker是什么:docker是一个解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
1.2 容器与虚拟机的比较
- 传统虚拟机技术 是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
- 容器 内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
2、docker安装
2.1 docker 基本组成
- 镜像(image)(类比java中的类)
- 容器(container)(类比java中的实例对象)
- 仓库(repository)(集中存放镜像文件的地方)(国内一般都用阿里云)
Docker镜像(lmage)就是一个只读的模板。镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
docker平台架构图解:
2.2 安装步骤
安装地址: https://docs.docker.com/engine/install/centos/.
我安装的是CentOS7版本
- 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
- yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
- 安装需要的软件包
sudo yum install -y yum-utils
- 设置stable镜像仓库,用阿里云的
yum-config-manager --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新yum软件包索引
yum makecache fast
- 安装DOCKER ce 社区版
yum -y install docker-ce docker-ce-cli containerd.io
- 启动docker
# 启动(执行命令后没有输出,是正常)
systemctl start docker
# 查看启动是否成功
ps -ef | grep docker
# 查看版本号
docker version
- 测试
# 启动hello-world镜像
docker run hello-world
- 卸载
# 停止docker服务
systemctl stop docker
# 删除docker服务
yum remove docker-ce docker-ce-cli containerd.io
# 删除docker的一些配置文件、库、包等
rm -rf /var/lib/docker
# 删除docker容器等相关东西
rm -rf /var/lib/containerd
2.3 阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxx.xxxxx.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.4 run干了什么
doker底层原理:
docker是一个 client-server 结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问。当docker-server接收到docker-client的指令,就会执行这个命令。
docker为什么比VM快?
- docker有着比虚拟机更少的抽象层
- docker利用的是宿主机的内核,而虚拟机每次都需要重新搭建一个操作系统内核
所以说,新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,直接用的宿主机的操作系统,省略了这个复杂的过程。
3、docker常用命令
3.1 帮助命令及启动命令
# 1.启动docker
systemctl start docker
# 2.停止docker
systemctl stop docker
# 3.重启docker
systemctl restart docker
# 4.查看docker状态
systemctl status docker
# 5.开机启动
systemctl enable docker
# 6.查看docker概要信息
docker info
# 7.查看docker总体帮助文档
docker --help
# 8.查看docker命令帮助文档(会列出命令的可选参数)
docker 具体命令 --help
3.2 镜像命令
1.列出本地的镜像
# 1.列出本地的镜像
docker images [OPTIONS]
-a 列出本地所有的镜像,含历史映像
-q 只显示镜像ID
2、查远方仓库某个镜像
docker search [OPTIONS] 镜像名字
--limit:只列出N个镜像,默认25个
# 举例
docker search --limit 5 redis
3、下载镜像到本地
docker pull 镜像名字[:TAG]
TAG:版本号,默认是下载最新的latest
指定版本:
4、查看镜像、容器、数据卷所占空间
docker system df
目前3个镜像(mysql-latest、mysql-5.7、hello-world)1个容器(hello-world)
5、删除某个镜像
docker rmi [-f] 镜像名字(或imageID)
rmi:就是 remove image 的意思
注:如果删不掉,可能镜像被某个容器正在用,可以加 -f 强制删除
# 删除单个镜像
docker rmi -f 镜像[:TAG] # 也可以按照镜像id删除
# 删除多个镜像
docker rmi -f 镜像[:TAG] 镜像[:TAG] # 也可以按照镜像id删除
# 删除所有的镜像,($符号是引用的意思)
docker rmi -f $(docker images -qa)
3.3 容器命令
有镜像才能创建容器 (java中由类才能创建对象实例)
下载一个centos镜像来测试学习
docker pull centos
1、新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 参数说明
--name="name" 容器名字,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080 跟主机映射
四种方式: -p 主机端口:容器端口 (常用)
-p ip:主机端口:容器端口
-p 容器端口
容器端口
-P 大写,随机指定端口
# COMMAND 说明
例如 使用 -it 进行交互运行,交互运行肯定需要一个控制台
可使用 /bin/bash
可通过如下指令启动并进入容器
docker run -it centos /bin/bash
进入之后,ls可发现,容器内就是一个自己的服务器环境!它就是我们下载的centos,就是一个小型的服务器!
exit # 退出容器
2、查看正在运行的容器
# 查看正在运行的容器
docker ps
# 查看正在运行的容器以及历史中启动过的容器
docker ps -a
# 查看最近创建的容器
docker ps -l
# 显示最近n个创建的容器
docker ps -n 2
# 显示当前正在运行的容器编号
docker ps -q
# 显示所有启动过的容器编号
docker ps -aq
3、退出容器
# run进去容器,exit退出,容器会停止
exit
# run进去容器,ctrl+p+q退出,容器不会停止
ctrl+p+q
通过 ctrl+p+q 运行
4、停止容器
docker stop 容器ID(容器名)
5、启动已经停止过的容器
docker start 容器ID(容器名)
6、重启容器
docker restart 容器ID(容器名)
7、强制停止容器
docker kill 容器ID(容器名)
8、删除已停止容器
# 不能删除正在运行的容器(可以先stop下,再去删),也可以指定 -f 强制删除
docker rm [-f] 容器ID(容器名)
# 两种方式删除多个(危险)
docker rm [-f] $(docker ps -a -q)
docker ps -a -q | xargs docker rm
9、后台启动容器
docker run -d centos
如果仅仅上面这样启动的话会发现 centos 立即停止了。因为docker容器使用后台方式运行时,必须要有一个前台进程,否则就会自动停止。
如果要后台启动容器,且保持运行状态,一种方式是加上-it
docker run -d -it centos /bin/bash
10、进入正在运行的容器(后台运行的容器)(重要)
docker exec -it 容器id /bin/bash
注意:通过后台启动的容器,在exec进入容器后,当exit退出后,容器不会停止运行。
docker exec -it 容器ID(容器名) [COMMAND]
docker attach 容器ID(容器名)
# 举例
docker exec -it 4216d5daf8e5 /bin/bash
docker attach 4216d5daf8e5
两者区别:
exec 是在容器中打开新的终端,并且启动新的进程。用exit退出,不会 导致容器的停止。(实际用的多)
attach 直接进入容器启动命令的终端,不会启动新的进程。用exit退出,会导致容器的停止。
11、查看容器日志
docker logs 容器ID(容器名)
12、查看容器内运行的进程
docker top 容器ID(容器名)
13、查看容器内部细节(已json格式展示)
docker inspect 容器ID(容器名)
14、从容器内拷贝文件到主机上 (重要)
docker cp 容器ID:容器内路径 目的主机路径
容器内所做的修改不会因为容器的停止而消失。即容器在关闭状态下也可以拷贝
15、部署nginx(本机通过一个端口号可访问到容器中的nginx)
docker pull nginx # 拉取
docker run -d --name nginx01 -p 3344:80 nginx # 启动容器,并将宿主机3344端口与容器内部端口80绑定,宿主机通过3344端口可访问到此容器
本机自测:
端口暴漏的概念:
首先服务器安全组开放3344端口,然后就算过了第一层防护。其次服务器防火墙要开放3344端口,过第二层防护,然后根据服务器的3344端口绑定容器中的80端口,访问到nginx服务!
需要在阿里云安全组配置3344端口:
然后就可以通过服务器公网:3344 进行访问容器内的80端口
进入容器:
16、导入和导出容器(整个容器做备份) (重要)
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
说明:
export 导出容器的内容流作为一个tar归档文件[对应import命令]
import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
举例:
docker export 4a364837bb4f > myos.tar
cat myos.tar | docker import - huige/myos:3.7
4、Docker镜像
4.1 镜像是什么?
镜像是一种轻量级、可执行的独立软件包。用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包成docker镜像,传给别人,就可以直接跑起来。
如何得到镜像:
- 从远程仓库下载
- 别人拷贝给你
- 自己制作一个镜像
4.2 分层镜像 UnionFS 联合文件系统
Docker中的镜像是分层的,就是为了保证复用。
Union文件系统(UnionFS) 是一种 分层、轻量级 并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。即当两个不同镜像有重叠部分时,不需要下载两次,一次即可,复用。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含底层的文件和目录。
4.3 镜像加载原理
docker的镜像实际上由一层一层的文件系统组成
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等标准目录和文件。可以很小的只包含最基本的命令,工具和程序库,这就是一个小的 linux。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
4.4 重点理解
(1)镜像下载时是分层下载的方式,如果某个层已经存在,则不会重复下载!
例如 docker pull redis
(2)Docker镜像层都是只读的,容器层是可写的
即 pull 下来的镜像是不会改变的,当我们通过 run 新建一个容器后,一个新的可写层被加载到镜像的顶部,这一层通常被称作容器层,容器下面的层叫做镜像层。
所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
4.5 修改原始镜像并保存为新的镜像(生成镜像的方法)
docker commit 根据镜像创建一个容器后,对容器做修改后,将镜像层和容器层打包并提交使之成为一个新的镜像。
docker commit [OPTIONS] 容器id [REPOSITORY[:TAG]]
例如:
docker commit -m="这里是提交的信息" -a "作者" 容器id 目标镜像名:TAG
举例:
原始 ubuntu 没有vim命令,先去下载 ubuntu 镜像到本地,启动镜像,在容器中安装vim,然后在命令行窗口执行 commit ,生成我们自己的新镜像,启动新镜像与老的进行对比。
过程:
拉取镜像并创建容器运行:
发现vim不存在,安装
提交新镜像,并查看内存变化