docker基于内核NameSpace和Cgroups 实现资源管理,在操作系统中, 可以根据宿主机的资源情况,创建不同应用与数量不同的容器。每个容器的CPU、Memory、Network由系统的内核NameSpace进行隔离, 相互之间不影响。

为了防止某个正在运行的容器大量占用宿主机的系统资源(CPU、Memory、Network), 那么将由操作系统的Cgroups功能进行资源限制(防止独占)。

容器运行的基础是需要镜像,并且新容器的运行也是需要存储支持的。在Docker中使用OverlayFS解决这一问题。

NameSpace 资源隔离

Cgroups 资源限制

OverlayFS 存储

 

安装环境,CentOS 7.5 ,初始化略

先将本地包上传到服务器:

docker-ce-19.03.6-3.el7.x86_64.rpm docker-ce-cli-19.03.6-3.el7.x86_64.rpm containerd.io-1.2.10-3.2.el7.x86_64.rpm

然后进入上传目录,yum安装本地包

yum localinstall docker-ce-19.03.6-3.el7.x86_64.rpm docker-ce-cli-19.03.6-3.el7.x86_64.rpm containerd.io-1.2.10-3.2.el7.x86_64.rpm

 

启动docker

systemctl start docker

设置开机启动

systemctl enable docker

下边命令是查看系统开机启动的服务

systemctl list-unit-files | grep enabled

 

 

修改daemon.json,改docker数据目录和配置阿里云镜像加速器。

{
  "registry-mirrors": ["https://fznv4ifc.mirror.aliyuncs.com"],
    "data-root": "/data/docker"
}

 重新加载文件

systemctl daemon-reload

重启docker服务

systemctl restart docker.service

 

启动第1个docker应用,会自动拉取镜像并运行。

docker run hello-world 

 

docker通信方式,默认是用socket

把docker服务停掉后来检查一下docker info

docker通信方式,默认是用socket

[root@node1-linux install]# systemctl stop docker
[root@node1-linux install]# docker info          
Client:
 Debug Mode: false

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info

 

Docker客户端和服务端是使用Socket方式连接,主要有以下几种方式:

本地的socket文件unix:///var/run/docker/sock (默认)

tcp://host:prot (演示)

fd://socketfd

 

## 修改连接参数 加上tcp支持 

vim /usr/lib/systemd/system/docker.service

 

将下边这行改一下

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

#这是版本1

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

# 版本2 同时支持tcp与socket

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock

 

重新加载文件

systemctl daemon-reload

重启docker服务

systemctl restart docker.service

 

查看状态验证,红色部分是我自己标的,这里能验证修改已生效:

[root@node1-linux install]# systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2020-12-28 02:53:06 EST; 1min 9s ago
Docs: https://docs.docker.com
Main PID: 16015 (dockerd)
Tasks: 13
Memory: 46.2M
CGroup: /system.slice/docker.service
└─16015 /usr/bin/dockerd -H tcp://0.0.0.0 -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock

验证端口,docker服务默认端口是2375,那么上边这个配置文件修改时也可以加上端口:

[root@node1-linux install]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 888/sshd
tcp6 0 0 :::2375 :::* LISTEN 16015/dockerd
tcp6 0 0 :::22 :::* LISTEN 888/sshd

 

 

这时可以从另外一台机器来远程查看当前服务器的状态了:

docker -H 192.168.1.51:2375 info

远程查看镜像

docker -H 192.168.1.51:2375 images

 

docker镜像操作

搜索镜像

docker search nginx

下载镜像,(没有指定版本,默认会下载最新版latest)

docker pull nginx:latest  = docker pull nginx

 

  Docker 加载镜像流程

1)检查本地是否有与启动镜像相匹配的镜像。

2)查询与镜像地址中是否有启动镜像

3)如果在镜像地址中没有完整的地址,则从默认的Docker Hub下载。

 

 基于容器创建镜像系统

#类似虚拟机的克隆功能

#在运行当中的容器基础上创建一个新的镜像(相当于vm 的快照)

 

 

docker container commit 0cc7ddd85c92 centos-nginx:1.0

 

#0cc7ddd85c92 原运行容器ID,后边的centos-nginx:1.0 是新起的名字和tag

如果创建了新的镜像,那在删除这个子镜像前不能删除原镜像。

[root@node1-linux install]# docker rmi ae2feff98a0c

Error response from daemon: conflict: unable to delete ae2feff98a0c (cannot be forced) - image has dependent child images

 

使用新创建的镜像来启动一个新容器

docker run -d -p 90:80 centos-nginx:1.0

 

删除镜像

要先将镜像创建的容器停掉并且删除容器再删镜像,当容器停止后没删除前可以-f强制删除,容器运行中强制删除也不能删。

要注意子镜像问题。

# 列出所有镜像

docker images

docker ps -a 列出所有运行的容器

 

docker stop 容器名字或ID

docker rm 容器ID

格式:

docker rmi 镜像ID

 

 

镜像导入导出

导出:

docker image save nginx > nginx.tar.gz
docker save nginx:latest > nginx1.tar.gz

 

导入:

docker load -i <fileName>.tar.gz

 

如果原来的镜像还在系统中,那么新导入的镜像将不可见。

先删除原镜像,再导入,我这是nginx镜像测试

先要将所有基于该镜像运行的容器停止并删除。命令顺序如下:

docker ps -a

docker rm

docker rmi

docker load -i nginx.tar.gz

 

 

镜像tag标签

语法:docker image tag 源_IMAGE[:TAG] 目标_IMAGE[:TAG]

类似linux 硬链接,在推送镜像到私有仓库时,需要添加tag

docker image tag nginx:latest hk.com/nginx:v1

[root@node1-linux install]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ae2feff98a0c 13 days ago 133MB hk.com/nginx v1 ae2feff98a0c 13 days ago 133MB

 

可以用新的tag标签启动容器,注意命令参数顺序不能变

-itd说

-i

以交互模式运行容器,通常与 -t 同时使用;

-t

为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-d

后台运行容器,并返回容器ID;

--name 给容器指定一个名字

docker run -itd --name hknginx -p 90:80 hk.com/nginx:v1

 

 

通过Dockerfile构建一个jdk镜像,并利用该镜像启动一个容器

先将jdk包上传到服务器上的指定目录

比如/root/jdk

mkdir /root/jdk

用的frolvlad/alpine-glibc基础镜像,所以需要先pull该镜像到本地。

docker pull frolvlad/alpine-glibc

编辑Dockerfile文件

cd /root/jdk

vim Dockerfile

 

FROM frolvlad/alpine-glibc
MAINTAINER hk
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories
RUN apk add --no-cache bash #安装bash,相当于yum安装bash
ADD jre1.8.0_211.tar.gz /usr/java/jdk/
ENV JAVA_HOME /usr/java/jdk/jre1.8.0_211
ENV PATH ${PATH}:${JAVA_HOME}/bin
RUN chmod +x /usr/java/jdk/jre1.8.0_211/bin/java
WORKDIR /opt

 

构建镜像并自定义个名字:

docker build -t hkjdk1.8:v1 .

 

利用该镜像启动个容器

docker run -itd --name hkjdk1 hkjdk1.8:v1

 

进入容器,验证:

docker exec -it hkjdk1 bash
bash-4.3# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

 

 

查看镜像构建历史

docker history hkjdk1.8:v1

查看镜像详情

docker image inspect hkjdk1.8:v1