这是一篇关于Docker技术的初级文档,主要针对Docker的babies。当然,如果是老鸟也欢迎温故知新。
Docker组件分为客户端和服务端。
Docker Client:Docker的客户端
Docker Server: Docker daemon的主要组成部分,接收用户通过Docker Client发送的请求,按照相应的路由规则实现路由分发。
Docker Registry:是Docker镜像的中央存储仓库
Docker镜像运行之后变成容器。
Docker需要使用Linux内核中的CGroups和Namespace功能,必须包含这两项功能,内核版本必须高于3.10.
安装docker,安装docker和docker.io,使用命令
apt-get install docer
apt-get install docker.io
启动docker Daemon命令为:
#service docker start或者systemctl start docker
查看Docker版本
#docker version
运行测试(因为需要下载hello-world镜像,会自动去外网下载):
#docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/engine/userguide/
或者使用网上的镜像进行测试
我们使用码云上的一个开源项目
先克隆项目命令如下:
# git clone https://gitee.com/dockerf/docker-training.git
然后编译镜像:
# docker build -t cyphere/centos:7.1 .
Sending build context to Docker daemon 8.704 kB
Step 1 : FROM centos:centos7.1.1503
---> c288e5945774
Step 2 : MAINTAINER Carson,C.J.Zeong
---> Using cache
---> ec1a67832870
Step 3 : ENV TZ "Asia/Shanghai"
---> Using cache
---> 577afeadeac1
Step 4 : ENV TERM xterm
---> Using cache
---> c6cb24e09d77
Step 5 : ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
---> Using cache
---> 25fef5ca6f0b
Step 6 : ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo
---> Using cache
---> 983dd35ebe92
Step 7 : RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwdsudo yum-utils hostname net-tools rsync man && yum install -y gcc gcc-c++ git make automakecmake patch logrotate python-devel libpng-devel libjpeg-devel && yum install -y --enablerepo=epel pwgenpython-pip && yum clean all
---> Using cache
---> 8d4ad2dbd92f
Step 8 : RUN pip install supervisor
---> Using cache
---> a112b76647f4
Step 9 : ADD supervisord.conf /etc/supervisord.conf
---> Using cache
---> 0fd05419af62
Step 10 : RUN mkdir -p /etc/supervisor.conf.d && mkdir -p /var/log/supervisor
---> Using cache
---> 14d11d019067
Step 11 : EXPOSE 22
---> Using cache
---> 464f20e0f9b8
Step 12 : ENTRYPOINT /usr/bin/supervisord -n -c /etc/supervisord.conf
---> Using cache
---> d31702307c6b
Successfully built d31702307c6b
查看镜像命令使用:
docker images
查看docker进程:
docker ps
查看容器日志
docker logs -f <容器名orID>
删除所有容器,不可以删除一个运行中的容器,此时必须先用docker stop或docker kill命令停止它才能删除。
docker rm $(docker ps -a -q)
删除之后去查看docker ps –a发现都不存在了。
删除单个容器
docker rm <容器名orID>
停止、启动、杀死一个容器
docker stop <容器名orID>
docker start <容器名orID> (如果全部删掉后,那先如要执行docker run
docker kill <容器名orID>
拉取镜像
docker pull <镜像名:tag>
删除所有镜像(慎重不要被好不容易下载的给删除了)
docker rmi $(docker images | grep none | awk '{print $3}' | sort -r)
构建自己的镜像
docker build -t <镜像名>
如Dockerfile在当前路径:
docker build -t xx/gitlab .
保存镜像:
当需要把一台机器上的镜像迁移到另一台机器的时候,需要保存镜像与加载镜像。
docker save busybox-1 > /home/save.tar
使用scp将save.tar拷到其他机器上,然后:
docker load < /home/save.tar
从容器中拷贝文件出来
docker cp 7bb0e258aefe:/etc/debian_version .
把容器转换成镜像
docker commit
调查容器详细信息,诊断问题信息常用
docker inspect
#docker exec -it
进入交互模式
上面中的docker命令包括了三部分:docker,run,hello-world。
其中docker表示客户端程序,
run表示子命令。
hello-world表示镜像名称。
说白了,docker run 组合在一起代表运行一个新docker容器。
我们继续运行一个ubuntu镜像:
#docker pull Ubuntu
然后运行一个含shell终端的容器:
#docker run -i -t ubuntu /bin/bash
直接进入到docker容器镜像了。
复杂一点的例如如下
运行一个新容器,同时为它命名、端口映射、文件夹映射。
docker run --name redmine -p 9003:80 -p 9023:22 -d -v /var/redmine/files:/redmine/files -v /var/redmine/mysql:/var/lib/mysql sameersbn/redmine
一个容器连接到另一个容器
docker run -i -t --name sonar -d -link mmysql:db tpires/sonar-server sonar
此外还可有有其他参数,例如-v参数。
在Docker run中-v参数表示映射本地文件到容器中。在数据库相关的容器中很有用,其他需要保存数据文件的场景也可以使用。
语法如下:
-vhost_dir:container_dir
--rm参数表示容器
--entrypoint可以覆盖掉原先的ENTRYPOINT参数,--entrypoint=/bin/bash
通过create命令将镜像生成容器,但是不运行。
容器和镜像是Docker的核心部分,Docker实际就是在容器里面运行一个镜像。
一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。
Docker镜像通过镜像ID进行识别。镜像ID是一个64字符的十六进制的字符串。但是当我们运行镜像时,通常我们不会使用镜像ID来引用镜像,而是使用镜像名来引用。
镜像可以发布为不同的版本,这种机制我们称之为标签(Tag)。
Docker容器可以使用命令创建:
# docker run imagename
会在所有的镜像层之上增加一个可写层。这个可写层运行在CPU上的进程,有两个不同的状态:运行态(Running)和退出态(Exited)。这就是Docker容器。
当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。
可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此相互隔离的。对其中一个容器所做的变更只会局限于那个容器本身。
如果对容器的底层镜像进行修改,当前正在运行的容器是不受影响的,不会发生自动更新现象。
如果想更新容器到其镜像的新版本,那么必须当心,确保我们是以正确的方式构建了数据结构,否则可能会导致损失容器中所有数据的后果。
64字符的十六进制的字符串来定义容器ID,是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名,但显然用4字符的容器ID更为简便。
dockerfile由4部分信息组成:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
Dockfile是创建Docker的文件,可以理解成makefile。
VOLUME 映射本地文件给虚拟机,
CMD参数: container启动时执行的命令,一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD.CMD主要用于container时启动指定的服务,当docker run command的命令匹配到CMD command时,会替换CMD执行的命令。
ENTRYPOINT 容器入口进程,最后一个生效。container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条,ENTRYPOINT没有CMD的可替换特性。
ADD,将文件
所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0,如果文件是可识别的压缩格式,则docker会帮忙解压缩。如果要ADD本地文件,则本地文件必须在 docker build
和Dockerfile同目录的.dockerignore文件可以记录文件名字用于忽略,即忽略文件中哪个文件。
ONBUILD命令在未做其他基线的时候引用触发,ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行。
编译生成镜像,命令如下:
docker build -t csphere/centos:7.1 .
其中-t参数指定镜像名称和tag
不过如果依赖基础镜像的话,下载速度很可能超时。
FROM是基础镜像
MAINTAINER 作者
ENV 环境变量
RUN 是安装哪些服务
ADD
EXPOSE
ONBUILD ADD
ONBUILD RUN
可以到docker镜像市场,例如:http://hub.daocloud.io/
此处下载一个tomcat镜像。
拉取镜像,命令如下:
docker pull daocloud.io/library/tomcat:7.0-jre7-alpine
当然可以拉最新的可以使用:
docker pull daocloud.io/library/tomcat:latest
拉取完毕后可以使用 docker images来查看。
启动镜像容器:
# docker run -it -p 8080:8080 daocloud.io/library/tomcat
也可以使用其他国内的镜像市场。
其中-p是指定主机和容器的端口映射。
可以使用如下命令进行查看:
#docker network ls
查看网络详情
#docker network inspect bridge
创建新的桥接网络
#docker network create –driver bridge mynet
容器的文件系统由分层文件系统提供,包含只读层(镜像)和可读写层(容器运行时)。如果要将主机上文件系统共享给容器使用,可以使用数据卷或者数据容器。
数据卷是将主机的卷mount进入到容器,数据容器是将外部容器分享给容器。使用参数-v。例如:
#docker run -d -v /webapp xxx
#docker run -d -v /root:/hostroot xxx
第二个命令是将/root目录映射到了容器中的/hostroot中。第一个命令创建一个数据卷。
因为容器本身可以包含文件系统,可以把容器的卷分享给另一个容器。可以先创建一个包含外部卷的容器,然后使用--volumes-from来指定该数据容器。
需要注意的是,数据卷在容器创建时进行初始化,数据卷可以共享也可以容器间重用,其读写是直接下发的。
镜像的公共仓库是Docker Hub,在海外,国内的需要墙出去才可以。当然可以在公司内部建立私有仓库,或者在网上建立公共的私有仓库。主要命令就是:search,pull,login,push。
例如查找mysql镜像,执行:
#docker search mysql
Docker教程官方
http://dockone.io/article/101