docker容器结构
docker容器结构
docker镜像管理命令
搜索镜像
docker search centos:7.2
下载镜像
docker pull tomcat:8
docker pull 域名:端口/项目名称/镜像名称:tag(号)
查看本地镜像
docker images
选项:
-a:全部显示所有镜像(默认隐藏中间镜像)
-f:根据提供的条件过滤输出
-q:仅显示镜像ID
过滤无用镜像
docker images -f "dangling=true" -q
将启动的容器做成镜像
docker commit [容器ID/容器名] [新镜像]
打包镜像
docker save [镜像ID/镜像名] -o [文件名].tar.gz
docker save [镜像ID/镜像名] > [文件名].tar.gz
解压镜像包
docker load -i [文件名].tar.gz
docker load < [文件名].tar.gz.
镜像改名
docker tag [镜像ID/镜像名] [文件名]
删除镜像
docker rmi [镜像ID/镜像名]
清理无用镜像 :
docker rmi(docker images | grep "^<none>" | awk "{print $3}")
docker基础操作命令
查看启动的容器
docker ps [OPTIONS]
选项:
-a:显示所有容器(默认显示刚刚运行)
-f:--根据提供的条件过滤输出
--使用Go模板格式化字符串打印容器
-n:显示n个上次创建的容器(包括所有状态)(默认值为-1)
-l:显示最新创建的容器(包括所有状态)
--无trunc不截断输出
-q:显示容器ID
-s:显示容器文件大小
容器状态
Created:被创建之后由于启动参数错误或者启动命令错误没有启动成功的容器
Up:正在运行的容器
Exited:已经被stop的容器
Paused:暂停状态
删除容器和数据卷
1.强制删除容器以及数据目录
docker rm -fv 容器名 -f表示强制删除运行中的容器,-v表示删除数据目录
2.停止一个或多个容器
docker container stop $(docker container ls -a -q)
3.清理无用容器
docker rm -v $(docker ps -a -q -f status=exited)
4.清理无用镜像
docker rmi $(docker images -f "dangling=true" -q)
5.清理无用数据卷
docker volume rm $(docker volume ls -qf dangling=true)
6.删除 network
docker network rm $(docker network ls -q)
启停容器
docker start 容器名
docker stop 容器名
强制停止容器
docker kill [容器ID/容器名]
创建挂载数据卷
这种情况创建的数据卷目录会把容器内的东西挂载出来,删除容器数据目录不会删除
docker volume create web-html
docker volume create mysqldata
#挂载
docker run -d -it -v web-html:/var/www/html --name ngingx nginx:latest
#宿主机创建目录(创建的目录可以放数据挂载到容器内)
这种情况会把创建的宿主机空目录挂载到容器内,容器内的目录也会成空的。删除容器数据目录不会删除。
mkdir /data/mysqldata
docker run -d -it -v /data/mysqldata:/var/lib/mysql --name mysql mysql:latest
#挂载文件
docker run -d -it -v /data/my.conf:/etc/my.conf --name mysql mysql:latest
删除无用数据卷
docker volume prune -f
prune:删除所有现在未使用的本地卷(包括没有启动的容器)
-f:强制删除
创建容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run 选项 镜像名称 命令 参数
选项:
-d:放到后台运行
-v:将本机目录映射到容器 例:本机目录:容器目录
-i:保持标准输入打开
-t:开启一个伪tty终端
-p:映射端口,例:本机端口:容器端口
-P:随机分配端口
--name:指定容器名称
--restart=always:跟随服务启动容器,跟服务开机自启一样。
例:
docker run -d --restart=always --privileged=true -v tomcat-data:/usr/local/apache-tomcat-8.5.16 -p 8090:8080 --name tomcat-v8.5.16 cuikangan/tomcat:v8.5.16
可以指定的命令:
1.以服务类型的命令
需要镜像有相关的服务,且服务支持前台运行
比如:nginx,mysql,tomcat
2.shell命令
例:tail命令,top命令,bash,/usr/sbin/init
3.执行脚本
主要是在容器启动时执行先改环境或者一些配置,可以启动其他服务
创建容器
docker run -it -d --name centos1 centos:latest
指定端口以及协议
docker run -it -d -p 80:80 -p 443:443 --name nginx01 nginx:latest
docker run -it -d -p 53:53/udp --name nginx01 nginx:latest
docker run -it -d -p 80:80/tcp --name nginx01 nginx:latest
docker run -it -d -p 80:80/tcp -p 443:43/udp --name nginx01 nginx:latest
单次创建容器
docker run -rm -it -d -p 80:80 -p 443:443 --name nginx01 nginx:latest
查看容器映射的端口
docker port 容器名
查看容器信息
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
选项:
-f:过滤
-s:size如果类型为container,则显示总文件大小
--类型字符串返回指定类型的JSON获取PID:docker inspect -f "{{.State.Pid}}" nginx1
获取ip:docker inspect -f "{{.NetworkSettings.IPAddress}}" nginx1
进入容器
方法一:docker exec -it [容器名/容器ID] /bin/bash
方法二:nsenter命令进入容器内部,但是需要用到容器的PID
获取容器PID:docker inspect -f "{{.State.pid}}" nginx1
安装nsenter:yum -y install util-linux
选项:
-t:target <pid> 要获取名字空间的目标进程
-m:mount[=<file>]输入mount名称空间
-u:uts[=<file>]输入uts名称空间(主机名等)
-i:ipc[=<file>]输入System V ipc名称空间
-n:net[=<file>]输入网络名称空间
-p:pid[=<file>]输入pid名称空间
-U:用户[=<file>]输入用户名称空间
-S:setuid<uid>在输入的命名空间中设置uid
-G:setgid<gid>在输入的命名空间中设置gid;保留凭据不要接触UID或GID
-r:根[=<dir>]设置根目录
-w:wd[=<dir>]设置工作目录
-F:无叉子
-Z:follow context根据--target PID设置SELinux context
进入容器:nsenter -t 容器PID -m -i -u -n -p
nsenter进入容器脚本
#!/bin/bash
###$1是传递的容器名字或者容器ID
docker_in(){
DOCKER_ID=$1
PID=$(docker inspect -f "{{.State.Pid}}" ${DOCKER_ID})
nsenter -t $PID -m -u -i -n -p
}
docker_in $1
创建时指定容器DNS
docker run -it -d -p 80:80 -p 443:443 --dns 192.168.0.254 --name nginx01 nginx:latest
容器生成镜像
docker commit 选项 容器ID 名字:tag
例:docker commit --change="EXPOSE 80 443" 容器ID 名字:tag
选项:
-a:作者描述(例如,“John Hannibal Smithhannibal@a-team.com")
-c:--change 镜像运行的时候执行的命令
-m:消息字符串提交消息
-p:提交期间暂停容器(默认为true)