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