docker学习笔记
一些面试题
docker与Virtual machine的区别与联系
如何理解docker swarm
容器内的文件存储在哪里
解释一下dockerfile的ONBUILD指令
如何监控生产中的docker
如何将docker迁移至另一台宿主机
构建容器应遵循哪些原则
了解容器逃逸吗,聊聊相关cve
在容器可能逃逸时,如何保证宿主机安全
docker和sandbox的区别与联系
视频地址
https://www.bilibili.com/video/BV1og4y1q7M4
docker原理
虚拟机中,在虚拟化环境下,物理服务器的CPU、内存、硬盘和网卡等硬件资源被虚拟化并受Hypervisor的调度,多个操作系统在Hypervisor的协调下可以共享这些虚拟化后的硬件资源
Docker类比虚拟机,类似于一个沙箱机制
https://www.docker.com/ docker官网
https://hub.docker.com/ 类似于GitHub,用来放镜像
Docker是基于Golang开发的开源项目
2014年Docker 1.0发布
大纲
Docker命令——镜像命令,容器命令,擦送做命令
Docker镜像
容器数据卷
Dockefile
Docker网络原理
IDEA整合Docker
Docker compose
Docker Swarm 简化版k8s
CI\CD 持续集成,持续交付 Jenkins
DevOps
DevOps (开发、运维)
应用要快速的交付和部署
Linux下安装Docker
https://www.cnblogs.com/kingsonfu/p/11576797.html
如果有apt包管理的话,直接 apt install docker.io
systemctl start docker # 开启docker服务
systemctl status docker # 查看docker服务状态
systemctl stop docker # 关闭docker服务
Docker常用命令
帮助命令
docker version
docker info # 显示docker的详细信息
docker {命令} --help
帮助文档的地址 http://docs.docker.com/engine/reference/commandline
镜像命令
http://hub.docker.com 类似github,寻找镜像
docker image 用于管理镜像
docker images 用于列出镜像
docker image ls # 查看本地镜像
docker images # 查看所有的本地的主机的镜像
docker images -a # 显示完全信息 -q只显示镜像id
docker search mysql --filter=STARS=3000 # 搜索STARS>=3000的镜像
docker pull #下载镜像,如果不写TAG,默认就是最优先匹配的
docker pull是分层pull的,可能好几个pull
docker rmi -f {容器id} # 删除镜像
docker rmi -f ${docker images -aq} # 删除本地所有镜像
查看所有容器
docker container ls
docker ps -a
启动和停止容器的操作
docker start {容器id}
docker restart {容器id}
docker sotp {容器id}
docker kill {容器id}
删除容器
docker rm -f ${docker ps -aq} #删除所有的容器
docker ps -a -q |xargs docker rm # 删除所有的容器
退出容器
退出container 输入: exit 1 或者按键: Ctrl + D
后台启动服务
docker run -d {镜像名}
# 参数说明:
# -d 指定docker启动后后台运行(必选)
# --name xxx 指定容器名称,需保证唯一,否则启动失败(可选)
# -h xxx 指定容器里的主机名称(可选)
# -p port1:port2 映射主机端口port1为容器端口port2
# -v v1:v2 映射主机目录v1为容器内目录v2,注意v1必须为全路径
#### -v v1:v2:ro 映射主机目录v1为容器内目录v2,注意v1必须为全路径,ro表示只读
# 如果为相对路径则建议该目录需通过`docker volume`创建
# -e xx=yy 设置容器内环境变量xx的值为yy
创建一个容器但是不启动它
docker create --name myrunoob nginx:latest
把img文件加载成docker镜像
docker load < XXX.img
查看日志
docker logs -ft --tail 10 {容器id} #显示最近的10条日志
查看容器中进程信息
docker top {容器id}
查看容器信息
docker inspect {容器id}
查看镜像信息
docker inspect {镜像id}
docker image inspect {镜像id}
进入当前正在运行的容器
docker exec -it {容器id} /bin/bash #以交互模式进入容器,开启一个新的终端
docker exec -it {容器id} /bin/sh #以交互模式进入容器,开启一个新的终端
docker attach {容器id} 进入容器正在进行的终端
退出container 输入: exit 1 或者按键: Ctrl + D
从容器内拷贝文件到机器
docker cp {容器id}:{容器内路径} 宿主机路径
可视化
docker run -d -p 8088:9000 --restart="always" -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
我这里是win10里开了个虚拟机kali,网络连接设置为NAT模式,kali里docker起了个容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
db7a1ac2c7f6 portainer/portainer "/portainer" 22 minutes ago Up 50 seconds 0.0.0.0:8088->9000/tcp gallant_matsumoto
ifconfig查看ip的话是 docker0网卡对应的ip是172.17.0.1,eth0网卡对应的ip是192.168.29.129
kali的某浏览器的http://172.17.0.1:8088/#/init/admin 可以访问
win的某浏览器的http://192.168.29.129:8088/#/auth 可以访问
创建用户后进入,建议选择"local"而不是"remote",进入后界面如下所示
docker commit命令和docker push命令
docker commit -m="提交的描述信息" -a="作者" {容器id} {目标镜像名}:{tag}
打包为一个新的镜像到本地
docker push 发布镜像
容器数数据卷
数据?如果数据都在容器中,那么容器删除,数据就会丢失,
容器之间可以有一个数据共享的技术,Docekr容器中产生的数据,同步到本地!
这就是卷的机制!
容器间也是可以数据共享的。
-v {主机目录path}/{容器内地址path}
就能成功mount了
测试文件的同步
具名挂载和匿名挂载
docker volume ls
没有给卷起名字的就叫匿名挂载
-v {卷名}:{容器内路径} 进行具名挂载
DockerFile
用来构建docker镜像的脚本文件!!每个命令就是一层,例如
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----edn----"
CMD /bin/bash
# 这里的每行命令就是镜像的一层
dockerfile的指令有下面这些:
FROM #基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUMNE # 挂载的目录
EXPOSE #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,可以追加命令
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承Docekrfile,这个时候就会运行ONBUILD的指令。触发指令 就是说构建出的镜像不会执行这条命令,但是用构建镜像的继承镜像,这条命令会被执行
COPY # 类似ADD,将我们的文件拷贝到镜像中
ENV # 构建的时候设置环境变量
docker build -f {/path/to/dockerfile1} -t {镜像名}:{tag}
Docker网络
Docker compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
docker-compose的yml文件写法见官网提供的compose file ref3.0
# 启动所有服务容器并在后台运行,如果容器不存在或者有更新则自动构建运行新容器
docker-compose -f aicp9_afr.yml up -d
# 启动项目中的指定服务
docker-compose -f aicp9_afr.yml up -d http
# 停止和删除容器、网络、卷、镜像
docker-compose -f aicp9_afr.yml down
# 停止正在运行的容器,可以通过docker-compose start 再次启动
docker-compose stop
# 停止项目中的指定服务
docker-compose -f aicp9_afr.yml stop http
# 启动指定容器,该容器必须要求存在
docker-compose -f aicp9_afr.yml start http
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。
Docker swarm
知道swarm是干什么的时候,不由自主把它和k8s类比起来,但是几乎同样的功能,为什么k8s看起来占领的份额更多呢?
Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。
一位博主的总结如下:
Docker 可以看做集装箱把杂乱的货物一个个整理归类, Compose 则是用于编排这些集装箱,最后 Swarm 就是多提供几条船,挂掉一两条还能继续走,提高稳定性。