使用Docker

Gao

Using Docker

什么是 Docker

Docker 利用现有的 Linux 容器技术,以不同方式将其封装及扩展 --主要是通过提供可以 值的镜像,以及一个用户友好的接口 --来创建一套完整的容器创建及发布方案

Docker 平台拥有两个不同部分

  • 负责创建与运行容器的 Docker Engine
  • 用来发布容器的云服务 Docker Hub

Docker 的哲学经常用航运集装箱的比喻来解释,这或许能解释 Docker 名字的由来。

这个比喻大概是这样:

运输货物时,要用到不同的运输工具,可能包括货车、叉车、起重机、火车和轮船。
这意味着这些工具必须可以处理大小不一,运输需求各异的货物。
以往这是一道复杂的工序,需要付出大量的人力、物力。
联运集装箱的诞生为运输产业带来了一场革命。
集装箱的大小有了统一标准,并且设计的出发点是能以最少的人力在不同的运输方式之间搬运。
所有运输机械都为运送集装箱而设计。运输不同类型物品可以使用不同的集装箱。
因此运输产业只需要专注于处理集装箱的运输及存储问题,而集装箱内的物品完全由生产商负责。

Docker 的目的是把集装箱的标准化流程运用到IT行业中去。
如今的典型系统可能包括Javascript框架、NoSQL数据库、消息队列、REST API,
以及由各个不同编程语言所写的后端。
而这个组合的全部或部分可能需要运行到不同的环境中,从开发者的笔记本电脑, 到公司内的测试集群,再到云端的生产环境。
每个环境都存在差异,他们存在不同的操作系统和不同的程序库。我们需要付出巨大的人力来在不同环境之间移动这些应用。
Docker容器简化了应用程序的移动,好比集装箱一样。
开发人员只需专注开发,再也不用担心测试和发布时环境以及依赖关系带来的问题。
运维部门只需专注于运行容器的核心问题。

安装 Docker

Docker 需要运行于 64 位的 Linux 系统上,内核版本需要大于 3.10

macOS 可以从docker.com下载到 docker-ce 版本安装使用

可以使用homebrew来安装

brew cask install docker

Ubuntu 系统安装

sudo apt-get remove docker docker-engine docker.io
apt-get update

apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

apt-key fingerprint 0EBFCD88

pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

apt-get update

apt-get install docker-ce

运行 Docker

images 镜像

docker 镜像是一个构建好的 docker 环境,可以使用 docker 直接启动一个镜像

docker run debian

运行镜像会自动从docker hub下载对应的镜像,并运行

运行镜像会自动创建一个 container

查看运行中的 container:

docker ps

运行一个交互式镜像

docker run --rm -it gsmlg/phoenix
# -i interactive
# -t terminal
# --rm remove after run

当 docker 运行后会生成一个 container 可以通过

docker ps -a

查看所有 docker containers

删除无用的 container

docker rm -v $(docker ps -aq -f status=exited)

Docker 镜像构建与发布

Dockerfile

docker 构建一个镜像需要通过 Dockerfile 文件来配置镜像的内容

一个构建的 Dockerfile 内容:

FROM alpine

MAINTAINER GSMLG < me@gsmlg.org >

RUN apk update \
    && apk add curl \
    && apk add stunnel \
    && apk add squid \
    && rm -rf /var/cache/apk/*

COPY stunnel.conf pkey.pem cert.pem /etc/stunnel/

EXPOSE 443

COPY entrypoint.sh /

ENTRYPOINT ["/entrypoint.sh"]

Dockerfile 配置说明

push and pull

push: 将本地镜像推送到远程

pull: 拉取远程镜像

通过 Docker Compose 运行

docker compose 通过 yaml 指定 docker 启动配置参数

Docker Registry

registry:
  restart: always
  image: registry:2
  ports:
    - 127.0.0.1:5000:5000
  volumes:
    - ./data:/var/lib/registry

Docker Machine

运行本地或远程的 docker 主机

自动创建管理移除