[9]docker的常用命令、镜像构建提交、提交阿里云仓库 - 图1

1.个人对docker的理解

docker类似一个虚拟机,是一个软件级别的虚拟机,安装使用方便,镜像小又丰富,在docker中的centos7的镜像只有200兆左右,去除了没必要的工具软件,只留必要的运行环境

1.1对镜像和容器的理解:

关系和java类似:
镜像=类
容器=实例对象
镜像run后会得到一个容器实例,每run一次就得一个容器实例,当然也可以启动停止的容器。

1.2镜像原理:

基于联合文件系统的分层原理(UnionFS),每个镜像可能得依赖于其他镜像 才能运行
如tomcat:kernel》Centos》jdk》tomcat,类似java中类的继承关系,kernel就想当于Object
在pull 拉tomcat的时候,依次拉这些依赖,对外暴露的只是tomcat,这也是tomcat有400多兆的原因

为什么联合文件系统的分层?

最大的好处就是共享资源,类似本地maven仓库的jar,为不同项目所共享
比如:有多个镜像都是从相同的base镜像构建而来,那么宿主机上只需要保存一份base镜像,
由其他要依赖的镜像共享
特点:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,
这一层被称为“容器层”,之下的都叫“镜像层”
2.相关命令
辅助命令:

  1. docker version
  2. docker info
  3. docker --help

镜像命令:

  1. docker images 列出本机的镜像
  2. -a 显示全部 包括中间层镜像
  3. -q 只显示镜像的id
  4. --digests 显示镜像的信息
  5. --no-trunc 显示完整的镜像信息
  6. docker search 镜像名字 {网址:https://hub.docker.com}
  7. docker -s 30 tomcat 搜索热度大于30 tomcat镜像
  8. docker rmi 镜像明/id 删除镜像(启动过有实例的 删不了)
  9. docker rmi -f 镜像明/id 强制删除镜像
  10. docker rmi -f 镜像明1/id1 镜像明1/id1 强制删除多个镜像 中间空格隔开
  11. docker rmi -f $(docker images -q) 删除全部
  12. docker history 镜像id 查看镜像历史

容器命令:

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG..]
  2. OPTIONS说明:
  3. --name="容器新名字" 为容器指定一个名字
  4. -d:后台运行容器,并返回容器id,即启动守护式容器
  5. -i:已交互式运行容器,通常与-t同时使用
  6. -t:为容器重新分配一个伪输入终端,通常与-i同时使用
  7. -P:随机端口映射
  8. -p:指定端口映射,有以下四种格式:
  9. ip:hostPort:containerPort
  10. ip::containerPort
  11. hostPort:containerPort
  12. containerPort
  13. --privileged=true 有时run 有错误,加这个参数 消除错误
  14. 进入了容器终端,exit是退出停止,ctrl+p+q是暂时退出 不关闭容器
  15. docker ps 查看正在运行的容器
  16. -l 查看上次运行过的容器
  17. -a 查看运行过的容器 历史 在运行的或已经退出的
  18. -n 3 查看上3次运行过的容器
  19. -q 静默模式,只显示容器编号
  20. --no-trunc 不截断输出
  21. doeker start 容器id或名字 启动关闭的容器
  22. doeker restart 容器id或名字 重启正在运行的容器
  23. doeker stop 容器id或名字 优雅停止运行的容器
  24. doeker kill 容器id或名字 强制停止运行的容器
  25. docker rm 容器id或名字 删除已停止的容器(未停止的删不成功)
  26. docker rm -f 容器id或名字 强制删除容器
  27. docker rm -f $(docker ps -a -q) 强制删除所有容器 docker ps -a -q | xargs ocker rm
  28. docker logs -f -t --a-tail 3 容器id 查看容器运行日志 3
  29. f:跟随最新的日志打印
  30. t: 加入时间戳
  31. tail 数字:显示最后多少条日志

重新进入后台运行的容器:

  1. 1. docker attach 容器id 直接进入容器的终端
  2. 2. docker exec -it 容器id 要执行的命令 进入执行命令 返回结果回当前终端

拷贝容器里的文件到宿主机(位置互换 方向相反):

  1. docker cp 容器id:容器文件路径 存到宿主机的路径

