您的位置:首页 > 运维架构 > Docker

docker总结

2016-05-24 00:00 525 查看
摘要:     docker微服务能降低运营成本,提高开发效率。配置一个环境从开发、测试、生存都适用。直接将我们从繁杂的环境配置中解脱出来,docker会越来越多的工程师使用。现在简单介绍下docker的一些概念和使用方法。

docker总结

docker微服务能降低运营成本,提高开发效率。配置一个环境从开发、测试、生存都适用。直接将我们从繁杂的环境配置中解脱出来,docker会越来越多的工程师使用。现在简单介绍下docker的一些概念和使用方法。

1、Docker能做什么

a.隔离应用依赖

b.创建应用镜像并进行复制

c.创建容易分分的即启即用的应用

d.运行实例简单、快速地扩展

e.测试应用并随后销毁它们

f、docker是一个基于LXC开源应用容器引擎,使用沙箱机制。

2、Docker的镜像、容器、数据券、连接

a.镜像(image)

Docker的镜像类始于一种虚拟机的快照,但是更加轻。给容器提供环境配置,创建后会有唯一的ID、名称和标签对

b.容器(container)

容器是从镜像中创建的,是一个启动了的环境,相当于一个独立的虚拟机系统。启动后有唯一的ID、名称。

ps:容器一般用来运行一个单应用,而这些应用的依赖会依赖容器。在创建镜像的时候,我们一般会一层一层的创建,然后通过依赖完成我们的应用。比如:创建一个tomcat的镜像,我们先创建一个centos镜像,然后创建一个jdk镜像,最后在创建一个tomcat镜像。这里推荐,每一个镜像都只有一个应用。

c.数据卷(volume)

我们的容器在运行的时候,Docker会单独维护一套rootfs文件系统。当我们创建、销毁容器的时候,都会将rootfs的内容格式化。Docker的数据券,可以将主机的文件挂载在容器上,在容器销毁的时候,不会销毁挂载内容。再次创建容器,可以直接使用同样的数据,这就为我们的SQL数据安装做了保证,可以利用这种特性将日志和数据库数据存放在主机上

d.连接(network)

Docker程序会维护一套自己的network网络(相当于一个网关),我们每一个container都是通过这套network和外接、其它容器通信。

1.提供了容器间相互通信的渠道。在创建容器的时候,直接引用,就能将两个容器连接。

2.容器将共享一个本地网络

3.Docker镜像的可移植性

Docker允许在一个镜像中指定卷和端口,从这个镜像创建的容器继承这些设置。但是Docker不允许在镜像上指定不可以移植的内容,因为你不知道宿主机上面是否有这些卷和端口可以使用。

ps:最佳实践:不要在Dockerfile中使用expore和volumn命令,而是在run的时候,通过-p和-v来实现端口、数据卷。

4、docker的container的实现过程:

[code=plain]1.创建镜像image文件:DockerFile
2.docker build -ti 镜像名 dockerFile的地址
3.docker images(查看我们的镜像是否创建)
3.dcoker run -d -p 主机port:docker的port --name container名称 镜像名
(先启动依赖的container,在启动我们自己的container)
4.docker ps -a (查看我们的container运行)
5.docker exec -ti container名称 /bin/bash(进入container中)
6.exit 退出
7.docker stop container名称 暂停container运行


5、docker常用命令

[code=plain](image和container都可以使用ID和名称,一般推荐使用名称,查询的时候很直观)

1.镜像管理:(创建、导入、导出、删除、保存、修改标签)
a、创建:docker build [-t:一个tag;-f:Dockerfile地址] filepath (这里推荐使用-t)
b、查看:docker images
c、删除:docker rmi IMAGE/
d、查看历史:docker history IMAGE(查看image有多少层)
e、保存:docker save IMAGE
f、标签:docker tag IMAGE DockerHub_Name/image_Name:image_version
g、导入:docker import <soft_path>/name.tar
h、导出: docker export > path/name.tar

2、容器的rootfs命令:(在容器创建的时候,应用启动之前,都会配置文件系统、端口信息)
a、提交:docker commint CONTAINER
b、复制:docker cp CONTAINER/path Host/path 从容器拷贝到主机上
docker cp Host/path CONTAINER/path 从主机拷贝到容器中
c、变化:docker diff CONTAINER  查看创建过程的文件系统变化

3、容器的生命周期:
a、关闭:docker top CONTAINER
b、启动:docker start CONTAINER
c、创建:docker run [OPTION] IMAGE (这里的区别是在使用docker ps -l 显示image时的名字,推荐使用IMAGE_NAME)
[--name:container名称;-ti:前端运行,可交互;-d:后端运行;-p:主机port=container—port]
d、重启:docker restart CONTAINER
e、关闭:docker stop/kill CONATER
f、暂停:docker pause CONTAINER
g、删除:docker rm CONTAINER

