安装 & 启动
安装
yum install -y docker
装完之后需要在 /etc/docker/daemon.json 修改image注册地址 & 存储目录
{
"insecure-registries" : ["registry.xxx.com"]
"graph": "/data0/docker"
}然后启动 dockerd:
systemctl enable docker
systemctl start docker
Docker命令参考
命令概览
- 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
- 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
- 容器rootfs命令 — docker [commit|cp|diff]
- 镜像仓库 — docker [login|pull|push|search]
- 本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
- 其他命令 — docker [info|version]
参考: Docker 命令大全 @ref
pull镜像
获取镜像: docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
可能需要先执行
docker login
管理本地镜像
- 列出已经下载下来的镜像:
docker images -a
# 列表包含了仓库名(REPOSITORY)、标签(TAG)、镜像ID(IMAGE ID)、创建时间以及所占用的空间- 无标签的镜像很多都是”中间层镜像”
- 根据仓库名列出镜像:
docker images 仓库名
- 删除镜像:
docker rmi 仓库:Tag
运行镜像
docker run --name webserver -d -p 80:80 repoName:tag
# 启动镜像- -p host_port:container_port // 端口映射
- -v host_path:container_path // 绑定主机目录到…
- -d: 容器在后台运行, 并不立即进入容器终端
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
- -i: 以交互模式运行容器,通常与 -t 同时使用
示例:
docker run -d repoName:tag
: 后台启动容器(执行后不立刻进入容器)docker run -it repoName:tag /bin/bash
: 交互模式启动容器
登录/退出容器
docker exec -it 容器ID /bin/bash
: 进入镜像的bash命令行,-i
保持STDIN 打开,-t
分配一个伪终端docker attach 容器ID
: 如果docker run -d
在后台运行的镜像, 需要这样连接上容器exit
退出容器
镜像修改和提交
docker attach
or docker exec -it
进入容器后, 可以对正在运行的镜像进行修改,
docker cp /Users/xx/xxx/ 容器ID:/tmp
: 本地文件拷贝到docker 容器内
然后 exit
退出 ..
docker diff
# 显示对 docker 镜像做了哪些修改docker commit --author "xx" --message "xxx" 容器ID 仓库名:TAG
# 提交对容器的修改到镜像docker history 仓库名:TAG
# 列出改动历史docker push 仓库名:TAG
# 上传
管理容器
运行镜像之后:
docker ps -a
: 列出容器(不是镜像!)- 列出正在运行的 容器ID(CONTAINER ID), 镜像(IMAGE), 状态(STATUS)
docker top 容器ID
: 显示一个运行的容器里面的进程信息docker stop 容器ID
: 停止容器, 先发送SIGTERM, 再发送SIGKILL, docker内的应用程序可以接收到SIGTERM做处理docker kill 容器ID
: 直接发送SIGKILLdocker restart 容器ID
: 重启docker rm 容器ID
: 删除容器, 如果加了-f
参数则是直接发送SIGKILL
容器日志
docker logs -f 容器ID
: 查看log, 类似tailfdocker logs --since 30m CONTAINER_ID
: 查看近30分钟的日志
创建镜像 & 编译镜像
- 准备Dockerfile
- 执行:
docker build --build-arg xArg1=$ARG1 -t <image_name>:<tag> .
--build-arg xArg1=$ARG1
: 把外界参数传入Dockerfile, 在Dockerfile里可以$xArg1
取到-t <image_name>:<tag>
: 设置tag
Dockerfile 说明
Example:
FROM xxx.com/REPOSITORY:latest |
- Dockerfile 中每一个指令都会建立一层, 新建立一层, 在其上执行这些命令, 执行结束后, commit 这一层的修改, 构成新的镜像.
- Union FS 是有最大层数限制的, 比如 AUFS, 曾经是最大不得超过 42 层, 现在是不得超过 127 层.
- RUN: 后面跟shell命令, 在镜像里执行
- WORKDIR 指定工作目录, 对后面的RUN都有效
- ARG: 指令是定义参数名称, 以及定义其默认值.该默认值可以在构建命令
docker build
中用--build-arg <参数名>=<值>
来覆盖 - ENV:
ENV Arg2=$Arg2
, 在运行时容器中就可以使用$Arg2
这个环境变量了. 用ENV赋值之前, 必须要用ARG声明变量ARG Arg2
- COPY:
COPY ./package.json /app/
# 拷贝资源 - ADD 类似COPY, 但ADD源地址可以是URL
- EXPOSE:
EXPOSE 3306
声明镜像的3306端口要暴露给外面, 仅仅是声明, 真正映射还是在docker run -p 宿主端口:容器端口
- CMD:
CMD ["sh", "-c", "echo $HOME"]
: 执行sh, 执行完后sh会退出, 容器也退出了CMD ["nginx", "-g", "daemon off;"]
: CMD的可执行程序必须在前台执行! 否则容器自动退出
- ENTRYPOINT:
ENTRYPOINT command param1 param2
docker build
- 编译命令:
docker build --build-arg env=${env} -t repository_name:tag_name -f Dockerfile .
- 注: 最后的
.
和tar cvzf xxx.tar.gz .
类似, 表示打包哪个目录 --build-arg k=v
会把参数传入dockerfile, 在dockerfile里-t repository_name:tag_name
: 冒号前面部分是仓库名, 后面是TAG
- 注: 最后的
- 删除镜像:
docker rm IMAGE_ID
, 或者docker rmi repository_name:tag_name
注意这样会删除该tag下所有镜像
核心技术与实现原理
参考: