掌握Docker安装及命令使用

[删除(380066935@qq.com或微信通知)]

## 第一章:掌握Docker安装及命令使用

#### 安装Docker注意事项

>CentOS7:操作系统版本不能低于7版本,内核版本3.10,内核的支持已经很完善了
>
>CentOS6版本内核:2.x版本,对容器的支持不是很完善



#### Docker版本介绍

>社区版:docker-ce
>
>企业版:docker-ee



#### 安装前环境准备

```shell
#关闭防火墙与SELinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

#配置本地yum源
[root@localhost ~]# mkdir /mnt/centos
[root@localhost ~]# mount /dev/cdrom /mnt/centos
[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# vim /etc/yum.repos.d/local.repo
[local]
name=local_centos
baseurl=file:///mnt/centos
enabled=1
gpgcheck=0

#创建阿里源
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

[root@localhost ~]# yum repolist
```



#### 创建Docker存储库

官方安装文档:https://docs.docker.com/engine/installation/linux/centos/

```shell
[root@localhost ~]# yum install -y yum-utils

#创建docker存储库(阿里)
[root@localhost ~]#  yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装docker软件包
root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io -y

#启动服务并开机自启
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker

#查看docker版本信息
[root@localhost ~]# docker --version
```



#### 配置镜像加速器

>默认情况下镜像从docker hub下载,由于docker hub服务器在国外,由于网络原因镜像下载速度较慢,一般会配置镜像加速器进行下载

> 国内镜像加速器有阿里云、网易云、腾讯云、中科大等,本实验配置阿里云镜像加速器,速度较快

```shell
#创建阿里云镜像加速器
[root@localhost ~]# mkdir -p /etc/docker
[root@localhost ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://d3p1s1ji.mirror.aliyuncs.com"]
}
EOF

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
```



#### Docker服务命令

| 命令                       | 作用               |
| :------------------------- | :----------------- |
| systemctl  start  docker   | 启动服务           |
| sysmtectl  status  docker  | 查看服务状态       |
| systemctl  restart  docker | 重启服务           |
| systemctl  enable  docker  | 设置服务随机自启   |
| docker  --version          | 查看docker版本信息 |
| systemctl stop docker      | 停止服务           |



```shell
#启动服务
[root@localhost ~]# systemctl start docker

#查看服务运行状态
[root@localhost ~]# systemctl status docker
...
   Active: active (running)  #运行  

#关闭服务
[root@localhost ~]# systemctl stop docker
[root@localhost ~]# systemctl stop docker
...
  Active: inactive (dead)   #死掉

#重启服务
[root@localhost ~]# systemctl restart docker

#设置服务随机自启
[root@localhost ~]# systemctl enable docker

#查看docker版本信息  
[root@localhost ~]# docker version
```



#### Docker镜像命令

| 命令                      | 作用     |
| ------------------------- | -------- |
| docker  images            | 查看镜像 |
| docker  search  镜像名    | 搜索镜像 |
| docker  pull  镜像名:版本 | 拉取镜像 |
| docker rmi  镜像名:版本   | 删除镜像 |

```shell
#查看docker可用命令
[root@localhost ~]# docker

#查看可用镜像
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
镜像名        版本       镜像ID     创建时间    大镜像小

#搜索镜像
[root@localhost ~]# docker search centos
NAME    DESCRIPTION                 STARS     OFFICIAL          AUTO
centos  The official buildofCentOS. 6639      [OK]
镜像仓库   镜像描述信息                镜像数量  是否为官方发布镜像  是否为自动化构建的镜像

#下载镜像(如果不指定镜像版本则是最新版本,如需指定版本可从docker hub查看对应版本信息在进行下载)
root@localhost ~]# docker pull centos:7

#查看镜像
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       7         8652b9f0cb4c   8 months ago   204MB

#查看所有镜像ID
[root@localhost ~]# docker images -q

#删除镜像(删除镜像可以根据镜像名称或者ID删除)
[root@localhost ~]# docker rmi centos

#如需删除所有镜像可以配合`docker images -q`获取命令的查询结果进行删除
[root@localhost ~]# docker rmi `docker images -q`
```



