首页 > 代码库 > docker入门
docker入门
一、介绍
1、 Docker的特性:
- 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
- 资源隔离:系统资源,像CPU和内存等可以分配到不同的容器中,使用cgroup。
- 网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。
- 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
- 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
- 交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上。
2、docker 应用场景
- 加速本地开发:快速搭建好开发环境和运行环境。
- 自动打包和部署应用。
- 创建轻量级的私有Paas环境。
- 自动化测试和持续集成。
- 创建安全沙盒。
二、环境搭建:
Docker对Linux环境有两个要求,一是64位系统,二是内核在3.8以上。 下面以centos 上搭建为例:
docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push、pull命令从公有或者私有仓库下载、上传镜像;Docker Registry私有服务器用于保存管理我们的私有镜像。
需要注意的是CentOS 6.X与7.0的安装是有一点点不同的,CentOS-6上docker的安装包叫docker-io,并且来源于Fedora epel库,这个仓库维护了大量的没有包含在发行版中的软件,所以先要安装EPEL,而CentOS-7的docker直接包含在官方镜像源的Extras仓库(CentOS-Base.repo下的[extras]节enable=1启用)。前提是都需要联网。
centos 6.8 的具体安装启动过程如下。
- yum -y install docker-io
- service docker start
- chkconfig docker on
centos 7 的安装启动过程如下
- yum -y install docker
- systemctl start docker.service
- systemctl enable docker.service
三、基本操作&命令
简单查询:
- docker info
- docker search imangeName 从长款查询容器。
- docker inspect imageName:version 查看镜像设置
镜像相关:
- docker images 查看所有本地镜像。
- docker pull NAME[:TAG|@DIGEST] 下载镜像:eg: docker pull centos 等级 docker pull centos:latest
- docker imi imageId 删除镜像(前提:镜像启动的容器都已经被删除。)
- 本地镜像的总描述文件
centos6.8: /var/lib/docker/repositories-devicemapper.json ( 注意centos 6.8 没有var/lib/docker/image/文件夹, 在docker 1.10 后,容器的所有配置文件同意移动到了 /var/lib/docker/image文件夹中)
centos7.X: /var/lib/docker/image/devicemapper/repositories.json
- 本地单个镜像的文件:
centos /var/lib/docker/graph/{imageid}/
json -保存着关于这个镜像的元数据
layersize – 一个整数,表示layer的大小。
存储: 一个镜像就是的基础是一系列的layers, 一个docker 镜像就是一组制度的layer组成,
docker 1.7之前: docker images --tree 可以查看一个镜像包含的所有layers
1.7之后: dockviz images -d |dog -Tpng -o images.png
- 容器储存储位置 centos 6.8/7 :
由于目Docker支持AUFS,Btrfs,Device mapper,OverlayFS,ZFS五种存储驱动,所有各自存储的位置是不一样的
- 命令查看 docker image 结构 :
centos 6.8 &docker1.7: docker daemon -D -s overlay -g /varlib/docker 首先会提示内核版本过低
- root@ssdpc admin]# docker -d
- WARN[0000] You are running linux kernel version 2.6.32-642.1.1.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0.
- INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
- INFO[0000] [graphdriver] using prior storage driver "devicemapper"
- WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1
- INFO[0000] Loading containers: start.
- INFO[0000] Loading containers: done.
- INFO[0000] Daemon has completed initialization
- INFO[0000] Docker daemon commit=786b29d/1.7.1 execdriver=native-0.2 graphdriver=devicemapper version=1.7.1
容器相关:
- docker ps : 查询当前启动的容器, docker ps -a (所有的包含停止的)
- docker stop xxx: 停止容器
- docker start containId 可以启动一个已经停止的容器
- docker rm xxx: 删除停止的容器
- ducker run 启动一个容器 , 参数说明
-d 后台运行
-t -i 合用, 交互模式运行
-net 指定网络, 默认bridge (会使用172段的ip依次分配给启动的docker 容器), host 模式为共享主机的网络配置和端口。
-p 当net不为host 模式时, 将容器的端口 映射到宿主机器的端口上。
--ip 指定容器的ip
-e 环境变量设置
- docker cp container:path hostpath 这个命令是从容器内复制文件到指定的路径上
- 镜像保存1: 导入导出容器为镜像 export & import :
docker export containId >mycontain.tar 注意导出只是容器的静态文件快照,docker file 描述将会丢失。
cat mycontain.tar |docker import - tqcommontomcat:0.01 导入发布为本地的一个镜像。
- 镜像保存2:导入导出镜像为镜像 2 save & load:
docker save imageName:version > save.tar 或者 docker save -o save.tar imageName:version保存镜像,包含layers ,和dockerfile
docker load < /home/save.tar 或 docker load -i save.tar
- 镜像保存3: commit ,提交当前容器为一个镜像
docker commit contarinId imageName:version
docker daemon
所谓docker damemon 即为docker server 主进程, centos 6.8 : /etc/init.d/docker start , centos 7 : systemctl start docker.service
Docker 1.10增加了新功能(http://geek.csdn.net/news/detail/54953),从这个版本以后,用户在Linux上跑Docker时都不必再以root权限运行了。
1.10之前所有容器都只能在Docker daemon下以root权限运行。
安全的命名空间. 通过命名空间,Docker 1.10将Docker daemon和容器区别开来,对二者的权限分别加以处理,同时为各个容器分配相应的权限等级。在1.10下,Docker daemon仍然要取得主机的root权限,但容器就可以不用了。
传统的容器管理工具 LXC 即将退出 Docker 的舞台,
在 Linux 内核版本 3.10+ 上,使用内嵌的 overlay 驱动来完成跨主机的网络互联
在docker 1.10以前: 启动dokcer server 实际执行命令为:docker -d $other_args
设置dns使用 docker -d --dns 8.8.8.8
设置dns搜索域 docker -d --dns-search example.com
输出调试log docker -d -D
在docker 1.10 后: docker daemon $other_args
docker daemon -D -s overlay -g /var/lib/docker
进入容器内部:
- docker attach 老方式
- docker exec -ti containId /bin/bash
容器网络
docker network ls 列出所有容器的网络id ,和网络模式
docker network inspect networkId 列出网络的详细信息
docker network connect --option containId 为运行中容器创建网络
dockerfile 相关
- FROM imagename:version 时以每个镜像为基础 layer
- ENV key value 设置环境变量
- ADD hostFIle imagePath 把宿主机器上的文件添加的镜像中, 请使用绝对路径
- WORKDIR xxx 容器启动时默认工作目录
- RUN commond 是指build 过程中随便执行的命令, 例如在镜像中创建文件等。
- VOLUME 讲宿主本地目录挂载到容器上
- CMD 设置容器启动的时候执行的命令
- ENTRYPOINT container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条ENTRYPOINT没有CMD的可替换特性
四、example
镜像tqtestjava:2.0 制作,tqtestjava:2.0 是一个userauth 和userauthweb的运行环境,
容器启动的功能包括:
1、能够在容器内部自动更新svn代码.
2、自动mvn install ,自动启动两个java .
3、容器的端口自动映射.
4、容器打包
下载一个基础的centos 镜像,docker pull centos
以交互模式启动centos 容器: docker run -d -ti centos /bin/bash,
进入容器bash后,安装yum , net , jdk, svn ,maven , svn co 社管代码到 /usr/local/project/zhejiange 下, 编写启动脚本/usr/local/start_zhejiang.sh
(这里需要注意的是我一开始讲许多环境变量设置在/etc/profile 中,其实对docker 来说,这可能是无效的,因为docker 的许多镜像,都市linux 精简版本 ,系统启动也仅仅加载必要的资源),所以需要我们在docke run 是指定环境变量,或者在dockerfile 中指定(固定不变的话)。
提交镜像: docker cmmoit mycontainId tqtestjava:1.0
5、tqtestjava:1.0 虽然有了我们需要自行的环境, 我们也可以以交互模式进入,启动我们的应用,但是如果要让我们的应用在容器启动的时候自动启动应用, 需要 在docker run 命令后面拼接以系列的环境变量, 换需要手动指定docker 启动的时自行的脚本, 工作目录等。
例如:
- docker run -d --net=host -ti -e MAVEN_HOME=/opt/maven -e JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64 -e PATH=$PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/ tqtestjava:1.0 /usr/local/project/start_zhejiang.sh
这对使用人员来说不太方面。
所以我们编写dockeFile : dockerUseranthTest.txt
- FROM tqtestjava:1.0
- ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
- ENV MAVEN_HOME /opt/maven
- ENV PATH $PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/
- WORKDIR /usr/local/project/
- RUN date;sleep 100;date
- RUN echo "============end==="
- CMD ["/usr/local/project/start_zhejiang.sh", " start " , "start"]
- [root@ssdpc dockerapp]# ^C
- [root@ssdpc dockerapp]# ll
- total 8
- -rw-r--r--. 1 root root 335 Aug 31 15:48 dockerCommonTomcat
- -rw-r--r--. 1 root root 340 Aug 31 08:45 dockerUseranthTest
- [root@ssdpc dockerapp]# more dockerUseranthTest
- FROM tqtestjava:0.04
- ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64
- ENV MAVEN_HOME /opt/maven
- ENV PATH=$PATH:$MAVEN_HOME/bin/:$JAVA_HOME/bin/:/usr/local/project/
- WORKDIR /usr/local/project/
- RUN date;sleep 100;date
- RUN echo "============end==="
- CMD ["/usr/local/project/start_zhejiang.sh", " start " , "start"]
然后执行: docker build -f dockerUseranthTest.txt -t tqtestjave:2.0 .
这样我们就新生成了一个 tqtestjave:2.0 镜像。
最后执行: docker -d --net=host tqtestjave:2.0 就可以实现启动容器时应用自启动了
6、网络选择: 这里我们选择host 模式, 不是说host 模式好,而且线上也不建议使用host模式。 而且因为如果我们选择bridge 模式,需要在路由器上设置一个172段的路由网关,同时固定宿主机器上分配的docker 容器的ip 段。 这适合于有网络经验的人来搞。
五、docker REST API
docker的所有命令可以通过一系列的restful 的API , 这对生产环境编写漂亮发布,部署脚本十分有效
docker images 可以等级与:
echo -e "GET /images/tomcat/json HTTP/1.0\r\n" |nc -U /var/run/docker.sock
docker ps 可以等级与:
echo -e "GET /containers/json HTTP/1.0\r\n" |nc -U /var/run/docker.sock
默认情况下 Docker 的守护进程启动会生成一个 socket (/var/run/docker.sock)进程通信文件,而并没有监听端口,只能在本机操作 Docker。如果想在其它地方操作 Docker 主机,就需要让 Docker 主机监听一个端口号,这样可以通过端口号就能实现远程操作。
1、对于手动启动的docker daemon :可以这样配置
docker -d -H unix:///var/run/docker.sock -Htcp://0.0.0.0:5678
2、ubuntu :
vim /etc/default/docker.io :
DOCKER_OPTS=" -H unix:///var/run/docker.sock" =====修改为====>DOCKER_OPTS=" -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"
service docker.io restart
3、Red Hat 7系列
systemctl stop docker
vim /etc/sysconfig/docker
#修改other_args 的值
other_args=" -H tcp://0.0.0.0:5678 -H unix:///var/run/docker.sock"
systemctl start docker
配置验证:
docker -H localhost:5678 version
六、相关资源
https://github.com/docker
QQ交流群:534368042
docker入门