目录
docker学习的入门
/  

docker学习的入门

部分内容摘自: < Docker技术入门与实践第3版 >

核心概念

Docker镜像

Docker镜像类似于虚拟机镜像 ,可以将它理解为一个只读的模板

例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache(或用户需要的其他软件).可以把它称为 一个Apache镜像.
镜像是创建Docker容器的基础.
通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从上网上下载一个已经做好的应用镜像, 并直接使用.
  • docker image + 命令
    • build 从Dockerfile构建一个镜像
    • history 显示图镜像的历史信息
    • import 从tarball导入内容以创建文件系统镜像
    • inspect 显示镜像的详细信息
    • ls 镜像列表
    • pull 从远程仓库下载镜像到本地
    • push 将镜像上传到远程仓库
    • prune 批量删除镜像
    • rm 输出一个或多个镜像
    • save 保存一个或多个镜像
      • docker image save nieubuntu:latest -o docker_ubuntu.tar.gz 导出镜像成压缩包
    • load 导入镜像
      • docker image load -i docker_ubuntu.tar.gz
    • tag 创建一个镜像标签
      • docker image tag 镜像id 镜像名:标签

Docker容器

Docker容器类似于一个轻量级的沙箱, Docker利用容器来运行和隔离应用.

容器是从镜像创建的应用运行实例. 它可以启动, 开始, 停止, 删除, 而这些容器都是彼此相互隔离的, 互不可见的.
可以把容器开看作一个简易版的Linux系统环境(包括root用户权限, 进程空间, 用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子.

Docker仓库

Docker仓库类似于代码仓库, 是Docker集中存放镜像文件的场所.

有时候我们会将Docker仓库和仓库注册服务器(Registry)混为一谈, 并不严格区分. 实际上, 仓库注册服务器是存放仓库的地方, 其上往往存放着许多个仓库. 每个仓库集中存放某一类镜像, 往往包括多个镜像文件, 通过不同的标签(tag)来进行区分. 例如存放Ubuntu操作系统镜像仓库,  被称为Ubuntu仓库, 其中可能包括16.04, 18.04等不同版本的镜像. 

  根据所存储的镜像公开分享与否, Docker仓库可以分为公开仓库(Public), 和私有仓库(Private)两种形式.

  目前最大的公开仓库是官方提供的Docker Hub, 其中存放者数量庞大的镜像供用户下载. 国内不少云服务器提供商(如 腾讯云, 阿里云等) 也提供了仓库 的本地源, 可以提供稳定的国内访问.

  当然, 用户如果不希望公开分享自己的镜像文件, Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库.

  当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库. 这样用户下次在另外一台机器上 使用该镜像时, 只需要将其从仓库上pull下来就可以了.

Docker的安装

容器的特点

容器: 共用宿主机内核,容器的第一个进程直接运行服务,损耗少,启动快,性能高.

容器虚拟化: 不需要硬件的支持. 不需要模拟硬件, 共用宿主机的内核, 启动时间秒级(没有开机启动的流程)

**总结: **

  1. 与宿主机使用同一个内核,性能损耗小
  2. 不需要指令级模拟
  3. 容器可以在CPU核心的本地运行命令, 不需要任何专门的解释机制

开机自启

  • systemctl enable docker

docker开启命令

  • systemctl start docker
  • service docker start

docker关闭命令

  • systemctl stop docker
  • service docker stop

管理镜像

  • 搜索镜像
    • docker search 镜像名字
      • eg: docker search nginx
  • 下载镜像
    • docker pull 镜像名字
      • docker pull nginx
  • 删除镜像
    • docker image rm 镜像名字
    • docker image rmi 镜像名字
      • 支持选项包括
        • -f , -force : 强制删除镜像, 即使有容器依赖它;
        • -no-prune : 不要清理未带标签的父镜像
  • 查看镜像信息
    • docker inspect 镜像名字
  • 使用tag命令添加镜像标签(类似于链接的作用, 或者说快捷方式)
    • docker tag 镜像名字:原来的标签名 自定义镜像名:自定义标签名
      • 例如: docker tag ubuntu:18.04 myubuntu:latest

运行镜像

  • docker run -d -p 80:80 nginx:latest

    • run (创建并运行一个容器)
    • -d 放在后台运行
    • -p 端口映射
      • 前面的80是宿主机的端口
      • 后面的80是容器的端口
    • nginx docker镜像的名字
  • docker run -it --name centos6 centos:6.9 /bin/bash

    • -it 分配交互式的终端
    • --name 指定容器的名字
    • /bin/sh 覆盖容器的初始命令 (不填了话, 就默认执行容器的初始命令 )
  • 启动容器

    • docker run imahe_name
    • docker run -it image_name CMD
    • docker run === docker create + docker start
  • 停止容器

    • docker stop 容器id
  • 杀死容器

    • docker kill 容器名字
  • 查看容器列表

    • docker ps 查看当前正在运行的容器 或者(docker container ls)
    • docker ps -a查看所有状态的容器 或者(docker container ls -a)
  • 进入容器(目的, 调试, 排错)

    • docker exec -it 容器id或容器名字 /bin/bash (/bin/sh)
      • 会分配一个新的终端tty
    • docker attach 容器id
      • 使用同一个终端
    • nsenter (安装yum install -y util-linux 已弃用)
  • 查看所有容器的id

    • `docker ps -a -q
  • 删除所有容器

    • docker rm 倒引号 docker ps -a -q 倒引号
  • 当我们在容器终端时, 我们退出容器, 并让容器在后台运行

    我们可以使用docker attach 容器id返回容器

    • 直接输入 exit
    • 快捷键 ctrl + p, ctrl + q,
  • 查看最新使用过的容器

    • docker ps -a l
  • 退出容器

    • ctrl + d

总结

docker容器内的第一个进程(初始命令)必须一直处于前台运行状态,否则这个容器, 就会处于退出状态!

apt-get仓库换成国内镜像源

  • 换成中科院的
    • 1、原文件备份

      sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

      2、编辑源列表文件

      sudo vim /etc/apt/sources.list

      3、将原来的列表删除,添加如下内容(中科大镜像源)

      deb http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
      deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
      deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
      deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
      deb http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
      deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
      deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse
      deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
      deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-proposed main restricted universe multiverse
      deb-src http://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
      
      1. 运行 sudo ape-get update

容器的网络访问

电脑-pc ---> 虚拟机 ---> docker容器(多个)

端口映射

  • 指定映射(docker 会自动添加一条iptables规则来实现端口映射)
    • -p hostPort:containerPort
    • -p ip:hostPort:containerPort 多个容器都想使用80端口
    • -p ip::containerPort(随机端口)
    • -p hostPort:containerPort:udp
      • 默认都是tcp,
    • -p 81:80 -p 443:443 可以指定多个 -p
  • 随机映射
    • docker run -p (随机端口)

容器的数据卷挂载

-v 卷名:/data

-v /src(宿主机的目录):/dist(容器的目录)

  • docker run -d -p 80:80 --volume(或者 -v ) /opt/nginx:/usr/share/nginx/html
    • /usr/share/nginx/html是nginx容器中默认的站点目录, 将这个目录挂载到当前主机的/opt/nginx目录下
  • 数据卷容器
    • --volumes-from (跟某一个已经存在的容器挂载相同的卷)
  • 多端口多站点nginx
    • KF62RS.png
    • 进容器创建.conf文件, 自定义server{***}

查看当前linux是什么版本的

  • cat /etc/os-release

手动制作镜像

  • 启动一个基本的容器
    • docker run -it -p 22:22 centos:6.9 /bin/bash
  • 修改root密码 echo '123456'|passwd --stdin root
  • 安装ssh
    • yum install openssh-server -y
    • service sshd restart (start)
  • docker container commit 容器id centos6.9_ssh:v1
  • 测试镜像功能
    • docker run -it -d -p 22:22 centos6.9_ssh:v1 /usr/sbin/sshd -D
    • 宿主机 ssh 连接, 测试是否连接成功

手动制作一个支持ssh+nginx的镜像

  • docker run -it -d -p 80:80 -p 22:22 --name nginx_ssh centos6.9_ssh:v1 /bin/bash
  • 安装nginx
    • 首先配置repo
      • curl -o /etc/yum.repos.d/CentOs-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
      • curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
    • 启动nginx
      • service start nginx
  • 使用docker container commit id xxxx

开机自启

  • systemctl enable docker

docker开启命令

  • systemctl start docker
  • service docker start

docker关闭命令

  • systemctl stop docker
  • service docker stop

标题:docker学习的入门
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2019/10/10/1577974144873.html