#### Docker容器命令

| 命令                                              | 作用                                         |
| ------------------------------------------------- | -------------------------------------------- |
| docker  ps                                        | 查看正在运行容器                             |
| docker  ps  -a                                    | 查看所有容器                                 |
| docker  run   参数                                | 创建容器                                     |
| docker  exec       容器ID/容器名                  | 进入容器                                     |
| docker  stop       容器名/容器ID                  | 停止容器                                     |
| docker  rm          容器名/容器ID                 | 删除容器                                     |
| docker  start       容器名/容器ID                 | 启动被停止的容器                             |
| docker  kill          容器名/容器ID               | 强制停止正在运行的容器(一般不用,除非卡了) |
| docker  inspect   容器名称                        | 查看容器元数据信息                           |
| --restart=always                                  | 启动容器时设置容器随机自启                   |
| docker  update --restart=always     容器名/容器ID | 容器启动后设置容器随机自启                   |

```shell
#创建容器:docker run
-i: 以交互模式运行容器,通常与 -t 同时使用
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--name="名称": 为容器指定一个名称
/bin/bash:在容器内执行/bin/bash命令
[root@localhost ~]# docker run -it --name=c1 centos:7 /bin/bash
[root@f52be4db44e7 /]#

#退出容器
[root@f52be4db44e7 /]# exit

#查看正在运行的容器信息(通过-it创建的容器退出后自动关闭)
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

#查看所有容器信息
-a:包括历史运行过的容器
[root@localhost ~]# docker ps -a
CONTAINER ID  IMAGE     COMMAND     CREATED      TATUS  PORTS     NAMES
容器ID        镜像名字    容器命令     创建时间       状态    端口      容器名字

#创建容器并放入后台运行(放入后台运行的容器退出后不会自动关闭)
-d: 后台运行容器,并返回容器ID
[root@localhost ~]# docker run -id --name=centos2 centos:7
f34a8b2f79d15b2694d82bba23a9243c25bbbb8b8cde2e72f18b068fe53c97fc

#查看正在运行容器信息
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE      COMMAND      CREATED          STATUS        PORTS     NAMES
f34a8b2f79d1   centos:7   "/bin/bash"  23 seconds ago   Up 21 seconds           centos2

#查看容器元数据信息
[root@localhost ~]# docker inspect centos2

#进入容器,在使用-d创建容器后,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入
docker attach
docker exec:推荐使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止
[root@localhost ~]# docker exec -it centos2 /bin/bash
[root@f34a8b2f79d1 /]#

#停止容器(可以根据容器名称或者容器ID停止)
[root@localhost ~]# docker  stop  centos2

#启动被停止的容器
[root@localhost ~]# docker start centos1

#启动所有被停止的容器
[root@localhost ~]# docker start `docker ps -aq`

#删除容器(可以根据容器名称或者容器ID删除)
[root@localhost ~]# docker  rm  centos2

#删除所有容器(先获取所有容器ID在进行删除)
[root@localhost ~]# docker ps -aq
[root@localhost ~]# docker rm `docker ps -aq`

```



练习:通过Docker部署nginx的web应用

```shell
#下载nginx镜像
[root@localhost ~]# docker pull nginx:1.20.1

#创建容器并实现端口映射(默认容器无法被外网访问)
-p: 指定端口映射,格式为:宿主机端口:容器端口
[root@localhost ~]# docker run -id --name=ngx-v1 --restart=always -p 80:80  nginx:1.20.1

#浏览器访问:http://宿主机IP:端口
```



## 第二章:掌握Docker数据卷



#### Docker容器数据卷

**容器存在的问题**

