- [PWD play with docker](https://labs.play-with-docker.com/)
- [the docker book](https://dockerbook.com/)
- [Docker精华学习资料集锦](https://yq.aliyun.com/articles/65145)
- [希云CSphere培训视频](https://csphere.cn/training)
- [docker 快速入门](https://yuansir-web.com/2016/06/14/docker-kuai-su-ru-men-zhi-yin/)
- [laradock](https://github.com/laradock/laradock): 参考 docker-compose 的使用
- 社区: [dockone](http://dockone.io/)
---
- [docker从入门到实践(docker practice)](http://docker_practice.gitee.io/) [docker技术入门与实战ed2](http://product.china-pub.com/5089907)
- [第一本docker书](https://book.douban.com/subject/26285268/)
- [docker容器与容器云ed2](http://www.ituring.com.cn/book/1899) [浙大SEL实验室](http://www.sel.zju.edu.cn/)
- docker全攻略: 简介 基础(安装 基本命令 Dockerfile) 进阶(运行剖析 内核讲解 资源调度) 生态 案例(Amazon CoreOS)
- 高性能docker: 准备docker宿主机 优化docker镜像 用chef自动化部署docker 监控docker宿主机和容器(监控+日志) 性能基准测试(JMeter) 负载均衡(nginx 水平扩展) 容器故障检测和排除 应用到生产环境(web运维)
- 自己动手写docker: LinuxNamespace LinuxCgroups LinuxUnionFS 构造简单容器
![docker architecture](http://qiniu.daydaygo.top/docker_architecture.png)
![docker command](https://docker_practice.gitee.io/appendix/_images/cmd_logic.png)
## 基础
- 终于解决了困扰很久的问题:docker 中 `symlink error`;解决方法:使用管理员运行 `docker-machine start`(docker tooolbox 时代在win10下遇到的问题)
- Docker Registry: 代入 git registry 来理解会更好一点
- 安全
- API
```json
// cat ~/.docker/daemon.json
{
"debug" : true,
"experimental" : true,
"registry-mirrors" : [ // 镜像加速
"https://sdl0y1oj.mirror.aliyuncs.com",
"https://registry.docker-cn.com"
],
"dns": [ // 全局设置 dns
"223.5.5.5",
"223.6.6.6"
]
}
```
- [私有仓库 - 官方 registry 镜像](https://docs.docker.com/registry/)
基础镜像:
- 小镜像: alpine/scratch/busybox 分阶段build run指令串联
- java spring-boot: openjdk:8-jdk-alpine, openjdk:8-jre-alpine
- java tomcat: tomcat:8.5-alpine
- php-fpm: nginx+php-fpm服务编排; 基于php-fpm+apk; [安全使用apk安装](https://hub.docker.com/r/trafex/alpine-nginx-php7/)
- go: 参考Dockerfile的分阶段build
## docker
- docker安装/加速/镜像仓库/自动构建: [aliyun - docker 免费容器镜像服务](https://cr.console.aliyun.com/cn-zhangjiakou/mirrors)
- [腾讯云容器服务](https://console.cloud.tencent.com/tencenthub)
- [中科大 - 镜像源](http://mirrors.ustc.edu.cn/)
- [清华 - 镜像源](https://mirror.tuna.tsinghua.edu.cn/)
```bash
docker system df
docker system prune # -a, 没有容器使用的docker镜像和容器
docker info
# registry, 格式(user)/(repo_name)
docker search/history/push (image-name)
# image
docker pull imgage:tag # 下载镜像
docker images -a # 查看 images
# -f --filter, -q, --digests
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}" # go 模板格式语法
docker tag <image> <tag>
docker push <tag name>
docker rmi $(docker images -f "dangling=true" -q) # 先 stop、rm 容器,再删除名称为 none 的镜像
# container
docker commit container-id image:tag # build image from container; 不推荐,推荐使用 Dockerfile
docker ps -a # 查看所有容器, 默认只显示正在运行的容器
docker rm `docker ps -a -q` # 删除所有容器
docker run -ti --rm --name <container-name> image:tag /bin/bash # -d daemon; 查看镜像内容, 方便写 Dockerfile
-e XXX=xx
docker run --name xxx-app -d -p 8080:80 xxx # 创建容器, 绑定端口
docker start/stop/restart/rm/attach/logs/kill <container>
docker top
docker exec
docker cp <contaner> <local>
docker inspect # 查看容器详情
docker ps | awk '{print $1}' | xargs docker stop # 批量操作
docker volume ls
docker volume inspect my-vol
docker stack # 编排能力: route
docker secret # 优雅实现安全编排
```
## Dockerfile
`docker build . -t tag -f Dockerfile`
- . 当前context, **注意**会将当前context下的所有内容都发送到 docker daemon, 建议建子文件夹
- -t image:tag
- -f 默认读取 context 下的 Dockerfile, 文件名不同需要 -f 指定
```Dockerfile
# 格式 INSTRUCTION argument
# 明确指定 image:tag, 避免基础镜像更新导致重新构建
FROM php:7.2.5-cli-alpine3.7
LABEL maintainer="1252409767@qq.com"
# 设置中文源加速
RUN echo -e "http://mirrors.ustc.edu.cn/alpine/v3.7/main\nhttp://mirrors.ustc.edu.cn/alpine/v3.7/community" > /etc/apk/repositories && \
apk update
# 设置时区
RUN apk add tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 支持正则 go-filepath.Match: https://golang.org/pkg/path/filepath/#Match
COPY src dst
# 更高级复制: url 压缩文件解压
ADD src dst
# string => sh -c $cmd; array => $cmd
CMD /bin/echo
CMD ["/bin/echo"]
# 1. 镜像作为命令使用 2. 镜像启动前的准备工作
ENTRYPOINT
# 暴露端口
EXPOSE 80:8080
EXPOSE 80
# 影响其他命令使用相对路径 RUN / CMD / ENTRYPOINT / COPY
WORKDIR /path/to/workdir
ENV <key> <value>
ARG <key> <value>
# 切换用户执行, 使用 gosu 替换 su/sudo
USER <uid>
# 挂载, 数据持久化
VOLUME ["/data"]
# 触发器, 基于当前镜像构建镜像时, 触发器的内容才会执行
ONBUILD COPY . /app
# 健康检查
HEALTHCHECK
# 分阶段build
FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
FROM alpine
RUN apk update && \
apk add ca-certificates && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=build-env /app/goapp /app/
EXPOSE 8080
ENTRYPOINT ./goapp
```
## docker-compose
- docker-compose 命令行
```
# install
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# alias: 设置别名, 方便使用
alias doc docker-compose
doc up -d <service> -f <yml file>
doc ps/rm/stop/restart
doc scale xxx=3
```
- docker-compose.yml
```yaml
version: '3.1' # 语法版本
services: # 定义服务
service-name:
image: image:tag # 明确指定镜像版本
labels: # 配置路由服务; 基于nginx负载均衡; 基于api服务发现
aliyun.routing.port_8080: 'http://tomcat-sample'
aliyun.scale: '3'
build: dir
build:
context: dir # context, 上下文
dockerfile: Dockerfile
args: # 替换Dockerfile中的 ARG 参数
arg1:val1
command: ["cmd"] # 用来覆盖缺省命令/添加参数
environment: # 字典/数组 格式
env: val
links:
- service-name
ports:
- "local:container"
volumes:
- local:container
- ./xxx.conf:/etc/xxx.conf # 挂载配置文件
# https://docs.docker.com/docker-for-mac/osxfs-caching/
- local:container:default # delegated cached consistent
volumes_from:
- volume-name
extra_hosts: # /etc/hosts
- "host:ip"
net: "bridge" # 网络模式: bridge none container:name host
dns: 8.8.8.8
dns:
- 8.8.8.8
tty: true # 打开此配置才可以 exec 进入容器
# 其他配置参考 docker run 命令参数
db: # 使用阿里云RDS
external:
host: rds******.mysql.rds.aliyuncs.com
ports:
- 3306
environment:
- MYSQL_DATABASE=blog
- MYSQL_USER=ghost
- MYSQL_PASSWORD=***********
```
## k8s