4、运维(进入、查看)
a、进入:docker exec -ti CONTAINER commond(container的bash:设置的执行入口,例如市面上linux发行版默认的都是bin/bash)
b、从内部退出:exit
c、查询变动:dcoker diff CONTAINER (查询目录、文件:添加:A-add; 删除:D-delete; 修改:C-change)
d、查看:docker ps -a
e、查看容器配置信息:docker inspect CONTAINER
f、阻塞:docker wait CONTAINER
g、日志:docker logs CONTAINER

5、dockerhub:
a、查询: docker search IMAGE_NAME
c、登录:docker login --username=dockerHub_Name --email=email
b、下载: docker pull 库/IMAGE_NAME:TAG (默认:库--》docker.io,tag-->latest ,也可以用自己的私有库)
c、上传: docker push 库/IMAGE_NAME:TAG (默认:库--》docker.io,tag-->latest ,也可以用自己的私有库)


6、docker的device Mapper

docker的rootfs文件系统,在centos里面用的是device Mapper。这个文件系统包括了:Mapped Device,Mapping Table,Target Device

Mapped Device:是内核对外提供的逻辑地址,提供给用户态、bash使用。

Mapping Table:提供的是逻辑地址和Target Device的映射关系,有Mapped Device 逻辑的起始地址、范围、和表示在 Target Device 所在物理设备的地址偏移量以及Target 类型等信息(注:这些地址和偏移量都是以磁盘的扇区为单位的,即 512 个字节大小,所以,当你看到128的时候,其实表示的是128*512=64K)。

Target Mapped: 记录的是物理空间段。

(这种使用中间映射表的映射机制,可以将逻辑地址和物理地址解耦,

Ⅰ:通过mappering table,我们可以映射物理地址、逻辑地址,一切我们需要存放信息的地方。

Ⅱ:通过mappringTable我们还可以将逻辑地址的大小,映射为不同物理大小。这样在使用过程中,不端添加,修改。



7、在/var/lib/docker的文件

[code=plain]containers:运行的容器
devicemapper:docker的文件系统(从docker build image:tag 后就一直存在)
graph:存放的images信息
linkgrahdb:
network:
repositories-devicemapper:
tmp:这里存放的有docker pull下载时候的iamge信息/build时的Dockerfile文件
trust:
volumes:容器和主机的之间的文件映射信息?


8、dockerFile编写

a.常用的命令

[code=plain]ps:写的时候,尽量不要设置volumn、expore值,这两个值在run的时候使用-v,-p直接设置。因为,不能确定宿主机的文件和网络端口是否被占用

【FROM】
语法:FROM  <image name>
解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载

【MAINTAINER】
语法:MAINTAINER <author name >
解释:MAINTAINER指令允许你给将要制作的镜像设置作者信息

【ENV】
语法:ENV  <key> <value>
解释:ENV指令用于设置环境变量,在Dockerfile中这些设置的环境变量也会影响到RUN指令,当运行生成的镜像时这些环境变量依然有效,如果需要在运行时更改这些环境变量可以在运行docker run时添加–env =参数来修改。
注意:最好不要定义那些可能和系统预定义的环境变量冲突的名字,否则可能会产生意想不到的结果。

【RUN】
语法:①RUN  《run》      #将会调用/bin/sh -c
②RUN ["executable", "param1", "param2"]    #将会调用exec执行,以避免有些时候shell方式执行时的传递参数问题,而且有些基础镜像可能不包含/bin/sh
解释:RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样。(相当于每次run都会创建一个image层,提供给下一层使用)

【EXPOSE】
语法:EXPOSE  <port>
解释:EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息。配合run -p 主机port:容器port 可以访问外部

【ADD】
语法:ADD  《src》《destibation》
解释:ADD指令用于从指定路径拷贝一个文件或目录到容器的指定路径中,是一个文件或目录的路径,也可以是一个url,路径是相对于该Dockerfile文件所在位置的相对路径,是目标容器的一个绝对路径,例如/home/yooke/Docker/Dockerfile这个文件中定义的,那么ADD /data.txt /db/指令将会尝试拷贝文件从/home/yooke/Docker/data.txt到将要生成的容器的/db/data.txt,且文件或目录的属组和属主分别为uid和gid为0的用户和组,如果是通过url方式获取的文件,则权限是600。
注意:
①如果执行docker build – < somefile即通过标准输入来创建时,ADD指令只支持url方式,另外如果url需要认证,则可以通过RUN wget …或RUN curl …来完成,ADD指令不支持认证。
②路径必须与Dockerfile在同级目录或子目录中,例如不能使用ADD ../somepath,因为在执行docker build时首先做的就是把Dockerfile所在目录包含子目录发送给docker的守护进程。
③如果是一个url且不是以”/“结尾,则会下载文件并重命名为。
④如果是一个url且以“/”结尾,则会下载文件到/,url必须是一个正常的路径形式,“http://example.com”像这样的url是不能正常工作的。
⑤如果是一个本地的压缩包且是以“/”结尾的目录,则会调用“tar -x”命令解压缩,如果有同名文件则覆盖,但是一个url时不会执行解压缩。

【ENTRYPOINT】
语法:①ENTRYPOINT ["executable", "param1", "param2"]        #将会调用exec执行,首选方式
②ENTRYPOINT command param1 param2             #将会调用/bin/sh -c执行
解释:ENTRYPOINT指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个ENTRYPOINT指令,则只有最后一个指令有效。ENTRYPOINT指令中指定的命令(exec执行的方式)可以通过docker run来传递参数,例如docker run  -l启动的容器将会把-l参数传递给ENTRYPOINT指令定义的命令并会覆盖CMD指令中定义的默认参数(如果有的话),但不会覆盖该指令定义的参数,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],当通过docker run 启动容器时该容器会运行ls -a /etc命令,当使用docker run  -l启动时该容器会运行ls -a -l命令,-l参数会覆盖CMD指令中定义的/etc参数。
注意:
①当使用ENTRYPOINT指令时生成的镜像运行时只会执行该指令指定的命令。
②当出现ENTRYPOINT指令时CMD指令只可能(当ENTRYPOINT指令使用exec方式执行时)被当做ENTRYPOINT指令的参数使用,其他情况则会被忽略。

【VOLUME】
语法:VOLUME ["samepath"]
解释:VOLUME指令用来设置一个挂载点,可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移,具体用法请参考其他文章。

【USER】
语法:USER <uid>
解释:USER指令用于设置用户或uid来运行生成的镜像和执行RUN指令。

【WORKDIR】
语法:WORKDIR /path/to/workdir
解释:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最终输出的当前目录是/data/logs

【ONBUILD】
语法:ONBUILD [INSTRUCTION]
解释:ONBUILD指令用来设置一些触发的指令,用于在当该镜像被作为基础镜像来创建其他镜像时(也就是Dockerfile中的FROM为当前镜像时)执行一些操作,ONBUILD中定义的指令会在用于生成其他镜像的Dockerfile文件的FROM指令之后被执行,上述介绍的任何一个指令都可以用于ONBUILD指令,可以用来执行一些因为环境而变化的操作,使镜像更加通用。
注意:
①ONBUILD中定义的指令在当前镜像的build中不会被执行。
②可以通过查看docker inspeat 命令执行结果的OnBuild键来查看某个镜像ONBUILD指令定义的内容。
③ONBUILD中定义的指令会当做引用该镜像的Dockerfile文件的FROM指令的一部分来执行,执行顺序会按ONBUILD定义的先后顺序执行,如果ONBUILD中定义的任何一个指令运行失败,则会使FROM指令中断并导致整个build失败,当所有的ONBUILD中定义的指令成功完成后,会按正常顺序继续执行build。
④ONBUILD中定义的指令不会继承到当前引用的镜像中,也就是当引用ONBUILD的镜像创建完成后将会清除所有引用的ONBUILD指令。
⑤ONBUILD指令不允许嵌套,例如ONBUILD ONBUILD ADD . /data是不允许的。
⑥ONBUILD指令不会执行其定义的FROM或MAINTAINER指令。

【CMD】使用【ENTRYPOINT】代替,在使用run的时候,如果后面的指令和cmd指令相同,会被替换掉
【COPY】使用【ADD】 代替

b.最佳实践

Ⅰ.保持常见的指令响MAINTAINER以及从上至下更新DockerFile命令。

Ⅱ.当构建镜像时使用可理解的标签,以便更好的管理镜像。

Ⅲ.避免在DockerFile中映射文件系统,公有端口。在run的时候使用-v,-p设置。

Ⅳ.CMD和ENTRYPOINT命令使用数组语法,这连个命令会被run,exec 后面的commond命令替换掉

Ⅴ.如果设置CMD和ENTRYPOINT执行命令,在run的时候,执行完命令后容器会关闭。一般都是直接使用脚本。

9、tomcat为服务使用

Dockerfile文件

[code=plain]#tomcat Dockerfile
FROM centos:latest

#设置变量
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV CATALINA_HOME /usr/local/apache-tomcat-8.0.35
ENV PATH=.:$JAVA_HOME/bin:$:$CATALINA_HOME/bin:$PATH

#将jdk、tomcat换成自己的版本,add会直接将压缩文件解压开
ADD /jdk-8u91-linux-x64.tar.gz /usr/local/

ADD /apache-tomcat-8.0.35.tar.gz /usr/local/

生成tomcat:8 的镜像

[code=plain]docker build -ti myapp/tomcat:8 .

运行镜像

[code=plain]1.运行container:-p 主机端口:容器端口 -v 主机文件:容器文件
docker run -ti --name tomcat -p 9000:8080 -v /usr/local/logs/tomcat8/:/usr/local/apache-tomcat-8.0.35/logs/ myapp/tomcat:8  /bin/bash

(ps:容器映射文件的时候,和mount的方式一样,会将/usr/local/logs/tomcat8/:/usr/local/apache-tomcat-8.0.35/logs/内容格式化,然后将宿主机的文件/usr/local/logs/tomcat8/ 挂载上,在运行的时候,需要将宿主机的文件挂载空的容器文件价下面)

2.在容器里面运行docker
# ./usr/local/apache-tomcat-8.0.35/startup.sh

在宿主机查看9000端口是否打开

[code=plain]netstat -antp

在外面查看

[code=plain]http://宿主机ip:9000/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  docker