Docker

架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Hello World

$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world

各个参数解析:

  • docker: Docker 的二进制执行文件。
  • run: 与前面的 docker 组合来运行一个容器。
  • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
  • /bin/echo “Hello world”: 在启动的容器里执行的命令

运行交互式的容器

我们通过 docker 的两个参数 -i -t,让 docker 运行的容器实现**“对话”**的能力:

$ docker run -i -t ubuntu:15.10 /bin/bash
root@0123ce188bd8:/#

各个参数解析:

  • -t: 在新容器内指定一个伪终端或终端。
  • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。

启动容器(后台模式)

使用以下命令创建一个以进程方式运行的容器

$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

镜像

  • 查看本地镜像 docker images
  • 查找镜像 docker search
  • 拉取镜像 docker pull
  • 删除镜像 docker rmi -f
  • 上传镜像 docker push    
  • 使用镜像创建容器并启动 docker run
    • [-i] 以交互式运行
    • [-t] 为容器重新分配一个伪输入终端
    • [–name ] #创建一个名称centos_aways的容器,自动重启
    • [–restart]:always始终重启;on-failure退出状态非0时重启;默认为,no不重启
    • [-p] : <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。
    • -d : 表示使用守护进程运行,即服务挂在后台
    • -P :随机的端口映射
    • -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>

docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭

  • 使用镜像创建容器

    docker create

    -t, –tty Allocate a pseudo-TTY

    -i, –interactive Keep STDIN open even if not attached

    -d, –detach Run container in background and print container ID #run的参数

  • 容器资源限制参数

  • -m 1024m –memory-swap=1024m # 限制内存最大使用(bug:超过后进程被杀死)

  • –cpuset-cpus=“0,1” # 限制容器使用CPU

  • exp:运行一个mysql容器

    sudo docker run --name first-mysql -p 3306:3306 -e MYSQL\_ROOT\_PASSWORD=123456 -d mysql
    
  • run 运行一个容器

  • –name 后面是这个镜像的名称

  • -p 3306:3306 表示在这个容器中使用3306端口(第二个)映射到本机的端口号也为3306(第一个)

  • -d 表示使用守护进程运行,即服务挂在后台

容器

  • 查看容器

    • docker ps
      • -l:列出最近一次启动的container
      • -a :列出所有的container(包含历史,即运行过的container)
      • -q :列出最近一次运行的container ID
      • -n:上几次运行的container
  • 启动容器

    • docker start 容器名称

    • docker start 容器id

  • 重启容器

    • docker restart
  • 停止容器

    • docker stop 容器名称

    • docker stop 容器id

    • docker kill 容器名称

    • docker kill 容器id

  • 退出容器

    • docker exit 容器停止退出到宿主机

    • ctrl+p+q 容器不停止退出到宿主机

  • 链接容器

    • docker attach 容器id :重新进入到容器

    • docker exec -it 容器id /bash/shell :可以执行后直接得到结果,而不用进入到容器

  • 查看容器中的信息

    • docker top 容器id
  • 容器日志

    • docker logs -f[最新] -t[时间戳] –tail[显示最多多少条] 容器id
  • 容器与主机之间的数据拷贝

    • docker cp 容器id:容器内路径 目的主机路径
  • 检查容器里文件结构的更改

    • docker diff
  • 删除容器

    • docker rm <container…> #:删除一个或多个container

    • docker rm docker ps -a -q #:删除所有的container

    • docker ps -a -q | xargs docker rm #:同上, 删除所有的container

  • 已root权限进入

第一步:查看容器的CONTAINER ID

docker ps

第二步:获取root权限,例如需要进入的CONTAINER ID为4650e8d1bcca

docker exec -ti -u root 4650e8d1bcca bash

导入导出

一、使用 export 和 import

导出镜像

(1)使用 docker export 命令根据容器 ID 将镜像导出成一个文件。

docker export f299f501774c > hangger_server.tar

导入镜像

(1)使用 docker import 命令则可将这个镜像文件导入进来。

docker import - new_hangger_server < hangger_server.tar

二、使用 save 和 load

保存镜像

(1)下面使用 docker save 命令根据 ID 将镜像保存成一个文件。

docker save 0fdf2b4c26d3 > hangge_server.tar

(2)我们还可以同时将多个 image 打包成一个文件,比如下面将镜像库中的 postgresmongo 打包:

docker save -o images.tar postgres:9.6 mongo:3.4

载入镜像

使用 docker load 命令则可将这个镜像文件载入进来。

docker load < hangge_server.tar

附:两种方案的差别

1,文件大小不同

export 导出的镜像文件体积小于 save 保存的镜像

2,是否可以对镜像重命名

  • docker import 可以为镜像指定新名称
  • docker load 不能对载入的镜像重命名

3,是否可以同时将多个镜像打包到一个文件中

  • docker export 不支持
  • docker save 支持

4,是否包含镜像历史

  • export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
  • save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。

5,应用场景不同

  • docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
  • docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

通用

docker inspect 容器id/镜像 :获取详细信息

镜像制作

手动修改镜创建镜像

docker commit 镜像ID 新镜像名称:新镜像标签

docker脚本创建镜像

docker build -t 镜像:标签 dcocker脚本路径

Dockerfile

Dockerfile语法格式

  • – FROM:基础镜像   //docker image 查看填写要做用的样版镜像
  • – MAINTAINER:镜像创建者信息   //可选项
  • – EXPOSE:开放的端口   //要打开哪个端口
  • – ENV:设置变量     //像systemctl的,可查看/usr/lib/systemd/system下*.service文件项
  • – ADD:复制文件到镜像并解压  //必须存放在和Dockerfile文件同一目录下
  • – COPY:复制文件到镜像
  • – RUN:制作镜像时执行的命令,可以有多个 
  • – WORKDIR:定义容器默认工作目录  //相当于cd到哪个目录下
  • – CMD:容器启动时执行的命令,仅可以有一条CMD
  • – ENTRYPONT:  容器启动时执行的命令,可以有多个
  • – ONBUILD:被继承时,ONBUILD可以被触发