第三章
本章目标学习dockerfile,发布容器提供支持Docker registries(寄存服务),通过容器持久化存储托管键值存储
- 交互运行容器,并提供容器的一个shell
docker run -i -t [镜像] /bin/bash-i -t 是设置交互会话-h 设置主机名对于容器来说,主进程停止容器也停止
- 查看容器
docker ps会出现下面这种表格信息容器id 镜像 命令 创建时间 状态 端口 名字(系统取得名字)docker ps -a 查看所有容器包括已经停止的
- 获取容器详细信息
docker inspect 容器名字(系统取得名字)/容器id信息太多,也可以过滤使用通道符或者-- formatdocker inspect name/containerID | grep IPAddressdocker 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 bash2更新并下载执行包(不管)(此时你已经进入容器中)apt-get updateapt-get install -y cowsay fortune/usr/games/fortune | /usr/games/cowsay3 看到效果之后,我们将其做成镜像,此时容器已经不同于最初的容器,他被修改了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 fortune2 执行dockerfiledocker 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 docker2 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 /data2. 在执行run 的时候docker run -v /data imagesname-h redis -p 63793. 注意此时在容器里面的/data目录下有这个容器操作的数据,而真实数据,在宿主机上实际存在的目录是/var/lib/docker/volumes下面。4 . 修改宿主机的默认挂载地址docker run -v 宿主机地址/容器地址 imagesname-h redis -p 6379
