Docker基础
本笔记是在学习狂神说java的B站docker视频记录的。
Docker简介
什么是docker
开源的容器引擎
为啥要用docker
简化环境配置,环境一致性
docker三大核心概念
镜像(image):好比一个模板,可以创建多个容器
容器(container):通过镜像创建的可运行实例
仓库(repository):存放镜像的服务,可拉取和提交镜像
镜像vs容器
相当于类和实例的关系
镜像是静态的,相当于模板,一旦创建无法更改;容器是镜像的运行实体,可以被创建、启动、停止、删除、暂停等。一般运行时需使用数据卷(Volume)、或者绑定宿主目录,使其数据不丢失。
公有仓库vs私有仓库
Docker hub是公开服务,访问较慢一般使用国内镜像。
私有仓库通过docker registry提供的自行搭建,也可以通过第三方比如nexus搭建。
Docker安装
参考docker官网安装文档:https://docs.docker.com/engine/install/centos/ (我的是centos系统)
uname -r #查看内核版本,centos7以上能装
#先删除本地已有docker再安装
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
$ sudo yum install -y yum-utils
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo systemctl start docker # 启动
$ sudo docker run hello-world # 验证
镜像加速器
创建或修改 /etc/docker/daemon.json文件
cd /etc/docker # 进目录
vim daemon.json # vim编辑,i插入
# 镜像加速器有很多,可自行百度选取
{
"registry-mirrors": [
"https://.mirror.aliyuncs.com", //阿里云需自己生成
"https://docker.mirrors.ustc.edu.cn", //科大镜像站
"https://hub-mirror.c.163.com", //网易云
"https://registry.docker-cn.com" //中国官方镜像
]
}
# :wq保存并退出
systemctl daemon-reload # deamon重新加载
systemctl restart docker # 重启docker生效
docker info # 可以查看刚刚改的镜像加速器
Docker指令
systemctl restart docker #重启docker
systemctl stop docker #关闭docker
docker version #查看版本
docker logs #查看日志
-tf #显示日志
--tail number #显示日志条数
docker inspect #查看元数据
#万能指令!!!
docker xxx --help #不会的命令都用help查看用法
镜像命令
docker search #搜索镜像
docker pull #获取镜像
docker images #列出所有镜像 = docker image ls
docker system df #镜像体积
docker image rm #删除镜像 (用ID、镜像名、摘要)
docker commit #保存镜像
docker rmi $(docker images -aq) #一次性删除所有镜像
docker history #查看镜像打包记录
容器命令
docker ps #查看容器 = docker container ls
docker ps -a #查看所有包括退出的容器
docker exec #进入容器,开启一个新的终端,exit容器不会停止
docker attach #进入容器,进入正在执行的终端,exit容器会停止
docker top #查看容器进程信息
docker container logs #容器日志
docker run -d #运行容器 -d参数使容器进入后台
docker import/export #导入/导出容器
docker container rm #删除容器
docker stop #停止容器
docker rm $(docker ps -aq) #一次性删除所有容器
docker cp 容器id:/home/test.java /home #从容器内拷贝文件到主机上
坑:容器使用后台启动后,必须要一个前台进程,docker发现没有应用,就自动停止了。docker ps -a 才能看得到被停止的容器
常用命令图
百度图片搜docker就能找到很多跟docker有关的图
镜像加载原理
docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。bootfs底层是公用的,rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。image也是分层的,由dockerfile代码组成。
run运行流程
1.docker run 的时候会现在本地找镜像
2.找到了就直接使用本地的镜像运行
3.找不到就去docker hub 仓库下载
4.docker hub 找不到就报错——找不到该镜像
5.docker hub 找到了就下载到本地,docker images能看到
容器数据卷
什么是容器数据卷
容器之间可以有一个数据共享技术,docker容器中产生的数据,同步到本地
这就是卷技术!目录挂载,将我们容器内的目录,挂载到Linux上面。
数据卷作用
容器持久化和同步操作!容器间也可以数据共享。
同步过程:双向绑定
数据卷好处
本地修改即同步容器
使用数据卷
docker run -it -v 主机目录:容器内目录 # -v参数设置数据卷
#用docker inspect 查看 mounts
--volumes-from #通过这个就能实现数据容器间共享
Dockerfile
介绍
dockerfile是docker镜像构建文件——命令脚本
脚本就是用来构建镜像的,docker镜像是一层一层的,脚本就是一个个的命令,每个命令都是一层。
构建步骤
1.编写一个dockerfile文件
2.docker build 构建一个镜像
3.docker run 运行镜像
4.docker push 发布一个镜像
dockerfile指令
FROM # 基础镜像
MAINTAINER # 镜像是写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤:比如tomcat镜像。这个tomcat是压缩包!给webapps添加内容
WORKDIR # 镜像工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口配置
CMD # 指定这个容器启动的时候运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候运行的命令,可以追加
ONBUILD #触发指令
COPY #类似ADD,将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
ARG #docker --build-arg =来指定参数
[图片上传失败...(image-9de456-1603781473203)]
CMD 和 ENTRYPOINT 的区别
CMD 只有最后一个生效,可被替换——run的时候要把命令写完整,直接追加不行
ENTRYPOINT 可以直接追加——run的时候可以直接追加
发布镜像(类似git)
1.地址:dockerhub注册账号
2.登录 docker login -u xxx
3.提交镜像 docker push 名字/镜像:版本号
4.增加标签 docker tag 镜像id 名字/镜像:版本号
Docker网络
ip addr #查看网络命令
linux 可以ping 通 docker容器内部
原理
我们每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0。
桥接模式 使用的技术是evth-pair,充当一个桥梁,连接各种虚拟网络设备
成对出现,一段连着协议,一段连着彼此相连
网络模式
bridge:桥接(docker默认,自己创建也使用)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用得少,局限很大)
自定义网络
docker network ls #查看所有docker的网络
docker network create --driver bridge \
--subnet 192.168.0.0/16 \
--gateway 192.168.0.1 mynet
#网关--subnet 192.168.0.0/16
#路由器--gateway 192.168.0.1 mynet
docker network connect #跨网络连通,比如192.168.0.1要连172.18.0.1
容器之间是可以互相ping通的,自定义的网络docker都已经帮我们维护好了对应的关系,推荐自定义网络!