镜像块
卸载旧版本
yum remove docker docker-common docker-selinux docker-engine
安装新版本
安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
使用国内源
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
安装docker
yum makecache fast
yum install docker-ce
自动化脚本
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
启动
systemctl enable docker
systemctl start docker
添加内核
tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
拉取镜像
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
查看镜像
docker images
查看镜像、容器、数据卷所占用的空间
docker system df
查看并删除虚悬镜像
docker rmi $(docker images -f dangling=true|sed '1d'|awk '{print $3}')
查看mongo:3.2 之后建立的镜像
docker images -f since=mongo:3.2
通过 LABEL 来过滤
docker images -f label=com.example.version=0.1
只包含镜像ID和仓库名
docker images --format "{{.ID}}: {{.Repository}}"
查看改动了容器的存储层
docker diff webserver
构建镜像
docker commit(不建议使用,因为不知道操作了什么,无法维护)
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
查看镜像历史记录
docker history nginx:v2
dockerfile定制镜像
dockerfile文件格式
FROM:指定基础镜像
RUN:执行命令
COPY:复制文件,格式:COPY <源路径>... <目标路径>
ADD:复制文件,将压缩文件直接解压到目标目录,如:ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
CMD:容器启动命令,格式: CMD <命令> 或者 CMD ["可执行文件", "参数1", "参数2"...]
举例:CMD echo $HOME == CMD [ "sh", "-c", "echo $HOME" ]
ENTRYPOINT:和CMD一样,指定容器启动程序和参数,当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,不再是直接的运行其命令,而是将
CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:<ENTRYPOINT> "<CMD>"
举例:
FROM ubuntu:16.04
RUN apt-get update
&& apt-get install -y curl
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
docker run myip -i 将CMD命令-i参数传给ENTRYPOINT命令
ENV:设置环境变量,格式:ENV <key> <value> 或者ENV <key1>=<value1> <key2>=<value2>.
ARG:构建参数,格式:ARG <参数名>[=<默认值>]
VOLUME:匿名卷,格式:VOLUME ["<路径1>", "<路径2>"...] 或者VOLUME <路径>
EXPOSE:声明端口,格式为 EXPOSE <端口1> [<端口2>...]
WORKDIR:指定工作目录,格式为 WORKDIR <工作目录路径>
USER:指定当前用户,格式: USER <用户名>
举例:如果以 root 执行的脚本,在执行期间希望改变身份
# 建立 redis 用户,并使用 gosu 换另一个用户执行命令
RUN groupadd -r redis && useradd -r -g redis redis
# 下载 gosu
RUN wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/1.7/
gosu-amd64"
&& chmod +x /usr/local/bin/gosu
&& gosu nobody true
# 设置 CMD,并以另外的用户执行
CMD [ "exec", "gosu", "redis", "redis-server" ]
HEALTHCHECK:健康检查
格式:
HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
HEALTHCHECK NONE :如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
构建镜像
docker build [选项] <上下文路径/URL/-> 举例:docker build -t nginx:v3 .
从Git repo 中构建
docker build https://github.com/twang2218/gitlab-ce-zh.git
从tar 压缩包构建
docker build http://server/context.tar.gz
从标准输入中构建
docker build - < Dockerfile
cat Dockerfile | docker build -
多阶段构建
编写 Dockerfile 文件
FROM golang:1.9-alpine
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/go/helloworld/app .
CMD ["./app"]
保存镜像
docker save alpine | gzip > alpine-latest.tar.gz
载入镜像
docker load -i alpine-latest.tar.gz
删除镜像
docker rmi [选项] <镜像1> [<镜像2> ...]
删除虚悬镜像的指令
docker rmi $(docker images -q -f dangling=true)
删除所有仓库名为 redis 的镜像
docker rmi $(docker images -q redis)
删除所有在 mongo:3.2 之前的镜像
docker rmi $(docker images -q -f before=mongo:3.2)
容器
新建并启动
举例:docker run ubuntu:14.04 /bin/echo 'Hello world'
交互
docker run -t -i ubuntu:14.04 /bin/bash
启动已终止容器
docker start 容器
后台运行
举例:docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
终止容器
docker stop 容器
进入容器
使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令
举例:docker exec -i 69d1 bash
导出容器
docker export 7691a814370e > ubuntu.tar
导入容器
cat ubuntu.tar | docker import - test/ubuntu:v1.0 或者:docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
docker rm trusting_newton
清理所有处于终止状态的容器
docker container prune
仓库(https://hub.docker.com/)
账号注册
https://cloud.docker.com
登录/退出
docker login/logout
查找镜像
docker search
拉取镜像
docker pull
上传镜像
docker push
打标签
docker tag 源镜像名 新镜像名
配置全部容器的DNS
/etc/docker/daemon.json 增加
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}