Docker的基本组成

docker利用容器(Container)独立运行的一个或一组应用;
容器时用镜像创建的运行实例
容器可以被启动、开始i、停止、删除。每个容器都是相互隔离的】保证安全的平台;
docker相当于一个精简版的虚拟机,只保留了运行应用是所需要的库(包括root用户权限、进程空间、用户空间和网络空间等和运行再其中的应用程序),摒弃了硬件模拟等;

docker三要素

  1. 镜像(images)相当于每个容器的模板
  2. 容器(container)每个容器的实例,应用都是部署在容器中的
  3. 仓库(repository)相当于java中的maven仓库,有一些打包好的镜像
    镜像:是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所哟内容,包括代码、运行时、库、环境变量和配置文件
    Docker镜像都是只读的,当容器地洞是,一个新的可写层被加载到镜像顶部。这一层通常被叫做容器层,容器层之下的都叫做镜像层;

docker的安装建议根据官网提示进行操作

https://docs.docker.com/engine/install/centos/

由于docker仓库默认使用海外镜像库,建议配置成国内阿里云或者网易镜像库

  1. systemctl daemon reload重新加载镜像配置文件
  2. systemctl restart docker重启docker服务

配置疑问可在阿里云查找文档dev.aliyun.com

docker常用命令

  1. docker -version //版本号

  2. docker -info //容器信息

  3. docker --help //docker帮助命令

  4. docker run [镜像名称] //运行一个镜像的实例(docker run 镜像)

  5. docker search 【镜像名称】从镜像仓库中搜索镜像

docker 镜像命令

docker images //列出本地目前已有的镜像

	1. REPOSITORY 表示镜像源
	2. TAG:镜像的标签(docker run时不加tag默认就是latest)
	3. IMAGE ID:镜像的id
	4. CREATED创建时间
	5. size镜像大小

docker images -a(镜像是分层的)显示所有包含中间镜像

docker images -qa 显示当前镜像所有镜像的id

docker images --digests显示镜像的摘要信息
doucker pull [镜像名字] TAG下载镜像(如果不加tag的话等价于下载最新版的,等价于 docker pull [镜像名]:latest)

在这里插入图片描述

docker images -qa //展示所有本地docer镜像id
docker rmi [唯一镜像名或镜像id] :tag //删除镜像
镜像正在使用删除失败

  • docker rmi -f [唯一镜像名或镜像id] :tag //强制删除删除镜像
  • 同时删除多个镜像以空格分隔
  • docker rmi -f ${docker images -qa}删除所有本地镜像

docker容器命令

(有镜像才能创建容器)所以在创建容器前要先pull下相应的镜像

  1. 新建并启动容器 doker run [options] --name [镜像id]
    * --name=’容器的新名字‘:为容器指定一个名称(如果不指定name则 默认随机分配)
    * options:启动容器时需要的启动模式通常使用-it
    * -i:以交互模式运行容器,通常与-t同时使用(启动容器后进行交互)
    * -t:为容器重新分配一个伪终端,通常与-i同时使用(登录容器后创建一个伪终端**命令窗口)
    * -d:后台运行容器,并返回容器id
    * -P:随机端口映射
    * -p:指定端口映射,有以下四种格式
    1. hostPort:containerPort
    比如docker run -it -p 8888:8080 【镜像id】,表示将容器中的8080端口启动容器后映射到宿主的8888端口
    上面的大写P是随机分配↑
    容器启动成功,并已进入容器中

  2. 列出当前所有正在运行的docker容器: docker ps

    • OPTIONS
    • -a 列出当前所有正在运行的容器+历史上运行过的
    • -l:显示最近创建的容器(上一个容器)
    • -n:显示最近n个创建的容器
    • -q静默模式,只显示容器编号
    • –no-trunc:不截断输出
  3. 退出容器 exit或者ctrl+p+q

    • exit关闭容器并退出
    • ctrl+P+Q退回到宿主机但不关闭容器
  4. 启动已经退出的容器doker start[容器id]

  5. 重启容器:docker restart [容器id]

  6. 关闭容器:docker stop

  7. 强制关闭容器:docker kill [容器id]

  8. 删除已停止的容器:docker rm [容器id](多个容器空格间隔,docker -f 强制删除)批量删除参照批量删除镜像,注意rm是删除容器,rmi是删除镜像

  9. 后台启动容器docker run -d --name [镜像id]

    • 问题:docker ps -a查看时发现进程容器已经退出,是因为Docker容器后台运行是必须有一个前台进程是启动的,容器运行的命令如果不是一些挂起的命令比如(top、tail),容器就会自动退出,比如容器当中部署了nginx是以守护进程的方式运行的,也会导致容器自动退出,所以要运行的程序要以前台进程的形式运行 例如docker run -d centos /bin/sh -c “while true;do echo hello xxxx;lsleep 2;done” shell编程没两秒钟打印hello xxxx
  10. 查看容器日志:docker logs -t -f --tail [容器id]

    • -t 加入时间戳
    • -f跟随最新的日志打印
    • –tail xx 显示最后xx条
  11. 查看容器内的进程:docker top [容器id]

  12. 查看容器内部细节:docker inspect 容器id

  13. 进入正在运行的容器:docker exec -it 【容器id】或者docker attach 【容器id】
    * docker attach 【容器id】 进入到容器的根目录
    * docker exec -it 【容器id】【需要在容器中执行的命令】在容器外面进行容器中的命令操作例如:docker exec -it 【容器id】 ls -l /tmp 表示在宿主机中查看容器内tmp目录下的内容,但是并没有进入到容器

  14. 从容器中拷贝数据到宿主机:docker cp 【容器id】:容器内部路径 目的主机路径

  15. 提交容器副本使之成为一个新的容器镜像:docker commit

    • docker commit -m=“提交的描述信息” -a “作者" [容器id] 要创建的目标镜像名称:[标签名]

