一、基本概念
1. 什么是Docker
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。
Docker通常用于如下场景:
- web应用的自动化打包和发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
2. Docker的基本概念
- #### 镜像(Image)
是一个只读模板,用来运行Docker容器。
- #### 容器(Container)
负责应用程序的运行,包括操作系统、用户添加的文件以及元数据
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
- #### 镜像(Image)
仓库是集中存放镜像文件的场所。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务
二、快速开始
1. 安装
#阿里云官方安装脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2. 镜像
获取
# 从仓库注册服务器拉取
sudo docker pull ubuntu:14.04
# 官方仓库注册服务器,相当于
sudo docker pull registry.hub.docker.com/ubuntu:14.04
# 也可使用其他仓库,如:
sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
显示
sudo docker images
运行
sudo docker run -t -i ubuntu:14.04 /bin/bash
修改
# 运行容器bash,通过shell进行操作
sudo docker run -t -i ubuntu:14.04 /bin/bash
# 提交更新
sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
- -m: 提交信息
- -a: 指定更新的用户信息
- 0b2616b0e5a8: 容器的 ID
- ouruser/sinatra: 仓库名
- v2: 仓库tag
创建
- 通过修改已有image, 具体操作修改中已有
- 通过Dockerfile来创建
mkdir mydockerimg
# docker image的配置文件
vim Dockerfile
# 创建image
sudo docker build -t testimg .
- -t: 指定新的image的名字
- .: Dockerfile所在目录
Dockerfile示例
# 这是注释
FROM ubuntu:14.04
MAINTAINER AIR_CC <c989692c@gmail.com>
RUN apt-get -y update
CMD echo "hello-world"
ADD myApp /var/www
EXPOSE 80
- #: 注释
- FROM: 告诉 Docker 使用哪个镜像作为基础
- MAINTAINER: 维护者的信息
- RUN: 在创建镜像时运行的操作
- CMD: 启动容器后运行的程序
- ADD: 复制本地文件到镜像
- WORKDIR: 设置 dockerfile 命令运行目录
EXPOSE: 对外部开放端口
- 通过本地文件系统导入
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
注:具体镜像可在openva中找
保存与载入
- 保存已有的镜像
sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
- 载入镜像
sudo docker load --input ubuntu_14.04.tar
# 或者 sudo docker load < ubuntu_14.04.tar
- 删除
# 暂停并删除相应的容器
sudo docker stop containerName
sudo docker rm containerName
# 删除镜像
sudo docker rmi imageName
注:删除镜像之前需要先stop & rm相应的container
# 删除所有的container
sudo docker stop $(docker ps -a -q)
sudo docker rm $(docker ps -a -q)
# 删除所有的image
sudo docker rmi $(docker images -q)
2. 容器
容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用
运行
sudo docker run -tid ubuntu:14.04
- -t: 为container分配一个伪终端(pseudo-tty),并绑定到容器的标准输入上
- -i: 让容器的标准输入保持打开
- -d: 使容器在后台以守护态(Daemonized)形式运行
终止
- 使用sudo docker stop 终止;
注:当容器中指定的应用终结时,容器也会终止
- sudo docker start – 启动一个处于终止的容器
- sudo docker restart – 重启一个处于运行态的容器
运行日志
获取 container 中程序输出到 terminal 上的信息 docker logs
进入
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh
导出与导入
- 导出
sudo docker export <container ID> > outputFileName
- 导入
sudo docker import <filePath/fileURL>
注:用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除
sudo docker stop <container ID>
sudo docker rm <container ID>
注: 删除容器前需先stop
其他
获取container的PID
sudo docker inspect --format '{{.State.Pid}}' <container ID>