Docker 的使用

Docker 的使用_第1张图片

一、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将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

Docker 的使用_第2张图片

4.docker container 容器  
镜像相当于Java中的类,容器就像实例化后的对象,一个镜像可以实例化多个容器,容器通过镜像启动。
镜像中的应用程序运行后形成的进程就是容器,是Docker会给容器进程做隔离,对外不可见。
Docker容器通过镜像启动,容器是Docker的执行单元,容器中可以运行客户的多个进程。

Docker 的使用_第3张图片

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

Docker 的使用_第4张图片

# 容器id查询容器的IP进行查询:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master

Docker 的使用_第5张图片

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;

Docker 的使用_第6张图片

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

Docker 的使用_第7张图片

Docker 的使用_第8张图片

3.3、数据卷的使用 

Docker 的使用_第9张图片

# docker run -it -v/宿主机绝对路径目录:/容器内目录镜像名
docker run -it -v /myDataVolume:/dataVolumeContriner centos:centos7.8.2003 / bin/bash

Docker 的使用_第10张图片

 docker inspect 容器ID,查看容器内部细节,可看到这两个目录绑定成功

Docker 的使用_第11张图片 

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

你可能感兴趣的:(docker,容器,运维)