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