Docker
Docker 基础
docker 介绍
docker 是一个开源的应用容器引擎,是直接运行在宿主操作系统之上的一个容器,使用沙箱机制完全虚拟出一个完整的操作,容器之间不会有任何接口,从而让容器与宿主机之间,容器与容器之间隔离的更加彻底.每个容器会有自己的权限管理,独立的网格与存储栈,以及自己的资源管理,能使一台宿主机上可以友好的共存多个容器.
docker架构
核心组件:
- 客户端[也就是 linux 终端,通过 linux 命令进行操作]
- dokcer 服务器,是一个守护进程[守护进程是不能和用户交互的,在后台运行.用来管理容器和镜像]
- docker 镜像[可执行程序].镜像可以启动,启动之后就是一个容器.一般不需要我们制作镜像,直接从 registry 仓库中拉下来使用
- docker 容器[docker 只占用磁盘资源,启动之后占用的是内存和 cpu 资源]
- 镜像仓库
docker 的基本使用
-
查看 docker 版本
```docker version```
-
配置加速器
以 mac 为例: https://dashboard.daocloud.io/ 进入DaoCloud注册登录后点击小火箭可以找到对应的配置 docker 镜像站的镜像地址.打开 docker桌面版,点击设置按钮可以进入到preference,选择 docker engine .将以下代码复制到 json 文件内后选择apple&restart 即可
"registry-mirrors": [
"http://f1361db2.m.daocloud.io"
]
docker 镜像管理
-
镜像的搜索
docker search 镜像名
输出解释:
- NAME: 镜像名字
- DESCRIPTION: 镜像描述
- STARS: 下载量
- OFFICIAL: 是否为官方出品[ok]代表为官方的
- AUTOMATED: 是不是自动化编译出来的,自动化是指通过 dockerfile 制作的
-
镜像的获取[可以指定具体版本,不指定则拉取最新版本 latest]
docker pull 镜像名:版本
-
镜像的查看[如果要查看指定镜像,后面跟上镜像名]
docker images (镜像名)或者 docker image ls (镜像名)
输出解释:
- REPOSITORY: 仓库
- TAG: 版本[latest 为最新版本]
- IMAGE ID: 镜像 id,唯一的
- CREATED: 镜像的创建时间
- SIZE: 镜像的大小
-
镜像别名
docker tag source_image:版本 target_image:版本
-
删除镜像
docker rmi镜像名或镜像id
需要注意:
如果给镜像起过别名就不可以用 id 去删除,因为同一个 image id 下面有多个 image.只删一次的话不是删除的镜像,只有指定镜像名的那一条被删除了,另一条依旧存在.当镜像没有被引用时才会被删除
-
镜像导出[导出镜像,不能修改镜像]
docker save [-o 或者--output] 导出后的镜像tar文件名字以img结尾 镜像
-
镜像导入
docker load [-i或者--input ] 通过 save 导出之后的镜像tar 文件的名字 或者 docker load > 通过 save 导出之后的镜像名
-
镜像历史信息[也就是制作镜像的操作步骤]
docker history 镜像名或镜像 id
-
镜像的详细信息[也就是镜像的属性信息,以 json 格式输出]
docker inspect [-f或者--format 格式化输出][-s 或者--size 输出镜像的大小也就是 docker images 里得 size][--type 返回时指定类型,默认是 json] 镜像名或镜像 id 例如:docker inspect -f {{.}} 镜像名 只输出 value 没有 key 可以通过{{}}获取指定键值对的值. 这里.代表当前镜像,也就是最外层的 json,{{.containerconfig.hostname}} 就可以获取到 hostname 的值了
docker 容器管理
-
查看容器
docker ps [-a 或--all如果没有-a 只能显示正在运行的,有了-a 显示所有状态的][-q 或--quiet只显示容器的 id]
输出解释:
CONTAINER ID: 容器启动之后的ID,这个ID是唯一的
IMAGE: 这个容器是通过哪个镜像启动起来的,对应的是镜像的名字[镜像名:版本]
COMMAND: 镜像启动之后,默认执行的第一个命令
CREATED: 容器创建时间
-
STATUS: 容器当前状态
- 运行 up
- 刚被创建 created
- 停止Exited
- 暂停 pauses
PORTS: 容器和宿主机对应的映射端口
NAMES: 容器启动之后的名字,启动镜像的时候没有指定名字,会自动指定
-
创建容器[容器被创建,但是还不能使用,需要启动]
docker create [-i 或者--interactive][-t 或者--tty][--rm][--name] 镜像名 [command容器启动之后,指定一个默认执行的 shell 命令,根据实际情况指定,如果什么都不做就写 bash] 参数解释: -i: 创建的容器是否关联标准输入[也就是是否和终端进行交互] -t: 是否给这个容器分配终端 --rm: 容器被停止(关闭)之后,是否自动删除容器 --name: 创建容器的时候给容器起名,如果没指定会随机生成
-
启动容器
docker start 参数 容器名字/容器 id参数解释:a: 关联标准输出和标准错误i: 关联表示标准输入应用场景:1. 容器创建后启动2. 容器被关闭或者停止后重新启动
-
创建并启动容器
docker run 参数 镜像 [command]参数解释:-i: 创建的容器是否关联标准输入[也就是是否和终端进行交互]-t: 是否给这个容器分配终端--rm: 容器被停止(关闭)之后,是否自动删除容器--name: 创建容器的时候给容器起名,如果没指定会随机生成-d 或者--detach 容器运行后是不是守护进程
-
暂停容器
docker pause 容器名/容器id
-
取消暂停
docker unpause 容器名/容器id
-
重启
docker restart 容器名/容器id
-
关闭容器[延时关闭,默认为 10s],可以停止一个或多个容器,多个容器以空格分隔
docker stop [-t 多少秒之后杀死容器的进程] 容器名/容器id
-
终止容器[马上关闭,没有延时]
docker kill 容器名/容器id
-
删除容器
# 删除未运行的容器[非 up 状态]docker rm 容器名/容器id# 删除运行中的容器docker rm -f 容器名/容器 id参数解释:-f 或者--force-l 或者--link-v 或者--vloumes# 批量删除容器[需要多个命令的集合]docker rm -f $(docker ps -aq)
$()或者``里放 shell 命令可以在其他命令里执行该命令,并把结果返回给前面的函数
-
进入容器
docker exec -it 容器 [command]参数解释:-i: 创建的容器是否关联标准输入[也就是是否和终端进行交互]-t: 是否给这个容器分配终端
-
退出容器
通过 exec 进来就不可以使用 ctrl+c 退出而是使用 exit 退出或者快捷键 ctrl+d
-
查看容器的日志信息
docker logs 容器名/容器id
-
查看容器的详细信息
docker inspect 容器名/容器id
-
查看容器的端口信息[需要在启动容器时指定映射才能看到.因为容器之间是隔离的,容器和宿主器之间是没办法通信的,如果要通信需要通过网络进行端口映射,指定哪个端口可以和外部进行通信]
docker port 容器名/容器id
-
容器重命名
docker rename 容器名 新名字
-
导出容器[该导出方式导出后可以修改镜像]
docker export 容器名 > 导出的镜像名
-
导入容器
cat 要导入的镜像文件名 | docker import - 导入的新镜像的名字
区别:
通过容器导入的镜像可以指定名字,image id 也会分配一个新的,size 比镜像导入要小[是因为文件大小发生了变化,所以镜像的哈希值也会发生变化 ]
通过容器export导出时会把历史记录删除,镜像导出 save 不会
并不是通过容器导出的只能容器的方法导入,是可以交替使用的
Docker高级
数据拷贝[容器好宿主机之间]
docker cp 宿主机目录/文件 容器名/容器id:容器路径docker cp 容器名/容器id:容器路径 宿主机目录/文件
数据卷的使用
数据卷: 宿主机的存储目录,该目录在宿主机和 docker 容器之间共享数据
要将目录中的数据和 docker 容器进行数据共享,也叫做挂载数据卷
挂载的时机:
- 容器被创建的时候 create
- 容器被创建并运行的时候 run
指定设置挂载数据卷使用通过-v 或者--volume 参数 宿主机路径:容器路径
宿主机路径必须是绝对路径
如果宿主机路径不存在会自动创建
如果容器路径不存在也会自动创建
例如:
docker run -it --name 容器名 -v 宿主机路径:容器路径:权限[默认为 rw 读写]
权限问题:
通过-v 进行数据卷挂载,默认时读写的挂载方式
rw 为读写,ro 为只读,可以修改容器对挂载目录的权限
既可以挂载文件也可以挂载目录
数据卷容器的使用
数据卷容器就是一个普通的容器,在这个容器中提供了一个挂载目录(共享目录)
只要被创建出来的容器就可以被作为数据卷容器使用
创建数据卷容器
docker create -itd --name 容器名 -v 挂载目录[没有会自动创建] 镜像名 [shell命令command]
数据卷容器的挂载使用
参数: --volumes-form 数据卷容器的名字/数据卷容器的 id
小例子:
# 1. 创建数据卷容器docker run -itd --name data_sheet -v /share_dir ubuntu:18.04 bash# 2. 启动测试容器1,挂载到数据卷容器docker run -itd --name test1 [ --volumes-from data_sheet指定数据卷容器] ubuntu:18.04镜像名 bash# 3. 启动测试容器2,挂载到数据卷容器docker run -itd --name test2 --volumes-from data_sheet ubuntu:18.04 bash # 4. 测试数据是否共享进入 test1 的终端:docker exec -it 593ca01feca1 bash并在 test1 的 share_dir 中新建一个文件 hello,内容为 hello进入 test2 的终端,检查文件以及内容是否正确:docker exec -it d16524efb984 bash
数据卷容器数据备份
因为容器可能会被我们误删,如果误删了数据也跟着丢了.所以我们需要将数据卷容器中的数据进行备份
-
创建一个临时新容器,挂载到数据卷容器上,和宿主机目录形成映射关系
docker run -itd --name data_copy3 --rm --volumes-from data_sheet -v /Users/shilingli/docker_data_sheet_copy:/share_dir2 ubuntu:18.04 bash# 注意: 和宿主机共享数据的目录不能和挂载数据卷容器的名字一样,否则文件夹中默认是宿主机文件夹里得内容,会覆盖掉数据卷中的
-
进入到该容器data_copy中
docker exec -it d8009a6970e4 bash
-
将数据卷容器的/share_dir中的内容拷贝到该容器的/share_dir中
如果数据量大使用 tar先进行打包tar -cvf 打包文件.tar 被打包的文件/路径...tar -zcvf /share_dir2/share_dir.tar.gz share_dir以下是压缩的内容:share_dir/share_dir/a.txt
-
备份完该容器就没用了,直接删除就可以了
docker stop d8009a6970e4docker rm d8009a6970e4
这四步操作也可以一步完成:
docker run -itd --name data_copy4 --rm --volumes-from data_sheet -v /Users/shilingli/docker_data_sheet_copy:/share_dir2 ubuntu:18.04 tar -zcvf /share_dir2/share_dir.tar.gz share_dir
数据卷容器数据还原
# 如果是之前压缩过了则需要解压缩tar -zxvf 压缩文件.tar.gz -C 解压目录docker run -itd --name data_store --rm --volumes-from data_sheet -v /Users/shilingli/docker_data_sheet_copy:/share_dir2 ubuntu:18.04 tar zxvf /share_dir2/share_dir.tar.gz -C /share_dir
docker网络管理[了解]
docker 端口映射
docker 容器和外界是隔离的,如果要和外界通信需要 tcp 网络通信,通信需要绑定端口
-
随机端口映射
# 在宿主机随便找一个没有被占用的空闲端口和容器的 80 端口进行映射[也就是 nginx 的默认端口]docker run -itd -P nginx
-
指定端口映射/指定多端口映射[宿主机的 ip:宿主机的端口:容器的端口或者宿主机的端口:容器的端] 多个端口映射直接追加-p 即可
端口必须是空闲端口
docker run -itd -p 1216:80 nginx
网络管理命令
docker network commandcommands: connect: 将指定的容器加入到指定的网络中 create: 创建一个网络 disconnect: 将容器从一个网络中删除 inspect: 查看网络的详细信息 ls: 查看当前网络 prune: 删除所有的没有被使用的网络.没有被使用不代表没用,该功能慎用 rm: 删除一个或多个指定的网络