Docker
概述
Docker为什么会出现?
环境配置麻烦,每一台机器都要部署环境,费时费力
Docker给以上问题提出了解决方案
Docker核心思想:隔离
能干嘛
容器化技术
容器化技术不是模拟一个完整的操作系统
比较Docker和虚拟机技术的不同:
- 传统虚拟机:虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器: 应用直接运行在宿主机的内核中,容器没有自己的内核,也没有虚拟硬件,所以轻便
- 每个容器间相互隔离,每个容器内都有属于自己的文件系统,互不影响
Docker安装
Docker组成
- 镜像(image):好比一个模板,可以通过这个模板来创建容器服务,一个镜像可以创建多个容器
- 容器(container):独立运行一个或一组应用,通过镜像来创建。启动、停止、删除等基本命令
- 仓库(repository):存放镜像。分为公有仓库和私有仓库
安装Docker
环境查看
系统内核是3.10以上
1 | [root@izbp159tpwttz5ehtj9eh7z ~]# uname -r |
系统版本CentOS 7
1 | [root@izbp159tpwttz5ehtj9eh7z ~]# cat /etc/os-release |
安装
1 | 1.卸载旧的版本 |
阿里云镜像加速
登录阿里云,找到容器服务
找到镜像加速地址
配置使用
1
2
3
4
5
6
7
8
9
10
11sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://zr459l1k.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
底层原理
Docker是怎么工作的?
Docker是一个Client-Server的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问
DockerServer收到DockerClient的指令,就会执行这个命令
Docker为什么比VM快?
- Docker有更少的抽象层
- Docker利用的是宿主机的内核,VM需要Guest OS
所以说,新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导
Docker的常用命令
帮助命令
1 | docker version |
帮助文档地址:https://docs.docker.com/reference/
镜像命令
docker images 查看所有本地的主机上的镜像
1 | [root@izbp159tpwttz5ehtj9eh7z ~]# docker images |
docker search 搜索镜像
1 | [root@izbp159tpwttz5ehtj9eh7z ~]# docker search mysql |
docker pull 下载镜像
1 | docker pull 镜像名[:tag] |
docker rmi 删除镜像
1 | [root@izbp159tpwttz5ehtj9eh7z ~]# docker rmi -f 镜像ID #删除指定镜像 |
容器命令
有镜像才可以创建容器
1 | docker pull centos |
新建容器并启动
1 | docker run [可选参数] image |
列出所有运行的容器
1 | [root@izbp159tpwttz5ehtj9eh7z ~]# docker ps #正在运行 |
退出容器
1 | exit #直接退出 |
删除容器
1 | docker rm 容器ID #删除指定容器,不能删除正在运行的容器 |
启动和停止容器
1 | docker start 容器ID |
常用其他命令
后台启动容器
1 | [root@zdogegg ~]# docker run -d centos |
查看日志
1 | docker logs |
查看容器中进程信息
1 | docker top 容器ID |
查看镜像元数据
1 | docker inspect |
进入当前正在运行的容器
1 | 方式一 |
从容器内拷贝文件到主机
1 | [root@163fdb509342 home]# ls |
可视化
portainer
1 | docker run -d -p 8088:9000 \ |
Docker镜像讲解
分层理解
https://www.bilibili.com/video/BV1og4y1q7M4?p=19&spm_id_from=pageDriver
commit镜像
https://www.bilibili.com/video/BV1og4y1q7M4?p=20&spm_id_from=pageDriver
容器数据卷
什么是容器数据卷
如果数据都在容器中,容器删除,数据也都删除了。需求:数据持久化
容器之间可以有一个数据共享的技术。Docker容器中的数据同步到本地
这就是卷技术。将容器内的目录挂载到系统上
使用数据卷
方式一:使用命令来挂载
1 | docker run -it -v 主机目录:容器目录 |
实战:安装MySQL
https://www.bilibili.com/video/BV1og4y1q7M4?p=22&spm_id_from=pageDriver
1 | [root@zdogegg home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql |
具名挂载和匿名挂载
1 | 匿名挂载 |
大多情况使用具名挂载
1 | -v 容器内路径 #匿名挂载 |
初识DockerFile
DockerFile就是用来构建Docker镜像的构建文件
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个个的命令,每个命令是一层
1 | dockerfile 内容 |
1 | [root@zdogegg docker-test-volume]# vim dockerfile1 |
这种方式使用的非常多,因为我们通常会使用自己的镜像
数据卷容器
多个容器同步数据
1 | [root@zdogegg /]# docker run -it --name docker01 dogegg/centos:1.0 |
DockerFile
DockerFile是构建Docker镜像的文件
构建步骤:
- 编写一个DockerFile文件
- docker build 构建成为一个镜像
- docker run运行镜像
- docker push发布镜像
DockerFile构建过程
基础知识:
- 每个保留关键字(指令)必须大写
- 从上到下顺序执行
#
表示注释- 每一个指令都会创建提交一个新的镜像层
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile生成的镜像,最终发布和运行的产品
Docker容器:镜像运行起来提供服务
DockerFile指令
1 | FROM #基础镜像 |
实战测试
https://www.bilibili.com/video/BV1og4y1q7M4?p=28&spm_id_from=pageDriver
实战:Tomcat镜像
https://www.bilibili.com/video/BV1og4y1q7M4?p=30&spm_id_from=pageDriver
Docker网络
理解Docker0
https://www.bilibili.com/video/BV1og4y1q7M4?p=34&spm_id_from=pageDriver
自定义网络
网络模式
- bridge:桥接
- none:不配置网络
- host:和宿主机共享网络
- container:容器内网络连通
测试
1 | docker run -d -P --name 容器名 --net bridge 镜像名 |