一、Docker 的作用和优势
软件集装箱化平台,可让开发者构建应用程序时,将它与环境一起打包到一个容器中,发布应用到任意平台中。
能在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,
如:Tomcat运行在一个Docker,MySQL运行在另外一个Docker,两者可以运行在同一个服务器。
1.1、docker基本组成
1.docker client 客户端
docker客户端输入指令,驱动服务端执行对应操作。
2.docker daemon docker 守护进程
Docker的守护进程,客户端向Daemon发送命令去执行Docker相关操作,得到结果再通过Daemon将结果返回。
3.docker images 镜像
Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。
4.docker container 容器
镜像相当于Java中的类,容器就像实例化后的对象,一个镜像可以实例化多个容器,容器通过镜像启动。
镜像中的应用程序运行后形成的进程就是容器,是Docker会给容器进程做隔离,对外不可见。
Docker容器通过镜像启动,容器是Docker的执行单元,容器中可以运行客户的多个进程。
5.docker registry 镜像仓库
Docker用仓库保存用户创建的镜像,仓库分共有和私有两种。
Docker公司自己提供了最大的公有仓库Docker Hub,可在Docker Hub上创建账户,保存分享自己创建的镜像。
1.2、Docker优势
1.简化配置、打包软件、快速部署
能将环境和配置放入代码然后部署,Docker配置能在各种环境中使用,将应用环境和底层环境解耦。
Docker通过创建进程的容器,不必重新启动操作系统,几秒内能关闭。
2.代码管道化管理
对代码以流式pipeline管道化进行管理,从开发者的机器到生产环境机器这个流程中都能有效管理。
Docker提供了跨越异构环境以一致性的微环境,从开发到部署实现流畅发布。
3.应用隔离、网络建模、开发生产化、服务合并
多个应用服务部署在多个Docker中相互隔离,
可在一台机器上启动数百个(甚至数千个)相互隔离的容器,对网络进行建模。
单机上最大程度模拟生产分布式部署的环境
Docker能合并多个服务,不多的操作系统内存占用,跨实例共享多个空闲的内存。
二、基本操作
2.1、Linux安装Docker
# yum 包更新到最新
sudo sudo yum update
# 下载关于Docker的依赖环境
sudo yum -y install yum-utils device-mapper-persistent-data lvm2
# 设置镜像下载Docker的镜像源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker
sudo yum makecache fast
sudo yum -y install docker-ce
# 查看docker版本,出现输入的界面都按 y
docker -v
2.2、Docker启动、停止
# 启动docker:
systemctl start docker
# 停止docker:
systemctl stop docker
# 重启docker:
systemctl restart docker
# 查看docker状态:
systemctl status docker
# 开机启动:
systemctl enable docker
# 设置开机自动启动
systemctl enable docker
# 测试
docker run hello-world
# 查看docker概要信息
docker info
# 查看docker帮助文档
docker --help
2.3、镜像操作
# 拉取镜像到本地 例:docker pull centos:7
docker pull 镜像名称 (在hub.docker.com(官方docker镜像仓库)右侧有拉取镜像的地址)
# 查看全部本地镜像
docker images
# 删除本地镜像1
docker image rm 镜像id
# 删除所有镜像
docker rmi `docker images -q`
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本
2.4、容器操作
# 进入容器 例:docker exec -it haoshun /bin/bash
docker exec 参数 容器id或者容器名 /bin/bash # 退出容器,容器不会关闭
# 查看所有容器
docker ps –a
# 查看正在运行的容器
docker ps
# 查看最后一次运行的容器
docker ps –l
# 查看停止的容器
docker ps -f status=exited
# 格式化查看
docker ps -a --format "table {{.Image}}\t{{.ID}}\t{{.Ports}}\t{{.Names}}"
# 启动容器:
docker start 容器名称(或者容器ID)
# 停止容器:
docker stop 容器名称(或者容器ID)
# 删除容器:如果是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名称或者容器id
# 交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
# 守护式方式创建容器:
docker run -di --name=容器名称 镜像名称:标签
# 登录守护式容器方式:
docker exec -it 容器名称 (或者容器ID) /bin/bash
# 容器保存为镜像 容器ID 镜像名称:版本
docker commit mynginx mynginx_i
# 镜像备份 将镜像保存为tar 文件
docker save -o mynginx.tar mynginx_i
# 镜像恢复与迁移 先删除掉mynginx_img镜像 然后执行此命令进行恢复
docker load -i mynginx.tar
# 配置数据卷 例:docker run -it --name=test2 -v /vagrant/test_data2:/home/test_data2:/home/test_data3 ubuntu:16.04
docker run ... -v 宿主机目录(文件):容器内目录(文件)...
# 退出当前容器
exit
2.5、Docker私有仓库
# 拉取私有仓库镜像 registry镜像搭建属于我们自己的私有仓库
docker pull registry
# 从私有仓库拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7
# 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
2.6、简单应用部署示例
MySQL部署
# 拉取mysql镜像
docker pull centos/mysql-57-centos7
# 创建容器
docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
tomcat部署
# 拉取镜像
docker pull tomcat:7-jre7
# 创建容器 -p表示地址映射
docker run -di --name=mytomcat -p 9000:8080
-v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
Nginx部署
# 拉取镜像
docker pull nginx
# 创建Nginx容器
docker run -di --name=mynginx -p 80:80 nginx
Redis部署
# 拉取镜像
docker pull redis
# 创建容器
docker run -di --name=myredis -p 6379:6379 redis
三、高级应用
3.1、搭建主从 MySql
3.1.1、安装主从 Mysql 、修改配置文件
1.安装
安装主从 Mysql 、修改配置文件
# docker内部安装vim
apt-get updateapt-get install vim
# 下载8.0.19版本:
docker pull mysql:8.0.19
# 查看mysql镜像:
docker images
## docker容器是相互隔离的,容器有独立IP,不同容器用相同的端口不会冲突
# 启动 Master 容器
docker run -p 3306:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:8.0.19
# 启动 Slave 容器
docker run -p 3307:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:8.0.19
# 查看 MySql 运行情况
docker ps -a
2.改配置文件
# 进入到Master容器内部,使用容器ID或者名称均可:
docker exec -it 8b71301f25ed /bin/bash //8b71301f25ed为容器ID
docker exec -it mysql-master /bin/bash //mysql-master为容器名称
# 切换到 /etc/mysql 目录下
# 编辑 master的 my.cnf文件
vim my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=master-bin
binlog-format=ROW // 二级制日志格式,有三种 row,statement,mixed
binlog-do-db=数据库名 //同步的数据库名称,如果不配置,表示同步所有的库
# 退出docker容器 重启 mysql-master
docker restart mysql-master
# 编辑 slave 的 my.cnf文件
vim my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=mysql-relay-bin
read_only=1 ## 设置为只读,该项如果不设置,表示slave可读可写
# 退出docker容器 重启 mysql-slave
docker restart mysql-slave
3.1.2、开启Master-Slave主从复制
1.查看Master的信息
# 进入Master库mysql客户端:查看Master状态,记住File、Position
show master status
# 容器id查询容器的IP进行查询:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
2.Slave 连接 Master
# 进入到Slave库myslq客户端,执行命令。
change master to master_host='172.17.0.2', master_user='root', master_password='12345678', master_port=3306, master_log_file='master-bin.000001', master_log_pos=3552, master_connect_retry=30;
master_host :Master库的地址,指的是容器的独立ip,可以通过
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称 | 容器id查询容器的IP进行查询:
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
3.查看 Slave 连接情况
# 启动slave
start slave
# 查询slave
show slave status \G;
3.2、极简版搭建私有仓库
##获取官方镜像
[root@server1 ~]# docker pull registry
[root@server1 ~]# docker images registry
##以该镜像为基础,启动容器
[root@server1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
##上传镜像(需要先更改镜像名称,以指定上传的仓库)
[root@server1 ~]# docker tag webserver:latest localhost:5000/webservr:latest
[root@server1 ~]# docker push localhost:5000/webservr ##上传
##查看挂载的地址
[root@server1 ~]# tree /opt/registry
##查看所挂载的镜像
[root@server1 ~]# curl localhost:5000/v2/_catalog
## 向私有仓库上传、下载镜像
#1.docker tag重命名需要上传的镜像
docker tag IMAGE 服务器IP:端口/IMAGE_NAME
# 2.docker push上传刚刚重命名的镜像
docker push 服务器IP:端口/IMAGE_NAME
3.3、数据卷的使用
# docker run -it -v/宿主机绝对路径目录:/容器内目录镜像名
docker run -it -v /myDataVolume:/dataVolumeContriner centos:centos7.8.2003 / bin/bash
docker inspect 容器ID,查看容器内部细节,可看到这两个目录绑定成功
3.4、docker-compose管理工具
可避免手动编写一堆 docker run 命令,用一个配置文件来定义整个应用的服务。
3.4.1、安装
# 1.用 pip 安装
sudo pip install docker-compose
# 2.linux上进行命令下载安装
sudo curl -L "https://github.com/docker/compose/releases/download/{version}/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose
# 授权 Docker Compose 二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
# 验证 Docker Compose 是否正确安装:
docker-compose --version
3.4.2、使用
1.编写 Docker Compose 文件
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
depends_on:
- redis
redis:
image: "redis:alpine"
使用命令
# 启动应用
docker-compose up
# 后台运行,则可以加上 -d 参数:
docker-compose up -d
# 查看 Docker Compose 应用的状态
docker-compose ps
# 停止应用
docker-compose down
# 查看配置命令
# docker compose config# 构建并后台启动
# docker compose up -d# 将会停止UP命令启动的容器,并删除容器
# docker compose down #重新启动nginx容器
# docker compose restart # 启动已存在的容器命令
# docker compose start# 停止正在运行的容器命令
# docker compose stop#暂停容器
# docker compose pause # 恢复容器
# docker compose unpause# 构建镜像
# docker compose bulid# 下载镜像
# docker compose pull# 删除容器
# docker compose rm # 查看运行的镜像
# docker compose ps# 查看进程
# docker compose top# 查看服务日志输出
# docker compose logs