一、安装Docker

1.1 使用官方安装脚本自动安装

 安装命令:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

 也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

1.2  手动安装

1.2.1 卸载旧版本

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

1.2.2 安装相关工具

sudo yum install -y yum-utils

1.2.3 设置yum仓库

官方地址(下载慢)

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

国内一些源地址

##阿里云
$ sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

##清华大学源
$ sudo yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

1.2.4 安装Docker Engine-Community  和 containerd

$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

1.3 启动Docker

$ sudo systemctl start docker

二、 配置Docker镜像加速

## 进入文件夹
$ cd /etc/docker
## 找到daemon.json文件并写入阿里云镜像地址
$ vim daemon.json 
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
:wq
## 重新启动服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

三、Docker简单使用

3.1 寻找可用镜像版本

镜像库地址:https://hub.docker.com 或 

3.2 拉取镜像

$ docker pull mysql:latest    ##拉取最新版本mysql镜像

 3.3 查看镜像

$ docker images

 3.4 运行容器

$ docker run -d -p 3306:3306 -v /data/mysql/Mysql:/var/lib/mysql  -v /etc/localtime:/etc/localtime      -e MYSQL_ROOT_PASSWORD="xxxxx" --name mysql mysql:8.0.31  --lower-case-table-names=1

## docker run + [可选参数] + 镜像名    启动容器
## 参数说明
## -d 后台方式运行
## -p 指定容器端口(映射宿主机3306端口到容器内的3306端口)
## -v 挂载容器卷(-v 宿主机路径:docker容器内路径)
## -e 设置环境变量(这里是制定了mysql root用户的登录密码)
## --name 执行容器别名(--name mysql)
## mysql:8.0.31 镜像名
## --lower-case-table-names=1 (mysql忽略大小写敏感)

3.5 查看是否启动成功

$ docker ps

 四、Docker命令

4.1 基础命令

$ docker version    ##查看docker版本信息 
$ docker info    ##查看docker的系统信息,包括镜像和容器的数量
$ docker 命令 --help       #帮助命令(可查看可选的参数)

4.2 镜像命令

$ docker images    ##查看本地镜像
$ docker rmi [OPTIONS] [IMAGE...]    ##删除本地镜像
$ docker save [OPTIONS] [IMAGE...]    ##将指定镜像保存成 tar 归档文件
$ docker load [OPTIONS]    ##导入使用 docker save 命令导出的镜像

4.3 容器命令

$ docker run [OPTIONS] [COMMAND] [ARG...]    ##创建一个新的容器并运行一个命令
# 可选参数上面有解释
$ docker start [容器名]   ##启动容器
$ docker stop [容器名]    ##停止容器
$ docker restart [容器名]    ##重启容器
$ docker kill -s KILL [容器名]    ##杀掉一个运行中的容器
$ docker rm [OPTIONS] [CONTAINER...]    ##删除一个或多个容器
# 可选参数
# -f :通过 SIGKILL 信号强制删除一个运行中的容器
# -l :移除容器间的网络连接,而非容器本身
# -v :删除与容器关联的卷
$ docker pause [容器名]    ##停止容器中所有进程
$ docker unpause [容器名]    ##恢复容器中所有进程
$ docker exec [OPTIONS] [COMMAND][ARG...]    ##在运行的容器中执行命令
# 可选参数
# -d :分离模式: 在后台运行
# -i :即使没有附加也保持STDIN 打开
# -t :分配一个伪终端
$ docker ps    ##列出容器
# 可选参数
# -a :显示所有的容器,包括未运行的
# -f :根据条件过滤显示的内容
$ docker top [容器名]    ##查看容器中运行的进程信息,支持 ps 命令参数
$ docker logs [容器名]   ##获取容器日志 
# 可选参数
# -f : 跟踪日志输出
# --since :显示某个开始时间的所有日志
# -t : 显示时间戳
# --tail :仅列出最新N条容器日志
$ docker port [容器名]    ##查看容器的端口映射情况

 五、容器卷

5.1 概要

设计目的:

卷的设计目的就是数据持久化(类似于redis中的rdb和aof文件),完全独立于容器的生命周期,因此docker不会在容器删除时删除其挂载的容器卷

作用:

将容器中的数据备份到主机的磁盘中

特点:

# 数据卷可在容器之间共享或重用数据

# 卷中的更改可以直接实时生效

# 数据卷中的更改不会包含在镜像的更新中

# 数据卷的生命周期一直持续到没有容器使用它为止

例:

运行一个带有容器卷存储功能的容器实例

$ docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

查看数据卷是否挂载成功

$ docker inspect 容器id

挂载成功或在容器挂载的目录中创建文件后在宿主机挂载目录下 可查看到

5.2 设置容器卷的读写规则

读写(默认)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

只读 (容器实例内部被限制,只能读取不能写 。此时如果宿主机写入内容可以同步到容器内,容器内可以读到,但容器内没有写的功能。)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

5.3 卷的继承与共享 

容器1完成和宿主机的映射

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 --name v1 镜像名

容器2继承容器1的卷规则

 docker run -it --privileged=true --volumes-from v1 --name v2 镜像名

六、Docker网络 

6.1  默认网络

6.1.1

        当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器都会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

        宿主机和Docker容器之间是可以进行网络连接的,同样的,Docker容器和容器之间也可以直接进行网络连接。

6.1.2 容器互联

        在微服务部署的场景下,注册中心是使用服务名来唯一识别微服务的,而我们上线部署的时候微服务对应的IP地址可能会改动,所以我们需要使用容器名来配置容器间的网络连接。使–link可以完成这个功能。

        首先不设置–link的情况下,是无法通过容器名来进行连接的。centos02容器是可以直接ping通centos01的容器ip,但是无法ping通centos01的容器name,添加参数 –link,可以通过容器name进行连接。centos03容器link到centos01,所以centos03可以直接通过ping centos01的容器名去ping通,但是反过来centos01去ping centos03的容器名是ping不通的。

6.2 自定义网络

6.2.1 创建自定义网络

创建自定义网络命令

$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
## 参数解释
## docker network create    创建自定义网络
## --driver bridge    指定驱动是 bridge 
## --subnet     指定子网
## --gateway    指定网关
## mynet    自定义网络名称

查看docker网络

$ docker network ls

        使用自定义网络创建容器后,相同网络name下的容器,不管是通过容器IP还是容器name,都可以进行网络通信

6.2.2 网络联通

        在没有使用connect命令的情况下,不同网络间的容器是无法进行网络连接的。

        例如:cnetos01属于docker0网络,cnetos2属于mynet网络,此时cnetos1与cnetos2两个容器之间是互相ping不通的。

         不同Docker网络之间的容器想要连接的话,需要把该容器注册到另一个容器所在的网络上,使用docker connect命令。

$ docker network connect mynet centos01

connect设置成功后,cnetos1与cnetos2两个容器之间就可以相互访问了。