引言

本文从“docker介绍”,“环境搭建”,“docker使用”三个方面介绍docker,内容简单,希望起到一个辅助梳理知识点入门的作用

1·docker介绍

docker是什么,引用百度百科的说法:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker使用Go语言编写,并且使用了一系列Linux内核提供的特性来实现其功能。

1.1·docker组件架构

docker客户端:docker客户端是用户与docker服务交互的窗口,就是我们在命令行用docker 命令

docker服务:有一个守护进程(docker daemon),监听来自客户端的请求,也就是命令,管理docker的镜像,容器,网络。磁盘等对象

镜像仓库:你需要任何镜像都可以从镜像仓库中获取,可以根据需要配置镜像源

本地docker 搭建kafka 使用docker搭建开发环境_容器

1.2·核心概念

Docker使用的Linux核心模块功能包括下列各项:

  • Cgroup – 用来分配硬件资源
  • Namespace – 用来隔离不同Container的执行空间
  • AUFS(chroot) – 用来建立不同Container的档案系统
  • SELinux – 用来确保Container的网路的安全
  • Netlink – 用来让不同Container之间的行程进行沟通
  • Netfilter – 建立Container埠为基础的网路防火墙封包过滤
  • AppArmor – 保护Container的网路及执行安全
  • Linux Bridge – 让不同Container或不同主机上的Container能沟通

1.2.1·Docker namespace

通过抽象方法使得namespace中的进程看起来拥有它们自己的隔离的全局系统资源实例 命名空间是Linux内核强大的特性。每个容器都有自己的命名空间,运行在其中的应用都是在独立操作系统中运行一样。命名空间保证了容器之间彼此互不影响

一些Docker使用到的命名空间有:

  • pid命名空间: 进程隔离(PID: Process ID)
  • net命名空间: 管理网络接口(NET: Networking)
  • ipc命名空间: 管理进程间通信资源 (IPC: InterProcess Communication)
  • mnt命名空间: 管理挂载点 (MNT: Mount)
  • uts命名空间: 隔离内核和版本标识 (UTS: Unix Timesharing System)

1.2.2·Docker CGroups

让容器受限制地使用系统资源,比如网络、磁盘、CPU以及内存等,也是为了让容器更可控。

 

1.3·容器和镜像

docker最重要的两个概念就是镜像和容器,用编程的方法来解释的话:

镜像就像是类,而容器就是实例化的对象

1.3.1·镜像

docker镜像是一个只读模板,可以用来创建docker容器。镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。它包含运行某个软件所需要的所有的内容,包括代码、运行时、库、环境变量、配置文件等。

任何镜像的创建会基于其他的父镜像,也就是说镜像是一层套一层,比如一个tomcat镜像,需要运行在centos/ubuntu上,那我们的tomcat镜像就会基于centos/ubuntu镜像创建。

1.3.2·容器

docker的容器是用镜像创建的运行实例,docker可以利用容器独立运行一个或一组应用。我们可以使用客户端或者API控制容器的启动、开始、停止、删除。每个容器之间是相互隔离的。

容器时没有单独自己的内核的,是共享宿主机内核的

1.4·容器创建的过程

  1. 拉取镜像,若本地已经存在该镜像,则不用到Docker仓库去拉取
  2. 使用镜像创建新的容器
  3. 分配union文件系统并且挂载一个可读写的层,任何修改容器的操作都会被记录在这个读写层上,你可以保存这些修改成新的镜像,也可以选择不保存,那么下次运行改镜像的时候所有修改操作都会被消除
  4. 分配网络/桥接接口,创建一个允许容器与本地主机通信的网络接口
  5. 设置ip地址,从池中寻找一个可用的ip地址附加到容器上,换句话说,localhost并不能访问到容器
  6. 运行你指定的程序
  7. 捕获并且提供应用输出:连接并且记录标准输出、输入和错误让你可以看到你的程序是如何运行的。

2·环境搭建

2.1·安装

2.1.1·yum安装

yum -y install docker-ce docker-ce-cli

2.1.1·离线安装

去官方得到源文件,放到你的服务器上,解压到你指定的安装目录:

官方下载地址:https://download.docker.com/linux/static/stable/x86_64/

我这里下载的是19.03.13版本

本地docker 搭建kafka 使用docker搭建开发环境_端口映射_02

可以直接wget

wget https://download.docker.com/linux/static/stable/x86_64/docker-19.03.13.tgz

也可以下载后上传,然后解压安装

解压安装包:tar -zxvf docker-19.03.13.tgz

将解压出来的目录下的执行文件可瓯北到/usr/bin/下:cp docker/* /usr/bin/

这个时候就可以使用docker命令了,但是docker还没启动,所以命令会报错

可以将docker注册为service服务,新建/etc/systemd/system/docker.service文件,内容如下:

[Unit]
 Description=Docker Application Container Engine
 Documentation=https://docs.docker.com
 After=network-online.target firewalld.service
 Wants=network-online.target[Service]
 Type=notify
 ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
 ExecReload=/bin/kill -s HUP $MAINPID
 LimitNOFILE=infinity
 LimitNPROC=infinity
 LimitCORE=infinity
 TimeoutStartSec=0
 Delegate=yes
 KillMode=process
 Restart=on-failure
 StartLimitBurst=3
 StartLimitInterval=60s[Install]
 WantedBy=multi-user.target


 

然后:

添加执行权限:chmod +x /etc/systemd/system/docker.service

重新加载文件:systemctl daemon-reload

启动docker:systemctl start docker

这样就可以正常使用docker了

 

2.2·镜像源

如果要修改镜像源,可以修改文件/etc/docker/daemon.json(没有就创建)

{
  "registry-mirrors" : [       
    "http://docker.mirrors.ustc.edu.cn",
    "http://registry.docker-cn.com",
    "http://hub-mirror.c.163.com"
  ],
  "insecure-registries" : [
    "registry.docker-cn.com",
    "docker.mirrors.ustc.edu.cn"
  ],
  "debug" : true,
  "experimental" : true
}

国内的docker镜像源有下面这些

Docker中国官方镜像加速

--registry-mirror=https://registry.docker-cn.com

网易163镜像加速

--registry-mirror=http://hub-mirror.c.163.com

中科大镜像加速

--registry-mirror=https://docker.mirrors.ustc.edu.cn

阿里云镜像加速

--registry-mirror=https://{your_id}.mirror.aliyuncs.com

daocloud镜像加速

--registry-mirror=http://{your_id}.m.daocloud.io

 

2.3·容器与镜像存储路径

docker镜像的默认存储路径是/var/lib/docker(docker info 命令也可以看到使用的存储路径)

本地docker 搭建kafka 使用docker搭建开发环境_端口映射_03

可在文件/usr/lib/systemd/system/docker.service中修改下面内容:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

改为

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --graph /usr/local/docker

然后将原目录的文件都拷贝到新目录中去:

cp -rf /var/lib/docker/* /usr/local/docker /

然后重启启动docker

 

如果修改配置文件的方法不生效,可以直接用软连接的方式

mv /var/lib/docker /usr/local/docker

ln -s  /usr/local/docker /var/lib/docker

本地docker 搭建kafka 使用docker搭建开发环境_centos_04

 

3·docker使用

3.1·镜像

3.1.1·获取镜像

查找镜像:docker search httpd

获取镜像:docker pull httpd

删除镜像:docker rmi httpd

查看本地镜像:docker images

如:用docker pull 获取centos7的镜像之后,用docker images就可以看到了

本地docker 搭建kafka 使用docker搭建开发环境_容器_05

本地docker 搭建kafka 使用docker搭建开发环境_端口映射_06

3.1.2·生成镜像

docker commit :从容器创建一个新的镜像。

命令格式:docker commit [参数] 容器 [REPOSITORY[:TAG]]

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

举例:

docker commit -a "dragon" -m "my nginx" 154b9e5bdfff mynginx:first

3.1.3·其他镜像常见命令

docker history : 查看指定镜像的创建历史。

docker tag : 标记本地镜像,将其归入某一仓库。

docker build 命令用于使用 Dockerfile 创建镜像。(后面单独讲解)

docker save : 将指定镜像保存成 tar 归档文件。

docker load : 导入使用 docker save命令导出的镜像。

docker import : 从归档文件中创建镜像。

3.2·容器

3.2.1·查看当前存在的容器

docker ps 命令可以查看当前服务器上在跑的容器的信息,其中的ID是比较重要的,通过ID可以对容器进行后续操作

本地docker 搭建kafka 使用docker搭建开发环境_容器_07

docker ps -a 可以看到停止的docker

本地docker 搭建kafka 使用docker搭建开发环境_容器_08

docker ps -l 查看最近创建的容器

3.2.2·容器创建/删除

【1】创建容器并启动:docker run

命令格式:docker run  [参数]  image   [命令]

参数:

  • -i :以交互模式运行容器,通常与 -t 同时使用;
  • -t :为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name = xxx:给容器命名为xxx
  • -d :后台运行容器,并返回容器ID
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "docke_one": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • -cpuset="0-2" or --cpuset="0,1,2" :绑定容器到指定CPU运行;
  • -m :设置容器使用内存最大值;
  • -net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • --link=[] :添加链接到另一个容器;
  • -expose=[] :开放一个端口或一组端口;
  • --volume , -v: 绑定一个卷

创建容器,并以命令行模式进入该容器

docker run -it centos:centos7  /bin/bash

本地docker 搭建kafka 使用docker搭建开发环境_容器_09

创建容器,后台运行

docker run -itd --name wxl_test2 centos:centos7  /bin/bash

本地docker 搭建kafka 使用docker搭建开发环境_容器_10

建容器(容器中使用systemctl,service命令报错就这样创建)

docker run -it -p 127.0.0.1::22 --name dragon4 --privileged=true  centos:centos7  /usr/sbin/init

【2】创建容器不启动:docker create 

命令格式:docker create [参数] IMAGE [命令]

举例:docker create --name mynginx nginx:latest

【3】删除容器:docker rm

命令格式:docker rm [参数] 容器_id [容器 ...]

  • -f :通过 SIGKILL 信号强制删除一个运行中的容器。
  • -l :移除容器间的网络连接,而非容器本身。
  • -v :删除与容器关联的卷。

 

3.2.2·启停/重启容器

命令格式:docker start/stop/restart  容器

 

3.3.3·进入容器

【1】docker attach

命令格式:docker attach 容器_ID

attach命令进入容器后推出,会导致容器停止

如:

attach之前,de40f9c647a2容器是up的

本地docker 搭建kafka 使用docker搭建开发环境_容器_11

attach进入并退出之后,de40f9c647a2容器就停止了

本地docker 搭建kafka 使用docker搭建开发环境_centos_12

 

【2】docker exec

命令格式:docker exec [参数] 容器 COMMAND [ARG...]

  • -d :分离模式: 在后台运行
  • -i :即使没有附加也保持STDIN 打开
  • -t :分配一个伪终端

如:

在容器  154b9e5bdfff  中开启一个交互模式的终端:

docker exec -it 154b9e5bdfff  /bin/bash

本地docker 搭建kafka 使用docker搭建开发环境_端口映射_13

3.3.4·其他常用操作命令

【1】docker kill:杀掉一个运行中的容器

命令格式:docker kill [参数] 容器 [容器...]

参数:-s :向容器发送一个信号

举例:docker kill -s KILL mydocker

【2】docker pause / docker unpause :暂停/恢复容器中所有的进程

命令格式:docker pause/unpause  容器 [容器...]

举例:docker pause mydocker

【3】docker logs:获取容器的日志

命令格式:docker logs 容器

举例如下,获取到了容器中的历史操作命令

本地docker 搭建kafka 使用docker搭建开发环境_容器_14

【4】docker port :列出指定的容器的端口映射

命令格式: docker port 容器

 

3.3·其他常见处理

3.3.1·容器端口映射

【1】docker run -P (大写)

将容器内部开放的网络端口随机映射到宿主机的一个端口上

如:

docker run -it -P  --name dragon --privileged=true  centos:centos7  /usr/sbin/init

【2】docker run -p (小写)

指定要映射的端口,一个指定端口上只可以绑定一个容器

指定主机一个端口映射到容器的指定端口:

docker run -it -p 127.0.0.1:8888:22 --name dragon4 --privileged=true  centos:centos7  /usr/sbin/init

随机指定主机一个端口映射到容器的指定端口:

docker run -it -p 127.0.0.1::22 --name dragon4 --privileged=true  centos:centos7  /usr/sbin/init

指定主机一个端口映射到容器的指定端口,不指定IP(映射所有接口地址):

docker run -it -p 8888:22 --name dragon4 --privileged=true  centos:centos7  /usr/sbin/init

【3】查看当前端口映射

 docker port 容器

本地docker 搭建kafka 使用docker搭建开发环境_本地docker 搭建kafka_15

【4】修改已经存在的容器的端口映射

要么废掉容器,重新生成容器的时候加上端口映射,但这样不推荐,可以先停止容器,然后直接修改对应容器的配置文件hostconfig.json

先用docker info看下自己docker的存储路径

我这里的存储路径如下

本地docker 搭建kafka 使用docker搭建开发环境_容器_16

对应容器的配置文件如下:

/usr/local/docker/containers/9971531d00113215718bc587d5e0cd0456e60347b1b4eb43c3f77b6cfd39826e/hostconfig.json

找到其中的PortBindings内容进行修改,例如我修改的容器中的原内容如下,如果需要添加,直接修改

"PortBindings":{
               "22/tcp": [
                         {"HostIp":"127.0.0.1","HostPort":""}
                ]
}


 

3.3.2·容器存储映射

docker存储映射是很常用和有用的,可以在容器中映射目录到宿主机的目录上,例如配置文件,程序包等等都可以放在映射的目录上

命令格式:docker -v 物理机文件夹:容器文件夹  镜像

举例:将宿主机/root/wxl/目录映射成容器中的/data_wxl 目录

docker run -d -v /root/wxl/:/data_wxl httpd

本地docker 搭建kafka 使用docker搭建开发环境_本地docker 搭建kafka_17

在容器中df -h也是可以看到

本地docker 搭建kafka 使用docker搭建开发环境_本地docker 搭建kafka_18