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
posted @ 2022-08-22 00:41  Edmond辉仔  阅读(64)  评论(0编辑  收藏  举报