docker-镜像管理

2.4:Docker 镜像管理

Docker 镜像含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于创建并启动docker容器。 

docker 镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令、工具和程序库就可以了。不同的镜像在一个宿主机内核上实现不同的 rootfs。

 演示Union FS(联合文件系统)原理

root@ubuntu:/opt# mkdir a b system
root@ubuntu:/opt# ll
total 24
drwxr-xr-x  6 root root 4096 Feb 18 10:18 ./
drwxr-xr-x 23 root root 4096 Jan 30 01:30 ../
drwxr-xr-x  2 root root 4096 Feb 18 10:18 a/
drwxr-xr-x  2 root root 4096 Feb 18 10:18 b/
drwxr-xr-x  2 root root 4096 Feb 18 10:18 system/
root@ubuntu:/opt# cd a
root@ubuntu:/opt/a# touch a.txt
root@ubuntu:/opt/a# cd ..
root@ubuntu:/opt# cd b
root@ubuntu:/opt/b# touch b.txt
root@ubuntu:/opt# mount -t aufs -o dirs=./a:./b none ./system/    #多个文件同时挂载到一个挂载点
root@ubuntu:/opt# tree system/
system/
├── a.txt
└── b.txt

镜像命令

搜索镜像
docker search centos:7.2.1511 #带指定版本号
docker search centos #不带版本号默认 latest 
下载镜像: 
从 docker 仓库将镜像下载到本地,命令格式如下: 
docker pull  仓库服务器:端口/项目名称/镜像名称:tag(版本)号 
docker info 中的Registry信息
查看本地镜像: 
docker images
REPOSITORY            #镜像所属的仓库名称 
TAG                   #镜像版本号(标识符),默认为 latest 
IMAGE ID              #镜像唯一 ID 标示 
CREATED               #镜像创建时间 
VIRTUAL SIZE          #镜像的大小
镜像导出: 可以将镜像从本地导出问为一个压缩文件,然后复制到其他服务器进行导入使用
1、 docker save centos -o /opt/centos.tar.gz 
2、 docker save centos > /opt/centos-1.tar.gz 
查看镜像内容:
cat manifest.json  #包含了镜像的相关配置,配置文件、 分层 
镜像导入: 
docker load -i centos.tar.gz 
docker load < /opt/centos.tar.gz 
删除镜像: docker rmi 镜像 ID/镜像名   ,通过镜像启动容器的时 候镜像不能被删除,除非将容器全部关闭 
 docker rmi centos 

Usage: docker rmi [OPTIONS] IMAGE [IMAGE...]
Remove one or more images
Options:
-f, --force Force removal of the image
--no-prune Do not delete untagged parents

 

2.5:容器操作基础命令

命令格式: 
# docker run [选项] [镜像名] [shell 命令] [参数]
# docker run [参数选项] [镜像名称,必须在所有选项的后面] [/bin/echo 'hello wold'] #单次执行,没有自定义容器名称
# docker run centos /bin/echo 'hello wold' #启动的容器在执行完 shell命令就退出了

常见命令

从镜像启动一个容器
会直接进入到容器,并随机生成容器 ID 和名称 
[root@docker-server1 ~]# docker run -it docker.io/centos bash #单次测试命令运行完即退出
[root@11445b3a84d3 /]
#退出容器不注销 ctrl+p+q 
显示正在运行的容器
docker ps 
显示所有容器: 包括当前正在运行以及已经关闭的所有容器:  docker ps -a 
删除运行中的容器:即使容正在运行当中,也会被强制删除掉 
docker rm -fv 容器ID
Options:
  -f, --force     Force the removal of a running container (uses SIGKILL)
  -l, --link      Remove the specified link
  -v, --volumes   Remove the volumes associated with the container
