Docker 简介

image-20201110195524770Docker 有一个守护程序,一直监听在套接字之上。

使用镜像的流程

从远程 registry 下载镜像,下载到本地后存储到 image 仓库中。然后通过后台的 libcontainer 引擎将镜像加载到容器中。

Docker 付费版和社区版

Docker-ee 是付费版,Docker-ce 是社区版,并且是免费版。

Docker 组成

Docker daemon

运行的守护进程

Docker client

客户端的运行

Docker registries

镜像仓库,最著名的有 Docker 官方的镜像仓库,但是本地用户也可以创建一个本地的镜像仓库。

镜像和容器的关系

镜像是静态的,容器是动态的,并且有生命周期。要想运行容器

Docker 的资源对象

images 镜像,支持增删改查

containers 容器,支持增删改查

networks 网络,单独支持增删改查

volumes 卷,增删改查

plugins 插件,增删改查

Docker 的安装

找到阿里云源或者是清华大学源,都会有 docker 的 yum 源

daemon.json 文件配置

https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file 官方网址

{
  "authorization-plugins": [],
  "data-root": "",
  "dns": [],
  "dns-opts": [],
  "dns-search": [],
  "exec-opts": [],
  "exec-root": "",
  "experimental": false,
  "features": {},
  "storage-driver": "",
  "storage-opts": [],
  "labels": [],
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file":"5",
    "labels": "somelabel",
    "env": "os,customer"
  },
  "mtu": 0,
  "pidfile": "",
  "cluster-store": "",
  "cluster-store-opts": {},
  "cluster-advertise": "",
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 5,
  "default-shm-size": "64M",
  "shutdown-timeout": 15,
  "debug": true,
  "hosts": [],
  "log-level": "",
  "tls": true,
  "tlsverify": true,
  "tlscacert": "",
  "tlscert": "",
  "tlskey": "",
  "swarm-default-advertise-addr": "",
  "api-cors-header": "",
  "selinux-enabled": false,
  "userns-remap": "",
  "group": "",
  "cgroup-parent": "",
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    }
  },
  "init": false,
  "init-path": "/usr/libexec/docker-init",
  "ipv6": false,
  "iptables": false,
  "ip-forward": false,
  "ip-masq": false,
  "userland-proxy": false,
  "userland-proxy-path": "/usr/libexec/docker-proxy",
  "ip": "0.0.0.0",
  "bridge": "",
  "bip": "",
  "fixed-cidr": "",
  "fixed-cidr-v6": "",
  "default-gateway": "",
  "default-gateway-v6": "",
  "icc": false,
  "raw-logs": false,
  "allow-nondistributable-artifacts": [],
  "registry-mirrors": [],
  "seccomp-profile": "",
  "insecure-registries": [],
  "no-new-privileges": false,
  "default-runtime": "runc",
  "oom-score-adjust": -500,
  "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],
  "runtimes": {
    "cc-runtime": {
      "path": "/usr/bin/cc-runtime"
    },
    "custom": {
      "path": "/usr/local/bin/my-runc-replacement",
      "runtimeArgs": [
        "--debug"
      ]
    }
  },
  "default-address-pools":[
    {"base":"172.80.0.0/16","size":24},
    {"base":"172.90.0.0/16","size":24}
  ]
}

指定 docker 版本下载

查看所有版本

[root@centos7_10 ~]# yum list docker-ce.x86_64 --showduplicates

指定下载

apt-get -y install docker-ce=5:18.09.9~3-0~ubuntu-bionic docker-ce-cli=5:18.09.9~3-0~ubuntu-bionic

Docker 的进程

  • dockerd:服务器程序,被 client 直接访问,其父进程为宿主机的 systemd 守护进程
  • docker-proxy:每个进程 docker-proxy 实现对应一个需要网络通信的容器,管理宿主机和容器的之间端口映射,其父进程 dockerd,如果容器不需要网络则无需启动
  • containerd:被 dockerd 进程调用以实现与 runc 交互
  • containerd-shim:真正运行容器的载体,每个容器对应一个 container-shim 进程,其父进程为 containerd

Docker 安装源配置

进入网站,下载 repo 源,然后将 repo 源中的源连接替换到repo 源中https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/

yum install docker-ce

配置阿里云加速源

image-20201110211110707Docker 命令

查看 docker 的服务器版本和客户端版本 docker version

显示更详细的 docker 系统信息 docker info Storage Driver 这一项是定义的一个文件驱动

