Docker学习笔记
[Docker视频教程](https://www.bilibili.com/video/BV1ZT4y1K75K)
# 一.Docker安装
> CentOS
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

最小化安装CentOS时要先安装下面两个软件,否则会报错

## 2、启动Docker服务
> systemctl status |start |stop |restart docker
## 3、检测Docker是否启动成功
> docker info
或 systemctl staus docker
systemctl status docker
## 4、配置开机自启动
> systemctl enable docker
## 5、创建Docker用户组
> sudo groupadd docker
## 6、将当前用户加入docker组
> sudo usermod -aG docker $USER
## 7、重启Docker服务就可以正常使用了
> systemctl restart docker
## 8、测试 hello world 容器验证
# 二、docker 的核心概念和核心架构 video4
> 镜像image images
一个镜像代表着一个软件,如mysql镜像 redis镜像,nginx镜像
特点:只读
> 容器container
定义:基于某个镜像运行一次就会生成一个程序实例,一个程序实例称之为一个容器
特点:可读可写
> 3、仓库 respository
定义:用来存储docker中所有镜像
远程仓库:docker 官方在世界范围维护的一个唯一远程仓库
https://hub.docker.com

本地仓库:当前自已机器中下载镜像存储位置

示例:
docker pull mysql:5.7
## docker 下载镜像加速的配置
1. 安装完成 docker 之后配置镜像回速
2. 注册阿里云开发者帐号
3. 登陆帐号
4. 管理控制台
5. 容器服务 镜像加速
==sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://mnr9ov68.mirror.aliyuncs.com"]
}
EOF==
==sudo systemctl daemon-reload
sudo systemctl restart docker==


# 三、容器服务相关概念 video6
## 入门案例
> docker run hello-world
## 1、docker 引擎相关操作
> docker info 用来展示docker信息(版本 等等) CS架构
docker version
docker --help
## 操作镜像的相关命令
docker images 查看本地仓库镜像
docker images mysql 过滤(mysql)
docker images -a
docker images -q 只列出镜像ID
==docker rmi -f $(docker images -q) 删除全部镜像,查询出来的ID当着参数传进去==

### 拉取镜像
docker pull 镜像名:版本号
###
docker search redis
### 删除镜像
docker image rm 镜像名:版本号
删除前要停止已经启动的容器或强删
docker image rm -f 镜像名:版本号 | 镜像id
docker rmi
## 2、容器操作相关命令
- ==通过镜像运行容器== docker run 镜像名:tag | 镱像id
- 映射宿主机口:容器端口映射 docker run -p 80:8080 tomcat:8.0-jre8
- 后台运行 -d docker run -d -p 80:8080 tomcat:8.0-jre8
- ==启动容器 指定名称 后台运行 端口映射== docker run -d -p 8081:8080 -p 8082:8080 --name tomcat1 tomcat:8.0-jre8
- 将打包tar镜像文件导入到自已的docker仓库 docker load -i 文件名
- ==查看当前运行的容器== docker ps
- 查看所有容器 docker ps -a
- ==返回正在运行的容器ID== docker ps -q
- 返回所有容器的ID docker ps -qa
## 3、停止、重启容器命令

## 4、删除容器

删除所有容器 docker rm -f $(docker ps -qa)
## 5、查看容器内信息

## 6、查看容器进程及与容器内部进行交互
> docker top 容器id或者容器名 ==查看容器内进程==
docker exec -it 容器id或者容器名 bash(命令行) ==进入容器,并与容器内命令行进行交互==
exit ==退出容器内命令行==
## 7、宿主机与容器内进行文件交互,传输文件
> ++从容器复制文件到宿主机++------------docker cp 容器ID或容器名:容器内的资源路径 宿主机路径
docker cp 6b4ca6ffb38b:/usr/local/tomcat/RUNNING.txt ./RUNNING.txt------复制单个文件
docker cp 6b4ca6ffb38b:/usr/local/tomcat/webapps ./webapps--------------复制整个文件夹
++从宿主机复制文件到容器中去++

## 8、查看容器内部细节
> docker inspect 容器ID或name
## 9、数据卷 volume 实现宿主机系统与容器之间的文件共享
> ==自定义数据卷目录==
docker run -d -p 8080:8080 --name tomcat01 -v 宿主机目录(绝对路径):容器内目录 tomcat:8.0-jre8

==自动数据卷目录==
docker run -d -p 8080:8080 --name tomcat01 -v aa:容器内目录 tomcat:8.0-jre8
注意:
1、aa代表一个数据卷名字,名称可以随便写,docker在不存在时自动创建这个数据郑同时自动映射宿主机中某个目录
2、同时在启动容器时会将aa对应容器目录中全部内容复制到aa映射的目录中


