docker入门-1

81 阅读14分钟

docker是什么

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在GitHub 上进行维护。

教学文档

docker优缺点

1. 部署方便

你一定还有印象,在我们最开始学习编程的时候,搭建环境这一步往往会耗费我们好几个小时的时间,而且其中一个小问题可能需要找很久才能够解决。你还会得到关于环境搭建方面的团队其他成员的求助。而有了容器之后,这些都变得非常容易,你的开发环境就只是一个或者几个容器镜像的地址,最多再需要一个控制部署流程的执行脚本。或者进一步将你的环境镜像以及镜像脚本放入一个git项目,发布到云端,需要的时候将它拉到本地就可以了。

# git clone https://github.com/my-project  
# sh ./my-build-boot.sh 

目前我们团队目前基本都是用这种方案搭建本地开发环境,而且整理成内部技术文档,慢慢沉淀成团队的财富了。

2. 部署安全

当我们收到一个bug反馈的时候,很多时候心里面的第一反应一定是“我本地是好的啊”!这种情况的发生就在于环境的不一致,我们在开发过程中的调试往往不能保证其他环境的问题,但是我们却要为此买单,这真是一件令人苦恼的事情。有了容器之后,这将很少发生。我们可以通过容器技术将开发环境和测试环境以及生产环境保持版本和依赖上的统一,保证代码在一个高度统一的环境上执行。而测试环境的统一,也同样能解决CI流程对环境的要求。

分布式技术和扩容需求日益增长的今天,如果运维能够使用容器技术来进行环境的部署,不仅仅在部署时间上节省不少,也能把很多因为人工配置环境产生的失误降到最低。

3. 隔离性好

不管是开发还是生产,往往我们一台机器上可能需要跑多个服务,而服务各自需要的依赖配置不尽相同,假如说两个应用需要使用同一个依赖,或者两个应用需要的依赖之间会有一些冲突,这个时候就很容易出现问题了。所以同一台服务器上不同应用提供的不同服务,最好还是将其隔离起来。而容器在这方面有天生的优势,每一个容器就是一个隔离的环境,你对容器内部提供服务的要求,容器可以自依赖的全部提供。这种高内聚的表现可以实现快速的分离有问题的服务,在一些复杂系统中能实现快速排错和及时处理。(当然需要说明的是,这个隔离性只是相对于服务器比较的,虚机技术要拥有更好的隔离性)

4. 快速回滚

容器之前的回滚机制,一般需要基于上个版本的应用重新部署,且替换掉目前的问题版本。在最初的时代,可能是一套完整的开发到部署的流程,而执行这一套流程往往需要很长的时间。在基于git的环境中,可能是回退某个历史提交,然后重新部署。这些跟容器技术相比都不够快,而且可能会引起新的问题(因为是基于新版本的修改)。而容器技术天生带有回滚属性,因为每个历史容器或者镜像都会有保存,而替换一个容器或者某个历史镜像是非常快速和简单的。

5. 成本低

这可能是一个最明显和有用的优点了,在容器出现之前,我们往往构筑一个应用就需要一台新的服务器或者一台虚机。服务器的购置成本和运维成本都很高,而虚机需要占用很多不必要的资源。相比之下,容器技术就小巧轻便的多,只需要给一个容器内部构建应用需要的依赖就可以了,这也是容器技术发展迅速的最主要原因。

6. 管理成本更低

随着容器技术的不断普及和发展,随之而来的容器管理和编排技术也同样得到发展。诸如Docker Swarm,Kubernetes, Mesos等编排工具也在不断的迭代更新,这让容器技术在生产环境中拥有了更多的可能性和更大的发挥空间。而随着大环境的发展,docker等容器的使用和学习的成本也是愈发降低,成为更多开发者和企业的选择。

说了这么多的优点,容器也有一些问题是没有解决的。上一代方案基本就是基于虚机技术的云方案,能有效增加服务器的使用效率,达到节省成本的目的,而容器技术在此基础上更进一步地优化了资源的使用率。但是仍然有一些问题,是我们在选择服务资源架构场景中需要考虑的:

1.隔离性

基于hypervisor的虚机技术,在隔离性上比容器技术要更好,它们的系统硬件资源完全是虚拟化的,当一台虚机出现系统级别的问题,往往不会蔓延到同一宿主机上的其他虚机。但是容器就不一样了,容器之间共享同一个操作系统内核以及其他组件,所以在收到攻击之类的情况发生时,更容易通过底层操作系统影响到其他容器。当然,这个问题可以通过在虚机中部署容器来解决,可是这样又会引出新的问题,比如成本的增加以及下面要提到的问题:性能。

2. 性能

不管是虚机还是容器,都是运用不同的技术,对应用本身进行了一定程度的封装和隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随机而来的,就会产生更多的网络连接转发以及数据交互,这在低并发系统上表现不会太明显,而且往往不会成为一个应用的瓶颈(可能会分散于不同的虚机或者服务器上),但是当同一虚机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为应用瓶颈的时候,容器会将这个问题放大,所以,并不是所有的应用场景都是适用于容器技术的。

3. 存储方案

容器的诞生并不是为OS抽象服务的,这是它和虚机最大的区别,这样的基因意味着容器天生是为应用环境做更多的努力,容器的伸缩也是基于容器的这一disposable特性,而与之相对的,需要持久化存储方案恰恰相反。这一点docker容器提供的解决方案是利用volume接口形成数据的映射和转移,以实现数据持久化的目的。但是这样同样也会造成一部分资源的浪费和更多交互的发生,不管是映射到宿主机上还是到网络磁盘,都是退而求其次的解决方案。

随着硬件技术和网络技术的迭代发展,容器技术的缺点会变得越来越不那么明显,而且随着容器技术的发展和普及,对应的解决方案也会越来越多。所以总体来看,docker等容器技术会朝着更加普及的趋势走近我们技术领域。也希望每一位热爱技术的小伙伴们能更加了解这些新技术,让它们能够更好的为我们服务。

原文来自:os.51cto.com/art/202009/…

本文地址:www.linuxprobe.com/docker-pros…编辑:圆蛋,审核员:逄增宝

Linux命令大全:www.linuxcool.com/

Linux系统大全:www.linuxdown.com/

红帽认证RHCE考试心得:www.rhce.net/

安装环境

提供虚拟机包-直到docker安装完成。

  • centos7.9最小化安装 4Gib/4vCPU
  • VMware® Workstation 16 Pro 16.2.0 build-18760230
  • 用户名:root,密码:admin123
虚拟机配置图

image-20220619100904058

ip配置图

image-20220619101536974

初始设置

关闭防火墙

内网服务器没必要打开防火墙。如果不关闭,到时候安装k8s,需要放行对应端口。

systemctl stop firewalld && systemctl disable firewalld
关闭iptables防火墙(可选)

安装iptables

yum install iptables-services -y 

禁用iptables

service iptables stop  && systemctl disable iptables**

清空防火墙规则

iptables -F** 
关闭selinux
临时生效
setenforce 0
永久生效配置

替换变量

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

重启后生效

reboot
测试

输入getenforce,显示Disabled,则表示设置成功。

[root@dockerStudy ~]# getenforce
Disabled
校时

如果服务器时间差距过大,会导致服务异常。

安装ntp
yum install -y ntp ntpdate
向校时服务器校时

时间快8小时解决

ln -sf /usr/share/zoneinfo/UTC /etc/localtime
ntpdate cn.pool.ntp.org
设置校时定时任务

指令

crontab -e 

添加任务

* */1 * * * /usr/sbin/ntpdate   cn.pool.ntp.org

邮件通知

您在 /var/spool/mail/root 中有邮件

查看邮件

cat /var/spool/mail/root

删除邮件

cat /dev/null > /var/spool/mail/root
安装基础依赖
yum install -y  wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack

下行命令,是为了解决在配置docker-ce国内yum源,提示-bash: yum-config-manager: 未找到命令

yum -y install yum-utils

image-20220619104508607

安装docker-ce

基础步骤
设置docker-ce国内yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker所需要的依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
安装docker
yum install docker-ce -y
启动docker并设置开机自启
systemctl start docker && systemctl enable docker
查看启动状态
systemctl status docker

结果如下

[root@dockerStudy ~]# systemctl status docker
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since  2022-06-19 10:49:17 CST; 1min 2s ago
     Docs: https://docs.docker.com
 Main PID: 2274 (dockerd)
   CGroup: /system.slice/docker.service
           └─2274 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
..........
Hint: Some lines were ellipsized, use -l to show in full.

查看docker信息

 docker info
[root@dockerStudy lib]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
  scan: Docker Scan (Docker Inc., v0.17.0)

..................

 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

查看docker版本

 docker version
[root@dockerStudy lib]#  docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:05:12 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:03:33 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
高级设置
开启包转发功能和修改内核参数

br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。(个人不是太懂linux网络这块)

教学文档

步骤

  • 加载模块

    modprobe br_netfilter
    
  • 开启转发,覆盖文件

    cat > /etc/sysctl.d/k8s.conf <<EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    net.ipv4.ip_forward = 1
    EOF
    
  • 启用配置

    sysctl -p /etc/sysctl.d/k8s.conf
    

注解:Docker 安装后出现:WARNING: bridge-nf-call-iptables is disabled 的解决办法。但是个人安装并未出现这个问题。

以上配置重启后失效,需要设置开机自动加载模块脚本

循环执行脚本

新建或者追加脚本

[root@centos60 ~]# cat /etc/rc.sysinit
cat: /etc/rc.sysinit: 没有那个文件或目录

新建脚本

cat > /etc/rc.sysinit <<EOF
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF

添加加载模块脚本

cat > /etc/sysconfig/modules/br_netfilter.modules <<EOF
modprobe br_netfilter
EOF

授予执行权限

7-创建者所有权限 5(4+1)同组执行和读取权限 5(4+1)其他用户执行和读取权限。

chmod 755 /etc/sysconfig/modules/br_netfilter.modules

重启测试

lsmod |grep br_netfilter

结果如下:

[root@dockerStudy ~]# lsmod |grep br_netfilter
br_netfilter           22256  0 
bridge                151336  1 br_netfilter
设置镜像加速

通过https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors获取阿里云的加速

