Docker 是什么?

  • Docker 是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中
  • Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样
  • 总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样

docker.jpg

Docker 的三个概念

  • 镜像(image):是一个只读的模板,类似于安装系统用到的那个 iso 文件,任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境。我们通过镜像来完成各种应用的部署。镜像可以用来创建 Docker 容器
  • 容器(Container):容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。可以把容器看做是一个简易版的 linux 环境(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。注意:镜像本身是只读的,容器从镜像启动时,Docker 在镜像的上层创建一个可写层,镜像本身不变
  • 仓库(Repository):类似于代码仓库,这里是镜像仓库,是 Docker 用来集中存放镜像文件的地方。仓库分为公开仓库和私有仓库。 最大的公开仓库是 Docker hub(hub.docker.com),国内公开仓库(dockerpool.com)。一般每个仓库存放一类镜像,每个镜像利用 tag 进行区分,比如 Ubuntu 仓库存放有多个版本(12.04、14.04等)的 Ubuntu 镜像。

    镜像的基本操作

  • Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等等资源

  • Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样
  • Run (运行镜像):运行的镜像就是一个容器,容器就是运行程序的地方

    编写 Dockerfile 文件

    Dockerfile 是为了快速构建镜像,Dockerfile 由一行行命令语句组成,并且支持以#开头的注释行。Dockerfile 分为4个部分:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令,例如:

    1. # 第一行必须制定基本的基础镜像
    2. FROM centos
    3. # 维护者信息
    4. MAINTAINER docker_user docker_user@email.com
    5. # 镜像的操作指令
    6. RUN echo "hello world"
    7. RUN yum update && yun install -y net-tools
    8. RUN yum install -y nginx
    9. # 容器启动时执行指令
    10. CMD /usr/sbin/nginx

    命令解释:

  • FROM:指定所创建镜像的基础镜像,如果本地不存在,则默认会去 Docker Hub 下载指定镜像

  • MAINTAINER:指定维护者信息,该信息会写入生成镜像的Author属性域中
  • RUN:运行指定命令
  • CMD:用来指定启动容器时默认执行的命令
  • EXPOSE:声明镜像内服务所监听的端口
  • ENV:指定一个环境变量,会被后续 RUN 指令使用,在镜像启动的容器中也会存在
  • ADD:将本地的一个文件或目录拷贝到容器的某个目录里

    使用 Dockerfile 创建镜像

    Dockerfile 可以理解为一种配置文件,用来告诉 docker build 命令应该执行哪些操作。编写完 Dockerfile 之后,可以通过 docker build 命令来创建镜像
    语法:docker build [选项] 内容路径
    该命令将读取指定路径下的 Dockerfile,并将该路径下的所有内容发送给 Docker 服务端,由服务端来创建镜像。因此除非生成镜像需要,否则一般建议放置 Dockerfile 的目录为空目录
    可以使用 -f 选项来指定其路径,可以使用-t选项来指定生成镜像的标签信息
    1. # 其中-t用来指定新镜像的用户信息、tag等。最后的点表示在当前目录寻找Dockerfile
    2. docker build -t="test/base-image" .

    获取镜像

    语法:docker pull NAME[:TAG]
    其中,NAME 是镜像仓库的名称(用来区分镜像),TAG 是镜像的标签(用来表示版本信息)
    1. # 拉取镜像
    2. docker pull centos:6.7

    查看镜像

    语法:docker images
    docker-images.jpg

    其它常用命令

    ```dockerfile

    运行一个hello world

    docker run -it centos:6.7 /bin/echo hello world

运行一个后台任务

docker run -ti -d centos:6.7 /bin/bash -C “ while true ;do echo helloworld;sleep 1;done”

将宿主机的 /host/src 目录挂载到 /opt/webapp

docker run -ti -v /host/src:/opt/webapp centos:6.7 /bin/bash

同上,不过是只读挂载

docker run -ti -v /host/src:/opt/webapp:ro centos:6.7 /bin/bash

随机分配端口

docker run -d -P wordpress

指定端口

docker run -d -p 8080:8080 wordpress

指定绑定ip地址和端口

docker run -d -p 127.0.0.1:8080:8080 wordpress

指定udp映射

dpcker run -d -p 8080:8080/udp wordpress

  1. <a name="abdBa"></a>
  2. ## 容器的基本操作
  3. <a name="X1dyD"></a>
  4. ### 创建容器
  5. 当使用 docker run 来创建并启动容器时,Docker 在后台运行的标准操作:
  6. 1. 检查本地是否存在指定的镜像centos,不存在就从公有仓库下载
  7. 2. 利用镜像创建并启动一个容器
  8. 3. 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
  9. 4. 从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去
  10. 5. 从地址池配置一个IP地址给容器
  11. 6. 执行用户指定的应用程序
  12. 7. 执行完毕后,容器被终止
  13. ```dockerfile
  14. # 创建容器
  15. # docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它
  16. docker create -it {image_name}
  17. # 启动容器
  18. docker start {container_id}
  19. # 新建并启动容器
  20. # 用下载到的镜像开启容器,-i表示让容器的标准输入打开,-t表示分配一个伪终端,要放到镜像名字前面
  21. docker run -t -i centos /bin/bash
  22. # 守护态运行容器
  23. docker run -itd centos /bin/bash

终止容器

语法:docker stoop [container]
可以使用 docker stop 来终止一个运行中的容器

进入容器

进入容器有以下3种方法:

  1. attach 命令
  2. exec 命令(推荐方式)
  3. nsenter工具 ```dockerfile

    attach命令

    使用attach命令有时候并不方便,当多个窗口同时使用attach命令链接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法进行操作

    docker attach mynginx

exec命令(推荐方式)

docker exec -it mynginx /bin/bash

nsenter工具

先安装 nsenter工具

yum install -y util-linux

为了使nsenter链接到容器,还需要找到容器的pid

PID=$(docker inspect —format “{{.State.Pid}}” <container>)

通过这个pid就可以连接到这个容器

nsenter -t $PID -u -i -n -p

通常情况,可以把工具写成一个脚本更为方便

[root@localhost ~]# cat ns.sh

!/bin/bash

PID=docker inspect --format "{{.State.Pid}}" $1 nsenter -t $PID -u -i -n -p [root@localhost ~]# ./ns.sh mynginx ``` Docker 官方文档:https://docs.docker.com/