【docker】docker介绍安装和使用

 

一.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生成一个新的镜像
相关文章
相关标签/搜索