Docker
网课链接 https://www.bilibili.com/video/BV1Ls411n7mx?from=search&seid=8958637791858967183
1.Docker简介
解决开发与运维的矛盾
交付代码加环境
基于Go
理念 一次构建 到处运行
容器由镜像实例化
虚拟机缺点
资源占用多
冗余步骤多
启动慢
Docker和虚拟机的区别
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程
而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便
每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源
cat /etc/redhat-release 查看linux版本
Docker架构
1)client
docker build
docker pull
docker run
2)docker_host
Contaioners 容器 可以看作一个简易版的linux
Images 镜像
3)Registry 仓库 保存镜像
2.Docker安装
centos安装Docker
https://docs.docker.com/engine/install/centos/
yum 安装 gcc
yum -y isntall gcc
yum -y install gcc gcc-c++
gcc -v
卸载老版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
设置stable镜像仓库
阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包索引
yum makecache fast
安装docker ce
sudo yum install docker-ce
启动docker
sudo systemctl start docker
测试
docker run hello-world
配置镜像加速器
阿里云
卸载
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
工作原理
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上
然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器,是一个运行时环境,就是我们前面说
到的集装箱。
docker比虚拟机快原因
1)有更少的抽象层,无需实现硬件虚拟化
2)docker利用的是宿主机的内核,不需要重新加载操作系统内核
3.Docker常用命令
帮助命令
docker version
docker info
docker --help
镜像命令
docker images 列出本地主机上的镜像
参数说明
- REPOSITORY 表示镜像的仓库源
- TAG 镜像的标签
- lMAGE ID 镜像ID
- CREATED 镜像创建时间
- SIZE 镜像大小
OPTIONS说明
- -a 列出本地所有的镜像(含中间映像层)
- -q 只显示镜像ID
- --digests 显示镜像的摘要信息
- --no-trunc 显示完整的镜像信息
docker search 某个镜像的名字
https://hub.docker.com/
docker pull 某个镜像的名字(默认最新) 下载镜像
docker rmi 某个镜像的名字/ID 删除镜像
-f 强制删除
删除单个 docker rmi -f 镜像ID
删除多个 docker rmi -f 镜像名1:TAG 镜像名2:TAG
删除全部 docker rmi -f $(docker images -qa)
容器命令
新建并启动容器 docker run [OPTIONS] images
OPTIONS
- --name "容器名称" 为容器指定一个名字
- -d 后台启动容器 (docker 容器后台运行,就必须有一个前台进程) 一般会自杀
- -i 交互模式启动 通常与-t同时使用
- -t 为容器重新分配一个伪输入终端 通常与-i同时使用
- -P 随机端口映射
- -p 指定端口映射时,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
列出当前正在运行的容器
docker ps [OPTIONS]
OPTIONS
- -a 列出当前加历史运行过的容器
- -l 显示最近创建的容器
- -n 数字 显示最近n个创建的容器
- -q 静默模式 只显示容器ID
- --no-trunc 不截断输出
退出容器
- exit 容器停止退出
- ctrl + p + q 容器不停止退出
启动容器
docker start 名/ID
重启容器
docker restart 名/ID
停止容器
docker stop 名/ID
强制停止容器
docker kill 名/ID
删除已停止的容器
docker rm 名/ID
一次删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
重新进入容器
docker attach 名/ID 直接进入容器的终端 不会启动新的进程
docker exec -it 容器ID bashShell 可以不进入容器 但可以获取所需的容器内容 也可以进入容器 功能更强
查看容器日志
docker logs -f -t --tail n 容器ID
-t 加入时间戳
-f 跟随最新的日志打印
--tail 数字 显示最后n条
查看容器内的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
查询linux所有的进程 ps -ef
4.Docker镜像
镜像加载原理
镜像由UnionFS 联合文件系统组成
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在
Docker镜像的最底层是bootfs。这一层与我们典型的Linux Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核
就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roots (root file system),在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, bin, letc等标准目录和文件。roots就是各种不同的
操作系统发行版,比如Ubuntu,Centos等等。
采用镜像分层原因
共享资源
Docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层"之下的都叫“镜像层”。
docker镜像操作commit
docker commit 提交容器副本使之成为一个新的镜像
docker commit -a=“作者” -m="提交的描述信息" 容器ID 要创建的目标镜像名:[TAG]
docker run -it -p 8888:8080 tomcat
8888linux端口 8080容器端口
5.Docker容器数据卷
容器数据卷
作用
持久化容器中的数据
容器间继承+共享数据
容器内添加方式
1)直接命令添加
命令 docker run -it -v /宿主机绝对路径目录:/容器间目录 镜像名 (自动新建文件夹)
容器和主机间共享数据
容器停止退出后,主机修改后再登录容器数据仍然同步
命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器间目录:ro 镜像名 (READONLY)
2)DockerFile添加
1. 根目录新建mydocker文件夹进入
2. 可以在DockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
3. File构建
Dockerfile内容
#volume test
FROM centos
VOLUME ["/dataVolumeContainer1" ,"/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
4. build生成镜像 docker build -f /mydocker/Dockerfile -t 镜像名字:TAG .
5. run 容器 自动生成两个
6. 没有指定的话有默认路径 用inspect查找
数据卷容器
容器间传递共享(--volume-from)
1. 启动父容器 dc01 docker run -it --name dc01 zzyy/ centos
2. dc02/dc03继承自dc01 docker run -it --name dco2--volumes-from dc01 zzyy/ centos
3. dc02/dc03各自添加数据
4. dc01/02/03都有相同的数据
dc01停止运行 23仍然可以看到数据
2修改数据 3仍然共享数据
数据卷的生命周期持续到没有容器使用它为止
6.DockerFile解析
DockerFile相当于可以生成镜像的源代码
使用来构建镜像的文件,是由一系列命令和参数构成的脚本
1. 手动编写一个dockerfile文件 需要符合file的规范 编写
2. 之后docker build执行 获得一个i自定义的镜像 构建
3. run 执行
maven build 获得jar
java -jar 微服务
scratch 基础镜像 源镜像
DockerFile构建构成解析
基础知识
- 每条保留字指令都必须为大写字母且后面跟随至少一个参数
- 指令从上到下 顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
执行大致流程
( 1) docker从基础镜像运行一个容器
(2)执行一条指令并对容器作出修改
(3)执行类似docker commit的操作提交一个新的镜像层
(4) docker再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令都执行完成
DockerFile保留字指令
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时执行的一个具体的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 默认/
ENV 这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样
也可以在其它指令中直接使用这些环境变量
ADD 比COPY强大 拷贝加解压
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 拷贝
VOLUME 容器数据卷
CMD 指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT 指定一个容器启动时 运行的命令 不会被替换 而是被追加
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
自定义tomcat案例
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/ local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA _HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr /local/apache-tomcat-9.0.8/bin/ startup.sh && tail -F /usr/local/apache-tomcat -9.0.8/bin/logs/catalina.out
运行
docker run -d -p 9080:8080 --name myt9
-v/zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
-v/zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs
--privileged=true
zzyytomcat9
--privileged=true
使用该参数,container内的root拥有真正的root权限
否则,container内的root只是外部的一个普通用户权限
linux指令
curl 网址 -p 查ip -i 查报文头
会返回网站html源码
7.Docker常用安装
安装tomcat
docker search tomcat
docker pull tomcat
docker images
docker run-it -p 8080:8080 tomcat
安装mysql
docker search mysql
docker pull mysql
docker images
docker run -p 12345:3306 --name mysql
-v /zzyyuse/mysqI/conf : /etc/mysql/conf
-v /zzyyuse/mysqL/logs: /logs
-v/zzyyuse/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSMORD=123456
-d mysql:5.6
docker exec -it MySQL运行成功后的容器ID /bin/ bash
安装redis
docker search redis
docker pull redis
docker images
docker run -p 6379:6379
-v /zzyyuse/myredis/data:/data
-v/1zyyuse/myredis/conf/redis.conf:/usr/local/etc/vedis/redis.conf
-d redis:3.2 redis-server /usr/local/etc/redis/redis.conf
--appendonly yes 开启AOF
docker exec -it 运行着Rediis服务的容器ID redis-cli
8.本地镜像发布到阿里云
生成镜像
dockerfile
commit
阿里云创建镜像仓库
将镜像推送到registry