一.docker简介:php
docker是容器技术的一个表明,而容器技术是将程序打包和隔离的一种技术,其实它并非一个新技术,以前在linux内核中早已存在,真正被大众所用所了解是由于docker的出现。docker之因此流行起来,是由于解决了一些计算机领域的痛点,它解决了软件包装的问题,保证开发与运维及测试环境的一致。docker能够将任何应用以轻量级容器的形式来打包,迁移发布和运行。能够简单的认为是一个轻量级的虚拟机,可是也不算是虚拟机。html
2013年docker开源,它跨平台,支持windows,Mac,Linux系统。Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎.java
docker官网:https://www.docker.com/linux
docker的github托管地址:https://github.com/dockernginx
docker官方文档:https://docs.docker.com/get-started/git
二. Docker思想:github
1.集装箱web
docker的logo是一个鲸鱼上面装着不少集装箱,想象下在没有集装箱以前,运输货物很是零散,没有规矩,运输过程当中说不定有些东西会掉了,优良集装箱,全部货物就被密封在集装箱中,集装箱很大也不容易丢失,这样就保证了咱们货物的安全原样的送到目的地。那么咱们能够把货物想象成咱们的程序,假如能把一台机器上的程序部署到新的一台机器上,那么会拷贝过去,可是这过程当中有可能会由于人为的疏忽少拷贝了一些配置文件或者相关文件,致使在另外一台机器上程序启动不起来。有了docker的集装箱就是帮咱们解决这样的问题,它会保证咱们的程序无论在哪运行不会缺乏应有的东西。docker
2.标准化编程
能够从三个方面解释标准化,1.运输方式的标准化。2.存储方式标准化。3.Api接口标准化。
3.隔离
docker是一种轻量级容器,它有本身的一套内部环境,好比cpu,内存,磁盘等,能够隔离外面主机。docker使用了LXC技术来实现这种独立的环境,LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化,这是一种轻量级的容器虚拟化,能够实现docker环境的快速创建,销毁。
三.docker能解决哪些问题
1.解决环境不一致:
常常遇到开发在本地运行没错,测试那边运行同一个程序出现问题。出现这种问题通常都是运行环境不一致致使的。一个应用程序运行须要一系列的依赖,如操做系统,web服务器,相关的配置文件,对应的编程语言的代码及相应程序解释器等等,若是其中一个变了程序就有可能失败,好比程序调用了一些系统命令,可是换个环境没有这些命令,那么就会致使程序启动失败,程序的版本也会致使程序的错误,如php7和php5.3语法就有些不同。
而docker就会把全部所须要的配置文件,程序代码等所须要的一切环境打包到一个集装箱中,至关于把开发环境打了一个包,这个包环境和开发的本地的环境一摸同样,这样就保证了运行环境的一致性,这个包就能够被测试引用到他本地运行,因此docker就是解决环境不一致的问题。
2.程序隔离
Linux是多用户系统,上面能够运行多种程序和服务,当其中一个程序或服务运行出现故障时候,消耗不少cpu,或者大量IO操做,占用大量内存,会牵连服务器上的其余运行中的软件,而docker能够避免这种状况出现。由于docker自己就是一个个独立隔离的环境,在docker启动的时候就会被限定使用多大的内存及其余资源使用限度,因此docker环境里的程序出现问题也会只是影响这个docker里的程序,不会影响其余服务和程序。
3.资源快速扩张和弹性伸缩
如今电商系统常常会有秒杀活动,还有双十一,618这样特别的促销活动。每当这样的节日来临时候,电商系统都会面临大量的访问,因此须要更多的软硬件资源去应对这样大量的访问量,而平时却不须要这么多的服务器,不如也会形成极大的浪费,因此在节假日来临前扩充能够应对节日所须要的服务器数量,节日以后在将这些多余的服务器下线,可是这会给运维带来很是大的工做量,由于运维须要分别给每台机器搭建环境配置所须要点一切软件,而且还得调试,这是一个很是繁琐的过程。可是docker让这些事变得简单,只须要经过docker管理软件点击鼠标配置下,就会立马从10台服务器变成100台或者更多。
四.docker核心技术
docker里面有三个核心的词汇镜像,仓库,容器,镜像是上面例子中的集装箱,仓库是存放镜像的地方,容器是运行程序的地方。docker运行一个程序的过程就是去仓库把镜像拉到本地,而后用docker命令在本地把docker运行起来。
1.镜像(image):从本质上来讲镜像就是一系列的文件,能够包括应用程序的文件,也能够包括运行环境的文件,这些镜像文件用一种特殊的文件格式来保存。linux有种存储技术叫作联合文件系统(Union File System),这是一种分层的文件系统,能够将不一样的文件目录挂载在同一个虚拟文件系统下。怎么理解呢,下面有个例子。
songguojundeMBP:~ songguojun$ ls dir1 //在dir1目录下看到下面三个目录 Desktop Downloads Movies songguojundeMBP:~ songguojun$ ls dir2 //在dir2目录下看到下面另外三个目录
code Documents Library songguojundeMBP:~ songguojun$ ls dir //联合文件系统中,在dir目录下看到下面六个目录,也就是上面两个目录共同的目录文件集合 Desktop Downloads Movies code Documents Library
其实就是联合在不一样磁盘上的不一样的文件系统到一个公共目录下。经过联合文件系统能够实现文件的分层,docker镜像就是利用这种分层的概念来实现镜像存储。下面这张图就是镜像存储格式。
在Docker镜像分为基础镜像和父镜像,没有父镜像的镜像被称为基础镜像。用户是基于基础镜像来制做各类不一样的应用镜像。这些应用镜像共享同一个基础镜像层,提升了存储效率。
2.容器(container)
容器的本质就是一个运行在服务器上的进程,docker镜像中的每一层文件都是只读的,只有最上面一层上可写的,这一层就是容器,容器这一层是可写的,当容器对下一层的镜像去写东西,会将下一层的镜像中要修改的文件拷贝一份到最上层容器中,而后在对它修改,修改以后当程序读取这个最新的文件,由于程序读取会从最顶层开始查找。因为镜像是不能够修改的,因此同一个容器能够生成多个容器独立运行,它们之间没有任何干扰。
镜像和容器区别:
镜像实际上是有多个只读层,它们重叠在一块儿,除了最上面一层可写其它都是只读模板,而容器就是镜像的一个运行实例。
3.仓库(repository)
仓库就是存放镜像的地方,可使用docker pull命令从docker hub拉取咱们须要的镜像,进行操做。docker有官方等其余公司提供的镜像中心,也支持搭建本身私有的镜像中心。
经常使用仓库地址列表:
hub.docker.com (docker官方仓库)
c.163.com(网易蜂巢)
hub.docker.com 里面经常使用镜像列表
五.Docker 架构
docker架构图
1.DOCKER_HOST:docker操做宿主机,上面运行了Docker daemon核心程序,负责各类docker操做,好比下载docker镜像或者运行一个容器。
2.Client:客户端用命令和Docker daemon交互,好比pull,build ,run等,交给Docker daemon来操做,和远端镜像仓库交互。
3.Registry:公司的sass服务,是存放 Docker 镜像的仓库,Docker daemon能够和Registry交互。
六.docker的安装
安装docker先看下centos版本
[root@localhost ~]# uname -r 3.10.0-514.21.2.el7.x86_64
第一个命令,下载
wget -qO- https://get.docker.com/ | sh
下载完后,docker默认状况是容许root去运行,全部建议添加一个用户到docker组
先查看用户组
cat /etc/group
咱们添加一个用户
[root@localhost docker]# usermod -aG docker songguojun
#groups 查看当前登陆用户的组内成员
查看加入状况
cat /etc/group
查看docker是否安装成功
docker info
若是出现下面命令
说明docker服务没有启动
咱们启动下
service docker start
在执行 docker info
docker安装成功
咱们能够直接输入docker命令 查看docker命令的选项
咱们看到里面有个run参数,意思是在一个新容器中执行命令,能够单独查看这个参数意思
[root@localhost ~]# docker run --help Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] Run a command in a new container Options: --add-host list Add a custom host-to-IP mapping (host:ip) -a, --attach list Attach to STDIN, STDOUT or STDERR --blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0) --blkio-weight-device list Block IO weight (relative device weight) (default []) --cap-add list Add Linux capabilities --cap-drop list Drop Linux capabilities --cgroup-parent string Optional parent cgroup for the container --cidfile string Write the container ID to the file --cpu-period int Limit CPU CFS (Completely Fair Scheduler) period --cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota --cpu-rt-period int Limit CPU real-time period in microseconds
docker window安装:https://docs.docker.com/docker-for-windows/install/
Mac安装:https://docs.docker.com/docker-for-mac/install/
更多安装参考: http://www.docker.org.cn/book/install/supported-platform-17.html
七.docker的使用
咱们先输入如下命令
songguojundeMBP:java songguojun$ docker run centos echo hello docker #这个命令做用是用docker运行centos镜像 并输出hello docker字符串 Unable to find image 'centos:latest' locally latest: Pulling from library/centos #在docker运行镜像前会查看本地环境是否有这个要运行等镜像 这里就是查看centos这个镜像,发现没有就从远端读取开始下载 8ba884070f61: Pull complete Digest: sha256:b5e66c4651870a1ad435cd75922fe2cb943c9e973a9673822d1414824a1d0475 Status: Downloaded newer image for centos:latest #镜像下载成功 hello docker #输出字符串
查看本地有哪些镜像
songguojundeMBP: songguojun$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 9f38484d220f 3 months ago 202MB
运行nginx服务
songguojundeMBP: songguojun$ docker run -p 8080:80 -d daocloud.io/nginx #-d参数表明守护进程 Unable to find image 'daocloud.io/nginx:latest' locally latest: Pulling from nginx 743f2d6c1f65: Pull complete 6bfc4ec4420a: Pull complete 688a776db95f: Pull complete Digest: sha256:e770165fef9e36b990882a4083d8ccf5e29e469a8609bb6b2e3b47d9510e2c8d Status: Downloaded newer image for daocloud.io/nginx:latest 720bfbd6d9beaaea8b7bb9506c6e45345a4dcd29e6486a4798b4aa31488fba13
上面开启了本地nginx服务,咱们在浏览器上输入http://localhost:8080/
查看当前运行的容器
songguojundeMBP: songguojun$ docker ps #显示当前正在运行的容器 docker ps -a 列出全部的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 720bfbd6d9be daocloud.io/nginx "nginx -g 'daemon of…" 29 seconds ago Up 28 seconds 0.0.0.0:8080->80/tcp quirky_blackwell
CONTAINER ID:容器id
PORTS:端口映射关系
修改nginx默认首页
songguojundeMBP:tmp songguojun$ cat index.html <html> <h1>hello docker</h1> </html> songguojundeMBP:tmp songguojun$ docker cp index.html 720bfbd6d9be://usr/share/nginx/html
再次查看
不过这个修改只是暂时的,当再次重启容器时候,以前的修改都会消失。
中止docker容器
songguojundeMBP:tmp songguojun$ docker stop 720bfbd6d9be
720bfbd6d9be
再次设置
[songguojundeMBP:tmp songguojun$ docker run -p 8080:80 -d daocloud.io/nginx # -d表示守护进程 3a69a07abb20cd12b238063ca8aaa6aa07d592266eb0e93d93ea9a0c15853375 [songguojundeMBP:tmp songguojun$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3a69a07abb20 daocloud.io/nginx "nginx -g 'daemon of…" 24 seconds ago Up 22 seconds 0.0.0.0:8080->80/tcp festive_khorana [songguojundeMBP:tmp songguojun$ docker cp index.html 3a69a07abb20://usr/share/nginx/html [songguojundeMBP:tmp songguojun$ docker commit -m 'fun' 3a69a07abb20 nginx-newimage 保存image sha256:8c9627568f55f12c1fe8b561253ef89bdc58b6511f513b3de2759122dc4e6203 新产生的image的id [songguojundeMBP:tmp songguojun$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx-newimage latest 8c9627568f55 21 seconds ago 109MB 这个是上面新产生的image daocloud.io/nginx latest 53f3fd8007f7 6 weeks ago 109MB centos latest 9f38484d220f 3 months ago 202MB
启动容器并进入该容器中
songguojundeMBP:docker songguojun$ docker run -i -t centos /bin/bash #启动一个centos容器及启动容器时候到命令 /bin/bash [root@5ce0363609a4 /]# ls #当前centos容器环境 说明已经进入了 5ce0363609a4是容器的名字 anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
八.Dockerfile
上面咱们经过docker commit能够建立一个新的镜像,咱们也能够经过一个配置文件去一步步构建(docker build
)新的镜像,这个配置文件就是Dockerfile,能够帮助咱们从一个基础镜像开始创建一个自定义镜像,使用配置文件的方式能够更加方便。
编写Dockerfile文件
[songguojundeMBP:docker songguojun$ cat Dockerfile FROM alpine:latest #alpine是专门针对docker作的一个极小的linux环境 image会很是小 MAINTAINER xbf CMD echo "hello Docker"
而后用docker build构建
[songguojundeMBP:docker songguojun$ docker build -t hello_docker . #构建 Sending build context to Docker daemon 2.048kB Step 1/3 : FROM alpine:latest latest: Pulling from library/alpine 921b31ab772b: Pull complete Digest: sha256:ca1c944a4f8486a153024d9965aafbe24f5723c1d5c02f4964c045a16d19dc54 Status: Downloaded newer image for alpine:latest ---> 4d90542f0623 Step 2/3 : MAINTAINER xbf ---> Running in 5c0c87f55732 Removing intermediate container 5c0c87f55732 ---> 92236846ad7f Step 3/3 : CMD echo "hello Docker" ---> Running in 86e5f878788c Removing intermediate container 86e5f878788c ---> 7378acc65286 Successfully built 7378acc65286 Successfully tagged hello_docker:latest
[songguojundeMBP:docker songguojun$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello_docker latest 7378acc65286 2 minutes ago 5.58MB #这个就是生成的新的image
<none> <none> 8c9627568f55 15 hours ago 109MB
alpine latest 4d90542f0623 3 days ago 5.58MB
daocloud.io/nginx latest 53f3fd8007f7 6 weeks ago 109MB
centos latest 9f38484d220f 3 months ago 202MB
[songguojundeMBP:docker songguojun$ docker run hello_docker #运行
hello Docker
编写Dockerfile文件去运行
编写Dockerfile文件以下
FROM ubuntu MAINTAINER songguojun RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nginx COPY index.html /var/www/html ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] EXPOSE 80
构建
songguojundeMBP:dockefile2 songguojun$ docker build -t songguojun/run-nginx . # 点.表明当前目录上下文 Sending build context to Docker daemon 3.072kB Step 1/8 : FROM ubuntu latest: Pulling from library/ubuntu 5b7339215d1d: Pull complete 14ca88e9f672: Pull complete a31c3b1caad4: Pull complete b054a26005b7: Pull complete Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Status: Downloaded newer image for ubuntu:latest ---> 4c108a37151f Step 2/8 : MAINTAINER songguojun ---> Running in 7f9ca70095c4 Removing intermediate container 7f9ca70095c4 ---> 671c843cfffd Step 3/8 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list ---> Running in 6238932a7dca Removing intermediate container 6238932a7dca ---> 4f672cace3ec Step 4/8 : RUN apt-get update Removing intermediate container 6e93cc3d0300 ---> dfc95c276b1d Step 6/8 : COPY index.html /var/www/html ---> 2407837e404b Step 7/8 : ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"] ---> Running in f66729e00481 Removing intermediate container f66729e00481 ---> 7e34bc3f7eb6 Step 8/8 : EXPOSE 80 ---> Running in 3dbdd072eaa8 Removing intermediate container 3dbdd072eaa8 ---> 2d0b94c15efc Successfully built 2d0b94c15efc Successfully tagged songguojun/run-nginx:latest
运行
songguojundeMBP:dockefile2 songguojun$ docker run -d -p 80:80 songguojun/run-nginx 08f8f58bf0bf8977a528a33bd35efca667dfb71cc4ca45017bdade452ad736da songguojundeMBP:dockefile2 songguojun$ curl http://localhost:80 docker runing #这个是index.html文件里的内容
Dockerfile指令
Dockerfile指令都是大写,后面跟着参数。
指令参数 | 做用 |
---|---|
FROM | base image |
RUN | 执行命令 |
ADD | 添加文件,能够将远程的文件添加入容器 |
COPY | 拷贝文件 |
CMD | 执行命令 |
EXPOSE | 暴露端口 |
WORKDIR | 指定路径 |
MAINTAINER | 维护者 |
ENV | 设定容器里的环境变量 |
ENTRYPOINT | 容器入口,和CMD相似 |
USER | 指定用户 |
VOLUME | mount point,指定容器所挂载的卷 |
镜像分层
Dockerfile配置文件里每一条命令都会产生一个新层,每一层对应一个独立的字符串id。
上面黄色一层表示容器层,是可读可写,它产生于image运行后,这样保证容器是能够改变的。下面红色的是只读。
分层的好处可使相同的层在不一样的image里复用。
九.Docke存储技术Volume
volume是提供独立于容器外的持久化存储。
songguojundeMBP:~ songguojun$ docker run -d --name nginx -v /usr/share/nginx/html nginx
42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9
songguojundeMBP:~ songguojun$ docker inspect nginx #获取容器/镜像的元数据.
[
{
"Id": "42ccf5ff54e62010ed44415fb25295619952411594f220abcb0365d0ba4938b9",
"Created": "2019-07-01T12:23:20.678195837Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
.......
"Mounts": [
{
"Type": "volume",
"Name": "060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934",
"Source": "/var/lib/docker/volumes/060bcb88df7ec3077f137182d545c21bd5eda97c931ca98acbe5dd390707c934/_data", #宿主机的路径,会挂载到下面容器内的路径
"Destination": "/usr/share/nginx/html", #容器内部的路径
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
............
下面列出docker经常使用命令
命令 | 做用 |
---|---|
docker version | 查看docker版本。 |
docker-compose --version | 查看compose 版本信息 |
docker pull | 从远端获取image |
docker build | 建立image |
docker images | 列出本地已有image |
docker run | 运行container |
docker ps | 列出container |
docker rm | 删除已经结束的container |
docker rmi | 删除一个image |
docker cp | 在host和container之间复制文件 |
docker commit | 保存已经被改动的image生成一个新的镜像 |