- [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 中 `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