- 容器删除后,在容器中产生的数据默认也会被删除

- 容器与外部主机无法直接交换文件

- 容器与容器之间无法相互交换数据



**容器数据卷**

- 数据卷可以是宿主机中的一个目录或文件,通过将目录或文件挂载到容器中实现容器数据与宿主机数据立即同步
- 数据卷可以解决容器删除后容器数据丢失的问题,实现数据持久化
- 数据卷可以间接的将外部主机数据传输到宿主机目录,解决容器与外部主机之间数据交换的问题
- 一个数据卷目录可以同时挂载多个容器,解决多容器之间数据交换的问题



**配置数据卷**

> 在创建启动容器时,使用-v参数设置数据卷
>
> docker  run  参数   -v  宿主机目录/文件:容器内目录/文件...

**注意事项**

> 1.目录必须是绝对路径
>
> 2.如果目录不存在,会自动创建
>
> 3.可以挂载多个数据卷



#### 配置容器数据卷

```shell
#创建容器并挂载数据卷
[root@localhost ~]# docker run -it --name=centos3 -v /root/test:/root/test_container centos:7 /bin/bash

#容器内查看数据卷目录
[root@8cf8fcdb6e52 /]# ls /root
anaconda-ks.cfg  test_container

#验证数据同步,在宿主机数据卷目录创建文件
[root@localhost ~]# touch test/xxxx.txt
[root@localhost ~]# ls test/
xxxx.txt

#验证数据同步,容器查看数据是否同步
[root@8cf8fcdb6e52 /]# ls /root/test_container/
xxxx.txt

#验证数据同步,容器数据卷发生变化,宿主机也会立刻同步
[root@8cf8fcdb6e52 /]# touch /root/test_container/abc.txt
[root@8cf8fcdb6e52 /]# ls /root/test_container/
abc.txt  xxxx.txt

#验证数据同步,宿主机验证数据是否同步
[root@localhost ~]# ls test/
abc.txt  xxxx.txt

#退出并删除容器
[root@8cf8fcdb6e52 /]# exit
[root@localhost ~]# docker rm centos3

#宿主机验证数据卷目录数据是否存在
[root@localhost ~]# ls test/
abc.txt  xxxx.txt

#重新创建容器,并将数据卷目录同步到容器中
[root@localhost ~]# docker run -it --name=centos3 -v /root/test:/root/test_container centos:7 /bin/bash

#容器验证数据是否同步
[root@9a48ae7d7eb3 /]# ls /root/
anaconda-ks.cfg  test_container
[root@9a48ae7d7eb3 /]# ls /root/test_container/
abc.txt  xxxx.txt
```



#### 容器挂载多个数据卷

```shell
#创建容器并同时挂载多个数据卷目录
[root@localhost ~]# docker run -it --name=centos4 \
> -v /root/test:/root/test \
> -v /root/test1:/root/test1 \
> centos:7

#容器查看数据卷目录
[root@2e975255d526 /]# ls /root
anaconda-ks.cfg  test  test1
```



#### 多容器挂载同一个数据卷

```shell
#创建容器并挂载数据卷
[root@localhost ~]# docker run -it --name=centos5 -v /root/test:/root/test_container centos:7

#创建容器并挂载数据卷
[root@localhost ~]# docker run -it --name=centos6 -v /root/test:/root/test_container centos:7

#在容器数据卷创建文件
[root@dec4ecc23b61 test_container]# touch test.txt
[root@dec4ecc23b61 test_container]# ls
abc.txt  test.txt  xxxx.txt

#另一个容器验证数据是否同步
[root@448a180cc6c8 ~]# ls test_container/
abc.txt  test.txt  xxxx.txt

#宿主机验证数据是否同步
[root@localhost ~]# ls test
abc.txt  test.txt  xxxx.txt
```



**数据卷总结:**

