1、docker安装和镜像常用操作


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 .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