搜索镜像
docker search centos #搜索镜像,默认是到官方的镜像仓库中搜索;不带版本号默认是latest,可以搜索指定版本号,centos:7.2.1511
下载镜像
https://hub.docker.com/ #docker官方仓库地址
docker pull ubuntu:19.10 #去官方仓库中下载镜像,不指定tags,默认下载latest
docker pull hello-world #使用docker run -it hello-world运行,检查当前docker是否正常,单次运行
可以去指定地址下载docker镜像:
docker pull 服务器域名:80/项目名称/镜像名称:tag号
注意事项:
下载镜像时,如果不指定tags号,则默认下载的是latest,当以后再次下载时,官方的最新版本已经升级,如果还不指定版本号进行下载,则下载时,会看到本地镜像有latest,就会使用本地的镜像,不会去官方下载最新的了,所以下载镜像时最好指定版本号。
查看本地镜像
docker images #查看本地镜像
注意事项:
镜像的REPOSITORY与TAG为none,表示后期导入或者制作的镜像与之前已经存在的镜像的REPOSITORY和TAG冲突,从而把之前的镜像覆盖而导致的,有很少一部分是从互联网下载下来就是这样。
镜像导出
可以将镜像从本地导出为一个压缩文件,然后复制到其他服务器进行导入使用。
docker save --help #查看导出镜像的帮助
docker load --help #查看导入镜像的帮助
导出方法1:
docker save nginx:1.16.1 -o /opt/nginx.tar.gz
导出方法2:
docker save nginx:1.16.1 > /opt/nginx.tar.gz #使用输出重定向的方法
导入方法1:
docker load -i nginx.tar.gz
导入方法2:
docker load < mysql.tar.gz #使用输入重定向导入镜像压缩文件
删除镜像
docker rmi 镜像ID #指定镜像的ID,或者指定,如:nginx:1.16.1;通过镜像启动的容器,镜像不能被删除,除非将容器删除
docker rmi -f 镜像ID #强制删除镜像,包括有容器正在使用的镜像,但不建议使用此参数,推荐是容器被删除之后,再删除镜像
docker rmi `docker images | grep none | awk '{print $3}'` #删除所有名称及tag为none的镜像
删除容器
docker rm -fv 容器ID/容器名称 #-f是强制删除,-v是删除容器运行时生成的数据目录,-f可以删除正在运行的容器
docker rm -v 容器ID/容器名称
创建容器及端口映射
docker run -d -it -p 80:80 nginx:1.16.1 #创建并运行容器;-d是在当前宿主机后台运行容器,-i是识别当前标准输入,-t是分配一个tty,-p是把宿主机80映射到容器的80端口;指定镜像,如果本地有镜像使用本地,如果本地没有,去官网下载
docker run -it -P -d nginx bash #创建容器并进入容器;bash指令会代替官方默认的指令
docker run -it -P -d nginx #创建并启动容器;-P是把宿主机的随机端口映射到容器的80
docker run -it -d --name linux-web -p 80:80 nginx:1.16.1 #创建容器时,指定容器的名称
docker run -it -d -p 172.168.3.100:80:80 nginx:1.16.1 #指定把宿主机固定地址的80映射到容器80
docker run -it -d -p :80 nginx:1.16.1 #宿主机的随机端口映射给容器的80
docker run -it -d -p 172.168.3.100::80 nginx:1.16.1 #宿主机的固定IP的随机端口映射到容器的80
docker run -it -d -p 8553:53/udp nginx:1.16.1 #把udp协议映射给容器
docker run -d -it -p 80:80/tcp -p 443:443/tcp nginx #映射多个端口与协议
docker port 容器名称/容器ID #查看某个容器的端口映射
docker run -it mysql echo linux #创建容器,容器创建后运行容器,执行打印linux命令后退出容器
docker run -it mysql tail -f /etc/hosts #可以让容器一直在当前宿主机终端运行
显示正在运行的容器
docker ps #查看本地正在运行的容器
docker ps -a #查看本地所有容器
docker start 容器ID/容器名称 #启动容器
docker stop 容器ID/容器名称 #停止容器
docker pause 容器ID/容器名称 #暂停容器
docker unpause 容器ID/容器名称 #取消暂停
容器状态:
Created:容器创建后,由于启动参数错误,没有启动成功的
Exited:已经退出的容器,可以再次启动
Up:正在运行的容器
单次运行容器
docker ps -a -q #列出所有容器的ID
docker rm -fv $(docker ps -a -q) #删除所有容器
docker run --rm -it -p 80:80 nginx #创建并运行容器,ctrl+c退出容器后,会自动删除容器
给容器传递运行命令
容器需要有一个前台运行的进程才能保持容器的运行(进程的PID通常为1),通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令。
容器里,不能使用systemd作为PID为1的守护进程,因为容器里没有kernel,所以没有使用systemd启动服务的环境;这就要求容器里必须有一个进程一直运行下去,这个进程会被封装成PID为1的守护进程。
docker run -it nginx echo 123456 #创建完执行打印123456命令后,就回收容器,不在执行nginx默认启动命令
docker run -it nginx nginx "-g daemon off;" #让nginx进程一直在容器前台运行
注意事项:
创建容器时,传递命令的优先级高于镜像中默认命令的优先级
进入到正在运行的容器
attach
docker run -it centos bash
另一个终端执行:
docker attach 容器ID
attach需要容器有bash环境,才可以进入,并且一个终端的操作,另一个终端也可以看见,并且attach终端执行exit后,容器也将退出,不建议使用此进入容器的方法
exec
docker exec -it 容器ID bash #进入容器;-i识别标准输入,-t表示分配一个tty,指定容器的ID,指定以bash进入
nsenter
docker inspect 容器ID #查看指定容器的所有属性信息
docker inspect -f "{{.State.Pid}}" 容器ID #-f指定查询的具体层级,从上往下一层层查询,查找到指定容器在当前宿主机的PID编号
nsenter -t 容器PID -m -u -i -n -p #进入容器;-t指定容器的PID,后面选项是指定各种namespace
注意事项:
centos需要安装nsenter,yum install util-linux -y;ubuntu自带nsenter
nsenter脚本登录:
#!/bin/bash
docker_in() {
docker_id=$1
docker_pid=$(docker inspect -f "{{.State.Pid}}" $1)
nsenter -t $docker_pid -m -u -i -n -p
}
docker_in $1
批量启动、停止容器
docker start $(docker ps -a -q) #批量启动容器
docker stop $(docker ps -a -q) #批量停止容器
docker kill $(docker ps -a -q) #强制关闭所有容器
docker ps -a -q -f status=exited #取出已经关闭的容器ID
docker rm -fv $(docker ps -a -q -f status=exited) #删除所有已经关闭的容器
指定容器DNS
docker run -it -d --dns 192.168.3.254 nginx #创建容器,指定容器的DNS服务器地址
其它常用命令
docker version #查看docker版本
docker run -it -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.46 #运行mysql镜像时,需要输入mysql的root密码,使用-e指定参数
docker info #查看docker相关信息
docker top 容器ID #查看单机指定容器的运行状态
docker stats #查看单机容器的资源利用率
docker logs 容器ID #查看单个容器的日志;可以添加-f,一直跟踪查看
创建镜像
docker build -t 镜像名称:TAG号 Dockerfile文件路径
docker build --no-cache -t 镜像名称:TAG号 Dockerfile文件路径 #创建镜像时,不使用缓存,Dockerfile中的每一步都执行