CheatSheet

Docker 核心架构:

  • 客户端 Client
  • 服务器 Docker daemon
  • 镜像 Image
  • Registry
  • 容器 Container

容器基本技术:

  • cgroup 资源限额
  • namespace 资源隔离
    • Mount
    • UTS
    • IPC
    • PID
    • Network
    • User

cheatsheet

Docker 采用 C/S 架构,客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 host 上,客户端也可以通过 socket 或者 REST API 和远程服务器通信。docker 客户端是和服务器通信的命令行工具。服务器负责创建、运行、监控容器,构建、存储镜像。镜像是一个只读模板,通过镜像可以创建容器。容器就是镜像运行的实例。Registry 是存放镜像的仓库。

构建镜像并启动容器

镜像管理

# pull an image from a registry
docker pull myimage:1.0
# retag a local image with new name and tag
docker tag myimage:1.0 myrepo/myimage:2.0
# push an image to a registry
docker push myrepo/myimage:2.0
# 查看本地镜像
docker images
# list all images locally stored
docker image ls
# delete an image from local image store
docker image rm alpine:3.4

从镜像启动容器

# 后台从镜像启动容器,并指定Host和容器的端口映射
docker run -d -p 8000:80 <image>

# 进入容器,附加到前台进程
docker attach <容器>
# 离开容器
Ctrl+p Ctrl+q

# 进入容器,新开一个终端
docker exec -it <容器> bash
# 退出容器
exit

# 启动exit的容器
docker start <容器>
# 停止容器
docker stop <容器>

# rum a container from alpine:3.9 image
# name the running container "web"
# expose port 5000 externally mapped to port 80 inside the container
docker container run --name web -p 5000:80 alpine:3.9
# stop a running container through SIGTERM
docker container stop web
# stop a running container through SIGKILL
docker container kill web

# delete all running and stopped containers
docker container rm -f $(docker ps -aq)
# print the last 100 lines of a container's logs
docker container logs --tail 100 web

构建镜像

# 查看容器
docker ps -a
docker container ls -a
# 构建镜像
# 1.运行容器
# 2.修改容器
# 3.将容器保存为新镜像
docker commit <镜像>
# 从dockerfile构建镜像
docker build -t <image_name> -f <Dockerfile路径>
# build an image from Dockerfile in the current directory and tag the image
docker  build -t myimage:1.0 .
# 查看镜像分层
docker history <image>

docker 网络

Docker 容器和主机之间网络:

  • bridge
  • host
  • none
  • 自定义

网络相关的命令:

brctl show # 显示网桥
ip r # 查看路由表
iptables-save # 查看路由


# 查看docker网桥
docker network inspect bridge

# 查看docker网络
docker network ls

# 以某种网络配置从镜像启动容器
docker run --network=host -it <镜像> bash

镜像的备份与恢复

docker save
导出镜像到本地文件

# Usage
$ docker save [OPTIONS] IMAGE [IMAGE...]
# 导出golang镜像
$ sudo docker save --output golang.tar golang:1.2
docker load
从本地文件导入文件到镜像库

# Usage
$ docker load [OPTIONS]
# 导入golang镜像
$ sudo docker load --input golang.tar
docker export
导出容器快照到本地文件

# Usage
$ docker export [OPTIONS] CONTAINER
# 导出hello容器快照
$ sudo docker export --output hello.tar
docker import
从容器快照文件中再导入为镜像

# Usage
$ docker import [OPTIONS] URL|- [REPOSITORY[:TAG]]
# 导入hello快照,并制定镜像标签为hello:1.0
$ cat hello.tar | sudo docker import - hello:1.0

容器监控

# 查看所有容器
docker container ls

# 查看容器内进程
docker container top <容器>

# 查看容器资源状态
# 1. 所有容器
docker container stats
# 2. 特定容器
docker container stats <容器...>

工具

  • Sysdig
  • Weave Scope
  • cAdvisor
  • Prometheus

容器日志

docker 默认将容器日志发送到 STDOUT 和 STDERR, 此外,docker 还提供了多种 logging driver,帮助从容器中提取运行日志, 默认的 logging driver 是 json-file,将容器日志保存在 json file 中, 可以在 host 目录的/var/lib/docker/containers/目录下找到日志的 json 文件

一些系统的日志方案

  • ELK
  • Graylog
# 打印容器所有日志
docker logs <容器>
# 持续打印日志
docker logs -f <容器>

参考

Docker 从入门到实践

Docker 快速入门

Docker 入门教程

每天 5 分钟玩转 Docker