第三章

本章目标学习dockerfile,发布容器提供支持Docker registries(寄存服务),通过容器持久化存储托管键值存储

  • 交互运行容器,并提供容器的一个shell
  1. docker run -i -t [镜像] /bin/bash
  2. -i -t 是设置交互会话
  3. -h 设置主机名
  4. 对于容器来说,主进程停止容器也停止
  • 查看容器
  1. docker ps
  2. 会出现下面这种表格信息
  3. 容器id 镜像 命令 创建时间 状态 端口 名字(系统取得名字)
  4. docker ps -a 查看所有容器包括已经停止的
  • 获取容器详细信息
  1. docker inspect 容器名字(系统取得名字)/容器id
  2. 信息太多,也可以过滤使用通道符或者-- format
  3. docker inspect name/containerID | grep IPAddress
  4. docker inspect name/containerId -- format{{.NetworkSetting.IPAddress}} name/containerID
  • 获取容器被修改了那些东西
  1. 一般我们会交互运行容器,对容器中的东西进行修改,使用 docker diff 可以展示容器被修改的部分
  2. docker diff name/containerId

docker 容器使用的联合文件系统,允许多个文件系以层级的方式挂载,并对外表现一个文件系统,而对于镜像来说,其文件系统以只读的挂载方式,任何对运行的容器改变只发生在镜像上的可读写层即容器,就是说对于镜像来说他是可读的,但是对于容器是可读可修改的。

  • 获得容器中发生的一切事情
  1. docker logs name/containerId
  • 关于容器删除的事情
  1. docker rm name/containerId// 删除容器
  2. 删除已经停止的容器
  3. 1 首先获得停止容器的id(多个) docker ps -aq -f status=exited
  4. 2 docker rm -v $(docker ps -aq -f status =exited)
  5. 如何设置当容器停止的时候自动删除
  6. docker run image --rm
  • 关于dockerfile 先实现一个容器步骤如下
  1. 1 运行并下载 牛说(一个小游戏算是)
  2. docker run -it --name cowsay --hostname cowsay debian bash
  3. 2更新并下载执行包(不管)(此时你已经进入容器中)
  4. apt-get update
  5. apt-get install -y cowsay fortune
  6. /usr/games/fortune | /usr/games/cowsay
  7. 3 看到效果之后,我们将其做成镜像,此时容器已经不同于最初的容器,他被修改了
  8. docker commit 容器名称 新镜像名称
  9. 4 运行新镜像并使用
  10. docker run 新镜像名称 /usr/games/cowsay "xxxxxx"
  • dockerfile
  1. 如何使用docker创建上述的dockerfile?
  2. 1 新建Dockerfile,写上
  3. FROM debian:wheezy //从哪个镜像进行改造
  4. RUN apt-get update && apt-get install -y cowsay fortune
  5. 2 执行dockerfile
  6. docker build -t 新镜像
  7. 3docker run 新镜像名称 /usr/games/cowsay "xxxxxx"
  8. 4 docker 可以说将你在容器里的改变以命令的形式创建docker
  • 寄存服务
  1. 和代码一样放在github一样,我们的docker 建造的容器也能分享,可以说是分享dockerfile,我们通常使用docker hub,私有的话可以选择在自己的服务器用docker 搭建一个私有的docker 容器
  2. 关于镜像的命名
  3. 1. 使用 字符串/ 开头一般属于用户自己的行为,比如你自己建的
  4. 2。使用 无字符串/属于根命名空间 一般是官方的
  5. 3. 私有仓库开头(ip
  • 使用官方redis镜像
  1. 基础容器建议使用官方的镜像,安全,安全,安全
  2. 1 docker pull docker
  3. 2 docker run --name myredis -d redis // -d代表后台运行,使用 docker logs 可以查看输出
  4. 3 redis已经启动,现在看如何使用
  5. 4 在启动一个容器,在其中启动redis的客户端,交互使用-it ,并在关闭之后删除该容器
  6. docker run -it --rm --link myredis:redis redis /bin/bash
  7. 在容器使用redis-cli连接redicd

容器如何之间连接? 通过—link myredis:redis ,这是说将myredis和新容器连接起来,并且将redis作为myredis的新代号,主机名,我们在新容器中cat /etc/hosts 或发现有这么一句话‘172.17.0.2 redis 83911f9e6c33 myredis’,这就是link的实现方法

数据如何共享,持久,备份,docker使用数据卷(volume)的概念解决这个问题,volume不属于联合文件系统,他是直接挂载在主机上的,也就是说,所有的容器和主机之间的数据同信都能实现。任何的数据修改都操作在数据卷中。

  • 声明数据卷
  1. 1. dockerfile 使用命令声明
  2. VOLUME /data
  3. 2. 在执行run 的时候
  4. docker run -v /data imagesname-h redis -p 6379
  5. 3. 注意此时在容器里面的/data目录下有这个容器操作的数据,而真实数据,在宿主机上实际存在的目录是/var/lib/docker/volumes下面。
  6. 4 . 修改宿主机的默认挂载地址
  7. docker run -v 宿主机地址/容器地址 imagesname-h redis -p 6379