## 10、将布署好的容器打包成一个新的镜像


==容器打包成镜像时,容器会暂停暂停==
## 11、将镜像备份出来

# 四、docker 镜像分层原理
# 五、docker中网络通信机制以及网桥的概念
> 0、为什么提供网络功能
docker 允许通过外部访问容器或容器互联的方式来提供网络服务
1、docker 中宿主机与容器间通信
2、docker 网络使用
 注意:一般在使用docker网桥()实现容器与容器通信时,都是站在一个应用角度进行容器通信
- ==查看默认网桥== docker network ls
- ==创建自定义网桥== docker network create pms(pms网桥名) docker network -d bridge pms
- **==docker run -d -p 8081:8080 --network pms --name mytomcat01 tomcat:8.0-jre8==**
- 容器名与IP地址自动形成映射,可以直接通过容器名来方问对应的主机
- http://mytomcat01:8080/来访问
- 
- 注意:一旦启动容器时指定了网桥之后,可以在任何这个网桥关联的容器中使用容器名字进行与其它容器通信
- 删除网桥------------docker inspect rm pms
- 查看网桥信息--------docker inspect pms
- 注意:使用 docker run 指定--network 网桥时,网桥必须已存在,也就是要先创建再使用
# 六、docker中数据卷及数据卷的操作
 1、数据郑作用?
  用来实现容器与宿主机之间的数据共享
 2、数据卷特点
  1、数据卷可以在容器之间共享和重用
  2、对数据卷的修改会立即影响到对应的容器
  ==容器内的数据卷只读,不能修改宿主机的数据,宿主机的数据修改可以同步到容器中==
  
  3、对数据卷的更新修改、不会影响到镜像
  4、数据卷默认会一直存在,即使容器被删除
 3、数据卷操作
  1、自定义数据卷目录
 4、docker 操作数据卷指令

、
# 七、docker的核心架构

# 八、常用容器的安装
## 一、mysql数据库容器的安装

## 二、redis 缓存容器的安装
### 1、下载redis镜像
  docker pull redis:5.0.10
### 2、启动 redis
   docker run -d -p 6379:6379 --name redis redis:5.0.10
### 3、开启redis持久化
   docker run -d -p 6379:6379 -v /volumes/services/redis/data:/data --name redis --network services redis:5.0.10 redis-server --appendonly yes
   注意:一旦开启持久化,持久化生成的aof文件会被放入容器中的/data目录中
### 4、修改redis的配置文件,以修改后的配置文件来启动redis
到redis官网下载redis包,找到redis.conf文件上传到宿主机的/myredis/conf/目录中
   $docker -v /myredis/conf:/usr/local/etc/redis --name myredis redis:5.0.10 redis-server /usr/local/etc/redis/redis.conf
  
## 三、elasticsearch安装
ES默认启动是以集群模式启动的,如果要以单节点模式启动须加入环境变量指定

> docker run -d --name es -p 9200:9200 -p 9300:9300 elasticsearch:6.8.0
docker run -d --name es -p 9200:9200 -p 9300:9300 --network services -e "discovery.type=single-node" elasticsearch:6.8.0

## 四、emqx安装
>d https://hub.docker.com/r/emqx/emqx
## 五、nginx安装
## 六、php安装
# 九、Dockerfile & Docker Compose

## 一、dokerfile 镜像构建文件
### 1、什么是dockerfile
> 定义:用来帮助我们自已构建一个自定义镜像,dockerfile成为镜像构建文件 描述文件
### 2、为什么要存在dockerfile
> 问题:在dockerhub中官方提供很多镜像已经满足我们的所有服务了,为什么还要要自定义镱像
核心作用:日后用户可以将自已应用打包成镜像,这样可以让我们应用进行容器运行
### 3、dockerfile 构建镜像原理

### 4、
[dockerfile](https://docs.docker.com/engine/reference/builder/)

### 5、dockerfile构建springboot应用
> 
# 十、Docker Compose
## 1、docker Compose简介
## 2、docker Compose安装与卸载
> 任意目录下载
sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改文件执行权限
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v 检查当前软件版本号
## 3、docker compose入门
>
## 4、docker compose 命令模板
> 
## 5、docker compose中build指令详解
>
## 6、docker compose中指令
> 
# docker 可视化工具 Portainer
> 1、下载可视化工具
docker pull portainer/portainer
2、启动 portainer 8000 9000端口
docker run -d -p 8000:8000 -p 9000:9000 --name=dockerview --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
