Docker01--介绍与安装、镜像和容器操作、应用部署
https://www.cnblogs.com/liuqingzheng/p/16315254.html
0 docker内容
详细内容:http://www.liuqingzheng.top/linux/Linux系列教程/
1 docker介绍,跟传统虚拟机的比较
2 安装docker,启动
3 镜像
4 容器
5 网络
6 数据卷
7 私有仓库
8 备份回顾
9 dockerfile
10 单机容器编排 docker-compose
1 docker介绍
# 0 各种软件用什么语言写的 基本都是运维需要使用的
zabbix :php # 监控软件
Prometheus:go # 监控软件 被称普罗米修斯
ansible :python # 批量管理主机,执行命令, 无客户端(angent)
salstack : python # 批量管理主机,执行命令,有客户端(angent) # 主机数量特别多 速度更快
openstack :python # 云计算,管理虚拟机
jekins :java # 自动化部署 ci/di 持续集成/部署
docker :go # 虚拟容器技术
k8s :go # 管理容器
# 1 什么是虚拟化?
虚拟化:打破实体结构间的不可切割的障碍
# 2 vmware、kvm openstack docker k8s等 名词含义
- vmware、kvm:是虚拟化技术,能够直接从硬件上或操作系统上虚拟化出多个不同的操作系统(云服务器)
- opensatck、阿里飞天: 是亚马逊、阿里云、腾讯云等云商家,用来管理虚拟化出来的操作系统
- docker:进程级别的隔离 # 一般:装在虚拟机 或 云服务器上
一个云服务器上可以跑出成几百个docker容器,成百上千的服务器上,就会有个上万个容器
- k8s: 用来管理不同机器的上万个docker容器 # 大型公司才会使用这个服务
# 3 什么是docker? 诞生于2013年
- Go语言实现,开始收费 --> 濒临倒闭 --> 开源出来,很多人用
- docker-ce (社区版 免费),docker-ee (企业版收费)
- 通过go语言对lxc技术的一个封装
# 4 容器与虚拟机比较
虚拟机:是完整的虚拟化技术,其中包括虚拟硬件和操作系统等,也会占据一定的资源消耗
docker:不需要虚拟硬件,是进程级别(应用)的隔离,只需要隔离网络和数据等,
轻量级,占用体积小,启动快
# 简单理解:
传统虚拟机 是同一个硬件上 隔离出多个操作系统
docker 是同一个操作系统上 隔离出多个应用进程 # 更快 更小
# 5 docker是一个客户端-服务器(C/S)架构程序(mysql,redis都是cs架构) 整套符合RESTful API
# 6 docker非常重要的概念: 镜像(image) 与 容器(container)
有了镜像 ---> 镜像运行起来是容器(真正的执行单位)
面向对象的类 对象
# 7 镜像是从哪里来的?
镜像就是一堆文件
从远程仓库获取(拉取)
2 docker架构图
3 docker安装
3.1 Windows
windows安装(不建议你装)
http://get.daocloud.io/
3.2 Ubuntu
# 0 卸载
sudo apt-get remove docker docker-engine docker.io containerd runc
# 1 安装必要工具
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# 2 安装GPG证书
# 官方
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 换成阿里云
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 3 写入软件源信息
# 官方
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 换成阿里云
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 4 更新并安装docker-ce
sudo apt-get -y install docker-ce
# 5 开启docker服务
systemctl status docker
3.3 Centos
# 官方建议docker运行在centos7 以上的系统
docker是在linux3.1以上内核中写出来的,在乌班图下开发完成的 docker的新特性在乌班图先看到
# 若centos6.8安装docker,需要升级内核版本 (自行搜索)
# 0 卸载 (未安装 不用卸载)
yum remove docker docker-common docker-selinux docker-engine
rm -rf /var/lib/docker
# 1 更新yum
yum update
# 2 安装需要的软件包 yum-util 提供yum-config-manager功能
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3 设置yum源为阿里云 将包含docker的阿里云源 添加到本地yum源中
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4 安装
yum install -y docker-ce
# 5 验证安装(查看版本)
docker -v
Docker version 19.03.12, build 48a66213fe # 19年03月12日发布
# 自从分了docker-ce和docker-ee以后,以年份命名版本
# 6 启动docker服务
systemctl start docker
# 7 停止docker服务
systemctl stop docker
# 8 重启docker服务
systemctl restart docker
# 9 开机启动
systemctl enable docker
# 10 查看概要信息
docker info # 管理docker的运维平台 查看服务端docker状态
3.4 远程仓库换源
# 注册-登录 https://hub.docker.com/ 官方
# 可以上传镜像 (类似于github) 把制作的镜像传上去,别人可以下载使用
# 配置加速 (之前去https://hub.docker.com/) 阿里云/清华 做了一个备份 配置好以后再拉镜像会去国内地址拉取
第一步:
vi /etc/docker/daemon.json
第二步:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
4 镜像操作
# -1 第一个hello-world (没有任何意义)
docker run hello-world
1 客户端连到服务端,服务端下载了hello-world镜像
2 通过镜像跑起容器来
3 容器输出一些东西,通过服务端发送给客户端,客户端展示在窗口里了
# 0 查找镜像
方式一:https://hub.docker.com/ 点点点搜索 # 用这种 官方网站中查找
方式二:docker search 镜像名字
# 1 拉取镜像
docker pull hello-world # 默认:最新版本 latest
docker pull hello-world:nanoserver
# 2 查看镜像 机器上有哪些镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
镜像名字 版本 id号 创建时间 大小
# 3 删除镜像
docker rmi 镜像名字/id号
# 如果还有基于这个镜像的容器,是不允许删除镜像的 先删除容器,再删除镜像
# 删除所有镜像 慎重 最好不要用!!! 老老实实的复制粘贴 id 容器同理!!!
docker rmi `docker images -q` # 先查出所有镜像的id 再删除
# 4 练习:拉取python3.6镜像,redis最新镜像,mysql5.7镜像
docker pull python:3.6
docker pull redis
docker pull mysql:5.7
docker pull centos:centos7
docker pull nginx
# 5 镜像是什么?
就是一堆文件,这堆文件通过docker跑起来 就变成了容器
# 理解:
现在就把它当成 一个操作系统内 跑了这个软件 # eg: redis镜像: Linux操作系统+redis
假设centos7的镜像跑起来了容器,就当成在宿主机上跑了一个centos7的操作系统 # 等同于centos的虚拟机
# 6 补充 (了解)
# 查看镜像的详细信息
docker image inspect 镜像id 46ff56815c7c
docker image ls <==> docker images
docker image rm <==> docker rmi
5 容器操作
# 1 删除容器 容器停止才能删除
docker rm 容器名字/容器id
# 2 启动并运行容器 通过centos:centos7镜像,创建一个名字叫mycentos的容器,并且把它运行起来
docker run -di --name=mycentos centos:centos7
# 输出结果:打印出容器的id号
# 3 查看正在运行的容器
docker ps
# 4 查看所有容器 包括停止的
docker ps -a
# 5 停止容器
docker stop 容器名字/id
# 6 启动容器
docker start 容器名字/id
# 7 容器的创建和启动(******)
# 方式一:了解
# 创建:
docker create --name=容器名 基于的镜像 容器启动后执行的命令 (# 可以不写,会有默认的夯住命令)
eg: docker create --name=test-container centos:centos7 ps -A
# 启动
docker start test-container
# 容器可以一直运行的原因 *** 这是为什么有些容器启动后,自动停止的主要原因!!!
它有一条前台进程,一直在运行 # 容器默认的命令没有结束,容易就会一直运行
# 容器启动时:
默认执行一个命令 如果该命令结束,该容器也就停止结束
# eg: centos 启动后是bash脚本 '/bin/bash'
# 故:以后如果自己制作的镜像,运行起容器,必须有个可以夯住的命令
# 方式二:通过run命令创建并启动 指定不同的参数执行
-i:表示运行容器
-t:表示容器启动后会进入其命令行
# 如果只加-i -t两个参数,创建后就会自动进去容器 (并不是真正的进入,而是分配一个伪终端来交互)
-d:表示创建一个守护式容器在后台运行
# 这样创建容器后,不会自动登录容器
--name:为创建的容器命名
# 如果不写,会自动分配一个名字(英文人名)
-v:表示目录映射关系 前者是宿主机目录:后者是容器目录 映射到宿主机上的目录
# 可使用多个-v 做多个目录或文件映射
# 注意:最好做目录映射(目录挂载),在宿主机上做修改,然后共享到容器上
-p:表示端口映射关系 前者是宿主机端口:后者是容器内的映射端口
# 可使用多个-p 做多个端口映射
-e: 表示向容器类的环境变量添加值 # 容器内 env 可查看 或 python os.environ.get(key) 获取
# eg: -e MYSQL_ROOT_PASSWORD=123456
# 主要应用在 项目连接数据库的配置中 django项目 setting.py中 数据库密码配置
# eg:
docker run -it --name=myredis redis # 后面可跟默认命令 '/bin/bash'
# 注意:
执行命令:docker run 镜像 # 如果本地没有该镜像,会先去仓库pull,再run
# 8 进入容器的几种方式 并不是真的进入,只是建立了可以操作容器内部的连接通道
第一种: # 常用 *****
docker exec -it 容器id /bin/bash
# 1.原理 docker exec 容器id 命令语句
exec真正的作用是在容器内执行命令 只是'/bin/bash'正好会开一个bash窗口
# eg: docker exec 容器id ls
# 2.与 docker run -it 容器id 的区别:
该方式相当于新建了一个连接终端,故退出时,docker不会随即停止
# docker启动时的夯住命令还在,原连接终端没有断开。
run -it 的方式,退出的话,会断开默认连接,导致容器也自动停止了
第二种:
ssh连接 # 前提: 容器内部需要装ssh服务端
# 9 退出
exit
# 10 文件拷贝
docker cp 源地址 目标地址
宿主机 ---> 容器内
docker cp lqz.txt 容器id:/home
容器内 ---> 宿主机
docker cp 容器id:/home/lqz.txt /app
# 11 目录挂载(目录映射) 前者是宿主机目录:后者是容器目录
docker run -di --name=mycentos99 -v /home/lqz:/home centos:centos7
# 一旦挂载,以后双方操作,互相影响
# 共享的是多级目录时,可能会出现权限不足的提示
--privileged=true # 原因:CentOS7中的安全模块selinux把权限禁掉了
# 12 端口映射 前者是宿主机映射端口:后者是容器运行端口
docker run -di -p 6377:6379 redis:latest
# 了解:redis镜像启动容器时,默认命令是 'docker-entrypoint.sh'
# 执行的是 '/usr/local/bin/docker-entrypoint.sh' 脚本
# 13 查看容器详细信息
docker inspect 容器名称(容器ID)
# 14 查看容器ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
docker inspect web | grep "IPAddress"
# 每个启动的容器都各自的ip地址 (局域网 宿主机及其他容器可相互访问)
eg: 其他容器的项目 可访问 redis容器ip+6379
6 应用部署
# docker部署 mysql
# -e表示添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登陆密码
docker run -di --name=mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 官方提供的
docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# docker部署 redis
docker run -di -p 6377:6379 redis:latest
# docker部署 nginx
docker run -di --name=mynginx -p 8080:80 nginx