docker
docker
介绍
docker是虚拟化中的一种容器技术
什么是虚拟化呢?
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。
# kvm:开源的免费的 Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中
# exsi:vmware商用的,装在裸机上,可以虚拟化出很多机器
# openstack(python开发的,开源的):电信云,华为云 openstack 管理云平台
# 阿里云(自研,阿里飞天):云服务器,到一个网站,点点---》付款--》完成
# docker:容器技术
# k8s:多机容器管理,容器编排
docker的由来
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 [GitHub](https://github.com/docker/docker) 上进行维护
Docker 项目的目标是实现【轻量级的操作系统虚拟化解决方案】。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的【容器就像操作一个快速轻量级的虚拟机】一样简单。
容器跟虚拟机的比较
虚拟机
一台服务器,要装操作系统(Linux),再用虚拟化的软件在虚拟化出机器,还需要在虚拟化出来的机器上 装操作系统,装一些二进制的可执行文件。每一台虚拟化出的机器都要遵循这个步骤
docker
在一台服务器上装操作系统,在装docker软件,用docker软件去虚拟化机器不需要再去装操作系统就可以直接装软件,依赖服务器的操作系统。
Docker的概念
本身也是一个cs架构软件, 客户端要和服务端通信,使用的是http协议,符合resful规范。
镜像重要
镜像就是一堆文件,相当于虚拟机装了操作系统,然后又装的软件后产生的一个vmdk文件。 相当于我们封装操作系统的概念。eg: iso文件 GHO文件 ,
容器重要
镜像运行起来就是一个安装好操作系统和软件的容器(虚拟机)
在python中 的类 就很像镜像 有一堆属性, 类产生的对象就类似与容器。
Registry(注册中心)
镜像都是从注册中心拉下来的
docker安装
windows平台
https://www.docker.com/products/docker-desktop/
需要下载软件,一路下一步安装
centos
如果有的话先卸载
yum remove docker docker-common docker-selinux docker-engine
删除目录
rm -rf /var/lib/docker
安装
# 依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 下载docker
sudo yum install docker-ce
# 查看版本
docker -v # Docker version 23.0.3, build 3e7cbfd
docker镜像
# 可以在这个网址上搜索
https://hub.docker.com/
"能搜到就可以在docker里下载"
因为是国外的网站下载可能比较慢,可以配置镜像源
修改源
sudo mkdir -p /etc/docker # 创完docker就会有这个文件夹一般不用在创建
vim /etc/docker/daemon.json
# 把下面的东西复制进去
{
"registry-mirrors": ["自己去阿里云上搜镜像服务里的镜像加速"]
}
# 保存退出后执行下列代码重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
docker命令
查看docker状态
systemctl status docker
启动
systemctl start docker
停止
systemctl stop docker
重启
systemctl restart docker
开机启动
systemctl enable docker
查看docker概要信息
docker info
需要关注的地方 下图
搜索镜像
docker search 镜像名
# 建议直接去 网站搜索 看起来比较舒服
拉取镜像重要
# 先去docker网站搜到后下载对应的版本
docker pull centos:7
不指定 : 版本则默认最新版
查看本地镜像
docker images
docker images -q # 查出所有镜像id号
删除镜像
需要先查看镜像,复制id删除,
docker rmi 镜像id号 可以跟多个
删除所有镜像
docker rmi `docker images -q`
容器相关命令
查看正在运行的容器
docker ps # 查看正在运行的容器
docker ps -a # 查所有容器
docker ps -l # 查最后一次运行的容器
创建运行容器重要
如果容器没有创建,直接执行run,就会创建并运行,所以你只需要会run就行了
run 的时候,有很多参数
-i:表示运行容器
-t:表示容器启动后会进入容器命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)
-name :为创建的容器命名,如果不写,随机生成一个名字
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
创建并进入容器
docker run -it 镜像:标签 # 自动起名
docker run -it --name=容器名 镜像:标签
docker run -it --name=mycentos centos:7
创建不进入容器
docker run -id --name=容器名 镜像:标签
docker run -id 镜像:标签 # 自动起名
退出容器
退出后容器就会停止运行
exit
启动容器
启动容器并不会进入容器
docker start mycentos
进入到容器内部
本质是让进入容器命令行
# 用容器执行命令
docker exec 容器id 命令
docker exec d8cc8e182637 mkdir lxj #创建文件夹
docker exec d8cc8e182637 ls # 查看
# 进入容器 /bin/bash 相当于交互式命令行
docker exec -it d8cc8e182637 /bin/bash
exit 断开链接
容器目录映射
在宿主机新建一个目录,在目录下可以创建一个txt文件
# 创建一个容器并做映射
-v 宿主机目录/容器目录
docker run -id --name=lqz -v /home/lxj:/lxj centos:7
"随意修改文件内容,会发现容器里和宿主机的文件都发生了改变 , 也可以新建文件"
容器端口映射
我们在容器中启动一个mysql 5.7 会监听容器中的3306端口
宿主机的3306端口没有监听,我们可以任意指定一个 端口与 容器的3306端口做映射
这样访问宿主机我们指定的端口就会访问到 容器中的mysql
# 启动一个 mysql容器并做映射
-p 宿主机端口:容器端口
"第一次启动mysql需要设置管理密码"
docker run -id --name=mysql -p 80:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 查看端口占用情况
netstat -nlp |grep 80
在Navicat 就可以用虚拟机/阿里云的ip地址 +80端口连接上容器的mysql
容器停止后无法操作数据库。容器删除 库也会消失
容器命令
启动容器
docker start 容器id
停止容器
docker stop 容器id
拷贝文件
docker cp 容器名称/id:容器目录 需要拷贝的文件或目录
docker cp 20fd8:/home/lqz.txt /home/lqz.txt
查看容器IP地址
docker inspect 容器名称 # 查看容器的详细描述,很多
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
删除容器
# 先停在删
docker rm 容器id
docker rm `docker ps -a -q` # 删除所有
应用部署
1.mysql部署
# 创建一个mysql容器 命令 不要执行 这只是在复习一下
docker run -id --name=mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
一般来说 为了确保数据的安全性,在创建mysql,redis容器的时候都会做目录映射,即使删除容器数据也不会丢失。
先创建好文件夹和配置文件 以后都可以用这个配置文件
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
vim /home/mysql/my.cnf
写入
[client]
default-character-set=utf8
[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
创建mysql容器 端口映射 目录映射
docker run -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
一切做好了之后,去数据库里建个库,然后建个表插入一条数据,进入容器查看该数据已经出现了,这时候删除容器
docker rm mysql
Navicat 重新链接数据库连不上了
重新创建一个新的容器并做目录映射,还是上面那个命令
进入容器发现数据还在并没有丢失,主要是因为做了目录映射 所有的库文件都会保存在宿主机上。
2.redis部署
拉取redis镜像
docker pull redis
创建文件夹
mkdir /root/data
# 搞一个配置文件
vim /root/redis.conf
bind 0.0.0.0 # 允许外部访问
daemonize NO
protected-mode no # 保护模式
requirepass 123456 #指定连接密码
启动容器
docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis redis-server /etc/redis/redis.conf
# redis-server /etc/redis/redis.conf 这句话是在跑redis服务
3.nginx部署
拉取nginx镜像
docker pull nginx # 不写版本默认最新
容器里的静态文件目录(html)
/usr/share/nginx/html
在本地创建一个html目录
mkdir /root/html
新建一个html文件或把准备好的html文件复制进去
这里 用index.html 示例
随意写一个<h1>标题</h1> 保存
创建容器
docker run -id --name nginx -p 80:80 -v /root/html:/usr/share/nginx/html nginx
因为做了端口映射访问宿主机的ip地址就可看到我们刚刚做的index.html啦
以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的
容器保存成镜像
运行一个centos容器
docker run -id --name centos_vim centos:7
在容器中装vim 你可以装你需要的东西
docker exec -it a6e240 /bin/bash
yum install vim -y
把容器做成镜像
docker commit centos_vim centos_vim_image
容器名 镜像名
docker images # 就可以看到该镜像了
把centos_vim 容器删除
docker rm centos_vim
基于新构建的镜像,运行成容器
docker run -id --name centos_vim centos_vim_image:latest
-进入到容器中,查看,软件都在
docker exec -it id号 /bin/bash
镜像备份和恢复
备份
docker save -o centos_vim_image.tar centos_vim_image
停止相关的容器,删除容器,删除镜像
把备份的镜像恢复
docker load -i centos_vim_image.tar
Dockerfile
是一个由一系列命令和参数构成的脚本文件,这些命令应用于基础镜像,并最终创建一个新的镜像。
Dockerfile的命令
FROM 基础镜像 # 基于哪个基础镜像来构建新的镜像
MAINTAINER lqz # 声明镜像的创建者
ENV key value # 设置环境变量 (可以写多条)
RUN command # 会在容器里给你执行命令 eg yum install vim -y
ADD source_dir/file dest_dir/file #将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file # 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR 目录名 # 设置工作目录,运行起这个容器,来到的路径就是这个路径
构建一个带vim的centos镜像
vim Dockerfile
# 自己输入命令
FROM centos:7
MAINTAINER lxj
ENV name tank
RUN yum install vim -y
RUN mkdir /data
RUN touch /data/xx.py
RUN echo 'print(1)' > /data/xx.py
ADD /root/redis.conf /data/redis.conf # 先删掉会报错,后面再解决问题
WORKDIR /data
# 构建命令
docker build -t='centos_lxj_vim' .