Docker使用最很详细的学习
应为Docker这个还是很长的一个东西,我怕以后忘了就习惯性写成了笔记
他的官方https://www.docker.com/
官方手册地址很详细的https://docs.docker.com/
官方文档非常详细https://docs.docker.com/engine
看的视频https://www.bilibili.com/video/BV1sK4y1s7Cj
看的视频https://www.bilibili.com/video/BV1og4y1q7M4
参考的文章https://www.jianshu.com/p/d3006b8a22ee
参考的文章https://www.runoob.com/docker/docker-tutorial.html
参考的文章https://www.cnblogs.com/dazhoushuoceshi/p/7066041.html
什么是Docker
Docker 是一个开源的应用容器引擎
他可以解决环境不一致,叫整个环境打包成一个集装箱,然后别人下载下来运行就不会出错了
容器是完全使用沙箱机制,就是隔离型,他运行的时候会在Linux内核里面开辟一个空间,这个空间不会影响其他的东西
虚拟机会站很大的空间,虚拟机会创建一个内核,
Docker与虚拟机的区别
docker有着比虚拟机更少的抽象层
Docker用的是物理机的内核
vm是自己创建一个内核环境会变的很慢
Docker的安装
他有Docker-ce版本的介绍社区版本的和Docker-ee企业版本
kali安装运行下面这个命令就可以直接安装
1 | apt install docker.io |
如果是其他的linux可以用下面这个命令安装
1 | curl -s https://get.docker.com/ | sh |
Docker的卸载
卸载依赖
1 | sudo yum remove docker-ce docker-ce-cli containerd.io |
卸载资源
1 | sudo rm -rf /var/lib/docker |
启动Docker
命令
1 | systemctl start docker |
查看是否启动成功
命令
1 | docker version |
可以运行一下helloworld
命令
1 | docker run hello-world |
Docker 镜像加速
地址有
1 | https://hub.docker.com/ //官方 |
/etc/docker/daemon.json
在这个文件里面添加下面的代码,如果没有文件创建一个文件
1 | { |
查看有没有配置好
重启docker
1 | systemctl restart docker |
重启完运行下面这个命令
1 | docker info |
出现下面出现这个就成功了
docker镜像基础命令
他的官方命令说明https://docs.docker.com/reference/
参数 | 作用 |
---|---|
images |
查看已经下载的镜像 |
search |
进行搜索镜像 |
pull |
下载镜像 |
rmi |
卸载镜像 |
save |
用-o 参数导出镜像 |
load |
用-i 进行导入镜像 |
tag |
修改镜像信息 |
查看他的命令可以用
1 | man docker |
和
1 | docker --help |
如果命令的参数不会用可以用
1 | docker 参数命令 --help |
列
1 | docker images --help |
pull下载镜像
命令
如果不指定他默认会去你配置的进行库去下载
1 | docker pull 要下载镜像的名 |
指定版本下载
下面下载的是php的7.1版本
1 | docker pull php:7.1 |
指定目录进行下载,
下载命令
1 | docker pull 下载的拉取命令 |
事例
比如下面这个地址http://hub.daocloud.io
下面是php
拉取命令是daocloud.io/library/php:7.4-alpine
进行下载
命令
1 | docker pull daocloud.io/library/php:7.4-alpine |
可以看见已经下载好了
rmi卸载镜像
查看镜像ID
命令
1 | docker images |
结果
rmi卸载镜像
命令
1 | docker rmi -f 要删除镜像的ID |
咧
命令
1 | docker rmi -f bf756fb1ae65 |
可以看见删除成功
images查看已经下载的镜像
1 | docker images |
他的表示的意思
1 | REPOSITORY 镜像的仓库源 |
他的可选参数
常用的
1 | -a, --all 列出所以镜像 |
下面咧
1 | docker images -q |
search进行搜索镜像
命令
1 | docker search 要搜索的景象名 |
测试
命令
1 | docker search mysql |
可选参数
查看可选参数
命令
1 | docker search --help |
进行过滤
镜像的导入导出
比如有的镜像下载不下来,我们就可以用别人导出的镜像进行安装
镜像的导出、
格式
1 | docker save -o 要导出的路径 镜像的ID |
实咧
查看现在我的都是有什么镜像文件命令docker images
我就叫那个php给导出出来
命令
1 | docker save -o /root/php.image e7ddddb9c714 |
查看一下文件可以看见已经导出成功了
镜像的导入
格式
1 | docker load -i 镜像的文件 |
实咧
我叫那个php给删除命令docker rmi -f 要删除的ID
我导入上面那个已经导入出来的php
命令
1 | docker load -i /root/php.image |
可以看见导入成功
修改镜像信息
可以看见我们导入的他没有名字和版本
格式
下面一个:
就代表下一个信息
1 | docker tag 进行的ID 要修改的名字:版本号:...:....:.... |
事例
命令
1 | docker tag e7ddddb9c714 php:7.1 |
可以看见修改成功
docker容器的命令
参数 | 作用 |
---|---|
run |
运行镜像 |
ps |
查看正在运行的容器 |
attach |
启动后进入容器 |
exit |
退出容器,这个退出之后容器也会停止 |
Ctrl+P+Q |
这样退出容器不会停止运行 |
start |
启动容器 |
stop |
停止容器 |
restart |
重启容器 |
kill |
强制关闭容器 |
rm |
删除容器 |
logs |
查看日志 |
run的可选参数 | 作用 |
---|---|
--name |
指定容器的名称 |
-it |
交互方法运行 主机可以进入 |
-d |
代表后台运行容器,-d和-it有冲突 |
-p |
为了映射当前Linux端口和容器端口 |
-P |
他会随机指定端口 |
ps的可选参数 | 作用 |
---|---|
-a |
查看全部的容器,包括没有运行 |
-p |
只查看容器的ID |
logs的可选参数 | 作用 |
---|---|
-f |
可以滚动查看日志的最后几行 |
-t |
显示时间 |
简单运行
在web是没有办法访问的
命令
下面这个运行如果没有他会下载在运行
1 | docker run 镜像的标识/镜像名称:版本号 |
运行常用的参数
命令
1 | docker run --name 容器名称 -it -p 宿主机端口:容器端口 镜像的ID/镜像名称:版本号 /bin/bash |
--name
容器名称:指定容器的名称-it
交互方法运行 主机可以进入-d
代表后台运行容器,上面我没有加应-d
和-it
有冲突-p
宿主机端口:容器端口:为了映射当前Linux端口和容器端口 ,他还有个-P
他会随机指定端口/bin/bash
是运行控制台 载入容器后运行 ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash
他的坑
命令
下面这个命令是在后台启动,但是发现他没有启动而是关闭了
应为他没有前端启动所以启动后就关闭了
1 | docker run -d 镜像的ID/镜像名称:版本号 |
查看正在运行的容器
用ps
参数
命令
如果ps
没有添加任何参数他会显示正在运行的容器
1 | docker ps |
可以看见下面启动了kali 容器CONTAINER ID
表示容器IDIMAGE
镜像IDCOMMAND
执行的命令CREATED
已经建立的时间STATUS
状态PORTS
用的端口NAMES
容器名字
ps还有可选参数
-a参数
-a:查看全部的容器,包括没有运行
命令
1 | docker ps -a |
-p参数
-q:只查看容器的ID
命令
1 | docker ps -q |
命令
进入容器
启动的时候直接进入容器
启动的时候直接进入容器添加-it和/bin/bash就可以直接进入容器
命令
1 | docker run -it a1765e8e381e /bin/bash |
-it
交互方法运行 主机可以进入a1765e8e381e
是镜像ID/bin/bash
是运行控制台 载入容器后运行 ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash
启动后进入容器
或者启动后用attach参数进入容器
1 | docker attach 容器ID |
还有一个exec参数进入容器
1 | docker exec 容器ID /bin/bash |
attach和exec他两个区别
exec 命令会开启新的终端
attach 这个会进入正在运行的终端
退出容器
在容器里面输入exit
退出容器,这个退出之后容器也会停止
如果不行停止可以用Ctrl+P+Q
,这样退出容器不会停止运行
可以看见他他还在运行
启动和关闭容器
如果我们关闭容器了
我们可以启动他里面的东西是不会变的
重启容器
1 | docker restart 容器ID |
关闭容器
1 | docker stop 容器ID |
强制关闭容器
1 | docker kill 容器ID |
启动容器
1 | docker start 容器ID |
然后我们这进入容器看看
1 | docker attach 容器ID |
可以看见已经进入了
删除容器
然后删除这个容器里面的东西就没有了和删除虚拟机一样
停止指定的容器
命令
1 | docker stop 容器id |
停止全部容器
命令
1 | docker stop $(docker pa -qa) |
删除指定的容器
命令
1 | docker rm 容器id |
删除全部容器
1 | docker rm $(docker pa -qa) |
查看日志
命令
1 | docker logs -f -t 容器ID |
-f
可以滚动查看日志的最后几行-t
显示时间
实咧下载和运行加进入容器
下面我先下载一个kali Linux容器
命令
1 | docker pull kalilinux/kali-linux-docker |
可以docker images
命令查看下载好的镜像
启动和进入容器
1 | docker run --name kali -it -p 5555:22 a1765e8e381e /bin/bash |
--name
容器名称:指定容器的名称-it
交互方法运行 主机可以进入-p
宿主机端口:容器端口:为了映射当前Linux端口和容器端口 ,他还有个-P
他会随机指定端口/bin/bash
是运行控制台 载入容器后运行 ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash
可以看见已经进入了
在
常用命令
参数 | 作用 |
---|---|
top |
查看容器里的进程 |
cp |
叫物理机文件复制容器里面 |
inspect |
查看容器的信息 |
history |
查看镜像是怎么做的 |
查看容器里的进程
命令
1 | docker top 容器ID |
容器和物理机传输文件
叫物理机文件复制容器里面
命令
1 | docker cp 文件名称 容器id:容器内部路径 |
实咧
命令
1 | docker cp /root/get-pip.py 702e50cf2295:/root/get-pip.py |
可以看见已经叫get-pip.py复制到容器的里面
叫容器里面文件复制物理机
命令
1 | docker cp 容器id:容器内部路径 路径文件名称 |
查看容器的信息
命令
1 | docker inspect 容器ID |
查看镜像是怎么做的
命令
1 | docker history 镜像ID |
Portaine可视化面板安装
下载Portaine
命令
1 | docker pull portainer/portainer |
创建Portainer容器
1 | docker run -d -p 8080:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name prtainer portainer/portainer |
命令的意思-d
代表后台运行容器-p
为了映射当前Linux端口和容器端口,开启的是物理机的8080访问的是容器的9000 端口
启动的是portainer/portainer
镜像
端口已经打开了
访问Portainer容器进行web管理
上面那个启动的物理机的8080我们就可以访问物理机的8080端口
命令
1 | http://物理机IP:8080 |
然后我们就可以设置密码了
下面这个我进行了谷歌翻译
镜像原理之联合文件系统
复制与https://blog.csdn.net/Saker__/article/details/107629736#_384
UnionFS(联合文件系统)
- UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
- 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
- docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
- bootfs(boot ilesystem)主要包含bootloader和kerne,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由botfs转交给内核,此时系统也会卸载bootfs。[个人理解:bootfs用于开机,rootfs用于命令。]
- rootfs(root file system),在bootfs之上。包含的就是典型Linux系统中的/de,/proc,/bin,/etc等标准目录和文件。roots就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
为什么虚拟机很大,Docker很小?
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
虚拟机是分钟级别,容器是秒级!
分层原理
所有的Docker┌镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
举一个简单的例子,假如基于UbuntuLinux16.04创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW【1】.
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
容器数据卷
什么是数据卷
数据卷:将宿主机的一个目录映射到容器的一个目录中
我们想叫容器有的数据同步在本地上,容器和本地之间可以共享数据,这个就是数据卷
简单理解就是比如vm虚拟机下载的文件下载到本地共享文件夹里面,我们删除虚拟机本地共享文件夹里面的下载文件还在
容器目录映射-v参数
上面有一个-p 5555:22
是叫本地端口映射到容器的22端口上
我们就可以用-v进行文件映射-v 主机目录:容器目录
列如下面这个
就会吧主机目录映射到容器目录里面
1 | docker run -v 主机目录:容器目录 镜像的ID/镜像名称:版本号 /bin/bash |
还可以设置权限ro
意思是只读意思
1 | docker run -v 主机目录:容器目录:ro 镜像的ID/镜像名称:版本号 /bin/bash |
容器和物理机目录映射
在物理机里面创建一个a
文件夹
命令
1 | cker run --name kali2 -it -v /root/a:/root/b a1765e8e381e /bin/bash |
--name
容器名称:指定容器的名称-v
知道映射主机目录和容器目录
启动下面这个命令他会在容器kali里面创建一个b
文件夹-it
交互方法运行 主机可以进入/bin/bash
是运行控制台 载入容器后运行 ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash
可以看见容器里面有一个b文件
查看他有没有映射成功
容器的信息里面有他的映射信息
命令
1 | docker inspect 容器ID |
可以看见映射成功
测试看看文件同步不
在物理机里面创建一个a.txt文件
可以看见容器kali里面已经有了a.txt文件
如果我们关闭容器然后在物理机创建一个文件
那在容器启动后也会有那个文件
其他的挂载
具名挂载
创建数据卷
创建数据卷之后,默认会存放在一个目录下 /war/lib/docker/volumes/数据卷名称/_data
1 | docker volume create 数据卷名称 |
查看数据卷的详细信息
1 | docker volume inspect 数据卷名称 |
查看全部数据卷
1 | docker volume ls |
删除数据卷
1 | docker volume rm 数据卷名称 |
应用数据卷
当你映射数据卷时,如果数据卷不存在,Docker会自动帮你创建,会将容器内部自带的文件,存储在默认的存放路径中
1 | docker run -v 数据卷名称:容器内部的路径 镜像id |
实咧多个容器同步挂载
多个容器挂载会用到--volumes-from
格式
1 | docker run --name kali3 -it --volumes-from 已经挂载的容器名 镜像的ID/镜像名称:版本号 /bin/bash |
实咧
容器和物理机目录映射
在物理机里面创建一个a
文件夹
命令
1 | cker run --name kali2 -it -v /root/a:/root/b a1765e8e381e /bin/bash |
--name
容器名称:指定容器的名称-v
知道映射主机目录和容器目录
启动下面这个命令他会在容器kali里面创建一个b
文件夹-it
交互方法运行 主机可以进入/bin/bash
是运行控制台 载入容器后运行 ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这个/bin/bash就表示启动容器后启动bash
可以看见容器里面有一个b文件
测试看看文件同步不
在物理机里面创建一个a.txt文件
可以看见容器kali里面已经有了a.txt文件
我在创建一个kali3的容器然后在叫这新个容器用--volumes-from
挂载在哪个已经挂载挂数据卷物理机的kali2上面
这样就实现多个容器同步了
命令
1 | docker run --name kali3 -it --volumes-from kali2 a1765e8e381e /bin/bash |
可以看见在kali3也是同步了
如果kali2容器删除了,那kali3也会正常同步的
commit参数容器变成镜像
我的这个kali已经添加和下载了很到东西,我叫我的这个kali的容器进行生成镜像,就和vm快照差不多
比如我们的用的镜像好用我们就可以叫容器打包成镜像
命令
1 | docker commit -m="提交的描述信息" -a="作者" 容器id 制作出来的镜像名:他的版本号 |
实咧
查看一下kali容器号
命令
1 | docker ps |
容器号是702e50cf2295
命令
1 | docker commit -m="kali" -a="abc" 702e50cf2295 kalilinux2:1.0 |
成功
我们查看一下进行,出来了一个kalinux2的镜像大小比原来的多0.3g
这个镜像我们直接就可以用了,
定义自己的镜像
Dockerfile的命令
他的命令记住必须大写
命令 | 作用 |
---|---|
FROM |
基础镜像信息,一切从这里开始 |
MAINTAINER |
作者的信息 ,姓名+邮箱 |
RUN |
镜像运行的时候需要运行的命令 |
ADD |
一个复制命令,把文件复制到镜像中 |
WORKDIR |
镜像的工作目录 |
VOLUME |
挂载的目录,可以将文件夹或者其他容器种得文件夹挂在到这个容器种 |
EXPOSE |
功能为暴漏容器运行时的监听端口给外部,和-P差不多 |
CMD |
功能为容器启动时要运行的命令 |
ENTRYPOINT |
功能是启动时的默认命令 |
ONBUILD |
触发命令,构建一个被继承Dockerfile,会触发ONBUILD的命令 |
COPY |
类似ADD,文件拷贝到镜像中 |
ENV |
功能为设置环境变量,就和a=10,这个a就是10一样 |
实战测试
我们安装kali linux的里面什么都没有连ifconfig
命令都没有还得需要自己下载
我想叫基本命令和ssh给添加上去
编写Dockerfile文件
我就创建一个名字是own-Kali-Linux
文件内容
1 | FROM kalilinux/kali-linux-docker |
1 | FROM kalilinux/kali-linux-docker #基础镜像信息,一切从这里开始 |
通过文件构建镜像
构建镜像用build
参数进行构建
格式
后面有一个.
1 | docker build -f 编写的Dockerfile文件名 -t 镜像名字:版本 . |
用上面的own-Kali-Linux
文件构建成镜像
命令
1 | docker build -f own-Kali-Linux -t kalilinux:1.0 . |
可以这样就可以进行执行自己写的命令了
用命令docker images
查看一下镜像可以看见有一个名kalilinux版本1.0的kali
测试自己定义的镜像
用自己定义的镜像启动容器
命令
1 | docker run -it 77319bf090e7 /bin/bash |
我们看一下我在own-Kali-Linux
里面指定的命令已经被直接了
安装了net-tools,vim,ssh
可以看见已经被安装了
查看镜像是怎么做的
命令
1 | docker history 镜像ID |
CMD和ENTRYPOINT的区别
CMD执行的命令
制作一个镜像文件
1 | FROM centos |
可以看见直接到时候就运行了ls -a
命令
如果启动的时候启动添加命令他就会报错
ENTRYPOINT执行的命令
1 | FROM centos |
可以看见直接到时候就运行了ls -a
命令
如果启动的时候启动添加命令他就没有报错
他两个的区别
CMD
如果启动的时候启动添加命令他就会报错ENTRYPOINT
如果启动的时候启动添加命令他就没有报错
上发镜像中央仓库上
登录仓库上
命令
回车之后就叫你输入密码了
1 | docker login -u 用户 回车 |
提交镜像
1 | docker push 镜像名或者镜像ID:版本号 |
Docker-Compose
什么是Docker-Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
下载Docker-Compose
在kali下载命令是
1 | apt install docker-compose |
其他linux系统如果没有可以在github上下载地址https://github.com/docker/compose/releases
出现下面这个就下载成功了
Docker-Compose编写
1 | version:'3.1' |
可以看这个地址https://www.runoob.com/docker/docker-compose.html
命令
基于docker-compose.yml启动管理的容器
1 | docker-compose up -d |
关闭并删除容器