1、Docker 安装

1.1 命令模式

  1. # 1、卸载旧版本docker
  2. yum remove docker \
  3. docker-client \
  4. docker-client-latest \
  5. docker-common \
  6. docker-latest \
  7. docker-latest-logrotate \
  8. docker-logrotate \
  9. docker-engine
  10. # 2、安装Docker的依赖库
  11. yum install -y yum-utils device-mapper-persistent-data lvm2
  12. # 3、设置镜像仓库
  13. yum-config-manager \
  14. --add-repo \
  15. https://download.docker.com/linux/centos/docker-ce.repo # 国外的
  16. # 国内阿里的
  17. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  18. # 国内腾讯的
  19. yum-config-manager --add-repo https://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo
  20. # 更新软件包索引 生成缓存
  21. yum makecache fast
  22. # 4、安装docker相关内容 docker-ce 社区 ee 企业版
  23. yum install docker-ce docker-ce-cli containerd.io
  24. # 5、启动docke
  25. systemctl start docker
  26. # 6、查看docker是否安装成功
  27. docker version
  28. # 7、测试hello-world
  29. docker run hello-world
  30. # 8、查看下载的镜像image
  31. docker images
  32. # 卸载docker
  33. sudo yum remove docker-ce docker-ce-cli containerd.io
  34. sudo rm -rf /var/lib/docker

1.2 脚本模式

  1. # -s 安静模式。不要显示进度表或错误消息
  2. # -S 安静模式下显示错误信息
  3. # -L (HTTP/HTTPS)追随http响应头“Location:”定向到跳转后的页面
  4. curl -sSL https://get.docker.com/ | sh
  5. systemctl start docker

1.3 启停服务

  1. 启动服务命令: systemctl start docker
  2. 停止服务命令: systemctl stop docker
  3. 检查运行状态命令: systemctl status docker
  4. 重启服务命令: systemctl restart docker
  5. 开机启动命令: systemctl enable docker
  6. 开机不启动命令: systemctl disable docker
  7. 检查开机状态命令: systemctl is-enabled docker

1.4 镜像加速

配置Docker的自定义镜像仓库地址 https://cr.console.aliyun.com/cn-shanghai/instances/mirrors

  1. # live-restore:Docker重启之后,容器不退出。
  2. # log-driver和log-opts:用来限制Docker容器的日志的大小。
  3. # max-size=500m,意味着一个容器日志大小上限是500M。
  4. # max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json。
  5. mkdir -p /etc/docker
  6. tee /etc/docker/daemon.json <<-'EOF'
  7. {
  8. "registry-mirrors": ["https://a5dwl7z9.mirror.aliyuncs.com","https://mirror.ccs.tencentyun.com","https://0bb905ba3400f35a0f83c01a53c2aec0.mirror.swr.myhuaweicloud.com"],
  9. "live-restore": true,
  10. "log-driver":"json-file",
  11. "log-opts": {"max-size":"500m", "max-file":"3"}
  12. }
  13. EOF
  14. systemctl daemon-reload
  15. service docker restart
  16. docker info
  17. # 国内镜像源加速站点
  18. https://registry.docker-cn.com
  19. http://hub-mirror.c.163.com
  20. https://3laho3y3.mirror.aliyuncs.com
  21. http://f1361db2.m.daocloud.io
  22. 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)