Docker概述
Docker为何要出现
由于传统的方式,不能打包环境,而环境的配置也及其繁琐,及其耗费时间,而docker就可以非常有效的解决这个问题
docker的思想来源于集装箱,docker的核心思想!打包装箱,也就是说每个箱子都是隔开的,docker通过这种机制可以吧服务器利用到极致
docker为什么这么多人喜欢用
在类似docker这种技术出现之前,我们用的都是虚拟机,而虚拟机和docker都称为虚拟化技术,不同的则是:
- 虚拟机安装和启动相当于一个全新的操作系统,体积十分的大
- docker则是直接运行在宿主机的,而且每个容器是相互隔离的,每个容器都有属于自己的文件系统,而每个容器相同的东西是共用的,互不影响,也十分的小巧
docker是基于go语言开发的,是一个开源项目
docker官网:https://www.docker.com/
docker的官方文档:https://docs.docker.com/
docker的镜像仓库:https://hub.docker.com/
- 应用更快熟的交付和部署
- 更便利的升级的扩展,删减
- 更简单的系统运维
- 更高效的计算机资源利用
Docker安装
参考官方文档和百度以及Google
Docker的基本组成
-
镜像(images)
可以通过镜像来创建多个容器
-
容器(container)
利用容器化技术,独立运行应用,通过镜像来创建,目前可以理解为一个简易的linux
-
仓库(repository)
存放镜像的地方,分为私有和公有,国内结合阿里云的容器的镜像加速服务使用
Docker的常用命令
帮助命令
docker version # 查看docker的版本信息
docker info # 查看docker的系统信息,包含镜像和容器的数量
docker 命令 --help #帮助命令,帮助文档:https://docs.docker.com/engine/reference/commandline/build/
镜像命令
docker images # 查看本地主机上的所有镜像,也可以用docker image ls
# 解释
#REPOSITORY # 镜像的仓库源
#TAG # 镜像的标签
#IMAGE ID # 镜像的id
#CREATED # 镜像的创建时间
#SIZE # 镜像的大小
docker search # 搜索镜像
docker pull #下载镜像
docker rmi # 删除镜像
docker pull下载镜像
#下载镜像 docker pull 镜像名[:tag]
❯ docker pull gcc
Using default tag: latest
latest: Pulling from library/gcc #不写tag默认就是latest
b9a857cbf04d: Already exists # 分层下载 docker images的核心,联和文件系统
d557ee20540b: Already exists
3b9ca4f00c2e: Already exists
667fd949ed93: Already exists
4ad46e8a18e5: Already exists
6b12d912e8a1: Pull complete
469a7950a2b4: Pull complete
b0ef12232a36: Pull complete
c261ba6eb26c: Pull complete
Digest: sha256:f418921b872c4831dfc9bc33aaec2a8480d37e46190da766c3497cd8d5fedb75 # 防伪签名
Status: Downloaded newer image for gcc:latest
docker.io/library/gcc:latest # 真实地址
docker rmi删除镜像
docker rmi -f 镜像id #删除指定的镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id#删除指定的镜像
docker rmi -f $(docker images -aq) #删除全部的镜像
容器命令
docker run 镜像id # 新建容器并启动
docker ps # 列出所有运行的容器 docker container list
docker rm 容器id # 删除指定容器
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
注:我们有了镜像才可以创建容器,linux
> docker container
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container # 当前shell下 attach连接指定运行的镜像
commit Create a new image from a container's changes # 提交当前容器为新的镜像
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Run 'docker container COMMAND --help' for more information on a command.
新建容器并启动
docker run [可选参数] images | docker container run [可选参数] image
#参数说明书
--name="Name" # 容器名字 tomcat01 tomcat02 用来区分容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-p # 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P(大写) 随机指定端口
# 测试
❯ docker run -it centos
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
7a0437f04f83: Already exists
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
i[root@8f62df7602af /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@8f62df7602af /]# exit # 退出容器到主机
exit
查看当前正在运行的容器
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
565c3e0b43ca centos "/bin/bash" 12 seconds ago Up 11 seconds
practical_hermann
退出容器
exit # 直接退出容器
ctrl+p+Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的容器,可以使用rm -rf强行删除
docker rm -f $(docker ps -aq) # 删除指定的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
常用的其它命令
后台启动命令
# docker run -d 镜像
❯ docker run -d centos
0a739d000eafcb8e190e890ed06832de1b7ee2f1544d59fcd60390699f1612fe
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 常见的坑,docker容器使用后台运行,就必须要有一个前端进程,docker发现没有应用,就会自动停止
查看日志
# 显示日志
-tf # 显示日志信息(一直更新)
--tail number # 需要显示日志条数
docker logs -t --tail n 容器id # 查看n行日志
docker logs -ft 容器id # 跟着日志
查看镜像的元数据
❯ docker inspect centos #centos为容器id或名称
[
{
"Id": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
..........
}
]
进入当前正在运行的容器
docker exec -it 容器id bashshell # 进入当前容器重开一个终端,可以在里面操作
docker attach 容器id # 进入当前容器正在执行的终端
从容器拷贝到主机上
docker cp 容器id:容器内路径 主机
Docker镜像讲解
镜像是什么
镜像其实就是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,将所有的应用和环境打包成docker镜像,即可直接运行
Docker镜像加载原理
-
UnionFs(联合文件系统)
我们下载的时候看见的一层层的就是这个
也就是一种分层,轻量级并且高性能的文件系统,支持对文件系统修改作为一次提交来一层层叠加,同时可以将不同的目录挂载在同一个虚拟文件系统下,是docker镜像的基础,镜像可以分层继承
特性:可以一次加载多个文件系统,但总体就一个文件系统,联和加载会把各层文件系统叠加起来,最终的文件系统就会包含底层的所有文件和目录
分层
最大的好处就是资源共享,查看镜像分层的方式可以通过docker images inspect
来查看
理解
所有的docker都起始于一个基础的镜像层,当进行修改的或者新加内容时,就会在当前的镜像层之上新建镜像层,类似于游戏打补丁
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统 一的文件系统
Linux上可用的存储引撃有AUFS、 Overlay2、 Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于 Linux中对应的文件系统或者块设备技术,井且每种存储引擎都有其独有的性能特点
Docker在 Windows上仅支持 windowsfilter 一种存储引擎,该引擎基于NTFS文件系统之上实现了分层 和CoW
docker镜像都是只读的,当容器启动的时候,一个新的可写层加载到镜像的顶部,这一层就是我们常说的容器层,容器之下的都叫镜像
commit镜像
# 和git的原理类似
docker commit -m="描述" -a="作者" 容器id 目标镜像名[:TAG]