>1. 把容器内的相应目录的数据持久化到宿主机
>
>2. 数据卷可以间接的将外部主机数据传输到宿主机目录,解决容器与外部主机之间数据交换的问题
>
>3. 一个数据卷目录可以同时挂载多个容器,解决多容器之间数据交换的问题



## 第三章:掌握Docker应用部署



#### 1.Docker部署MySQL

> 在Docker容器中部署MySQL数据库,并通过外部MySQL客户端管理MySQL数据库

```shell
#下载MySQL镜像文件(不了解版本的可以从Docker Hub上提前查看MySQL的版本信息)
[root@localhost ~]# docker pull mysql:5.7

#在宿主机创建目录用于存储MySQL数据
[root@localhost ~]# mkdir -p /mysql/conf          
[root@localhost ~]# mkdir  /mysql/logs

#创建容器,提前将所需的配置从容器中拷贝到宿主机,所需的目录或文件就是传统部署方式的所在位置,所以需要有传统部署方式的基础
cp 用于将宿主机文件或目录拷贝到容器中,也可将容器中的目录或文件拷贝到宿主机中
命令格式: docker cp 容器名:目录/文件  宿主机目录       #将容器中文件或目录拷贝到宿主机
命令格式: docker cp 宿主机目录/文件  容器名:目录       #将宿主机文件/目录拷贝到容器中
[root@localhost ~]# docker run -it --name=mysql mysql:5.7 /bin/bash  #创建容器
[root@localhost ~]# docker cp mysql:/etc/mysql /mysql/conf           #拷贝配置文件目录
[root@localhost ~]# docker cp mysql:/var/log/mysql /mysql/logs       #拷贝日志目录

#删除mysql容器重新创建并挂载数据卷
[root@localhost ~]# docker stop mysql
[root@localhost ~]# docker rm mysql
[root@localhost mysql]# docker run -id -p 3306:3306 --name=mysql \   #映射端口
 -v /mysql/conf:/etc/mysql/ \     #映射配置文件目录
 -v /mysql/logs:/var/log/mysql \        #映射日志目录
 -v /mysql/data:/var/lib/mysql \        #映射数据目录(不需要提前拷贝,访问数据库时会自动产生数据)
 -e MYSQL_ROOT_PASSWORD=123456 \        #指定数据库密码
 mysql:5.7

#进入MySQL容器
[root@localhost mysql]# docker ps
[root@localhost mysql]# docker exec -it mysql /bin/bash

#进入容器中的MySQL数据库
root@43f0946f3e6c:/# mysql -uroot -p123456
mysql>
mysql> create database db1;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#宿主机查看数据卷目录
[root@localhost ~]# ll /mysql/data
```



#### 2.Docker部署tomcat

>在Docker容器中部署tomcat,并通过外部机器访问tomcat部署的项目

```shell
#下载tomcat镜像文件(不了解版本的可以从Docker Hub上提前查看tomcat的版本信息)
[root@localhost ~]# docker pull tomcat:10

#在宿主机创建数据卷目录用于存储tomcat容器数据
[root@localhost ~]# mkdir /tomcat

#创建容器,拷贝所需数据到宿主机
[root@localhost ~]# docker run -id --name=tomcat tomcat:10 /bin/bash
[root@localhost ~]# docker cp tomcat:/usr/local/tomcat /tomcat

#停止tomcat容器并删除
[root@localhost ~]# docker stop tomcat
[root@localhost ~]# docker rm tomcat

#创建容器,设置端口映射、目录映射
[root@localhost ~]# docker run -id --name=tomcat -p 8080:8080 \
-v /tomcat/tomcat:/usr/local/tomcat \
tomcat:10

#宿主机创建tomcat网页目录
[root@localhost ~]# mkdir /tomcat/tomcat/webapps/test

#创建测试页面
[root@localhost ~]# vim /tomcat/tomcat/webapps/test/index.html
<h1>hello tomcat<h1>

#外部主机通过浏览器访问容器tomcat服务
http://192.168.0.41:8080/test/
```



