# 01_Docker快速入门到项目部署(一)
## 一、Docker课程介绍
### 1、Docker快速入门到项目部署 课程内容
1)快速入门
* docker部署mysql
* docker命令解读
2)Docker基础
* Docker 常见命令
* Docker 数据卷
* Docker 自定义镜像
* Docker 容器网络。
3)项目部署
* 部署前端
* 部署 java
* DockerCompose
### 2、docker 是什么?
Docker 是 快速构建、运行、管理应用的工具。
### 3、传统方式部署MySQL,大概的步骤有:
1)搜索并下载MySQL安装包
```bash
$ rpm -qa | grep mysql
$ rpm -qa | grep mariadb
$ rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
```
2)上传至Linux环境
```bash
$ mkdir /usr/local/mysql
$ tar -zxvf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar.gz -C /usr/local/mysql
```
3)编译和配置环境
```bash
$ rpm -ivh mysql-community-5.7.25-1.el7.x86_64.rpm
...
$ yum install net-tools
$ yum install openssl-devel -y
```
4)安装
```bash
$ rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64
```
### 4、docker 安装 mysql
```bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
Mysql
```
## 二、Docker的安装
### 1、docker 的安装官方文档:
http://docs.docker.com/engine/install/centos/
### 2、linux 环境搭建
1)下载安装VMware
https://www.vmware.com/products
2)创建虚拟机
3)安装 centos7
4)设置虚拟机快照。
### 3、安装 SSH 客户端。
### 4、安装 docker
1)卸载旧版 docker
```bash
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-selinux
```
2) 配置docker的yum 库
```bash
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
```
3) 安装docker
```bash
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```
4) 启动和校验docker
```bash
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
```
5) 配置docker 的镜像加速器
```bash
# 创建目录
mkdir -p /etc/docker
# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker
```
## 三、快速入门-部署MySQL
### 1、docker 部署 mysql
```bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
```
### 2、镜像(image)和容器(container)
使用Docker,会自动搜索并下载MySQL。注意:这里下载的不是安装包,而是镜像。镜像中不仅包含了MySQL本身,还包含了其运行所需要的环境、配置、系统级函数库。因此它在运行时就有自己独立的环境,就可以跨系统运行,也不需要手动再次配置环境了。这套独立运行的隔离环境我们称为容器。
### 3、镜像仓库(DockerRegistry)
Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利。Docker官方提供了一些基础镜像,然后各大软件公司又在基础镜像基础上,制作了自家软件的镜像,全部都存放在这个网站。这个网站就成了Docker镜像交流的社区:hub.docker.com。
官方仓库在国外,下载速度较慢,阿里云、华为云会提供一些第三方仓库,我们也可以自己搭建私有的镜像仓库。一般我们都会使用第三方仓库提供的镜像加速功能,提高下载速度。而企业内部的机密项目,往往会采用私有镜像仓库。
### 4、docker 基础概念
1)Docker是做什么的?
Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。
2)什么是镜像?
将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像。
3)什么是容器?
为每个镜像的应用进程创建的隔离运行环境就是容器。
4)什么是镜像仓库?
存储和管理镜像的服务就是镜像仓库,DockerHub是目前最大的镜像仓库,其中包含各种常见的应用镜像。
### 5、docker 部署应用图示
Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速部署指定的应用。Docker服务部署应用时,首先要去搜索并下载应用对应的镜像,然后根据镜像创建并允许容器,应用就部署完成了。
## 四、快速入门-命令解读
### 1、利用Docker快速的安装了MySQL,非常的方便,执行的命令到底是什么意思?
```bash
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
```
### 2、docker 命令解读
1)docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行。
2)--name mysql : 给容器起个名字叫mysql,你可以叫别的。
3)-p 3306:3306 : 设置端口映射。
容器是隔离环境,外界不可访问。但是可以将宿主机端口映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口。
4)-e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数
格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定。
案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码。
5)mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像。
格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号
在未指定TAG的情况下,默认是最新版本,也就是mysql:latest
### 3、docker 镜像命名规范
1)镜像名称一般分两部分组成:[repository]:[tag]。其中repository就是镜像名
tag是镜像的版本。
2)在没有指定tag时,默认是latest,代表最新版本的镜像。
### 4、docker run命令中的常见参数:
-d: 让容器后台运行。如: docker run -d \
--name : 给容器命名。如:--name nginx \
-e: 环境变量。
-P: 宿主机端口映射到容器内端口。如:-p 80:80 \
镜像名称结构:nginx
Repository:TAG
镜像名:版本号
## 五、Docker基础-常见命令
### 1、Docker最常见的命令就是操作镜像、容器的命令
详见官方文档: https://docs.docker.com/
https://docs.docker.com/reference/
### 2、docker 常见命令
命令 | 说明 |
docker pull | 拉取镜像 |
docker push | 推送镜像到DockerRegistry |
docker images | 查看本地镜像 |
docker rmi | 删除本地镜像 |
docker run | 创建并运行容器(不能重复创建) |
docker stop | 停止指定容器 |
docker start | 启动指定容器 |
docker restart | 重新启动容器 |
docker rm | 删除指定容器 |
docker ps | 查看容器 |
docker logs | 查看容器运行日志 |
docker exec | 进入容器 |
docker save | 保存镜像到本地压缩文件 |
docker load | 加载本地压缩文件到镜像 |
docker inspect | 查看容器详细信息 |
### 3、docker 常见命令关系图例:
### 4、案例:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器
1)需求:
* 在DockerHub中搜索Nginx镜像,查看镜像的名称
* 拉取Nginx镜像
* 查看本地镜像列表
* 创建并运行Nginx容器
* 查看容器
* 停止容器
* 再次启动容器
* 进入Nginx容器
* 删除容器
2)以Nginx为例,演示上述命令。
```bash
# 第1步,去DockerHub查看nginx镜像仓库及相关信息
# 第2步,拉取Nginx镜像
docker pull nginx
# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 9bea9f2796e2 7 weeks ago 192MB
# 打包(保存)镜像到本地
docker save -o nginx.tar nginx:latest
# 删除镜像
docker rmi nginx
# 再次查看镜像,没有了nginx
docker images
# 解压镜像(-i: 指定包名,-q: 不显示输出)
docker load -i nginx.tar
# 或者
docker load -i nginx.tar -q
# 再次查看镜像,又有了nginx
docker images
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
```
### 5、示例: