docker使用
docker简介
什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等
虚拟化技术
vm在操作系统上虚拟化出操作系统,openstack,python写的框架,vm虚拟的机器,管理控制台管理
docker,docker-compose:软件,虚拟化,软件层面虚拟化,不虚拟出硬件来,硬件依赖了本身的操作系统;单机多个docker容器的管理
k8s:多机的容器编排,100台虚拟机 10000个容器
1.2 什么是Docker
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护,好多软件,用go写的,这个软件火,推升了go火
区块链,第一款开源的区块链用go写
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的【容器】就像操作一个快速轻量级的【虚拟机】一样简单。
docker解决的痛点
java,一个东西(docker镜像,独立的网络),拿到任何平台直接运行就是我的项目
python,某个东西(docker镜像,独立的网络),在任何平台,直接运行,屏蔽了平台和环境和python解释器模块
很多服务器服务器---》虚拟化出centos---》装python解释器,装django,放上代码,运行代码
很多服务器服务器---》虚拟化出centos---》装个docker软件,把python项目做成镜像
以后换到任何机器上---》装个docker软件,启动容器即可---》直接运行
2 docker安装与启动
2.1 docker架构
cs 架构软件:客户端,服务端 ,相互通信使用resful
Docker镜像与容器
-镜像:
-安装了虚拟机---》ios镜像文件(win7,centos)--->装在虚拟机上--》启动起来了
-把docker的镜像【当成】这个ios文件
-docker镜像是一堆文件,必须运行起来,才是容器
-容器:
-一个容器你【当成】,一台虚拟机上装了一个centos的操作系统
docker软件的安装
镜像操作命令
容器操作命令(操作系统)
连接到容器中:安装软件,删除软件,copy文件
纯净的centos7--》启动器容器---》进入--》装python3.6---》反打包成镜像
dockerfile构建镜像 --》非常小的文件,写几个命令就可以构建出镜像
镜像的备份与迁移
私有仓库
安装 ---》centos7.9为例
卸载
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
安装
yum update
安装依赖,之前装python,这些依赖装过了
yum install -y yum-utils device-mapper-persistent-data lvm2
设置阿里云的yum源--》官方源---》yum--》官方源找软件安装--》官方源里没有docker
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装---》docker-ce 社区版 ee专业版收费
yum install docker-ce
查看版本
docker -v # 20.10.16 年月日
启动docker---》win 双击运行可执行文件
systemctl start docker
docker命令(要学)
3 docker常用命令
# docker 仓库
- 下载镜像--》从某个地方下载--》hub.docker.com---》远程仓库
3.1 Docker的启动与停止
# 启动docker:
systemctl start docker
# 停止docker:
systemctl stop docker
# 重启docker:
systemctl restart docker
# 查看docker状态:
systemctl status docker
# 开机启动:
systemctl enable docker
# 查看docker概要信息
docker info
# 查看docker帮助文档
docker --help
3.2 镜像相关命令
#1 查看,列出所有镜像
docker images # 用它就行
# 2 搜索镜像---》有什么镜像再下---》一般不用--》直接去仓库网站看
docker search centos
# 3 拉取镜像
##### 镜像分标签---》mysql 5.5 /5.6 /5.7/ 8--->标签标志版本
docker pull mysql # 下载最新版---》mysql 8
docker pull mysql:5.7 # 有这个标签才能下载,mysql 5.7
#4 删除镜像 可以空格 放多个id,删除度讴歌
docker rmi 镜像id
docker rmi a091
# 5 删除所有镜像---》面试被问到,如果一次性全部删除镜像
docker rmi `docker images -q`
3.3 容器相关命令
#1 查看所有在运行中的容器
docker ps
# 2 查看所有,运行的,停止的,暂停的
docker ps –a
# 3 查看停止的容器
docker ps -f status=exited
#####4 重点#### 创建并运行容器---》俩命令合二为一--》创建 运行
docker run # 创建并运行,有很多参数
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
--name :为创建的容器命名,一个镜像可能起很多容器,给它命名,不写会自动命名
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
# 4.1 运行并进入到容器
docker run -it --name= mycentos centos:7
exit
# 4.2 运行不进入到容器
docker run -id --name= mycentos centos:7
返回id号,容器id号,唯一标识
# 4.3 在宿主机,想进入到容器内部操作 exe进
# exec 指定容器执行命令---》利用这个特点-->进入容器
docker exec -it 容器id/名字 /bin/bash
exit退出
# 5 停止与启动容器
docker stop 707be33301f7
docker start 707be33301f7
# 6 文件拷贝--->django项目---》cp进去
# 宿主机---》容器内部
docker cp 需要拷贝的文件或目录 容器名称:容器目录
# 容器内部---》宿主机
docker cp 容器名称:容器目录 需要拷贝的文件或目录
# 7 目录挂载
# 一旦挂载--》宿主机操作文件和容器操作文件都会影响
# 挂载多个目录,继续-v
docker run -id --name=mycentos3 -v /root/s20:/home/s20 centos:7
# 8 查看容器IP地址
docker inspect 容器名称
docker inspect --format='{{.NetworkSettings.IPAddress}}' f69cf7c4f1cb
# 9 删除容器
docker rm 容器id
# 删除镜像---》必须该镜像运行的容器先删除
服务部署
镜像 容器,镜像操作,容器操作
运行,copy文件。。。
装 mysql redis ,源码编译安装,启动
有了docker后,容器操作系统+软件,拉取一个redis镜像,运行起来,容器里就有 redis服务了,做好端口映射,就相当于在宿主机上装了个虚拟机,虚拟机里装了个redis
redis部署
如果本地没有这个镜像,运行镜像,会先拉取,然后在运行
-docker pull redis
容器中的redis运行时候,有配置文件,用写的配置文件,-v 映射 (宿主机写个配置文件,让容器中的redis用)
redis运行产生数据--》放在容器中--》容器删除数据就没了---》数据映射到宿主机-->以后删了容器,数据还在---》只要再启动起一个容器---》做好目录映射,数据自然都在了
# 这个,数据目录没有映射出来,配置文件使用容器默认的---》这种不用---》
docker run -di --name=myredis -p 6379:6379 redis
# 配置文件自己写,数据目录映射出来
# 启动容器,名字叫redis_6379,两个目录映射:配置,数据目录 ,运行容器的时候,执行redis-server /etc/redis/redis.conf配置文件
# 操作流程
# 第一步:启动容器
docker run -id -p 6379:6379 --name redis_6379 -v /root/s20/redis.conf:/etc/redis/redis.conf -v /root/s20/data:/data redis redis-server /etc/redis/redis.conf
docker logs 容器名字 # 查看容器日志
# 第二步:远程连接redis
-存入数据
-bgsave
# 第三步:删除容器
# 第四:再启动reddis
docker run -id -p 6379:6379 --name redis_6379 -v /root/s20/redis.conf:/etc/redis/redis.conf -v /root/s20/data:/data redis redis-server /etc/redis/redis.conf
mysql 部署
docker pull mysql:5.7
# -e 是环境变量---》容器运行时传入,看文档才知道有哪些参数
# 使用了默认配置,把数据目录映射出来
# root用户默认不允许远程登陆
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 进去授权
grant all privileges on *.* to 'root'@'%' identified by 'Lqz1234?';
# 运行远程登陆
# 配置文件用宿主机的,数据目录映射出来到宿主机
# mysql的配置文件 my.cnf
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
# 运行容器
docker run -di -v /root/s20/mysql/data/:/var/lib/mysql -v /root/s20/mysql/conf.d:/etc/mysql/conf.d -v /root/s20/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
nginx部署
docker pull nginx
docker run -di --name=mynginx -p 80:80 nginx
centos7,python-->django--->项目cp进去---》依赖,项目跑起来
python3.6 容器--->django--->项目cp进去---》依赖,项目跑起来
迁移与备份
# python容器--》装了django 容器反打包成镜像
# 把容器做成镜像
docker commit 容器名字 镜像名字
docker commit django django2.2.2
# 镜像打包成压缩包
docker save -o django2.2.2.tar django2.2.2
# cp给别人---》释放成镜像---》运行起容器
docker load -i django2.2.2.tar
dockerfile
# 把容器打包成镜像---》压成压缩文件--》复制给别人---》压缩包很大--》速度慢
# 特别轻量级的方式,可以构建出镜像来,把一个特别小的文件复制给别人,别人一运行就有了镜像
# 它就是一个固定的 Dockerfile 文件,里面写了一些命令
# 通过 docker build -t='django2.0' . 把这个文件构建成镜像
#dockerfile的命令
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name 声明镜像的创建者
ENV key value 设置环境变量 (可以写多条)
RUN command 是Dockerfile的核心部分(可以写多条)
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
# Dockerfile
FROM python:3.8.13
MAINTAINER lqz
ENV pwd 123
RUN pip install django==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN mkdir lqz
ADD ./redis.conf /home/redis.conf
WORKDIR /home # 工作路径是哪
docker build -t='django2.2.2' .
私有仓库
# docker pull 都是从hub.docker.com 拉的
# 我们公司自己做的镜像,在上面没有---(我可以传上去,不安全)
# 自己搭建私有仓库