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