attach # 当前shell下attach连接指定运行镜像
build # 通过dockerfile定制镜像
commit # 提交当前容器为新的镜像
cp # 从容器中拷贝指定文件或者目录到宿主机中
create # 创建一个新的容器,同run 但不启动容器
diff # 查看docker 容器变化
events # 从docker 服务获取容器实时事件
exec # 在已存在的容器上运行命令
export # 导出容器的内容作为一个 tar 归档文件[对应import]
history # 展示一个镜像形成历史
images # 列出系统当前镜像
import   # 从tar包中的内容创建一个新的文件系统映像[对应export]
info # 显示系统相关信息
inspect # 查看容器详细信息
kill # kill 指定容器
load # 从一个tar 包中加载一个镜像[对应save]
login # 注册或者登陆一个docker源服务器
logout # 从当前docker registry退出
logs # 输出当前容器日志信息
port # 查看映射端口对应的容器内部源端口
pause  # 暂停容器
ps # 列出容器列表
pull # 从docker镜像源服务器拉取指定镜像或者库镜像
push # 推送指定镜像或者库镜像至docker源服务器
restart # 重启运行的容器
rm # 移除一个或者多个容器
rmi # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需要删除相关容器才可继续或 -f 强制删除]
run # 创建一个新的容器并运行一个命令
save # 保存一个镜像为一个tar包[对应load]
search # 在docker hub 中搜索镜像
start # 启动容器
stop # 停止容器
tag # 给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
version # 查看docker版本号
wait # 截取容器停止时的退出状态值

docker 常用命令

image-20201110224848820根据关键词搜索镜像 docker search 搜索出的镜像没有分隔符那么就是顶级仓库,有分隔符则是私人的仓库,docker hub 官方镜像

下载 docker 镜像 docker pull 可以替换为 docker image pull alpine 体积特别小,缺少很多工具,下载时每一层会单独下载

范例:

docker pull nginx:1-alpine

rmi 是删除镜像的意思,rm 是删除容器的意思,也可以使用 docker image rm 明确表明删除镜像

显示完整的详细信息 docker image ls --no-trunc 默认只显示前几位,带上 --no-trunc 后会显示所有位数

暂停容器运行 pause 开始容器 unpause 运行

查看容器占用资源情况 top

查看容器的 pid 及运行情况 ps

容器运行完成后立刻删除 --rm

容器运行在后台 -d/--detach

查看容器运行的日志 docker logs

进入已经开启的容器 attach 命令,可以类似于 vnc 一样,让两个终端连接同一个容器,实时同步输入命令

进入已经开启的命令 exec 命令,可以执行命令

查看指定某些状态的容器 docker ps -f status=exited

查看容器的资源信息 docker stats 命令是查看资源持续执行,会持续刷新 --no-stream 一次执行

ps top 命令可以查看某个容器的使用资源情况,会显示 CPU 和磁盘等硬件资源的使用情况。

privileged 选项是开启某个容器时,可以让这个容器暂时获得 root 的权限,并可以使用 mount 挂载宿主机的硬盘,并做出相应操作。

image-20201110224446041范例:拉取 busybox 镜像并启动 httpd 服务

拉取镜像

[root@centos7_10 ~]# docker pull busybox

查看镜像

[root@centos7_10 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1-alpine            e5dcd7aa4b5e        4 days ago          21.8MB
busybox             latest              f0b02e9d092d        3 weeks ago         1.23MB

开启容器并启动镜像

[root@centos7_10 ~]# docker run --name b1 -it busybox

启动 http 服务

/bin # mkdir -p /data/html ; echo busybox hello > /data/html/index.html
/bin # httpd -f -h /data/html/

新开终端访问页面

查看 IP 地址
[root@centos7_10 ~]# docker inspect b1
[root@centos7_10 ~]# curl 172.17.0.2
busybox hello

查看正在运行的容器进程

[root@centos7_10 ~]# docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1096b4798bc8        busybox             "sh"                6 minutes ago       Up 6 minutes                            b1

暂停容器

/bin # exit
[root@centos7_10 ~]# docker container ls -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
1096b4798bc8        busybox             "sh"                9 minutes ago       Exited (130) 5 seconds ago                       b1

重新开启容器

[root@centos7_10 ~]# docker container start -ia b1
/ #

范例:拉取 redis 镜像并配置

拉取镜像

[root@centos7_10 ~]# docker pull redis

在镜像内执行 bash 环境,交互式修改镜像

1. 创建容器
[root@centos7_10 ~]# docker container create --name r1 redis

2. 启动容器
[root@centos7_10 ~]# docker start r1

3. 执行 bash 并进入 r1 命令
[root@centos7_10 ~]# docker exec -it r1 /bin/bash

使用交互式方式进入容器,并使用服务

[root@centos7_10 ~]# docker exec -it r1 /bin/bash
root@4c6e5fd27b38:/data# redis-cli
127.0.0.1:6379> keys *
(empty array)

因为镜像中,有些命令缺失,所以给运维造成烦恼

root@4c6e5fd27b38:~# ss -ntl
bash: ss: command not found
root@4c6e5fd27b38:~# ps
bash: ps: command not found

重启规则

+ no - 容器退出时不要自动重启,这个是默认值

+on-failure 在容器非正常退出时(退出状态非0),才会重启容器

+on-failure[:max-retries] 当容器非正常退出超过设定的次数才会重启

+always 不管退出状态码是什么,始终重启容器,当指定always时,docker daemon将无数次的重启容器,容器也会在daemon启动时尝试重启,不管容器的状态如何。

+nuless-stopped 在容器退出时,总是重启,但不考虑在docker守护进程启动之时,就已经停止了的容器,