docker
docker镜像(image):只读的模板。可以用来创建docker容器,一个镜像可以创建多个容器。
容器(container):docker利用容器独立运行一个或一组应用。容器是用镜像创建的运行实例。它可以被启动开始停止删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是有一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间)和运行在其中的应用程序。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(repository):是集中存放镜像文件的场所。仓库和仓库注册服务器(Registry)是有区别的。仓库注册器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
docker本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成docker容器。image文件可以看做是容器的模板。docker根据image文件生成容器的实例。同一个image文件。可以生成多个同时运行的容器实例。
image文件生成的容器实例,本身也是一个文件,称为镜像文件。
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器。
至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
docker是一个CS结果的系统,docker守护进程运行在主机上,然后通过socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。容器。是一个运行时环境,就是我们前面说到的集装箱。
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像到的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
docker镜像加载原理
实际上由一层层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像最底层的是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs。
footfs(rot file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版。
安装
yum install -y epel-release
yum install -y docker-io
/etc/sysconfig/docker
service docker start / service docker stop / service docker restart
docker version
https://docs.docker.com.install/linux/docker-ce/centos/ 教程网址
在 /etc/sysconfig/docker中配置自己的镜像加速器
centos7配置镜像加速器:
vim /etc/docker/daemon.json 没有就创建
文件写入:{ “registry-mirrors”: [“镜像加速地址”] }
sudo systemctl daemon-reload
sudo systemctl restart docker
使用命令
docker run 镜像名 本地如没有此镜像,会下载一个此镜像,并在容器运行
帮助命令
docker version 查看版本
docker info docker信息描述
docker –help 获得docker相关命令
镜像命令
/bin/bash
docker images [options]
列出本地主机上的镜像
options说明:-a:列出本地所有镜像 -q:只显示镜像id --digests:显示镜像摘要信息 --no-trunc:显示完整的镜像信息
docker images 镜像名 精确查找
docker search [options] 镜像名
查找镜像名相关的镜像
options:–no-trunc:显示完整的镜像描述 -s:列出收藏数不小于指定值的镜像 --automated:只列出automated build(自动构建)类型的镜像
docker pull 镜像名[:tag]
下载镜像 tag为版本号
docker rmi 镜像名
删除镜像,删多个用空格隔开,删全部 docker rmi -f ($docker images -q) 命令组合使用查询出所有镜像id,然后删
options:-f:强制删除
容器命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
新建并启动容器
options:–name=”容器新名字”:为容器指定一个名称;-d:后台运行容器,并返回容器ID,也即启动守护式容器;-i:以交互模式运行容器,通常与-t同时使用;-t:为容器重新分配一个伪终端,通常与-i同时使用;-P:随机端口映射;-p指定端口映射,有以下4种格式:ip:hostPort:containerPort;ip::containerPort;hostPort:containerPort;containPort,外部访问端口:容器内部访问端口,例:8081:8080 外部虚拟机访问8081,容器内访问8080
docker ps [OPTIONS]
列出当前所有正在运行的容器
options:-a:列出当前所有正在运行的容器+历史运行过的;-l:显示最近创建的容器;-n:显示最近n个创建的容器;-q:静默模式,只显示容器编号;–no-trunc:不截断输出。
退出容器
exit 容器通知退出
ctrl+p+q 容器不停止退出
docker start 容器名或容器ID
启动容器
docker restart 容器名或容器ID
重启容器
docker stop 容器名或容器ID
停止容器
docker kill 容器名或容器ID
强制停止容器
docker rm容器ID
删除已停止的容器,会删掉历史记录
optiones:-f 强制删除
一次性删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
查看容器日志
docker logs -f -t –tail 容器ID
options:-t:加入时间戳;-f跟随最新的日志打印;–tail:数字显示最后多少条
查看容器历史记录
docker history 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
进入正在运行的容器并以命令交互
docker exec -it 容器ID bashShell 在容器中打开新的终端,并且可以启动新的进程,不进入容器,外部执行命令获得命令执行结果,也可以进入容器,取决于bashShell 不加则进容器,加则不进
重新进入docker attach 容器ID 直接进入容器启动命令的终端,不会启动新的进程
从容器内拷贝文件到主机
docker cp 容器ID:容器内路径 目的主机路径
提交让其副本使之成为一个新的镜像
docker commit -m=”描述信息” -a=”作者” 容器ID 要创建镜像名:[标签名]
容器数据卷
数据持久化方式
负责容器的持久化和容器间继承+数据共享
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File system提供一些用于持续存储或共享数据的特性。 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷
特点:1、容器卷可在容器之间共享或重用数据。2、卷中的更改可以直接生效。3、数据卷中的更改不会包含在镜像的更新中。4、数据卷的生命周期一直持续到没有容器使用它为止。
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 创建宿主机和容器共享文件夹
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro镜像名 ro为只读 rw wo 容器对目录的权限
查看容器和宿主机挂载
dockerfile
docker build -f /xxx文件 -t 命名空间 .(路径) 例:docker build -f /mydocker/docker.file -t jayus/centos .
作用:在centos镜像内建两个容器卷,命名为volume的中括号内容。与宿主机挂载点可通过docker inspect命令查看。
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
实现数据传递依赖。
docker run -it --name 命名当前容器 --volumes-from 已存在容器名(与当前日期来自同一镜像) 镜像名 实现容器间共享数据
dockerfile保留字指令
FROM:基础镜像,当前新镜像像是基于哪个镜像的
MAINTAINER :镜像维护者的姓名和邮箱地址
RUN:容器构建是需要运行的命令
EXPOSE:当前容器对外保留出的端口
WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点。容器启动后当前目录所在位置
ENV:构建镜像过程中设置环境变量 key/value对
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包。拷贝并解压
COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 COPY src dest 或 COPY [“src”,”dest”]
VOLUME:容器数据卷,用于数据保存和持久化工作
CMD:指定一个容器启动时要运行的命令。dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT:指定一个容器要启动时要运行的命令。目的和CMD一样,都是在指定容器启动程序及参数。但不会和CMD一样被覆盖,而是追加。
ONBUILD:当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
设置容器启动落脚点,并按照vim和net-tools:
FROM centos
MAINTAINER jayus
ENV mypath /tmp
WORKDIR $mypath
RUN yum -y install vim
RUN yum -y install net_tools
EXPOSE 80
CMD echo “success”
CMD /bin/bash
#发起curl请求,返回ip地址信息
FROM docker.io/centos
RUN yum install -y curl
CMD [“curl”,”-s”,”http://ip.cn”]
将CMD改为ENTRYPOINT
FROM docker.io/centos
RUN yum install -y curl
ENTRYPOINT [“curl”,”-s”,”http://ip.cn”]
每当有镜像继承这个镜像时(即FROM此镜像),会执行ONBUILD的内容
FROM docker.io/centos
RUN yum install -y curl
ENTRYPOINT [“curl”,”-s”,”http://ip.cn”]
ONBUILD RUN echo “father onbuild----886”
自制tomcat准备jdk、tomcat的tar包和一个c.txt
FROM centos
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把jdk和tomcat添加到容器
ADD jdk.tar /usr/local/
ADD tomcat.tar /usr/local/
#安装vim
RUN yum install -y vim
#设置工作访问时候的WORKDIR路径,登陆落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#设置java和tomcat环境变量
ENV JAVA_HOME /usr/local/jdk
ENV CLASSPATH
J
A
V
A
H
O
M
E
/
l
i
b
/
.
d
t
.
j
a
r
:
JAVA_HOME/lib/.dt.jar:
JAVAHOME/lib/.dt.jar:JAVA_PATH/lib/tools.jar
ENV CATALINA_HOME /usr/local/tomcat
ENV CATALINA_BASE /usr/local/tomcat
ENV PATH
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin:
C
A
T
A
L
I
N
A
H
O
M
E
/
l
i
b
:
CATALINA_HOME/lib:
CATALINAHOME/lib:CATALINA_HOME/bin
#容器运行时监听端口
EXPOSE 8080
#容器运行时运行tomcat
ENTRYPOINT [“usr/local/tomcat/bin/startup.sh”]
CMD [“usr/local/tomcat/bin/startup.sh”,”run”]
CMD /usr/local/tomcat/bin/startup.sh && tail -F /usr/local/tomcat/bin/logs/Catalina/out
spring微服务打包docker
FROM java:8
COPY *.jar /app.jar
CMD [“—server.port=8080”]
EXPOSE 8080
ENTRYPOINT [“java”,”-jar”,”/app.jar”]