以json串显示容器的信息

  1. docker inspect 容器id

提交现有容器为镜像:

  1. docker commit -a="作者" -m="描述" 容器id wpx/mytomcat:8.5

3.docker容器数据卷:

容器的持久化
容器间继承+共享数据
解决容器停止或删除时数据问题
卷的目的就是:数据持久化,完全独立于容器的生命周期,因此docker不会在容器删除时产出其挂载的数据卷
特点:

  1. 据卷可在容器之间共享或重用数据
  2. 中的更改可以直接生效
  3. 据卷中的更改不会包含在镜像的更新中
  4. 据卷的声明周期一直持续到没有容器使用它为止

    添加数据卷:直接命令添加、DockerFile添加

    1.直接命令添加
    启动centos时 建立同步文件夹 宿主机dataH 容器内dataC,下次启动该容器时也会同步宿主机的过来

    1. docker run -it -v /dataH:/dataC centos

    加上:ro 是只读的意思,能同步 但容器里面不能写改

    1. docker run -it -v /dataH:/dataC:ro centos

    2.DockerFile添加

    新建dockerfile文件,继承该镜像后 添加相应命令,编译成新镜像
    文件内容:

    1. FROM centos
    2. VOLUME ["dataC1","dataC2"]
    3. CMD echo "finished---------succes!"
    4. CMD /bin/bash

    编译:

    1. docker build -f /mydocker/dockerfile -t wpx/centos .

    ps看到 新的镜像
    启动会看到已经生成好2个 数据卷文件夹dataC1 dataC2,读写都为true
    使用 docker inspect 容器id 可以查看对应宿主机那边的数据卷文件夹位置
    相同镜像 不同实例之间的共享:
    首先启动的第一个容器d1 添加了数据卷
    其他实例启动时 去继承d1即可,所有继承者之间都能相互同步共享数据卷
    即使d1挂了,子孙之间依然保持
    命令:docker run -it —name d2 —volumes-from d1 镜像名或ID

    4.dockerFile构建:

    步骤:

  5. 辑dockerfile文件 及相关资料放在同目录

  6. 译dockerfile,得到的镜像在本地镜像库中

编译命令:

  1. docker build -f /mydocker/dockerfile -t wpx/centos .

提交现有容器为镜像:(对容器的改动都会保住)

  1. docker commit -a="作者" -m="描述" 容器id wpx/mytomcat:8.5

dockerFile保留字指令:

FROM 基于镜像,或继承那个镜像
MAINTAINER 作者及邮箱
RUN 容器构建时需要执行的命令
EXPOSE 当前容器对外暴露的端口
WORKDIR 指定才创建容器后 终端登录进来的工作目录
ENV 用来在构建过程中设置环境变量(ENV 变量名 值)
ADD 讲宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和tar压缩包
COPY 复制文件或目录到镜像中,COPY src dest,COPY[“src”,”dest”]
VOLUME 建立容器数据卷,用于数据的保存和持久化工作
CMD 指定容器启动后 要执行的命令,可以又多个但只有最后一个有效,CMD会被docker run 后面的参数替换
ENTRYPOINT 指定容器启动后 要执行的命令,和CMD一样,但其命令会在docker run 都追加
ONBUILD 当构建一个被继承的dockerFile是运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发

5.push提交本地镜像到阿里云的云端仓库

进入阿里云 容器镜像服务,创建相应仓库,仓库列表右侧“管理”,点击去 按照操作指南即可

6.安装常用软件

安装mysql:
加-d后台运行还不行,因为mysql默认只是本机登录,外面无法操作,所以docker启动又立刻停掉了
可以 -e MYSQL_ROOT_PASSWORD=123456 设置一下密码,有密码的root可以外机访问
-v挂载mysql 相关文件
-v /opt/mysql/data:/var/lib/mysql
-v /opt/mysql/my.cnf:/etc/mysql/my.cnf
安装redis:
docker run -d -p 6379:6379
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
redis redis-server /usr/local/etc/redis/redis.conf
—appendonly yes

  1. docker run -d -p 6379:6379 -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf redis redss-server /usr/local/etc/redis/redis.conf --appendonly yes