欢迎访问yhm138的博客园博客, 你可以通过 [RSS] 的方式持续关注博客更新

MyAvatar

yhm138

HelloWorld!

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 就是多提供几条船,挂掉一两条还能继续走,提高稳定性。

posted @ 2021-08-22 22:35  yhm138  阅读(45)  评论(0编辑  收藏  举报