docker基础
Docker三个重要的概念:仓库(Repository),镜像(Image)和容器(Container),他们是Docker的三大基础组件。
容器都是基于镜像创建的,基于一个镜像可以创建若干个名字不同但是功能相同的容器
基础指令
对容器的基本操作
docker ps :查看当前主机正在运行的容器(看到的容器CONTAINER ID 是简化的16位ID)
docker ps --no-trunc :查看完整版ID
docker ps -a |grep CONTAINER ID:查看容器状态
docker stop CONTAINER ID:停止容器的运行
docker start CONTAINER ID:启动容器
CONTAINER ID 默认为128位,但是对于大多数主机而言,ID的前16位即可保证其在本机的唯一性。
CONTAINER ID 虽然能保持唯一性,但是很难记忆。在创建容器时,可以用–name参数给容器起一个别名,然后通过这个名字来代替CONTAINER ID 对容器进行操作。eg:docker start wordpress
docker inspect CONTAINER ID:查询容器的所有基本信息,包括运行情况、存储位置、配置参数 、网络设置等。(以JSON格式显示)
“-f”可以使用Golang的模板来提取指定部分的信息
eg:docker inspect -f {{.State.Status}} MyWordPress:提取容器中的运行状态
docker inspect -f {{.NetworkSettings.IPAddress}} MyWordPress:提取容器的IP地址
docker logs MyWordPress:查询日志
如果需要打印最新的日志,可以加上“-f”参数
docker stats MyWordPress:实时查看容器所占有的资源,如CPU、使用率、内存、网络和磁盘开销。
容器内部命令
Docker原生的方式支持登入容器 docker exec ,形式如下:
docker exec + 容器名 + 容器内执行的命令
如果希望在容器内连续执行多条命令,可以叫上 “-it” 参数,就相当于以root的身份登录容器内,可以连续执行命令,执行完成后通过“exit”退出。
多容器管理:
Docker的理念是“一个容器一个进程”,如若一个服务由多个进程组成,就要创建多个容器组成一个系统,相互分工和配合来对外提供完整的服务。所以,容器间需要进行数据交互,在同一台主机下,‘docker run’命令提供‘–link’选项建立容器间的互联。前提条件是,使用‘–link container A’创建容器B时,容器A必须已经创建并且启动运行。所以容器启动是按顺序的。
Docker Compose
Docker 提供的一个容器编排工具,就是用来解决‘–link’时需要手动控制容器启动先后的麻烦,它允许用户在‘YAML’格式的模板中定义一组相关联的应用容器。这组容器根据配置模板中的‘–link’等参数,对启动的优先级进行自动排序,简单执行一条‘docker-compose up’,就可以把同一个服务中的多个容器一次创建和启动。
需要注意的是:
虽然Docker Compose可以判断容器间的依赖并生成正确的启动顺序,但这种顺序仅仅是容器的顺序,假如容器A的进程a依赖容器B的进程b,但进程b启动需要耗费很长时间的话,这时虽然容器B先于容器A创建和启动,但进程a仍然可能和进程不能正常交互而启动失败,因为虽然容器B已启动但进程b还没完全启动完成。在这种情况下,Docker Compose无能为力,需要进程a自行增加一些判断等待和重试机制
对镜像的基本操作
和CONTAINER ID 一样,每个镜像有唯一的IMAGE ID,同样默认是128位,使用前16位的缩写模式,也可以用镜像的名字(REPOSITORY)和版本号(TAG)来组成位移标识。如果省略版本号,默认使用最新版本(lastest)
镜像分层
docker采用分层机制,就是将不同镜像相同的部分独立成层,再在这层上根据各自不同的部分形成各自的独立分层,这样就大大减小了存储资源的占用。然后docker利用联合文件系统将各层文件系统叠加在一起,在用户看来就像一个完整的文件系统。
通过 docker history 可以查看镜像分了多少层,每一层都做了什么操作,
eg:docker history sameersbn/redis 如果操作的内容显示不完整,在docker history 后 + ‘–tree’选项打印出完整的内容。
对于分层的docker镜像有两个特性:一是,已有的镜像只能读不能修改,一个是,上层镜像优先级高于底层镜像。
Dockerfile
Dockerfile:指定整个工程所有文件的编译顺序、编译规则。
ENTRYPOINT关键字指定将来创建的新容器使用/sbin/entrtpoint.sh来启动redis服务。
定制私有镜像
使用debootstrap工具,可以定制自己需要的最小化的Linux基础镜像。
下面制作一个Ubuntu14.04的基础镜像,并把系统时区修改为东八区(可以修改系统的任何文件):
sudo apt-get install debootstrapsudo debootstrap --arch amd64 trusty ubuntu-trusty http://mirrors.163.com/ubuntu/cd ubuntu-trustysudo cp usr/share/zoneinfo/Asia/Shanghai etc/localtime
提交生成基础镜像,名字为ubuntu1404-baseimage:1.0
cd ubuntu-trusty
sudo tar -c .|docker import - ubuntu1404-baseimage:1.0
现在就可以通过docker images来查看新创建的镜像了
指令解读
docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
这条指令做如下事情:
先,
在本机查找有没有wordpress镜像,如果没有,就到Docker的仓库查找该镜像,然后下载到本机。
然后,
基于wordpress镜像创建容器MyWordPress,提供个人博客服务。
所以, 我们通过docker ps 可以查到名字(Name)是MyWordPress,所使用的镜像是WordPress的镜像。
Docker指令的基础用法
docker + 命令关键字(COMMAND) + 一系列的参数([arg…])
比如,对于下面的指令来说,run是命令关键字,后面的内容都是参数
docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
如果不了解某个命令关键字支持哪些参数,可以通过下面指令获取帮助:
docker COMMAND --help
十分钟的动手教程
列出Docker的版本号
Docker引擎有两部分组成:Daemon和Client。Daemon是Service端的守护进程,接收Client端指令,管理本机上的所有镜像和容器;Client是通过Docker命令个Daemon交互,对Docker的镜像和容器进行查询、添加、修改、启动、停止等操作。
Docker命令的基本用法是:
docker + 选项 + 命令关键字 + 参数,其中。选项和参数是可选的。
格式如下:
docker [OPTIONS]COMMAND[arg…]
查看版本:
docker version
在Docker 的官方镜像仓库,搜索别人已经制作好的Docker镜像
Docker镜像仓库(Docker Hub Registry)储存着大量的Docker化的应用镜像,我们可以基于Docker官方仓库的镜像来创建我们的应用。
Docker查询镜像的格式为:
docker search
eg : docker search tutorial
在Docker官方镜像仓库,镜像的全名都是如下格式:
/
这是因为,每个用户都可以在Docker官方镜像仓库注册自己的账户,发布自己的Docker镜像,使用 “用户名+镜像名” 的命名方式,可以让不同用户拥有相同的镜像名而不相互干扰。
下载镜像,并以这个镜像为模板,在Docker容器中运行一个shell命令,输出“hello world”
下载镜像
docker 提供 docker pull 命令来下载镜像
创建并启动容器
docker run 命令用来创建和运行docker容器,至少需要两个参数,一个是镜像名,一个是在容器中需要运行的命令
想要运行容器并输出,需要shell命令 ‘echo’
eg:docker run learn/tutorial echo “hello world”
在docker容器中安装ping软件包,把他提交为新镜像
修改容器
在容器中安装实用工具ping,在非交互式模式下安装软件包是不要忘记使用‘-y’
docker run learn/tutorial apt-get install -y ping
创建新镜像
docker支持在原有镜像的基础上,只提交增量修改部分,形成一个新镜像。
首先,使用docker ps -l 找到安装过ping包的容器的ID号。
然后,把这个容器提交(docker commit)为新镜像,镜像名为’learn/ping’。
docker commit 698(CONTAINER ID) learn/ping
基于安装有ping软件的新镜像为模板,在docker容器中测试ping命令工作是否正常
docker run learn/ping ping www.baidu.com
docker ps: 查询所有正在运行的容器
docker inspect:通过ID查看单个容器详细内容。
如果测试ping命令工作正常,说明安装有ping软件的镜像制作正确,然后,我们就把这个新镜像提交到docker官方镜像仓库,分享给大家使用
docker images :显示当前主机上的所有镜像
docker push:推送主机的镜像到Docker仓库
docker push learn/ping