参考学习网站:
https://www.bilibili.com/video/BV1og4y1q7M4
https://www.bilibili.com/video/bv1kv411q7Qc/?spm_id_from=333.788.b_636f6d6d656e74.6
0.复习目标
前面简单过了下基础概念,因为没有实践环境就没实操。后续有了自己的节点,就简单的操作练了下(毕竟凡人一个,眼过千遍不如手过一遍嘛)。进行简单记录方便后续命令查看。
不过个人感觉最好的参考还是Docker官方文档:https://docs.docker.com/reference/
- 基础命令练习
- 镜像
- 容器
- 仓库
- Dockerfile
- docker compose
- 网络连接
- swarm
1. 基础命令
官网查看地址:https://docs.docker.com/engine/reference
1.1 帮助命令
# 查看版本
docker version
# 查看详细信息(容器数量;镜像数量;正在运行的容器数量等)
docker info
# 帮助命令
docker --help
1.2 镜像命令
docker images 查看镜像
# 查看本地所有镜像
docker images
REPOSITORY 镜像仓库源
TAG 镜像标签
IMAGE ID 镜像id
CREATED 镜像创建时间
SIZE 镜像大小
# 查看所有镜像
docker images -a/-all
# 查看镜像ID
docker images -q/-quiet
docker search 搜索镜像
# 查询mysql镜像
docker search mysql
NAME 镜像名
DESCRIPTION 镜像描述
STARS 标星数
OFFICIAL 是否为官方生产
AUTOMATED 自动构建
# 查询mysql镜像的STARS大于30的
docker search mysql --filter=STARS=30
docker pull 拉取镜像
# 默认下载最新版mysql
docker pull mysql
Using default tag: latest # 默认latest
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete # 分层下载
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
a56aca0feb17: Pull complete
de9d45fd0f07: Pull complete
1d68a49161cc: Pull complete
d16d318b774e: Pull complete
49e112c55976: Pull complete
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d # 镜像签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
# docker pull mysql 等价于 docker pull docker.io/library/mysql:latest
# 拉取指定版本mysql,这个版本必须在仓库中存在
docker pull mysql:5.7
# 已经下载过的分层不再下载,直接使用系统已有的
5.7: Pulling from library/mysql
bb79b6b2107f: Already exists
49e22f6fb9f7: Already exists
842b1255668c: Already exists
9f48d1f43000: Already exists
c693f0615bce: Already exists
8a621b9dbed2: Already exists
0807d32aef13: Already exists
f15d42f48bd9: Pull complete
098ceecc0c8d: Pull complete
b6fead9737bc: Pull complete
351d223d3d76: Pull complete
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi删除镜像
# 删除指定版本的mysql
docker rmi -f mysql:5.7
Untagged: mysql:5.7
Untagged: mysql@sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Deleted: sha256:1b12f2e9257be96da5c075f186dc371b18442b0f9281728ac64c9a69c6e0e264
Deleted: sha256:b21d85dcc43f7db4e532c3ca07e5adbc1e02beb37646b7079217ea2b1922af91
Deleted: sha256:603c9faa831d58a3f60eb377cd6246a281a97b906406a92bf3452726a6f15b69
Deleted: sha256:2d927a6eb4cc26ba5454193a3f4abf503b6cea710293d4f0e6d061c08578b687
Deleted: sha256:b96c2c2176ca7b5223469ad39c9e17509505233dd81030878bc12b03074baef4
# 删除所有镜像,-aq为遍历删除,-f强制删除
docker rmi -f ${docker images -aq}
# 删除多个镜像
docker rmi -f images_1 images_2
docker commit提交镜像
# docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名:TAG
docker commit -m="描述信息" -a="作者" mycentos mycentos_image:1.0
1.3 容器命令
有了镜像才会有容器,使用centos镜像练习
docker run 新建并启动容器
# 新建并启动容器centos
docker run [COMMAND] centos
# 参数说明
--name mycentos:容器名
-d:后台方式运行
-it:交互方式运行,启动后即进入容器
-P:随机指定端口
-p:指定端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
docker ps 查看容器
# 查看当前运行的容器
docker ps
# 参数说明
-a:查看所有运行的容器
-l:查看最近运行的容器(latest)
-n 3:查看历史近3次运行的容器
exit 退出容器
# 直接退出(对于run -it的容器;对于exec -it的容器不会退出)
exit
# 不停止容器,直接退出
Ctrl + P + Q
docker rm删除容器
# 先停掉容器
docker stop mycentos
# 再删除容器
docker rm mycentos
# 强制删除所有容器(不管是否在运行中)
docker rm -f ${docker ps -aq}
或者
docker ps -a -q | xargs docker rm
启动和停止容器
docker start mycentos
docker stop mycentos
docker restart mycentos
docker kill mycentos
以上的命令中容器使用的是容器名进行指定,也可以通过容器ID进行指定
1.4 其他常用命令
后台运行
# 后台运行容器
docker run -d centos
# 使用docker ps会发现centos停止了
# 原因:docker容器使用后台运行必须要有一个前台进程,docker要是发现没有应用的话就会自动停止
# 所以一般后台运行使用
docker run -itd centos
进入正在运行的容器
# 方法一 进入容器开启一个新的终端,可以在里面自主输入命令执行相关操作(常用)
# 此处/bin/bash也可根据需求更换为其他容器支持的命令,例如ip addr等
docker exec -it mycentos /bin/bash
# 方法二 进入容器正在执行的终端,不会启动新的进程(直接运行容器中写好的相关命令)
docker attach -it mycentos /bin/bash
查看日志
# 查看日志
docker logs -tf --tail mycentos
# --tail number: 显示number条日志
# -tf:显示日志
查看进程
docker top mycentos
查看元数据
docker inspect mycentos
[
{
"Id": "e34dc480263fc4acba846af9feb59d221673627b0f2b55286052ee3311c1ab95",
"Created": "2020-10-28T08:45:06.265792062Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8498,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-10-28T08:54:03.811379851Z",
"FinishedAt": "2020-10-28T08:53:31.072828646Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath":
...... # 不再复制
]
拷贝容器文件
# 将容器中/home下的文件test.java拷贝到主机的/home目录
docker cp mycentos:/home/test.java /home
拷贝是一个手动过程,可使用 -v 数据卷的技术实现自动同步(容器中的数据挂载到宿主机目录中)
2. 数据卷
目标:将数据持久化,并且实现容器间数据共享(容器的持久化和同步、容器间数据共享)
数据卷:将容器中的目录挂载到宿主机上
挂载的方式:
- -v命令直接挂载
- 具名挂载
- 匿名挂载
- Dockerfile通过VOLUMES挂载
# 指定路径挂载(本质还是匿名挂载,如果没有指定卷名的话)
docker run -itd -v 主机目录:容器内目录
# 具名挂载
docker run -itd -v 卷名:容器内目录
# 匿名挂载
docker run -itd -v 容器内目录
测试效果:在主机/home/ceshi目录中添加文件test.java,容器中/home目录下同步有test.java
停止容器后,修改主机文件,重启容器发现/home数据也会同步
使用数据卷的好处:挂载之后如果需要修改只需要修改本地即可,容器内会自动同步
具名挂载和匿名挂载
# 匿名挂载
docker run -itd -v 容器内路径 centos
# docker volume ls 查看系统所有的数据卷
DRIVER VOLUME NAME
local 0d6cf80561323399c001da9589983215360cfddadf218ab19112fe470f549d89
# 具名挂载
docker run -itd -v 主机路径:容器内路径 centos
[root@master mongodb-4.4.1]# docker run -itd -v ceshi:/home centos /bin/bash
7746acd62ac669d708f923f68521f648d3478df5b61bde71b1c0dfa453750fdd
[root@master mongodb-4.4.1]# docker volume ls
DRIVER VOLUME NAME
local 0d6cf80561323399c001da9589983215360cfddadf218ab19112fe470f549d89
local 7a5ab28885d9034ac3b4796b59640fb814adadfb12967ee2dd4e5f3e8d93327f
# 指定主机路径
local ceshi
# 查看某个卷具体的位置 docker volume inspect 数据卷名
[root@master mongodb-4.4.1]# docker volume inspect ceshi
[
{
"CreatedAt": "2020-10-28T22:37:21+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/ceshi/_data",
"Name": "ceshi",
"Options": null,
"Scope": "local"
}
]
所有docker容器中如果没有指定主机挂载的数据卷(即使用匿名挂载),这些卷实际上都存储在
/var/lib/docker/volumes/
目录下
为方便找到挂载的数据卷,建议使用具名挂载
# ro:readonly 表示数据卷只读
# rw:可读可写(不写的话默认rw)
docker run -itd --name mycentos1 -v juan:/home:ro centos
docker run -itd --name mycentos2 -v juan:/home:rw centos
3. 数据卷容器
[root@master volumes]# docker run -itd --name mycentos3 --volumes-from mycentos2 centos
6d350f2df11afc1746aea649f8b079fc3067017f36cc10249ad7f220be6c9895
[root@master volumes]# docker exec -it mycentos3 /bin/bash
[root@6d350f2df11a