CheatSheet
Docker 核心架构:
- 客户端 Client
- 服务器 Docker daemon
- 镜像 Image
- Registry
- 容器 Container
容器基本技术:
- cgroup 资源限额
- namespace 资源隔离
- Mount
- UTS
- IPC
- PID
- Network
- User
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 <容器>