容器状态:
created: 被创建之后由于启动参数错误而没有启动成功的
up:正在运行的容器
exited:已经退出或者注销的
指定端口映射:
方式 1:本地端口 81 映射到容器 80 端口:  
root@ubuntu:~# docker run -it --name web1 -p 8000:80 55c440ba1ecb
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                  NAMES
ac11d44f5539        55c440ba1ecb        "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes              0.0.0.0:8000->80/tcp   web1
方式 2:本地 IP:本地端口:容器端口 
root@ubuntu:~#  docker run -it -d --name web2 -p 192.168.134.182:9000:80 nginx
root@ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
c493bc2b09c5        nginx               "nginx -g 'daemon of…"   10 seconds ago      Up 9 seconds        192.168.134.182:9000->80/tcp   web2
方式 3:本机 ip:本地端口:容器端口/协议,默认为 tcp 协议 
root@ubuntu:~# docker run -it -d -p 8001:80/udp --name web3 nginx:1.16.1
d2a5897fc888b94ba2790a761e3f1ac004b333ba672c9ed01d4be7551d792727
root@ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                          NAMES
d2a5897fc888        nginx:1.16.1        "nginx -g 'daemon of…"   7 seconds ago       Up 7 seconds        80/tcp, 0.0.0.0:8001->80/udp   web3
方式 4:一次性映射多个端口+协议: 
root@ubuntu:~# docker run -it -d -p 86:80/tcp  -p 443:443/tcp --name web5 nginx:1.16.1
f8ef7471fd639eb3a226e441f288803a58f72f25582ef5d71fd13559499102fa
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
f8ef7471fd63        nginx:1.16.1        "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:443->443/tcp, 0.0.0.0:86->80/tcp   web5
#查看 Nginx 容器访问日志
root@ubuntu:~# docker logs  b0d688e137c4     #一次查看 
root@ubuntu:~#  docker logs -f b0d688e137c4  #持续查看 
查看容器已经映射的端口:
root@ubuntu:~# docker port d2a5897fc888
80/udp -> 0.0.0.0:8001
后台启动容器: 参数家上-d
创建并进入容器: 
root@ubuntu:~# docker run  -it --name web10   nginx:1.16.1  bash
root@50adcf8c2293:/#

传递运行命令 :

容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一 种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。这个进程被封装为PID为1的守护进程,如nginx的master进程,shell命令。传递的命令优先级高于镜像内置的启动命令。

容器的启动和关闭: 

k8s环境禁止通过重启服务或重启容器来实现配置变更和代码发布

root@ubuntu:~# docker start 50adcf8c2293
50adcf8c2293
root@ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES
50adcf8c2293        nginx:1.16.1        "bash"                   45 minutes ago      Up 7 seconds        80/tcp                                     web10
root@ubuntu:~# docker stop 50adcf8c2293
50adcf8c2293
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                                      NAMES
50adcf8c2293        nginx:1.16.1        "bash"                   About an hour ago   Exited (0) 2 seconds ago           

进入到正在运行的容器: 

使用 exec 命令
执行单次命令与进入容器,不是很推荐此方式,虽然 exit 退出容器还在运行 
root@ubuntu:~# docker exec -it f8ef7471fd63 bash
root@f8ef7471fd63:/#
使用 nsenter 命令
推荐使用此方式,nsenter 命令需要通过 PID 进入到容器内部,不过可以使用 docker inspect 获取到容器的 PID: 
docker inspect ID#获取json格式的信息
root@ubuntu:~#  docker inspect -f "{{.State.Pid}}" f8ef7471fd63
5215 ##获取到某个docker 容器的 PID,可以通过 PID 进入到容器内 
root@ubuntu:~#  nsenter -t 5215  -m -u -i -n -p
mesg: ttyname failed: No such device
ping 容器 ID
root@f8ef7471fd63:/#
apt update
apt install iputils-ping
apt install net-tools
root@f8ef7471fd63:/# ping f8ef7471fd63
PING f8ef7471fd63 (172.17.0.6) 56(84) bytes of data.
64 bytes from f8ef7471fd63 (172.17.0.6): icmp_seq=1 ttl=64 time=0.011 ms
64 bytes from f8ef7471fd63 (172.17.0.6): icmp_seq=2 ttl=64 time=0.023 ms

批量关闭正在运行的容器:

root@ubuntu:~# docker ps -a -q #查看container ID
50adcf8c2293
f8ef7471fd63
d2a5897fc888
c493bc2b09c5
ac11d44f5539
b0d688e137c4
root@ubuntu:~#  docker stop  $(docker ps -a -q)
root@ubuntu:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
50adcf8c2293        nginx:1.16.1        "bash"                   About an hour ago   Exited (0) 38 minutes ago                       web10
f8ef7471fd63        nginx:1.16.1        "nginx -g 'daemon of…"   2 hours ago         Exited (0) 5 seconds ago                        web5
d2a5897fc888        nginx:1.16.1        "nginx -g 'daemon of…"   2 hours ago         Exited (0) 5 seconds ago                        web3
docker kill  $(docker ps -a -q) #批量强制关闭正在运行的容器
root@ubuntu:~#  docker rm -f  `docker ps -aq -f status=exited` #批量删除已退出容器
docker rm -f  $(docker ps -a -q) #批量删除所有容器: 

指定容器 DNS:

dns 服务,默认采用宿主机的 dns 地址 

一是将 dns 地址配置在宿主机

二是将参数配置在 docker 启动脚本里面 –dns=1.1.1.1 

root@ubuntu:~# docker run -it -d --dns 223.6.6.6 nginx:1.16.1
root@ubuntu:~# docker exec -it b1c0a49c6eaf bash
root@b1c0a49c6eaf:/# cat /etc/resolv.conf
nameserver 223.6.6.6
原文地址:https://www.cnblogs.com/lummg-DAY/p/12327134.html