Image 命令
1.列出本地所有镜像
docker images
docker image ls
2.给本地镜像添加标签
docker tag [image_name]:[tag] [new_image_name]:[new_tag]
3. 查看镜像详细信息
docker inspect [image_name]:[tag]
4. 查看镜像历史
# 显示每层的具体内容
docker history [image_name]:[tag]
5.搜索镜像
# 搜索远端仓库中共享的镜像
# docker search [TERM[
docker search nginx
删除本地镜像
# 当有该镜像创建的容器存在时,不允许删除镜像,需要先删除容器
dockker rmi [image_name]:[tag]
创建镜像
- 基于已有镜像的容器创建
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# -m 提交注释
# -a 作者
docker commit -m "Add a new file" -a "author tony" d6cfbdd9258c test:0.1
- 基于本地模板导入
docker import [OPTIONS] file [URL]-[REPOSITORY[:TAG]]
# 以ubuntu举例
cat ubuntu-16.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
- 基于Dockerfile创建
存储镜像
导出镜像到本地文件
# 导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,复制ubuntu_14.04.tar分享给他人
docker save -o ubuntu_14.04.tar ubuntu:14.04
载入镜像
可以使用docker load 将导出的tar文件再导入到本地镜像库
docker load --input ubuntu_14.04.tar
或
fovkrt load < ubuntu_14.04.tar
上传镜像
将镜像上传到仓库,默认Docker Hub仓库
# docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
# 1 . 添加标签
docker tag test:latest user/test:latest
# 2. 上传镜像
docker push user/test:latest
容器
创建容器
docker create -it ubuntu:latest
# -i 保持标准输入打开,默认为false
# -t 是否分配一个伪终端,默认为false
# 更多参数参看官方文档
启动容器
启动一个已经创建的容器
docker start [containerID 或 NAMES]
新建并启动容器
等价于先执行docker create, 再执行docker start命令
docker run [containerID 或 NAMES] [OPTIONS]
# -d 让Docker容器在后台以守护状态运行
终止容器
终止一个运行中的容器
docker stop [containerID 或 NAMES]
进入容器
# 推荐方式
docker exec -it [containerID 或 NAMES] [命令]
删除容器
删除处于中止或退出状态的容器
docker rm [containerID 或 NAMES]
查看容器信息
docker inspect [containerID 或 NAMES]
导出容器
导出一个已经创建的容器到一个文件,无论是否处于运行状态
# docker export [-o] [--output] [CONTAINER]
docker export -o test_for_run.tar ce5
导入容器
将导出的文件通过docker import命令导入变成镜像
既可以通过docker load将镜像存储文件导入到本地镜像库,也可以通过docker import将容器快照导入到本地镜像库
区别在于docker import将丢失所有历史信息与元数据信息,load将保持所有的信息,体积也更大
docker import test_for_run.tar - test/ubuntu:v1.0
仓库
登录
# 需输入用户名,密码
docker login
在仓库搜索镜像
docker search [镜像名]
# 根据是否为官方提供,分为基础镜像或叫根镜像和用户镜像
# 官方镜像使用单个单词命名不带用户名,用户镜像带用户名
搭建本地私有仓库
通过官方提供的registry镜像来搭建本地私有仓库
docker run -d p 5000:5000 -v /opt/data/registry:/temp/registry registry
容器数据管理
挂载数据卷
特性:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
- 对数据卷的更新不会影响镜像,解耦了应用和数据
- 卷会一直存在,直到没有容器使用,可以安全的卸载它
# 加载主机的/src/webapp目录到容器的/opt/webapp目录
docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
# 挂载数据卷默认是读写权限,可以通过ro指定为只读
docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
数据卷容器
需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
# 创建一个数据卷容器dbdata
docker run -it -v /dbdata --name dbdata ubuntu
# 查看/dbdata目录
# 然后可以在其他容器中使用 --volumes-from来挂载dbdata容器中的数据卷
# 以下创建db1和db2两个容器,并从dbdata容器挂载数据卷
docker run -it --volumes-from dbdata --name db1 ubuntu2
docker run -it --volumes-from dbdata --name db2 ubuntu2
# 此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录,三个容器任何一方在该目录下的写入,其他容器都可以看到
# 多次使用--volumes-from参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷
docker run -d --name db3 --volumes-from db1 training/postgres
# 如果删除了挂载的容器,数据卷并不会被自动删除
删除容器卷
docker rmm -v [容器卷]
利用容器卷迁移数据
docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
# 1. 利用ubuntu镜像创建一个容器worker
# 2. 使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata)
# 3. 使用 -v $(pwd):/backup参数来挂载本地的当前木到worker容器的/backup目录
# 4. worker容器启动后,使用了 tar cvf /backup/backup/tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar
恢复
将数据恢复到一个容器
# 1. 创建一个带有数据卷的容器dbdata2
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
# 2. 创建一个新的容器,挂载dbdata2的容器,并使用untar 解压备份文件到锁挂载的容器中
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
端口映射与容器互联
端口映射访问容器
# -P(大写) Docker随机映射一个49000 ~ 49900的端口到内部容器开放的网络端口
docker run -d -O training/webapp python app.py
# -p(小写) 映射容器指定端口到本机指定端口,可以映射多个
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
# 映射一个特定地址
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
# 映射本机的任意端口到容器的5000端口,本地主机会自动分配一个端口
docker run -d -o 127.0.0.1::5000 training/webapp python app,py
查看端口映射配置
docker port nostalgic_morse 5000
互联机制实现便捷互访
通过自定义容器名来互联
# 1. 设置容器名字 (以下设置容器名字为db)
# 容器名字是唯一的,如果需要再次使用这个名称,需要先执行docker rm 删除现有db容器
docker run -d -P --name db training/postgres
# 2. 通过容器名字连接(以下web容器通过名字连接db容器)
docker run -d -P --name web --link db:db training/webapp python app.py
# 语法:--link name:alias name是要连接的容器名,alias是这个连接的别名
# 连接成功后,docker ps查看容器连接会发现 db容器 names列有db 也有 web/db表示允许web容器访问db容器的新消息
查看容器公开连接信息
方式一:更新环境变量
# 使用env参数查看环境变量
docker run --rm --name web2 --link db:db training/webapp env
# 结果中DB_开头的环境变量是供web容器连接db容器使用的
方式二:更新 /etc/hosts文件
Docker会添加host信息到父容器
# 1. 进入父容器查看host信息
cat /etc/hosts
# 2. 查看db容器ip,获得连接ip