{
    "registry-mirrors": ["https://y8y6vosv.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}

重启docker生效

systemctl daemon-reload
systemctl restart docker

image-20220619112601400

基础使用命令

镜像操作

搜索镜像
docker search centos

image-20220619202453186

内容描述

  • name-镜像名字
  • description-描述
  • stars-关注数
  • offical-是否是官方镜像
  • automated-是不是自动化编译出来的,自动化是指通过 dockerfile 制作的
下载镜像
docker pull centos

结果

[root@dockerStudy ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
  latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
您在 /var/spool/mail/root 中有新邮件
[root@dockerStudy ~]#   docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    5d0da3dc9764   9 months ago   231MB
查看下载的镜像
docker images
导出导入镜像
导入

在外网下载镜像,然后再把压缩包放入内网进行解压,实现内网docker安装镜像。

docker save -o centos.tar.gz centos
导出
docker load -i centos.tar.gz
删除
docker rmi -f centos:latest

容器操作

以交互方式启动并进入容器
docker run --name=hello -it centos /bin/bash
  1. run表示启动容器

  2. name表示容器名字

  3. /bin/bash说明你的shell类型为bash,bash shell是最常用的一种shell, 是大多数Linux发行版默认的shell。 此外还有C shell等其它shell。

  4. it,分别表示-i交互式,-t表示分配伪终端。

    交互式模式:就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。(举例:最常见的交互式shell,就是我们利用虚拟机登录Linux系统时的那个等待登录界面:系统在等待我们键入登录的用户名和密码,这就是一种交互式shell) 非交互式模式:是以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。(举例:非交互式shell就像我们写的那些很简单的脚本,比如一个脚本展示出:helloworld。这个脚本不需要我们对其进行交互,它就只是很简单的将其脚本中的命令按顺序执行)

    CSDN-blog.csdn.net/Doudou_Mylo…

    终端描述

    1. 物理终端:直接连接在主机上的显示器、键盘鼠标统称。在实际机架式服务器部署中,一般是多台服务器共享一套终端,简称KVM(Keyboard键盘,video显示器,mouse鼠标)
    2. 虚拟终端(tty):附加在物理终端之上,用软件方式虚拟实现,CentOS默认启用6个虚拟终端,可以通过快捷键来切换,切换方式:Ctrl-Alt-F[1--6], 对应的文件是/dev/tty#。可以同过tty命令来查看当前的虚拟终端号。tty是teletypewriter的简称。
    3. 伪终端(pty):两种应用场景,第一在图形界面下打开的命令行接口,第二基于ssh协议或telnet协议等远程打开的命令行界面,是运维工程师用的最多的一种连接服务器的方式。pts(pseudo-terminal slave)是pty的实现方法。

    892435-20170918030949337-45017950.png (938×251)

退出容器命令

exit
缺点

因为不是守护进程方式启动,所以退出容器的时候,就会导致容器结束。

以守护进程方式启动容器
docker run --name=hello1 -td centos
  1. d(daemon)表示守护进程

使用以下命令即可进入容器

docker exec -it hello1 /bin/bash

退出

exit
查看容器
docker ps

image-20220619205713412

追加-a参数即可看到所有容器。

image-20220619205856132

关闭容器
docker stop hello1
打开容器
docker start hello1
删除容器
docker rm -f hello1
docker --help
管理命令:
  builder     管理构建
  config      码头工人管理配置
  container   管理容器
  engine      管理docker引擎
  image       管理图像
  network     管理网络
  node        管理群节点
  plugin      管理插件
  secret      管理码头工人的秘密
  service     管理服务
  stack       管理码头工人栈
  swarm       管理群
  system      管理码头工人
  trust       管理Docker映像上的信任
  volume      管理卷
  
操作命令:
  attach      将本地标准输入、输出和错误流附加到正在运行的容器中
  build       从Dockerfile构建一个映像
  commit      从容器的更改中创建一个新映像
  cp          在容器和本地文件系统之间复制文件/文件夹
  create      创建一个新容器
  diff        检查容器文件系统上文件或目录的更改
  events      从服务器获取实时事件
  exec        在正在运行的容器中运行命令
  export      将容器的文件系统导出为tar存档文件
  history     显示图像的历史
  images      图片列表
  import      从tarball导入内容以创建文件系统映像
  info        显示整个系统的信息
  inspect     返回Docker对象的底层信息
  kill        杀死一个或多个正在运行的容器
  load        从tar存档或STDIN加载图像
  login       登录到Docker注册表
  logout      从Docker注册表注销
  logs        获取容器的日志
  pause       暂停一个或多个容器中的所有进程
  port        列出容器的端口映射或特定映射
  ps          列表容器
  pull        从注册表中提取映像或存储库
  push        将映像或存储库推入注册表
  rename      重命名一个容器
  restart     重新启动一个或多个容器
  rm          移除一个或多个容器
  rmi         删除一个或多个图像
  run         在新容器中运行命令
  save        将一个或多个图像保存到tar存档文件(默认情况下流到STDOUT)
  search      在Docker集线器中搜索图像
  start       启动一个或多个停止的容器
  stats       显示容器资源使用统计数据的实时流
  stop        停止一个或多个正在运行的容器
  tag         创建一个引用SOURCE_IMAGE的标记TARGET_IMAGE
  top         显示容器的运行进程
  unpause     在一个或多个容器中暂停所有进程
  update      更新一个或多个容器的配置
  version     显示Docker版本信息
  wait        阻塞,直到一个或多个容器停止,然后打印它们的退出代码

测试

在docker的centos容器里面安装nginx服务

  1. 启动容器

    docker run --name nginx -p  80 -itd centos
    
    • -p 80表示随机映射 本机一个空闲端口到容器里面的一个端口。nginx需要80端口。
  2. 查看容器状态

    docker ps |grep nginx
    

    可以从下面结果看出,本机端口49153已经映射到了容器的80端口

    [root@dockerStudy ~]# docker ps |grep nginx
    0ca35fbf7924   centos    "/bin/bash"   5 minutes ago    Up 5 minutes    0.0.0.0:49153->80/tcp, :::49153->80/tcp   nginx
    
  3. 进入容器

     docker exec -it nginx /bin/bash
    
  4. 查看ip情况

    从eth0可以看到,docker网卡是占用了172.17.0.1/16,容器启动,docker就会分配一个ip给容器。

    image-20220619210759183

  5. 安装nginx

    依次执行下面的代码(否则会存在安装nginx命令失效情况)

    rm -rf /etc/yum.repos.d/*
    curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
    yum install wget -y
    yum install nginx -y 
    

    前两句如果不执行则会出现

    Failed to set locale, defaulting to C.UTF-8
    Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlis
    

    截图如下

    参考图

  6. 创建nginx的html文件夹

    mkdir /var/www/html -p
    
  7. 创建index.html

    cat >/var/www/html/index.html <<EOF
    <html>
            <head>
                     <title>nginx in docker</title>
            </head>
            <body>
                    <h1>hello,My Name is xianchao</h1>
            </body>
    </html>
    EOF
    
  8. 修改nginx的root路径

    vim /etc/nginx/nginx.conf
    

    修改红框部分代码为/var/www/html/;

    image-20220619211745401

  9. 检查结果

    走docker的网卡

    curl localhost:80
    

    image-20220619212200769

  10. 或者走虚拟机映射端口

    image-20220619212027781

流量走向

graph TD;
节点ip:port-->容器ip:port-->nginx;