最近才开始使用Docker是因为新版Docker for Mac不再是基于臃肿的Virtualbox的Toolbox,而是基于Mac内嵌的HyperKit VM。

docker相比vagrant有更快的启动速度,更少的空间和系统资源占用和接近原生的性能。

概念

  • 镜像(image)
  • 容器(container)
  • 仓库(repository)

镜像就像是一个文件系统,镜像和容器的关系就像是面向对象程序设计中的实例,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启用、停止、删除、暂停等。每个镜像由很多层次构成,Docker使用Union FS将这些不同层结合到一个镜像中。

仓库包含了同一个软件的不同版本的镜像,像Docker Registry这样的服务则包含多个仓库,提供镜像的存储、分发服务。

环境

macOS: >= 10.10.3 docker: 1.12.6(14937)

如果系统达不到要求,可以安装 Docker Toolbox,基于VirtualBox(版本不低于 4.3.30)。

安装

首先需要到官网下载DMG来安装,然后注册帐号。

除了下载DMG,也可以使用Homebrew来安装:

brew cask install docker

安装完成后,进入命令行查看版本:

docker --version
# Docker version 1.12.6, build 78d1802
docker-compose --version
# docker-compose version 1.9.0, build 2585387
docker-machine --version
# docker-machine version 0.8.2, build e18a919

国内网通可以添加加速器(Docker -> Preferences -> Advanced -> Registry mirrors -> 添加 -> 加速器地址在文末),加速镜像的下载。

运行一个Nginx服务器:

docker run -d -p 80:80 --name webserver nginx
# Unable to find image 'nginx:latest' locally
# latest: Pulling from library/nginx
# 75a822cd7888: Pull complete
# 0aefb9dc4a57: Pull complete
# 046e44ee6057: Pull complete
# Digest: sha256:fab482910aae9630c93bd24fc6fcecb9f9f792c24a8974f5e46d8ad625ac2357
# Status: Downloaded newer image for nginx:latest
# fd523216447c45694c2f02d3d1541a207150ea61b7704634de25f97e427e3e67

服务运行后,访问 http://localhost 即可看到 “Welcome to nginx!”,表示运行成功。

执行以下命令停止并删除服务:

docker stop webserver
docker rm webserver

使用

使用postgres

# 搜索镜像
docker search postgres
# NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
# postgres                          The PostgreSQL object-relational database ...   3074      [OK]
# kiasaki/alpine-postgres           PostgreSQL docker image based on Alpine Linux   29                   [OK]
# abevoelker/postgres               Postgres 9.3 + WAL-E + PL/V8 and PL/Python...   10                   [OK]
# macadmins/postgres                Postgres that accepts remote connections b...   8                    [OK]
# ...

# 安装官方镜像
docker pull postgres:latest

# 查看已下载的镜像
docker images
# REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
# postgres            latest              eb05a0f245ea        2 days ago          264.9 MB

# 创建容器
docker run -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres

# 查看已运行的容器
docker ps
# CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
# 353fa6db4ae7        postgres            "/docker-entrypoint.s"   8 seconds ago       Up 7 seconds        0.0.0.0:5432->5432/tcp   pedantic_yonath

使用ubuntu16.04镜像

以安装ubuntu16.04为例,安装并运行官方镜像。

下载:

docker pull ubuntu:16.04
# 16.04: Pulling from library/ubuntu
# b3e1c725a85f: Pull complete
# 4daad8bdde31: Pull complete
# 63fe8c0068a8: Pull complete
# 4a70713c436f: Pull complete
# bd842a2105a8: Pull complete

运行:

docker run -it --rm ubuntu:16.04 bash
root@6b8113ed1462:/# cat /etc/os-release
# NAME="Ubuntu"
# VERSION="16.04.1 LTS (Xenial Xerus)"
# ID=ubuntu
# ID_LIKE=debian
# PRETTY_NAME="Ubuntu 16.04.1 LTS"
# VERSION_ID="16.04"
# HOME_URL="http://www.ubuntu.com/"
# SUPPORT_URL="http://help.ubuntu.com/"
# BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
# VERSION_CODENAME=xenial
# UBUNTU_CODENAME=xenial

运行参数解释:

  • -it : 这是两个参数 -i 表示交互式操作, -t 表示使用交互式终端
  • --rm : 表示容器退出后随之将其删除
  • ubuntu:16:04 : 是指用此镜像启动容器
  • bash : 放在镜像名后的是命令,用来运行交互式Shell

常用命令

  • 镜像
  • docker images : 列出所有已下载的镜像
  • docker run [选项] 镜像名:标签 [命令] [参数...] : 运行一个镜像为容器
  • docker commit [选项] 容器ID或容器名 [<仓库名>[:<标签>]] : 把修改的容器提交成一个新的定制镜像
  • docker rmi <镜像名> : 删除镜像
  • docker rmi $(docker images -q) -f dangling=true : 删除虚悬(dangling)镜像

  • 容器
  • docker start : 启动终止状态的容器
  • docker restart : 重启运行状态的容器
  • docker ps : 查看运行状态的容器
  • docker ps -a : 查看终止状态的容器
  • docker rm <容器名> : 删除处理终止状态的容器
  • docker export <容器ID> > <文件名>.tar : 导出容器
  • cat <文件名>.tar | docker import - test/<镜像名>:<分支名> : 将导出的容器导入为镜像

  • 仓库
  • docker login : 登录Docker Hub
  • docker search <镜像名> : 搜索镜像
  • docker pull <镜像名>[:<分支名>] : 下载镜像

私有项目自动构建

私有项目需要在发布新版本时自动构建新版本的镜像,需要先到docker hub网站去连接github或bitbucket帐户(目前只支持这两个),然后在docker hub中配置自动构建,最后在项目中创建Dockerfile文件并提交创建

Docker Registry 服务

国内 Docker Hub 镜像(加速器)

国内镜像服务

参考