1. 什么是虚拟化
2 .什么是Docker
Docker是一个开源的应用容器引擎,Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术。在2018年之前是不支持在Windows系统部署Docker的。用户操作Docker的容器就像操作一个快速轻量级的虚拟机一样简单。
个人理解:Docker: 集装箱 把东西封装到集装箱中,别人需要就直接给集装箱。
3.为什么选择Docker?
1)上手快
4. 容器与虚拟化的比较
下面的图片比较了Docker和传统的虚拟化方式的不同之处,可见容器在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统的虚拟化则是在硬件层面实现。
总结一下就是: Docker没有独立的操作系统,使用真机的内存与操作系统。与传统的虚拟机相比,Docker的优势体现为启动速度快、占用体积小。
借用知乎上一个很形象的例子就是:
5.Docker组件
Docker服务器与客户端
Docker是一个客户端/服务器(C/S)架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。
Docker提供了一个命令行工具docker以及一整套RESTful API来与守护进程交互。
Docker镜像与容器
仓库:每个仓库存放某一类镜像。
镜像:类似虚拟机镜像(eg:xxx.iso)。 eg: MySQL镜像、Redis镜像、2048镜像。
容器:从官方仓库中拿取镜像,进行操作使镜像可以运行之后称为容器。类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。对镜像改变时相当于做快照,删除容器,相当于删除镜像修改的部分,镜像不变。
Registry(注册中心)
Docker用Registry来保存用户构建的镜像。Registry分为公有和私有两种。
公有仓库 :所有人可以访问下载镜像的仓库。Docker公司运营公共的Registry叫做Docker Hub。
私有仓库: 规定范围内可以访使用的库。用户可以构建私有的Registry。
最简便的方法:
阿里云安装docker(yum仓库使用阿里云的仓库很方便)
- git bash中:ssh @47.92.233.236 输入密码
- yum install docker
- systemctl start docker
方法一: 直接使用docker光盘镜像源安装docker最新版本
(1) yum包更新到最新
# 阿里安装软件镜像源下载
$ wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ yum makecache # 生成缓存
$ yum update # yum包更新
(2) 配置yum仓库安装Docker
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker- ce.repo
(3) 安装Docker
$ yum install docker-ce -y
(4) 安装后查看Docker版本
$ docker -v
方法二: 官网下载软件包, 自行安装
$ yum install * -y
$ docker version
启动Docker:$ systemctl start docker
停止Docker:systemctl stop docker
重启Docker:systemctl restart docker
查看Docker状态: systemctl status docker
开机启动Docker:systemctl enable docker
查看Docker概要信息:docker info
查看Docker帮助文档:docker --help
REPOSITORY: 镜像名称
TAG: 镜像标签
IMAGE ID: 镜像ID
CREATED: 镜像创建的时间(不是获取该镜像的日期)
SIZE: 镜像大小
这些镜像都是存储在Docker宿主机的/var/lib/docker目录下。
docker search 镜像名称
docker pull 镜像名称
按ID删除镜像
docker rmi 镜像ID
删除所有镜像(注意:是反向单引号)
docker rmi `docker images -q`
查看所有正在运行的容器docker ps
查看所有容器(即无论是否运行中)docker ps -a
查看最后一次运行的容器docker ps -l
查看停止的容器docker ps -f status=exited
创建与启动容器
创建容器常用参数说明: docker run
-i, --interactive : 表示运行容器
-t, --tty : 表示容器启动后进入其命令行(分配一个伪终端)
–name : 指定容器名称
-v, --volume list : 表示一个/多个目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录)
-d, --detach : 创建一个守护进程在后台运行
-p, --publish list : 表示一个/多个端口映射,前者是宿主机端口,后者是容器内的映射端口。
(1) 交互式创建容器
$ docker load -i ubuntu.tar # 加载镜像
$ docker run -it --name=myubuntu ubuntu /bin/bash # 创建容器, exit退出当前容器
$ docker ps -a
(2) 守护方式创建容器
$ docker run -di --name=容器名称 镜像名称:标签 # 创建容器
$ docker exec -it 容器名称/容器ID /bin/bash # 登录守护容器交互环境的方式
(3) 删除容器
删除指定的容器,如果删除容器时,容器正在运行中,则先停止容器。
docker stop myubuntu1
docker rm myubuntu1
(4)停止与启动容器
$ docker stop 容器名称(或者容器ID)
$ docker start 容器名称(或者容器ID)
(5)查看容器IP地址
docker inspect myubuntu1
docker inspect --format='{{.NetworkSettings.IPAddress}}' myubuntu1
docker cp 容器名称:容器目录 需要拷贝的文件或者目录
- docker --help | less 查看容器命令
- docker exec -it 2048 /bin/bash 交互环境进入2048项目
- hostname > hostname.txt 容器内产生一个文件
- cat hostname.txt
- ctrl + p +q 退出交互式环境不关闭容器
- docker cp 2048容器id:/hostname.txt /mnt/ 将容器的文件拷贝到真机/mnt/
- cat /mnt/hostname.txt
$ docker cp 需要拷贝的文件或者目录 容器名称:容器目录
- docker cp /etc/passwd 容器id:/tmp/ 将真机/etc/passwd 拷贝到容器/tmp下
- docker exec -it 2048 /bin/bash 重新进入交互式环境
- head -3 /tmp/passwd 查看从真机拷贝到容器下的文件
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主主机某个目录的文件从而影响容器。也就是通过修改真机目录来修改容器内的目录。
创建容器 添加-v参数 后面为 宿主机目录: 容器目录
例如:
docker run -di -v /usr/share/Project1: /usr/share/Project1 --name my_2048 docker.io/blackicebird/2048
对镜像创建一个容器,容器中/usr/share/Project1映射到真机下 /usr/share/Project1 (目录可以不相同)
docker exec -it my_2048 /bin/bash
进入这个容器的交互式环境
cd /usr/share/Project1
进入容器下的目录创建文件
touch file{1..10}
ctrl +p +q 退出容器
ls /usr/share/Project1
真机下查看在虚拟机下创建的文件
如果把设置好的容器封装成镜像,每次使用这个容器时就把这个镜像启动成新的容器而无需设置。对于一个每次使用都需设置的容器,可以进行封装保存为一个镜像。commit会把所有指令都集成为一个文件,启动容器的时候就执行这个文件。
小例子: 对mysql设置登陆密码、指定用户远程连接和授权的操作,将设置好的mysql封装为镜像:
docker commit 要封装的容器名称 新的镜像名称例如mysql:remote_login
docker images
查看镜像docker run -d -p 0.0.0.0:3306:3306 6 --name test_mysql mysql:remote_login
镜像创建容器docker ps
查看运行的容器如果pull镜像很慢的话可以将容器打包镜像,每次load即可
步骤如下:
docker save -o mysqlRemoteLogin.tar 要打包的镜像mysql:remote_login
docker load -i mysqlRemoteLogin.tar
镜像恢复docker images
查看镜像Dockerfifile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
对于开发人员:可以为开发团队提供一个完全一致的开发环境。
对于测试人员: 可以直接拿开发时所构建的镜像或者通过Dockerfifile文件构建一个新的镜像开始工作了。
对于运维人员: 在部署时,可以实现应用的无缝移植。
- vim docjer_file
- mkdir dockertest
- mv docker_file dockertest/dockerfile
- cd dockertest
- touch hell0.txt 将这个文件拷贝到容器中
- docker build --no-cache -t “ubantu:test” .
执行写好的dockerfile,. 表示对当前执行操作 -t加入标签- docker run -id --name ubantu_test -p 82:80 ubantu:test 对封装的镜像创建容器
- docker exec -it ubantu_test /bin/bash
- cd /mnt
- ls
可以看到hello.txt
背景:
- 云服务器47.92.233.236
- git bash
步骤:
docker search 2048
docker pull docker.io/blackicebird/2048
docker images
查看镜像docker run -d --name 2048 -p 0.0.0.0:80:80 docker.io/blackicebird/2048
对docker.io/blackicebird/2048 镜像创建容器,-d在后台运行 -p映射:将2048游戏放到容器的80端口,真机80端口映射到容器80端口,用户访问云服务器80端口时就会访问容器的80端口来访问2048这个游戏docker ps
查看运行的容器docker ps -a
查看所有的容器部署遇到的问题:
问题一: 如果通过云服务器:80无法访问,则需要设置端口号对应的安全组。
问题二:有时候阿里云版本下的镜像与操作系统配置版本不兼容,可以提升操作系统配置:yum update 更新所有软件包括系统内核版本。
背景:
- 项目端装mysql:yum install mysql
- 理解:数据库 主机一部署 ,项目 主机二部署
知识扩展:
hub.docker.com: 搜索关于镜像设置拉取的信息
操作步骤:
项目所在的主机二远程连接主机一的数据库,数据库所在的主机一需要设置用户可以远程连接
- docker search mysql
- docker pull docker.io/mysql
- docker images
- docker run -d -p 0.0.0.0:3306:3306 6 -e MYSQL_ROOT_PASSWORD=‘123’ --name remote_mysql docker.io/mysql
- docker inspect --format=’{{.NetworkSettings.IPAddress}}’ mysql
查看容器IP,IP: 172.17.0.3- docker ps 查看开启的容器
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口。
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登录密码。
- docker exec -it remote_mysql /bin/bash
进入docker的remote_sql 容器命令行 对数据库需要设置用户可以远程连接- mysql -uroot -p123
- create user lvah@’%’ identified by ‘123’;
创建用户lvah,允许任意主机(%)远程登陆,登陆密码为123.- grant all privileges on . to ‘lvah’@’%’;
授权lvah@%用户, 允许操作任意数据库和任意数据表(.).
此时退出容器外部登录MySQL会报错是因为版本加密方式不一致
- alter user ‘lvah’@’%’ identified with mysql_native_password by ‘123’;
flush privileges;
重新加载用户授权表。- ctrl +p +q
- 退出容器测试:mysql -ulavh -p123 -h172.17.0.3
报错处理:
用户在连接MySQL数据库时会出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的错误。
mysql -ulvah -p123 -h172.17.0.2 -p3307
ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be
loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared
object file: No such file or directory
报错原因:
mysql8 之前的版本中加密规则是 mysql_native_password,
而在mysql8之后,加密规则是 caching_sha2_password
解决方法: 修改账户密码加密规则并更新用户密码
修改加密规则
ALTER USER ‘user’@‘localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE
NEVER;
# 更新一下用户的密码
ALTER USER ‘user’@‘localhost’ IDENTIFIED WITH mysql_native_password BY
‘password’;
docker部署基本流程: