Docker
uname命令用于查看系统信息
> uname -r
1. 概念
Docker本身是一个容器运行载体或称之为管理引擎,我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是Image镜像文件
只有通过镜像文件才能生成容器实例,镜像文件是容器的模版
Docker根据镜像来生成容器实例,同一个镜像文件可以生成 多个同时运行 的容器实例
Docker特点
- 轻量:基于容器的虚拟化,仅包含业务所需的运行时runtime环境,CenterOS\Ubuntu 基础镜像仅170M,宿主机可部署100-1000个容器
- 高效:无操作系统虚拟化开销
- 便捷和灵活
Docker利用容器独立运行一个或一组应用
容器(Container) 是 镜像(Image) 的一个实例:镜像/容器 => 类/对象
可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序
仓库(Repository) 是集中存放镜像文件的场所
仓库注册服务器(Registry) 中存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(Tag)
仓库分为公开仓库和私有仓库两种
最大的公开仓库是Docker Hub,存放了数量庞大的镜像可以自由下载,国内的仓库有阿里云及网易云等。
2. 安装
CentOS 6.8版本
yum install -y epel-release
yum install -y docker-io
安装后的配置文件 /etc/sysconfig/docker
启动Docker后台服务:service docker start
docker version 验证
国内镜像加速
登陆阿里云账号后,在控制台->容器镜像服务->镜像中心->镜像加速器
中查看配置步骤
配置成功后,通过docker info
命令查看是否配置成功
$ docker info
...
Registry Mirrors:
http://hub-mirror.c.163.com
Live Restore Enabled: false
3. Docker镜像命令
docker info
查看docker信息,可以查看配置的镜像加速代理地址
docker run <镜像id>
运行容器,先从本地查找镜像文件,如果本地不存在,则会从docker hub上查找公共镜像并拉取,通过镜像文件生成指定容器运行
docker run -d <镜像id>
以后台进程方式运行容器,启动成功后控制台会输出容器id
docker ps
查看运行中的容器
docker stop <容器id或者容器名称>
docker version
查看docker及系统版本信息
docker xxx --help
命令帮助信息
docker images
本地镜像列表
- 参数
- -a: 列出本地所有镜像,包括中间映像层
- -q: 只显示镜像id
- –digests: 显示镜像的摘要信息
- –no-trunc: 显示完整的镜像信息
docker search <镜像名>
搜索镜像,会从远程仓库拉去 docker hub
- 参数
- -s: 限制start数大于此参数指定的值
docker search -s 20 <镜像名>
- –no-trunc: 显示完整说明信息Description
- –automated: 只列出automated build类型的镜像
- -s: 限制start数大于此参数指定的值
docker pull <镜像名>[:TAG]
拉取\下载镜像
- 参数
- 通过TAG可以指定版本,如果不指定,自动下载最新版本:
xxxx:latest
- 通过TAG可以指定版本,如果不指定,自动下载最新版本:
docker rmi <镜像名>
删除镜像
- 删除单个镜像
docker rmi -f <镜像ID>
- 删除多个
docker rmi -f <镜像名1:TAG> <镜像名2:TAG>
空格分隔
不指定TAG将默认删除latest最新的,但是如果有多个相同镜像名的,要指定TAG,不能试图通过这种方式批量删统一镜像名的多个版本镜像
- 批量删除镜像,通过组合命令
docker rmi -f $(docker images -qa)
类似sql的子查询,$() 可以引用其他命令的返回值
4.镜像容器命令
-
新建并启动容器:
docker run [option] image [command] [parameter]
docker run -it centos /bin/bash
:表示以交互式命令的方式启动一个容器,在容器内执行/bin/bash命令
/bin/bash : 表示载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器就会退出
- -d : 后台启动守护式容器,并返回容器id (如果使用-d启动容器发现容器退出了,可以加一个-t)
-
查看正在运行的容器:
docker ps
-
查看上一个容器 -l
-
所有运行过的包括运行中的容器 -a
-
最近的x个容器 -n x
-
只查看容器id -q
-
-
退出容器
exit
容器停止并退出 或者ctrl+P+Q
容器不停止退出 -
启动容器(容器退出后,还可以启动)
docker start 容器id
就是说可以结合ps -l 从日志中恢复容器的启动状态 -
重启
docker restart 容器id
-
停止容器
docker stop 容器id
强制停止容器docker kill 容器id
-
删除已停止运行的容器
docker rm 容器id
- -f 强制删除容器,无论是否在运行
-
批量删除
docker rm -f $(docker ps -aq)
或者docker ps -aq | xargs docker rm
-
查看容器日志
docker logs 容器id
- -t : 显示时间戳
- -f: 追加日志
- tail x : 倒数x行
-
查看容器内部进程
docker top 容器id
会发现容器内部运行的进程与宿主机的进程几乎是一致的,再次印证了容器是简易的系统环境 -
查看容器信息
docker inspect 容器id
-
重新进入容器终端
docker attach 容器id
-
在容器外向容器终端发起命令
docker exec -t 容器id 命令...
功能较attach强大一些
docker exec -it 容器id ls /tmp
查看容器内/tmp文件夹下的文件信息
docker exec -it 容器id /bin/bash
打开容器终端 (但是好像执行不了其他命令了只能退出…(因为少了参数-i ,i与t常常结合使用,-i表示以交互模式运行容器,-t表示为容器重新分配一个伪输入终端))
-
拷贝容器内文件到宿主机
docker cp 容器id:容器内文件路径 宿主机路径
-
docker commit
提交容器快照使之成为一个新的镜像
docker commit
-m “提交信息” -a “作者信息” 容器ID 要创建的目标镜像名:[标签名]
5. 数据卷(Volumes)
-
容器内数据持久化
-
数据共享
-
命令
-
通过命令行方式添加数据卷(处于可移植和可分享的角度考虑,-v命令有一定的局限性,因为并不是所有宿主机都存在相同的路径)
- 添加数据卷
docker run -it -v /宿主机绝对路径:/容器内目录绝对路径 [/宿主机绝对路径2:/容器内目录绝对路径2...] 镜像名
- 查看数据卷挂载信息
docker inspect 容器id
- 容器停止后,再次启动容器,数据卷的内容仍然可以同步
- 添加只读权限的数据卷(限制容器的操作)
docker run -it -v /宿主机绝对路径:/容器内目录绝对路径:ro 镜像名
- 添加数据卷
-
通过dockerfile来添加数据卷
- 新建dockerfile
FROM centos VOLUME ["/dataVolumeContainer01","/dataVolumeContainer02"] CMD echo "docker create data volume finished.---success" CMD /bin/bash
- 通过VOLUME指定一个或多个数据卷
- 在dockerfile所在目录
docker build -f dockerfile文件绝对路径 -t 镜像命名空间 .
.表示当前目录 - 运行后即可使用run命令来查看数据卷是否建立成功
- 使用docker inspect <容器id> 可以查看到在主机上生成的容器数据卷对应目录
-
Linux ->
转换当前文本的编码为指定的编码
:set enc=编码
以指定的编码显示文本,但不保存到文件中
6. 数据卷容器
挂在数据卷的容器,其他容器通过挂载(–volumes-from)这个父容器实现数据共享,这个父容器称为数据卷容器
- 启动一个数据卷容器,为了方便区分,可以
--name doc1
指定一个容器名字 - 启动挂载容器,通过–volumes-from 来挂载数据卷容器
docker run -it --name doc2 --volumes-from doc1 shm/centos
- Doc2、Doc3 挂载自Doc1,并且他们在启动容器的时候,都各自add一个文件到数据卷内
- 通过查看doc1的共享数据卷可以发现,数据卷既可以继承又可以共享
- 删除d1后,d2的更新d3仍可以访问到
- 新建d4,继承d3,删除掉d3后,d4与d2仍可以数据共享*(其实可以看做,容器与宿主机之间的共享,数据卷的生命周期直到没有使用它的容器为止)
7. Dockerfile
用来构建镜像的脚本文件
Scratch:所有镜像的元镜像
保留字指令
- FROM 基础镜像 当前镜像基于哪一个基础镜像
FROM scratch
- MAINTAINER 作者信息 名称、邮箱
MAINTAINER sunhongminhongmin.shm@aliyun.com
- RUN 容器构建时所需要的指令
RUN yum -y install vim
- EXPOSE 暴露的端口号
EXPOSE 7001
- WORKDIR 指定在创建容器后,终端进入容器后的工作目录,一个落脚点
WORKDIR /usr/local
- ENV 构建镜像过程中设置环境变量,其他指令可以使用$XXX引用
ENV customdir /usr/local
- ADD 将宿主机文件拷贝到镜像,并且ADD命令会自动处理URL及解压tar压缩包
- COPY 类似ADD,将从构建上下文目录中源路径的文件复制到新的一层镜像内目标路径的位置
- VOLUME 容器数据卷,用于保存数据和持久化
- CMD 指定容器运行后执行的命令,如果有多个CMD命令,那么最后一个生效,并且CMD会被docker run 之后的命令替换掉(比如说tomcat的dockerfile中定义了CMD [“catalina.sh”,“run”],如果docker run后面不加其他命令,那么容器启动就会默认启动tomcat,而如果你指定了参数,例如docker run -it xxxx ls -l,那么tomcat将不会自动启动,因为CMD命令被覆盖掉了)
CMD /bin/bash
CMD echo “hello,docker…”
- ENTRYPOINT 指定容器运行后执行的命令, 在docker run 之后添加的命令也会追加到ENTRYPOINT 命令后面形成新的命令组合
ENTRYPOINT [“java”,"-Dspring.profiles.active=shm","-Xmx512m","-jar","/app/kos-cc.jar"]
- ONBUILD 当构建一个被继承的dockerfile时运行命令,父镜像被子镜像继承后,父镜像的ONBUILD被触发
push镜像
阿里云控制台([https://cr.console.aliyun.com/#/accelerator]
docker login --username=孙宏民test --password=密码 registry.cn-hangzhou.aliyuncs.com
docker build -f (DockerfilePath) -t (镜像名:tag) .
# 使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
docker tag (镜像id或者镜像名:tag) 远程地址/镜像库:版本号
# 使用 "docker push" 命令将该镜像推送至远程。
docker push 远程地址/镜像库:版本号
tips
curl https://www.baidu.com
下载命令
https://ip.cn
查看当前ip及所在地理位置
which java
which命令用来查看软件安装位置