1、Docker 安装
1.1 命令模式
# 1、卸载旧版本docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2、安装Docker的依赖库
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、设置镜像仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 国外的
# 国内阿里的
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 国内腾讯的
yum-config-manager --add-repo https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo
# 更新软件包索引 生成缓存
yum makecache fast
# 4、安装docker相关内容 docker-ce 社区 ee 企业版
yum install docker-ce docker-ce-cli containerd.io
# 5、启动docke
systemctl start docker
# 6、查看docker是否安装成功
docker version
# 7、测试hello-world
docker run hello-world
# 8、查看下载的镜像image
docker images
# 卸载docker
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
1.2 脚本模式
# -s 安静模式。不要显示进度表或错误消息
# -S 安静模式下显示错误信息
# -L (HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面
curl -sSL https://get.docker.com/ | sh
systemctl start docker
1.3 启停服务
启动服务命令: systemctl start docker
停止服务命令: systemctl stop docker
检查运行状态命令: systemctl status docker
重启服务命令: systemctl restart docker
开机启动命令: systemctl enable docker
开机不启动命令: systemctl disable docker
检查开机状态命令: systemctl is-enabled docker
1.4 镜像加速
配置Docker的自定义镜像仓库地址 https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
# live-restore:Docker重启之后,容器不退出。
# log-driver和log-opts:用来限制Docker容器的日志的大小。
# max-size=500m,意味着一个容器日志大小上限是500M。
# max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://a5dwl7z9.mirror.aliyuncs.com","https://mirror.ccs.tencentyun.com","https://0bb905ba3400f35a0f83c01a53c2aec0.mirror.swr.myhuaweicloud.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}
EOF
systemctl daemon-reload
service docker restart
docker info
# 国内镜像源加速站点
https://registry.docker-cn.com
http://hub-mirror.c.163.com
https://3laho3y3.mirror.aliyuncs.com
http://f1361db2.m.daocloud.io
https://mirror.ccs.tencentyun.com
2、Docker 命令
- Docker环境信息 — docker [info|version]
- 容器生命周期管理 — docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]
- 容器操作运维 — docker [ps|inspect|top|attach|wait|export|port|rename|stat]
- 容器rootfs命令 — docker [commit|cp|diff]
- 镜像仓库 — docker [login|pull|push|search]
- 本地镜像管理 — docker [build|images|rmi|tag|save|import|load]
- 容器资源管理 — docker [volume|network]
- 系统日志信息 — docker [events|history|logs]
2.1 镜像命令
2.1.1 搜索镜像
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
docker search [OPTIONS] TERM
# 搜索收藏大于3000以上的信息
docker search mysql --filter=STARS=3000
| 参数 | 说明 |
| ----------- | ------------- |
| NAME | 镜像名称 |
| DESCRIPTION | 镜像说明 |
| STARS | 点赞数量 |
| OFFICIAL | 是否是官方的 |
| AUTOMATED | 是否是自动构建的 |
2.1.2 查看镜像
### 查看本地所有镜像
REPOSITORY # 镜像的仓库源
TAG # 镜像的标签
IMAGE ID # 镜像的ID
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
Options:
-a, --all Show all images (default hides intermediate images)
-q, --quiet Only show numeric IDs
# 查看镜像详细信息
docker image inspect 镜像ID
2.1.3 下载镜像
### 下载镜像
# tag: latest 默认是下载最新版
docker pull 镜像名称
2.1.4 删除镜像
# 删除镜像 -f表示强制删除
docker rmi [-f] 镜像id[镜像名称]
# 删除所有镜像
docker rmi -f $(docker images -qa)
2.1.5 导入导出
# 导出 centos是REPOSITORY
[root@hchost ~]# docker image save centos > docker-centos.tar.gz
# 导入
[root@hchost ~]# docker image load -i docker-centos.tar.gz
docker save <myimage>:<tag> | gzip > <myimage>_<tag>.tar.gz
gunzip -c <myimage>_<tag>.tar.gz | docker load
2.1.6 提交镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
[root@hchost ~]# docker commit -m="add webapps" -a="hc" 369f96c23d9e tomcat_hc:1.0
2.2 容器命令
2.2.1 查看容器
# 查看正在执行的容器
docker ps
-a 列出当前正在运行的容器+顺带出历史运行过的容器
-n=? 显示最近创建的容器
-q 显示容器编号
2.2.2 启动容器
docker run 参数
参数说明:
-i: 保持容器运行。退出容器后,容器会自动关闭。
-t: 为容器重新分配一个伪输入终端,通常和-i同时使用。
-d: 以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。
-it: 创建的容器一般称为交互式容器。
-id: 创建的容器一般称为守护式容器、
--name: 为创建的容器命名。
-p: 映射端口 外部端口:容器内部端口
-P: 随机指定端口
exit # 容器停止并退出
ctrl+p+q # 容器不停止退出
2.2.3 进入容器
# 区别
# docker exec 进入容器后开启一个新的终端,可以在里面操作(常用),exit退出后,容器还在运行
# docker attach 进入容器正在执行的终端,不会启动新的进程,exit退出后,容器退出结束
docker exec -it 容器id[容器名称] /bin/bash
docker attach 容器id[容器名称] /bin/bash
2.2.4 删除容器
docker rm 容器ID # 删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
2.2.5 启停容器
docker start 容器ID
docker restart 容器ID
docker stop 容器ID
docker kill 容器ID
docker pause 容器ID
docker unpause 容器ID
2.2.6 查看日志
docker logs -f 容器id[容器名称]
Options:
--details 显示提供给日志的额外详细信息
-f, --follow 跟踪日志输出
-n, --tail string 从日志末尾开始显示的行数 (default "all")
-t, --timestamps 显示时间戳
# 最后10行日志,并实时监控日志输出
docker logs -n 10 -f 容器id
# 最近10分钟的日志
docker logs --since 10m 容器id
# 查看6月3号9点到10点之间的日志
docker logs --since 2021-06-03T9:00:00 --until 2021-06-03T10:00:00 容器id
2.2.7 其他命令
# 查看容器内进程
docker top 容器ID
# 查看镜像的元数据
docker inspect 容器ID
# 拷贝容器文件到宿主机
docker cp 容器id:容器内路径 目的的主机路径
# 提高权限
docker run -it --name hc_centos -p 8023:80 -v /data/:/data/ --privileged=true hc_centos:7.9 /usr/sbin/init
# 查询容器IP
docker inspect 容器id|grep -ai ipaddr|tail -1|grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}"
# 查询指定配置信息
docker inspect 容器id|grep -ai mounts -A 10
3、容器数据卷
- 数据卷是宿主机中的一个目录或文件。
- 当容器目录和数据卷目录绑定后,对方修改会立即同步。
- 一个数据卷可以同时被多个容器同时挂载。
- 一个容器也可以被挂载多个数据卷。
3.1 常用命令
```bash查看卷列表
docker volume ls DRIVER VOLUME NAME
创建一个卷
docker volume create hc_nginx
查看卷路径
docker volume inspect hc_nginx
使用数据卷
docker run -it -v 主机目录:容器目录
删除卷
docker volume rm [OPTIONS] VOLUME [VOLUME…]
删除未被任何容器使用的本地卷
docker volume prune [OPTIONS]
<a name="q1wUR"></a>
## 3.2 匿名挂载
```bash
# 可以在宿主机的/var/lib/docker/volumes目录中找到容器挂载的目录,但是目录的名称是随机的
docker run ... -v 容器内目录(文件) ...
# -P 随机映射端口
docker run -d -P -v /var/log/nginx/ --name nginx nginx
docker volume ls 查看卷的情况,这种就是匿名挂载,我们在 -v 只写了容器内的路径,没有写容器外的路径
3.3 具名挂载
# 可以在宿主机的/var/lib/docker/volumes目录中找到容器挂载的目录,但是目录的名称是自己指定的
docker run ... -v 名称:容器内目录(文件) ...
docker run -d -v nginx80:/var/log/ --name nginx nginx
docker volume inspect nginx80
# "Mountpoint": "/var/lib/docker/volumes/nginx80/_data"就是宿主机上此容器/var/log/卷映射的位置
3.4 拓展
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦设定了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx02 -v juming-nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的
--volumes-from
# 创建两个容器实现数据同步
# 创建docker01
docker run -it --name=docker01 centos
# 创建docker02
docker run -it --name=docker02 --volumes-from docker01 centos
# docker01 和docker02 的数据是同步的,docker01就是数据卷容器(父类),docker02是子类
# 还可以创建多个容器挂载docker01或docker02,删除了docker01,其余挂载的容器数据不会丢失
# 格式化查看容器信息
# 镜像,ID,端口号,状态
docker ps --format "table {{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Status}}"
docker ps --format "table {{.Names}}\t{{.Status}}"
# 显示容器名
docker ps -a --format "table {{.Names}}\t{{.Status}}"
docker inspect --format='{{.Name}}' $(docker ps -q)|cut -d"/" -f2
# 获取容器IP
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-ID>
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
# 列出无用的数据卷
docker volume ls -qf dangling=true
docker volume rm $(docker volume ls -qf dangling=true)