镜像构建
构建指令docker build 当前的目录是构建的上下文docker build 默认查找当前目录中的Dockerfile作为构建输入,也可以通过-f指定docker build PATH指定构建上下文
构建缓存
docker会缓存中有没有可用的已存在的镜像,只有不存在时才会重新构建
通过判定Dockerfile中的指令
- ADD 和 COPY 比较文件的checksum
- RUN 简单比较参数与现存镜像中的指令是否一致
- 底层的缓存失效,会引发上层的都失效
如何强制重新构建
docker进程管理
docker run 创建并运行容器
docker run [参数] IMAGE [CMD] [ARG]
参数
--name指定容器的名称-t|--tty=true分配伪tty终端,默认为false-i|--interactive=ture容器以交互式模式运行-d|--detach让命令在后台运行--rm命令结束后docker退出自动销毁-h,--hostname容器的主机名--ip=""设定容器IP-P, --publish-all=true|false为所有的端口映射-p, --publish=[]映射指定端口ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort-w, --workdir=""指定容器的工作目录--restart=always--add-host=xxx:10.180.8.1修改/etc/hosts文件--dns设置DNS
退出时,使用[ctrl + D],这样会结束docker当前线程,容器结束; 可以使用[ctrl + P][ctrl + Q]退出而不终止容器运行。
docker start 启动终止的容器
选项
-a, --attach启动后附加--help Print usage-i, --interactive附加到容器的标准输入
docker restart 重新启动运行的容器
选项
-t, --time=10发出终止信号前等待的时间
docker stop 停止运行的容器
选项
-t, --time=10发出终止信号前等待的时间
docker attach 进入启动的容器
当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
nsenter 命令
nsenter 工具在 util-linux 包2.23版本后包含。
yum install -y util-linux
使用方法
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)nsenter --target $PID --mount --uts --ipc --net --pid
建议使用 bashrc_docker
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_dockerecho "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
使用方法
alias docker-pid="sudo docker inspect --format '{{ .State.Pid }}'"alias docker-ip="sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}'"
docker-enter
docker-enter <container> [cmd]
如果后边跟上命令,指令命令后会退出,相当于
nsenter --target 63424 --mount --uts --ipc --net --pid env -i ls
docker容器
docker ps 查看容器状态
参数
-a, --all显示所有容器-f, --filter value--format string Pretty-print containers using a Go template-n, --last int Show n last created containers (includes all states) (default -1)-l, --latest显示最新创建的容器--no-trunc不截断显示-q, --quiet-s, --size
docker rm 删除停止的容器
选项
-f, --force强制删除正在运行的容器-l, --link移除特殊的连接-v, --volumes移除volumes
示例
# 删除所有停止的容器docker rm $(docker ps -a -q)
docker镜像
docker images 查看镜像
docker rmi 删除镜像
-f ,--force 强制
docker cp file :filepath 复制文件到镜像
docker logs
-f|--follow 是否一直输出--since[=SINCE] Show logs since timestamp-t|--timestamps 时间戳--tail[="all"] 倒数多少条
docker inspect 查看容器配置信息
镜像导入导出
docker save
打包镜像存储文件将保存完整记录,体积也要大
docker save的应用场景是,如果你的应用是使用docker-compose.yml编排的多个镜像组合,但你要部署的客户服务器并不能连外网。这时,可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。
从命令行帮助可以看出,docker save是用来将一个或多个image打包保存的工具。
例如我们想将镜像库中的postgres和mongo打包,那么可以执行:
docker save -o images.tar postgres:9.6 mongo:3.4
docker export
容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态)
docker export需要指定container,不能像docker save那样指定image或container都可以。
docker export -o postgres-export.tar postgres
docker save和docker export的区别
总结一下docker save和docker export的区别:
- docker save保存的是镜像(image),docker export保存的是容器(container);
- docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
- docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。
docker load 和docker import
docker load -i postgres-export.tardocker import postgres-save.tar postgres
docker import可以指定IMAGE[:TAG],可以为镜像指定新名称。
push 和pull
# 根据提示进行输入用户信息root@aliyun:~# docker login# 生成的认证信息存放位置root@aliyun:~# cat .docker/config.json{"auths": {"https://index.docker.io/v1/": {"auth": "aGl5YW5nOkNWQDA4OTU1Nl9jb20="}}}# docker push <repositry>/<images_name>:<tag>
docker清理
prune 命令用来删除不再使用的 docker 对象。
删除所有未被 tag 标记的镜像(dangling):docker image prune删除所有未被容器使用的镜像:docker image prune -a删除所有停止运行的容器:docker container prune删除所有未被挂载的卷:docker volume prune删除所有网络:docker network prune删除 docker 所有资源:docker system prune
network
docker network lsdocker network inspect bridgedocker network create --driver bridge --subnet 192.168.100.0/24 --ip-range 192.168.100.0/ 24 my-bridge-network
其他
docker history 命令来查看它的构建命令,如图可以看到运行的启动脚本,暴露的端口等信息。还可以加 —no-trunc查看完整命令。
