Docker | 比较广泛应用的容器

2019 11 24, Sun

Docker是一个使用比较广泛的容器实现,其他的还有podman啊什么的,基于docker还有k8s/k3s。

有docker的话很多东西都会比较简单,给新手大概记一下用docker的正确姿势

组件

docker主要是由这么几部分组成

  • 依赖
    • systemd: docker会用systemd来实现一些功能,比如说调用cgroup
    • cgroup
    • namespace
  • 自身构成
    • dockerd
    • OCI组件,比如说container runtime、network driver、storage driver、logging driver等等
    • docker cli
  • 编排工具
    • docker-compose: 单机组建集群
    • docker-swarm: 多机组件集群
    • 更复杂的k8s

依赖

容器的基本原理是Linux的命名空间(namepsace),只要具有ns支持的内核的Linux理论上都可以跑容器,有docker这种工具的话会简单一些。除此之外如果要限制容器的cpu、内存或者别的资源的占用,就还需要cgroup。在比较新的机器上,这些都是由systemd管理

构成

docker这个容器引擎由两部分实现。

一部分是核心守护进程,叫dockerd,负责管理这些容器,配置网络、存储等等核心功能。默认情况下暴露出一个位于/var/run/docker.sock的unix domain socket。

一部分是我们日常调用的docker命令,一般不需要特权,直接调用就好,是我们和docker交互的主要方法。

编排

一般来说一个容器只有一个功能,多个容器才能组建一个应用。所以我们需要编排这些容器,把多个容器打通,这就是编排。

开发机,或者个人一个机器两个机器,一般docker-compose就足够了。如果是纯粹使用docker,但是又需要多个机器部署,那就需要docker-swarm。更复杂一些,如果需要failover啊熔断啊什么的,就需要k8s。后面两个选项以后再说

安装

卸载掉老版本,以及CentOS自带的docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

添加镜像源

先装好yum的工具和lvm什么的

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

docker说我们要添加一个源

sudo wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

但是实际上这个源从国内访问很慢,所以添加源以后,我们再改一下

sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

安装、启动服务,并设置自启

sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker

权限

需要正确设置权限,用普通用户时docker命令才能正常和dockerd通信。不建议用sudo执行docker命令

sudo groupadd docker
sudo usermod -aG docker $USER
sudo systemctl restart docker

SELinux

在CentOS上我们一般有默认的SELinux,用来保护我们的系统不被恶意应用侵犯。

中文博客很多建议你禁用SELinux,但是我的建议是不要禁用SELinux。为容器的类型设置permissive就好了。

容器本身已经被ns限制在一个独立空间内,为SELinux放开权限以后我们挂载目录的时候容器就可以自由的读写目录和文件了。这样还是有很多风险,但是相对来说比较小了。

sudo semanage permissive -a container_t