转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6994652.html
一:docker理解
docker的通俗化定义:docker相当于一个容器,你可以把任何程序放到docker中。
它是一个软件容器化平台。
二:docker思想
集装箱:如果只是单纯地把项目拷贝到别处,极大几率会运行失败,因为新的运行环境可能不满足软件所需的各种配置、运行环境。而docker则不仅仅是把程序单纯地拷贝,而是把程序放进“集装箱”,这个“集装箱”就是这个程序的整个运行环境,把整个集装箱拷贝,从而包装程序拷贝到哪里都能正常运行。
标准化:运输方式标准化——程序先同一运送到超级码头,然后再发送到请求该软件的地方。API标准化——使用同一的api控制应用。
隔离:docker化的程序互不影响。
三:docker的应用场景
1:docker解决了运行环境不一致导致同一个程序在不同环境运行失败的问题——把软件以及软件所需的运行环境一并打包;
2:docker解决了同一台服务器上不同应用之间由于硬件资源产生的互相影响问题——在同一台服务器上运行的docker程序事先分配好了一定的硬件资源(cpu、内存等),各自属于一个隔离的小环境,一个docker程序的运行崩溃不会影响到其他程序。
3:docker让服务器规模弹性伸缩、扩展简单成为可能——在高并发热点时间段需要进行服务器规模扩展时,使用docker的标准化操作,可以快速在新的服务器上搭建好统一的运行环境,让服务器集群规模快速扩展成为可能。
四:docker基本概念
1:镜像(集装箱):镜像是一系列文件,包括程序本身、所处运行环境的文件。镜像的组成使用了Linux系统的分层文件系统原理。把处于不同层次的文件构建成为一个独立的文件系统,成为一个可以独立运行的环境。底层,是系统引导层;往上,是linux操作系统;再往上,是程序运行环境,如web容器,jdk等;之后是程序层,我们要运行的程序;最顶层是容器层。除了顶层外,下面的各层都是只读的。
2:容器(运行程序的地方):容器层相当于一个虚拟机。镜像的文件系统被拷贝到他处后,就在容器层运行。容器层是可写的,因为程序运行起来后,需要进行一些简单的IO操作,如日志输出等。
3:仓库(超级码头):是docker镜像的运输中心,在本地构建好镜像后,需要发送到docker仓库。其他计算机需要运行这个docker程序时再从仓库下载。仓库有hub.docker.com、c.163.com等。
我们也可以搭建自己内网的私人仓库,供企业内部使用。
用docker运行一个程序的过程,就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器:
工作过程类似于Maven:
执行docker pull时,docker客户端把命令传递给docker守护进程;
守护进程首先在本机镜像仓库查找该镜像,若不存在,则向docker中央仓库发出拉取命令,把镜像下载到本机仓库;
执行docker run时,命令发送给守护进程,守护进程先在本机仓库查找,如果存在该镜像,则放进容器中运行;如果不存在,则向中央仓库拉取到本机,再放进容器中运行;
执行docker build,构建了一个镜像,放进本机仓库中,然后用docker ship上传镜像。
五:ubuntu上安装docker
首先,更新系统的apt-get:sudo apt-get update
然后,输入命令行:sudo apt-get install -y docker.io 安装docker。
六:docker镜像命令
docker pull Name:从中央仓库拉取Name镜像。
docker images:查看本机所有docker镜像。
七:docker容器命令
docker run ImageName [command] :运行下载回来的镜像
docker ps:显示正在运行的镜像
八:使用镜像
1:镜像的获取:到网易蜂巢上面查找镜像关键词:c.163.com
2:在查询结果列表中选择自己要拉取的镜像,点击进去,找到拉取该镜像的docker命令
3:复制粘贴到本机的docker终端来执行,从而拉取该镜像。
4:运行该镜像:
docker run -d ImageName:后台运行该镜像。
5:进入该容器:docker exec -it ImageName bash
进入容器之后,相当于进入了一个独立的小系统,可以在里面使用该容器环境的各自指令,运行程序。
6:退出容器:exit
九:docker网络通信
在容器在运行的docker应用,如何把其入口映射到所在主机的端口上?
有三种方式:
Host模式:host模式下,容器直接使用本机的物理网卡,因此,本机的端口就是容器的端口,可以直接通过浏览器访问。
Bridge模式:桥模式下,容器中创建一个虚拟网卡,容器使用虚拟网卡的网络端口,然后docker创建一个网桥docker0(bridge),把本机物理网卡的端口映射到容器虚拟网卡上,使得容器能够进行网络通信。
None:没有网络,docker不进行网络通讯。
我们一般使用端口映射的方式来运行docker镜像,有两种:
1:指定主机某个端口映射到容器的80端口:
docker run -d -p 主机端口:80 镜像名
此时,我们在浏览器输入 主机ip:主机端口 即可访问到容器内80端口,进入镜像页面。
2:开放主机所有端口,随机映射一个端口给容器80端口:
docker run -d -P 镜像名
注意:这里时大写P。
然后执行
docker ps
查看正在运行的镜像,找到刚才运行的镜像的运行情况,从 PORTS列的到端口映射情况。
然后在浏览器输入 主机ip:分配的端口 即可访问容器内页面。
十:制作镜像
制作镜像需要两步:
1:编写dockerfile文件,在其中属性镜像的构建规则。如:
from 已有镜像 MAINTAINER 新建镜像所有者的名字 COPY 本机文件 到引入镜像的某个位置
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。
一个声明以#
字符开头则被视为注释。可以在Docker文件中使用RUN
,CMD
,FROM
,EXPOSE
,ENV
等指令。
FROM
该指令用于设置后续指令的基本映像。
LABEL
可以为映像添加标签来组织项目的映像。
RUN
该指令用于执行当前映像的任何命令。
CMD
这用于执行映像的应用程序。Dockerfile文件中只能有一个CMD。如果使用多个CMD,则只会执行最后一个CMD。
COPY
该指令用于将来自源的新文件或目录复制到目的地的容器的文件系统.
WORKDIR
WORKDIR用于为Dockerfile中的RUN
,CMD
和COPY
指令设置工作目录。如果工作目录不存在,它默认将会创建。
2:在Dockerfile存放目录执行build指令构建镜像:
docker build -t name:tag dockerfilepath
其中,name是创建出来的镜像名,tag是版本名,后面是dockerfile所在目录的路径【当前目录则为 .】
十一:实例——docker运行nginx镜像
1:查找镜像
登陆网易蜂巢镜像中心,输入关键字,查找镜像,点击进去,复制镜像地址
2:打开终端,输入docker pull 镜像地址
3:执行 docker images 查看是否拉取成功
4:执行 docker run -d nginx:后台运行nginx,并返回容器id
5:执行 docker exec -it 容器id bash:打开容器的终端
6:此时相当于进入到容器内部了,可以在终端执行一系列命令,查看镜像运行情况、监控等
7:端口映射:如果时运行一个部署在nignx内的web项目,则在运行该镜像时,需要进行端口映射:
docker run -d -p 主机端口:80 镜像名
然后就可以在浏览器输入 主机ip:主机端口/web项目名 访问web项目页面了。
十二:实例——制作javaweb镜像
1:在本机拉取tomcat镜像
docker pull hub.c.163.com/library/tomcat:latest
2:新建一个目录,把需要部署的war包放进去
3:在该目录下,新建名为 Dockerfile的文件,并编辑:
from 基础镜像(这里时tomcat镜像名)
MANITAINER 镜像作者名,联系方式
COPY war包 /user/local/tomcat/wepapps
4:构建镜像
docker build -t 镜像名 . (当前目录下构建,用 . 表示dockerfile路径)
5:运行镜像,映射端口:
docker run -d -p 端口:8080 镜像名
6:打开浏览器,输入 主机ip:端口 即可访问javaweb项目页面。
7:还可以安装其它依赖,如:mysql等。
十三:常用docker命令
1. 查看Docker版本
$ docker version
它用于查看Docker的客户端和服务器版本。如下图所示。
2. 从Docker文件构建Docker映像
$ docker build -t image-name docker-file-location
-t:它用于指定使用提供的名称来标记Docker映像。
3. 运行Docker映像
$ docker run -d image-name
-d:用于创建守护程序进程。
4. 查看可用的Docker映像
$ docker images
5. 查看最近的运行容器
$ docker ps -l
-l:它用于显示最新的可用容器。
6. 查看所有正在运行的容器
$ docker ps -a
-a:它用于显示所有可用的容器。
7. 停止运行容器
$ docker stop container_id
container_id:由Docker分配给容器的Id。
8. 删除一个映像
$ docker rmi image-name
9. 删除所有映像
$ docker rmi $(docker images -q)
10. 强制删除所有映像
$ docker rmi -r $(docker images -q)
-r:用于强制删除映像。
11. 删除所有容器
$ docker rm $(docker ps -a -q)
12. 进入Docker容器
$ docker exec -it container-id bash