Docker容器数据卷

即:容器关闭后运行数据就丢失了,容器数据卷既是容器内的运行数据持久化

Docker的理念:

  • 将运用于运行的而环境打包形成容器运行,容器内的运行数据可以持久化
  • 容器间的数据可以共享(Docker容器产生的数据,如果用docler commit是生成新的镜像是可以保存的)

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止
数据卷的添加
  1. 直接命令添加
    docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
    ** 如果写权限不够,可在命令最后添加 docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 --privileged=true

1.1 -v /宿主机绝对路径目录:/容器内目录 命令会自动为宿主机和容器创建相应的目录,相当于mkdir,并建立容器于宿主机的连接实现数据共享
1.2 查看数据卷是否挂载成功
docker inspect [镜像id]
在这里插入图片描述
在这里插入图片描述

1.3 容器和宿主机之间数据共享
1.4 容器停止退出后,如果重新启动容器,宿主机修改的数据也会同时同步到容器
2. 命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
容器内的目录只读不可写

  1. DockerFile添加
    (例):
    使用VOLUME指给镜像添加一个或多个数据卷
    VOLUME[“容器目录1”,“容器目录2”,“容器目录3”,…]
    注意volume指令在dockerFile中只支持容器地址;因为考虑到镜像移植和分享的考虑,目录会有差异;所以VOLUME无法像直接用命令添加数据卷一样直接指定宿主机的关联目录,但会在宿主机随机生成一个目录进行关联,后面镜像创建后使用docker inspect [容器id]可查看
    3. 1. 根目录下新建目录mkdir /mydocker; cd mydocker
    3. 2. 编写dockerFile;vim dockerfile;
# volume test 
FROM cenos 				#以哪个镜像作为模板,类似java中的extends
VOLUME ["dataVolumeContainer1","/dataVolumeContainer2"]		#在当前的镜像下新建两个数据卷
CMD echo "finished,---------success1"; 			# 打印提示
CMD /bin/bash 						

#######
3. 3. 构建生成新镜像
docker build -f /mydocker/dockerfile -t zp/centos .
-f 文件,指定dockerfile路径为/mydocker/dockerfile
-t 命名空间,指定构建的新镜像的名字为zp/centos
. 新镜像保存到当前路径下
在这里插入图片描述

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂在数据卷的容器,称之为数据卷容器;

类似于主从复制,其他机器挂载到已经有有数据卷的容器上,那么这个容器就是数据卷容器,从而实现了父容器到子容器的数据共享;

启动一个数据卷容器(即数据卷容器)
docker run -it --name dc01 ap/centos
启动一个挂载到dc01的容器
dco2
docker run -it --name dc02 --volumes -from dc01 ap/centos
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止

DockerFile(重点)!!!

  • 定义

    Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

  • Dockerfile内容基础知识
  1. 每天保留字指令都必须为大写字母,且后面要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交
  • Docker执行Dockerfile的大致流程
  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新的容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

在这里插入图片描述

  • DockerFile体系结构(保留字指令)

FROM
基础镜像,当前编写的这个新的镜像是基于哪个镜像的
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
EXPOSE
当前容器对外暴露的端口号
WORKDIR
指定在容器创建后,终端默认登录进来的工作目录,一个落脚点;
如果没有指定则默认进入根目录
ENV
用来在构建镜像过程中设置环境变量
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样
比如:
定义:ENV MY_PATH /usr/local
使用:WORKDIR $MY_PATH
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY
类似ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置,但不会处理URL和解压缩
COPY src dest #shell脚本的写法
COPY [“src”,“dest”]
二者都可
VOLUME
容器数据卷,用于数据保存和持久化
CMD
指定一个容器启动时要运行的命令
CMD指令的格式和RUN相似,也是有两种格式:
shell 格式:CMD<命令>
exec格式:CMD [“可执行文件”,“参数1”,“参数2”…]
参数列表格式:CMD [“参数1”,“参数2”,…]在指定了ENTRYPOINT指令后,用CMD指定更具体的参数。
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数


ENTRYPOINT与CMD命令的区别就是,在运行run命令时,追加的参数会覆盖CMD的命令,而ENTRYPOINT的命令是追加
ONBUILD
触发器:
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
也就是当有镜像被继承时,当build新镜像时将执行被继承镜像dockerfile中的ONBUILD指令

USER
指定用户组或用户id可以运行此Dockerfile
.dockerignore
添加构建镜像需要忽略的

  • 列出镜像的变更历史

docker history [镜像名]

  • 补充知识centos 7安装docker

  1. 安装gcc yum -y install gcc
  2. yum -y install gcc-c++
  3. 根据docker官网要求卸载旧版
  • 安装后无法启动docker服务 注意centos7中新版docker服务启动的命令变为systemctl start docker

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