软件集装箱化平台,可让开发者构建应用程序时,将它与环境一起打包到一个容器中,发布应用到任意平台中。
能在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,
如:Tomcat运行在一个Docker,MySQL运行在另外一个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.简化配置、打包软件、快速部署
能将环境和配置放入代码然后部署,Docker配置能在各种环境中使用,将应用环境和底层环境解耦。
Docker通过创建进程的容器,不必重新启动操作系统,几秒内能关闭。
2.代码管道化管理
对代码以流式pipeline管道化进行管理,从开发者的机器到生产环境机器这个流程中都能有效管理。
Docker提供了跨越异构环境以一致性的微环境,从开发到部署实现流畅发布。
3.应用隔离、网络建模、开发生产化、服务合并
多个应用服务部署在多个Docker中相互隔离,
可在一台机器上启动数百个(甚至数千个)相互隔离的容器,对网络进行建模。
单机上最大程度模拟生产分布式部署的环境
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
# 启动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
# 拉取镜像到本地 例: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 新镜像名称:版本
# 进入容器 例: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
# 拉取私有仓库镜像 registry镜像搭建属于我们自己的私有仓库
docker pull registry
# 从私有仓库拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7
# 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
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
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
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;
##获取官方镜像
[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
# docker run -it -v/宿主机绝对路径目录:/容器内目录镜像名
docker run -it -v /myDataVolume:/dataVolumeContriner centos:centos7.8.2003 / bin/bash
docker inspect 容器ID,查看容器内部细节,可看到这两个目录绑定成功
可避免手动编写一堆 docker run 命令,用一个配置文件来定义整个应用的服务。
# 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
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