镜像构建
构建指令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_docker
echo "[ -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.tar
docker 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 ls
docker network inspect bridge
docker network create --driver bridge --subnet 192.168.100.0/24 --ip-range 192.168.100.0/ 24 my-bridge-network
其他
docker history
命令来查看它的构建命令,如图可以看到运行的启动脚本,暴露的端口等信息。还可以加 —no-trunc查看完整命令。