docker 简介

2013年3月20日发布Docker0.1

如何定义Docker?

Docker 是一个承载和驱动容器的。Docker 是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是Docker提出的"Build once,Run anywhere"

为了更好的认识Docker,我们先来了解几个必备词汇:镜像,容器和仓库。

1
2
3
4
5
6
7
8
9
1. 镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器。Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
镜像是一种文件结构。Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上。
Docker官方网站专门有一个页面来存储所有可用的镜像,网址是:index.docker.io。

2. 容器( Container):容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境,Docker 利用容器来运行应用。

3. 仓库:仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
Docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。
Docker的运行离不开这几位的支持,Docker的成功也是拜几位所赐。也有人会误以为,Docker就是容器。但Docker只会傲娇地说:我不是容器,我是管理容器的引擎。

docker 加速代理

https://41zx6m59.mirror.aliyuncs.com

http://e53509dc.m.daocloud.io

docker 基本操作

  1. docker 运行命令参数介绍

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    -d # 使docker在后台运行
    -v # 挂载主机上的源代码文件夹到容器内,这样就可以在本地修改代码,然后docker直接读取本地代码
    -w # 配合-v参数,设置工作目录,执行容器时可以直接执行工作目录下的文件,不需要指定路径,如python
    --rm # 在容器结束时自动清理其所产生的数据
    -P/-p # 容器会开放部分端口到主机
    --restart=always # 容器随系统自动启动
    
    docker run -d -p 80:80 --name 'contain_name' p.home.forgame.com:4567/yunker/xiaodai:1.5.14  # 执行镜像并生成新容器
    docker start contain_name  # 启动容器
    docker exec -it mysql /bin/bash  # 进入容器
    
  2. linux 下启动 docker

    systemctl start docker

  3. 查看日志

    docker logs container_id # Fetch the logs of a container

  4. 查看镜像或容器的详细信息,包括容器的IP地址

    docker inspect <images_id || “container_id>

  5. 在宿主机查看Docker使用cpu、内存、网络、io情况

    docker stats container_id

  6. 使用Dockerfile构建镜像

    docker build -t 镜像名:版本号 . 『后面那个点是指context,即上下文目录』

    . 表示当前目录,而 Dockerfile 就在当前目录 [eg: docker build -t dockerzsm/mysql:0.2 .]

  7. 查看容器具体改动了哪些文件

    docker diff container_id

工作案例

  1. docker 运行出错并提示:to many links error

    1
    2
    
    # 解决方案:删除没用的镜像[none]
    docker rmi $(docker images | grep "<none>" | awk ' { print $3} ')
    
  2. 更改了 php 或静态页面的代码后,后端接口还是返回旧代码的响应内容。

    原因: 存在nginx静态页面缓存和php文件自动缓存的参数配置

    解决方案:

    • 处理静态文件缓存:在nginx.conf配置文件将参数sendfile设置为off
    • 处理动态文件缓存:启用或设置opcache.enable=0, opcache.enable_cli=0