#### 3.Docker部署nginx

> 在Docker容器中部署nginx,并通过外部主机访问nginx服务

```shell
#下载nginx镜像文件(不了解版本的可以从Docker Hub上提前查看nginx的版本信息)
#宿主机创建nginx数据卷目录
[root@localhost ~]# mkdir /nginx

#在数据卷目录创建conf目录用于存放nginx的主配置文件
[root@localhost ~]# mkdir /nginx/conf

#创建容器,拷贝所需数据到宿主机(nginx只需要拷贝配置文件即可,其他数据创建容器后自动生成)
[root@localhost ~]# docker cp nginx:/etc/nginx/nginx.conf /nginx/conf

#创建容器,设置端口映射、目录与配置文件映射
[root@localhost ~]# docker run -id --name=nginx -p 80:80 \   #映射端口
-v /nginx/conf/nginx.conf:/etc/nginx/nginx.conf \   #映射配置文件
-v /nginx/logs:/var/log/nginx \                     #映射日志目录
-v /nginx/html:/usr/share/nginx/html                #映射网页根目录

#宿主机在/html数据卷目录为nginx创建测试
[root@localhost ~]# vim /nginx/html/index.html
hello nginx

#外部主机通过浏览器访问nginx服务
http://192.168.0.41/
```



#### 4.Docker部署Prometheus+Gfafana监控

```shell
#下载prometheus镜像
[root@localhost ~]# docker search prometheus
[root@localhost ~]# docker pull prom/prometheus

#创建数据卷目录
[root@localhost ~]# mkdir /prom

#创建容器拷贝prometheus配置文件
[root@localhost ~]# docker run -id --name=prom prom/prometheus    

#拷贝配置文件到宿主机目录
[root@localhost ~]# docker cp prom:/etc/prometheus/prometheus.yml /prom

#停止容器
[root@localhost ~]# docker stop prom

#删除容器
[root@localhost ~]# docker rm prom

#创建Prometheus容器并挂载数据卷
[root@localhost ~]# docker run -id --name=prom -p 9090:9090 \
-v /prom/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

#查看容器状态并访问Prometheus
[root@localhost ~]# docker ps

http://192.168.0.24:9090

#下载node-exporter用于获取主机指标数据
[root@localhost ~]# docker pull prom/node-exporter

#创建node-exporter容器
[root@localhost ~]# docker run -id --name=node-export -p 9100:9100 prom/node-exporter

#修改Prometheus.yml配置文件定义监控
[root@localhost ~]# vim /prom/prometheus.yml
...
  - job_name: "node-exporter"
    static_configs:
      - targets: ["192.168.0.24:9100"]
     
#重启Prometheus      
[root@localhost ~]# docker restart prom

#创建grafana容器
[root@localhost ~]# docker run -id --name=grafana -p 3000:3000 grafana/grafana

#访问grafana添加数据源与监控模板
http://192.168.0.24:3000

#部署cadvisor(开源的容器度量和可视化系统)用于获取容器内的指标数据
具体部署地址可参考:https://github.com/google/cadvisor

#下载cadvisor镜像
[root@localhost ~]# docker pull google/cadvisor

#创建cadvisor容器
[root@localhost ~]# docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8888:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor

#访问cadvisor
http://192.168.0.24:8888

#cadvisor为prometheus提供了时序数据格式(该格式为prometheus识别的格式)
http://192.168.0.24:8888/metrics

#修改promethes.yml文件采集cadvisor数据
[root@localhost ~]# vim /prom/prometheus.yml
...
  - job_name: "docker"
    static_configs:
      - targets: ["192.168.0.24:8888"]

#重启prometheus容器
[root@localhost ~]# docker restart prom

#为grafana导入容器监控模板
具体模板可参考地址:https://grafana.com/grafana/dashboards/?search=docker
```