第三章
本章目标学习dockerfile,发布容器提供支持Docker registries(寄存服务),通过容器持久化存储托管键值存储
- 交互运行容器,并提供容器的一个shell
docker run -i -t [镜像] /bin/bash
-i -t 是设置交互会话
-h 设置主机名
对于容器来说,主进程停止容器也停止
- 查看容器
docker ps
会出现下面这种表格信息
容器id 镜像 命令 创建时间 状态 端口 名字(系统取得名字)
docker ps -a 查看所有容器包括已经停止的
- 获取容器详细信息
docker inspect 容器名字(系统取得名字)/容器id
信息太多,也可以过滤使用通道符或者-- format
docker inspect name/containerID | grep IPAddress
docker inspect name/containerId -- format{{.NetworkSetting.IPAddress}} name/containerID
- 获取容器被修改了那些东西
一般我们会交互运行容器,对容器中的东西进行修改,使用 docker diff 可以展示容器被修改的部分
docker diff name/containerId
docker 容器使用的联合文件系统,允许多个文件系以层级的方式挂载,并对外表现一个文件系统,而对于镜像来说,其文件系统以只读的挂载方式,任何对运行的容器改变只发生在镜像上的可读写层即容器,就是说对于镜像来说他是可读的,但是对于容器是可读可修改的。
- 获得容器中发生的一切事情
docker logs name/containerId
- 关于容器删除的事情
docker rm name/containerId// 删除容器
删除已经停止的容器
》1 首先获得停止容器的id(多个) docker ps -aq -f status=exited
》2 docker rm -v $(docker ps -aq -f status =exited)
如何设置当容器停止的时候自动删除
docker run image --rm
- 关于dockerfile 先实现一个容器步骤如下
1 运行并下载 牛说(一个小游戏算是)
docker run -it --name cowsay --hostname cowsay debian bash
2更新并下载执行包(不管)(此时你已经进入容器中)
apt-get update
apt-get install -y cowsay fortune
/usr/games/fortune | /usr/games/cowsay
3 看到效果之后,我们将其做成镜像,此时容器已经不同于最初的容器,他被修改了
docker commit 容器名称 新镜像名称
4 运行新镜像并使用
docker run 新镜像名称 /usr/games/cowsay "xxxxxx"
- dockerfile
如何使用docker创建上述的dockerfile?
1 新建Dockerfile,写上
FROM debian:wheezy //从哪个镜像进行改造
RUN apt-get update && apt-get install -y cowsay fortune
2 执行dockerfile
docker build -t 新镜像
3docker run 新镜像名称 /usr/games/cowsay "xxxxxx"
4 docker 可以说将你在容器里的改变以命令的形式创建docker
- 寄存服务
和代码一样放在github一样,我们的docker 建造的容器也能分享,可以说是分享dockerfile,我们通常使用docker hub,私有的话可以选择在自己的服务器用docker 搭建一个私有的docker 容器
关于镜像的命名
1. 使用 字符串/ 开头一般属于用户自己的行为,比如你自己建的
2。使用 无字符串/属于根命名空间 一般是官方的
3. 私有仓库开头(ip)
- 使用官方redis镜像
基础容器建议使用官方的镜像,安全,安全,安全
1 docker pull docker
2 docker run --name myredis -d redis // -d代表后台运行,使用 docker logs 可以查看输出
3 redis已经启动,现在看如何使用
4 在启动一个容器,在其中启动redis的客户端,交互使用-it ,并在关闭之后删除该容器
docker run -it --rm --link myredis:redis redis /bin/bash
在容器使用redis-cli连接redicd
容器如何之间连接? 通过—link myredis:redis ,这是说将myredis和新容器连接起来,并且将redis作为myredis的新代号,主机名,我们在新容器中cat /etc/hosts 或发现有这么一句话‘172.17.0.2 redis 83911f9e6c33 myredis’,这就是link的实现方法
数据如何共享,持久,备份,docker使用数据卷(volume)的概念解决这个问题,volume不属于联合文件系统,他是直接挂载在主机上的,也就是说,所有的容器和主机之间的数据同信都能实现。任何的数据修改都操作在数据卷中。
- 声明数据卷
1. 在dockerfile 使用命令声明
VOLUME /data
2. 在执行run 的时候
docker run -v /data imagesname-h redis -p 6379
3. 注意此时在容器里面的/data目录下有这个容器操作的数据,而真实数据,在宿主机上实际存在的目录是/var/lib/docker/volumes下面。
4 . 修改宿主机的默认挂载地址
docker run -v 宿主机地址/容器地址 imagesname-h redis -p 6379