Appearance
基础
1. 为什么使用 Docker?
缺点 | 优点 |
---|---|
安装麻烦,可能有各种依赖、运行报错。例如:WordPress,Redis,Mysql 等。 | 一行命令可以安装完毕,简单方便,有丰富的镜像可以直接使用 |
可能对 windows 并不友好,只支持在 Linux 运行 | 没有系统兼容性问题,Linux 专享软件直接用 |
不方便安装多版本软件,不能共存 | 支持软件多版本共存 |
安装了一堆软件,拖慢电脑运行速度 | 用完就丢,不会拖慢电脑速度 |
不同系统和硬件,安装方式不一样 | 安装好 Docker 不用担心环境,一个命令搞定所有 |
2. Docker 基本组成
名称 | 描述 |
---|---|
镜像 | 相当于一个模板,通过模板来创建容器服务,通过镜像可以创建多个容器。 |
容器 | Docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建。启动,停止,删除,基本命令!目前可以把容器理解为一个简易的Linux 系统 |
仓库 | 仓库是存放镜像的地方,分为公有仓库和私有仓库, Docker Hub(国外)阿里云、华为云、网易云、腾讯云...都有容器服务器(配置镜像加速) |
3. 配置镜像加速服务
这里仅举例阿里云镜像加速服务配置
在 Docker Engine 中registry-mirrors
配置自己的加速地址即可
4. Docker 常用命令
4.1 帮助命令
bash
# 显示docker版本信息
docker version
# 显示docker系统信息,包括镜像、容器的数量
docker info
# 显示所有可用命令
docker --help
4.2 镜像命令
docker images 查看所有本地主机上的镜像
bash
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx stable 9be976d16505 4 months ago 134MB
# 解释
# REPOSITORY 镜像的仓库源
# TAG 镜像的标签
# IMAGE ID 镜像的ID
# CREATED 镜像的创建时间
# SIZE 镜像的大小
# 可选项
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的ID
docker search 搜索镜像
bash
# 解释
# NAME 镜像名称
# DESCRIPTION 镜像简单描述
# STARS 星星数量
# OFFICIAL 是否官方
# AUTOMATED 是否由代码版本库自动生成
# 可选项
-f, --filter # 根据提供的条件过滤输出
--limit # 限制展示结果数量
--no-trunc # 完整显示描述内容
# 示例
docker search --filter=stars=10000 nginx
docker pull 下载镜像
bash
docker pull 镜像名:tag # 如果不写tag 默认就是latest(最新版)
**docker rmi ** 删除镜像
bash
docker rmi -f 镜像id # 删除指定容器
docker rmi -f 镜像id 镜像id 镜像id # 删除多个容器
docker rmi -f $(docker images -aq) # 删除全部容器
4.3 容器命令
docker run 容器启动
bash
# 参数说明
--name="Name" # 容器名字,用来区分容器
-d # 后台方式运行
-it # 使用交互方式运行,进入容器查看内容
-P(大写) # 将所有公开的端口发布到随机端口
-p(小写) # 将容器的端口发布到主机 主机端口:容器端口 多个端口映射可以写多个-p
--rm # 一般用来测试 用完即删除容器本身
-e,--env # 设置环境变量
全部命令:
https://docs.docker.com/engine/reference/commandline/run/
进入容器和退出容器:
bash
# 以命令交互方式启动并进入容器
docker run -it --name="shangguigu" nginx:stable /bin/bash
# 停止容器并退出容器
root@e8f75f96323b:/# exit
# 容器不停止退出
使用Ctrl + p + q
docker ps 查看当前正在运行的容器
bash
# 解释
# CONTAINER ID 容器ID
# IMAGE 使用的镜像源
# COMMAND 启动容器的附加命令
# CREATED 创建时间
# STATUS 运行状态
# PORTS 端口转发
# NAMES 容器名字
# 可选项
-a,--all # 显示以前运行过的容器
-n,--last # 显示指定数量的最近创建过的容器
--no-trunc # 显示完整的COMMAND指令
-q,--quiet # 只显示容器ID
docker rm 删除容器
bash
docker rm 容器id # 删除指定容器(运行中的容器无法删除)
docker rm -f 容器id # 强制删除容器(运行中的容器也会被删除)
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs docker rm # 删除所有的容器
启动、重启和停止容器
bash
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止正在运行的容器
docker kill 容器id # 强制停止当前运行的容器
提示
docker run 指创建新的容器并运行,docker start 指启动已经存在的容器
4. 其他命令
后台启动容器
bash
docker run -d 镜像名
注意:容器后台运行,必须有一个前台进程,docker 发现没有应用,就会自动停止。
以上描述分 2 种情况,无桌面环境服务器中的 docker 和上述描述一致,如果是桌面环境带 docker 客户端的情况下,客户端会自动补充命令导致上述描述失效
bash
❯ docker run -d nginx:stable
684f1952c67fadd9cafc005ded4263711db855fd7b4d8f3338e36ad7499191a1
❯ docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
684f1952c67fadd9cafc005ded4263711db855fd7b4d8f3338e36ad7499191a1 nginx:stable "/docker-entrypoint.sh nginx -g 'daemon off;'" 55 seconds ago Up 54 seconds 80/tcp objective_cray
docker logs 查看日志
bash
docker logs -ft 容器id #查看容器日志
# 可选项
-f, --follow # 跟踪日志输出
-n, --tail # 列出最新的N条日志
-t, --timestamps # 显示时间戳
docker top 查看容器中进程信息
docker inspect查看容器元数据
提供有关 Docker 控制的构造的详细信息,默认情况下,将在 JSON 数组中呈现结果。
bash
# 查看容器内部IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器id
172.17.0.2
# 查看容器内部MAC
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' 容器id
02:42:ac:11:00:02
# 查看端口绑定
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 容器id
80/tcp -> 8080
docker exec 进入运行中的容器
bash
# 进入容器后开启一个新的终端,可以在里面操作(常用)
docker exec -it 容器id /bin/bash
# 进入容器正在执行的终端,不会启动新的进程
docker attach 容器id|容器name
docker cp 从容器内拷贝文件到主机
bash
# docker cp 容器id:文件路径 主机路径
# 在容器内
root@2e64bdb23ff6:/home# touch bddxg.vue
# 使用 Ctrl + p + q 切换到主机
❯ docker cp 2e64bdb23ff6:/home/bddxg.vue ./
❯ ls
Applications Documents Library Music Public
Desktop Downloads Movies Pictures bddxg.vue
docker cp 从主机向容器内拷贝文件
bash
# docker cp 主机路径 容器id:文件路径
> touch /home/bddxg.vue
> docker cp /home/bddxg.vue 2e64bdb23ff6:/home/
# 使用 docker exec 切换到主机
❯ docker exec -it 2e64bdb23ff6
root@2e64bdb23ff6: cd /home
root@2e64bdb23ff6: ls
bddxg.vue
docker stats 统计容器 CPU 内存的使用情况
bash
docker stats 容器id|容器name
docker commit 提交镜像
bash
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
命令在线文档:
https://docs.docker.com/reference/
5. 容器数据卷
5.1 什么是数据卷?
数据存储在容器中,如果容器被删除,数据就会丢失! 需求:数据持久化!
数据库存储在容器中,容器删除,数据丢失!需求:数据库存储在本地!
数据共享技术,容器中的数据同步到本地,这就是数据卷技术
5.2 使用数据卷
方法一:直接使用命令来挂在 -v 效果:双向绑定
bash
# docker run -d -v 主机路径:容器路径 (无法使用相对路径)
docker run -d -v /Users/bddxg/dk/nginx:/home nginx:stable
# 检查是否映射成功
dk inspect --format='{{.Mounts}}' 容器id
# [{bind /Users/bddxg/dk/nginx /home true rprivate}]
5.3 mysql 数据持久化
bash
# 下载mysql
docker pull mysql:5.7 # macOS M1 用户 请使用 docker pull amd64/mysql
# 挂在目录并启动mysql容器
docker run -d -v /Users/bddxg/dk/mysql/conf:/etc/mysql/conf.d -v /Users/bddxg/dk/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3310:3306 --name mysql amd64/mysql:latest
# -v /Users/bddxg/dk/mysql/conf:/etc/mysql/conf.d
# 绑定本机目录/Users/bddxg/dk/mysql/conf与容器目录/etc/mysql/conf.d
# -v /Users/bddxg/dk/mysql/data:/var/lib/mysql
# 绑定本机目录/Users/bddxg/dk/mysql/data与容器目录/var/lib/mysql
# -e MYSQL_ROOT_PASSWORD=123456
# 设置环境变量 设置mysql登录密码
# -d 后台运行 -p 主机端口:容器端口 --name 容器名称
测试链接数据库:
测试创建数据库:
删除 mysql 容器:
bash
docker rm -f mysql
容器数据持久化:
5.4 具名和匿名挂载
具名挂载: docker run -v 卷名:容器路径
匿名挂载: docker run -v 不指定主机挂载路径,只有容器路径
docker volume 管理数据卷
命令 | 描述 |
---|---|
docker volume create | 创建卷 |
docker volume inspect | 查看卷详细信息 |
docker volume ls | 列出所有的卷 |
docker volume prune | 删除所有未在使用的数据卷 |
docker volume rm | 删除一个或者多个数据卷 |
bash
# 启动一个具名容器
docker run -d -P --name ng2 -v juming-nginx:/etc/nginx nginx:stable
# 查看所有的卷
docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 查看具名卷的详细信息
docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-05-08T13:37:02Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的 docker 的容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
中
警告
不建议使用匿名挂载,大部分情况下可以使用具名挂载
拓展
bash
docker run -d -P --name ng2 -v juming-nginx:/etc/nginx:ro nginx:stable
# ro: readOlay 只读
# rw: readwrite 可读可写
# ro 只能通过主机来操作,容器内无法从操作
5.5 数据卷容器
共享多个 docker 容器之间的数据
bash
# 启动容器一
docker run -it --name nginx01 dxg/nginx:0.1
root@bec78468db33:/# cd volume01
root@bec78468db33:/volume01# ls
root@bec78468db33:/volume01# touch bddxg01
# 启动容器二
docker run -it --name nginx02 --volumes-from nginx01 dxg/nginx:0.1
root@8fd14c1dbd10:/# cd volume01
root@8fd14c1dbd10:/volume01# ls
bddxg01
删除容器一后,容器二中的数据依然存在
bash
# 删除 容器一
docker rm bec78468db33
# 查看 容器二的数据
root@8fd14c1dbd10:/volume01# ls
bddxg01
实现原理:
容器二的挂载指针指向了容器一的挂载地址,从而实现了数据共享,又因为删除容器不会造成挂载一同被删除,所以实现了删除容器一,但容器二挂载的数据还可以访问的场景
警告
如果删除了主机上容器挂载的数据,那么多个容器共享的数据也会消失!