Docker Hub地址
docker hub类似maven远程仓库地址
作为一名研发人员,则可以将镜像理解为类(Class)。是一个应用程序。
首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。
拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。前面多次提到镜像就像停止运行的容器(类)。实际上,可以停止某个容器的运行,并从中创建新的镜像。
在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run
time)结构,如下图所示。
镜像常用命令 w3cschool
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。它包含运行某个软件所需的所有内容,包括代码、运行是、库、环境变量和配置文件。**
查找镜像(不推荐,不直观)
docker search java
① NAME:镜像仓库名称。
② DESCRIPTION:镜像仓库描述。
③ STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于GitHub的Stars。
④ OFFICAL:表示是否为官方仓库,该列标记为[OK]的镜像均由各软件的官方项目组创建和维护。由结果可知,java这个镜像仓库是官方仓库,而其他的仓库都不是镜像仓库。
⑤ AUTOMATED:表示是否是自动构建的镜像仓库。
pull 下载镜像
docker pull java docker pull tomcat:9.0.20-jre8
https://hub.docker.com/_/centos docker pull centos:7.8.2003https://hub.docker.com/_/alpine docker pull alpine:3.12.1
- 下载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。默认情况下,镜像会从 Docker Hub 的仓库中拉取。
- 通过下载过程,可以看到,一个镜像一般是由多个层组成,类似 f7e2b70d04ae 这样的串表示层的唯一 ID。
问题一:小伙伴们可能会想到,如果多个不同的镜像中,同时包含了同一个层,这样重复下载,岂不是导致了存储空间的浪费么?
实际上,Docker 并不会这么傻会去下载重复的层,Docker 在下载之前,会去检测本地是否会有同样 ID
的层,如果本地已经存在了,就直接使用本地的就好了。
问题二:另一个问题,不同仓库中,可能也会存在镜像重名的情况发生, 这种情况咋办?
从严格意义上讲,我们在使用 pull命令时,还需要在镜像前面指定仓库地址(Registry), 如果不指定,则
Docker 会使用您默认配置的仓库地址。例如上面,由于我配置的是国内 docker.io的仓库地址,我在pull 的时候,docker 会默认为我加上 docker.io/library 的前缀。
例如:当我执行 docker pull tomcat:9.0.20-jre8命令时,实际上相当于 docker pull
docker.io/tomcat:9.0.20-jre8,如果您未自定义配置仓库,则默认在下载的时候,会在镜像前面加上
DockerHub 的地址。Docker 通过前缀地址的不同,来保证不同仓库中,重名镜像的唯一性。
常用参数
- -a, —all-tags=true|false : 是否获取仓库中所有镜像,默认为否;
- —disable-content-trust : 跳过镜像内容的校验,默认为 true;
列出镜像
docker images —all/-a docker image ls
① REPOSITORY:镜像所属仓库名称。
② TAG:镜像标签。默认是latest,表示最新。
③ IMAGE ID:镜像ID,表示镜像唯一标识。
④ CREATED:镜像创建时间。
⑤ SIZE:镜像大小。
查看镜像
- 通过 docker inspect 命令,我们可以获取镜像的详细信息,其中,包括创建者,各层的数字摘要等。
- docker inspect 返回的是 JSON格式的信息,如果您想获取其中指定的一项内容,可以通过 -f 来指定,如获取镜像大小
docker inspect tomcat:9.0.20-jre8-alpine docker inspect -f {{“.Size”}} tomcat:9.0.20-jre8-alpine
保存镜像
保镜像保存成一个压缩包,然后下载下来
一个镜像 docker save busybox > busybox.tar docker save —output busybox.tar busybox docker save redis:6.0.9 -o redis6.0.9.tar 多个镜像 推荐开发岗的小伙伴使用idea开发工具中的列编辑模式制作docker save命令 docker save \ ubuntu:20.04 \ alpine:3.12.1 \ debian:10.6-slim \ centos:7.8.2003 \ -o linux.tar
删除镜像
docker rmi hello-world docker rmi -f $(docker images) //删除所有镜像 通过ID删除镜像
注:不推荐通过ID删除镜像
推荐通过image的名称删除镜像
image的ID在终端长度未完全显示,ID值会出现重复
常用参数
- -f, -force : 强制删除镜像,即便有容器引用该镜像;
- -no-prune : 不要删除未带标签的父镜像;
加载镜像
将镜像从压缩包加载成镜像docker load < busybox.tar.gz docker load —input fedora.tar docker load -i redis6.0.9.tar
常用参数
- —input , -i : 指定导入的文件。
- —quiet , -q : 精简输出信息。
history命令
通过 docker history命令,可以列出各个层的创建信息,例如:查看 tomcat:9.0.20-jre8-alpine的各层信息docker history tomcat:9.0.20-jre8-alpine
tag命令
docker tag tomcat:9.0.20-jre8-alpine lagou/tomcat:9
构建镜像
容器
列出容器
docker ps 列出所有运行的容器
-a 列出没有运行的容器
-l 显示最近创建的容器
-n 显示最近n个创建的容器(docker ps -n 3)
-q 静默模式,只显示容器编号
—no-trunc 不截断输出
实用技巧
停止所有运行容器 docker stop $(docker ps -qa)
删除所有的容器 docker rm $(docker ps -aq) docker rm $(docker stop $(docker ps -q))
删除所有的镜像
docker rmi $(docker images -q)
查看容器
docker inspect : 获取容器/镜像的元数据。
常用参数
-f :指定返回值的模板文件。
-s :显示总的文件大小。
—type :为指定类型返回JSON。
新建并启动**
[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmytest v1 59b624162336 7 minutes ago 126MBnginx latest 540a289bab6c 2 days ago 126MBcentos 7.2.1511 9aec5c5fe4ba 7 months ago 195MB
docker run -it imageId(mytest:v1)docker run -d -p 91:80 nginxdocker run -itp 8099:8099 eureka:1.02 bin/bashdocker run -itv --name myNames /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash
参数信息
-d, —detach=false: 后台运行容器,并返回容器ID -i, —interactive=false: 以交互模式运行容器,通常与 -t 同时使用 docker run [OPTIONS] IMAGE [COMMAND] [ARG…] docker run -it —rm -p 8080:8080 tomcat:9.0.20-jre8-alpine-P, —publish-all=false: 随机端口映射,容器内部端口随机映射到主机的端口。不推荐各位小伙伴 使用该参数 -p, —publish=[]: 指定端口映射,格式为:主机**(宿主)端口:**容器端口,推荐各位小伙伴们使用 -t, —tty=false: 为容器重新分配一个伪输入终端,通常与 -i 同时使用 —name=”nginx-lb”: 为容器指定一个名称 -h , —hostname=”laosiji”: 指定容器的hostname -e , —env=[]: 设置环境变量,容器中可以使用该环境变量 —net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型 —link=[]: 添加链接到另一个容器;不推荐各位小伙伴使用该参数 -v, —volume : 绑定一个卷 —privileged=false: 指定容器是否为特权容器,特权容器拥有所有的capabilities —restart=no**:指定容器停止后的重启策略 no:容器退出时不重启 on-failure:容器故障退出(返回值非零)时重启 always:容器退出时总是重启,推荐各位小伙伴们使用 —rm=false: 指定容器停止后自动删除容器,不能以docker run -d启动的容**
使用docker run命令来启动容器,docker在后台运行的标准操作包括
1.检查本地是否存在指定的镜像,不存在则从公有仓库下载
2.使用镜像创建并启动容器
3.分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
4.从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去
5.从地址池分配一个ip地址给容器
6.执行用户指定的应用程序
7.执行完毕之后容器被终止
创建容器
docker create **:创建一个新的容器但不启动它。用法同 docker run命令
语法**
docker create [OPTIONS] IMAGE [COMMAND] [ARG…] docker create -it —name tomcat9 -p 8080:8080 9.0.20-jre8-alpine
进入容器
docker exec **:**在运行的容器中执行命令。早期有attach命令,对于阻塞命令会等待,所以不方便。在Docker 1.3.0后提供了exec 可以在容器内直接执行任意命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
语法示例
有bash命令的linux系统:例如centos docker run -it —name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim docker exec -it tomcat9.1 /bin/bash
没有bash命令的linux系统:例如alpine系统 docker run -it —name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine docker exec -it tomcat9.2 sh docker exec 容器id ls -l (在容器外面通过命令获取容器里面的内容)**
使用nsenter进入容器
cd /usr/local/myDocker$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz$ tar -xzvf util-linux-2.24.tar.gz$ cd util-linux-2.24/$ ./configure --without-ncurses$ make nsenter$ sudo cp nsenter /usr/local/bin
两条命令封装成一个Shell 封装脚本,从而简化进入容器的过程。参考地址
1、在 /usr/local/bin 目录下创建一个 docker-enter文件,保存下面的脚本 2、执行 chmod +x docker-enter 命令 3、运行 docker-enter
进入到容器中
#!/bin/shif [ -e $(dirname "$0")/nsenter ]; then# with boot2docker, nsenter is not in the PATH but it is in the same folderNSENTER=$(dirname "$0")/nsenterelseNSENTER=nsenterfiif [ -z "$1" ]; thenecho "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"echo ""echo "Enters the Docker CONTAINER and executes the specified COMMAND."echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."elsePID=$(docker inspect --format "{{.State.Pid}}" "$1")if [ -z "$PID" ]; thenexit 1fishiftOPTS="--target $PID --mount --uts --ipc --net --pid --"if [ -z "$1" ]; then# No command given.# Use su to clear all host environment variables except for TERM,# initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,# and start a login shell."$NSENTER" $OPTS /bin/su - rootelse# Use env to clear all host environment variables."$NSENTER" $OPTS env --ignore-environment -- "$@"fifi
常见问题:nsenter: failed to execute su: No such file or directory 这是由于容器中的PATH 路径问题,使用/bin/su 即可。
开始/重启/停止
docker start :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器
语法
docker start [OPTIONS] CONTAINER [CONTAINER…] docker stop [OPTIONS] CONTAINER [CONTAINER…] docker restart [OPTIONS] CONTAINER [CONTAINER…]
执行命令
docker start tomcat9 docker stop tomcat9
docker restart tomcat9
杀掉容器
docker kill :杀掉一个运行中的容器
语法
docker kill [OPTIONS] CONTAINER [CONTAINER…] docker kill tomcat9
容器日志
docker logs : 获取容器的日志
语法
docker logs [OPTIONS] CONTAINER
docker logs -f tomcat9 docker logs [-f] [-t][—tail] 容器名
docker logs -t 容器名 显示日志时间
docker logs -ft 容器名 不断刷新日志
docker logs -ft —tail 0/10条 容器名 显示最新的日志
常用参数
-f : 跟踪日志输出
—tail :仅列出最新N条容器日志
删除容器
按照容器名称删除
docker rm tomcat9
按照容器ID删除
docker rm 8dd95a95e687
常用参数
-f :通过 SIGKILL 信号强制删除一个运行中的容器。
-l :移除容器间的网络连接,而非容器本身。
-v :删除与容器关联的卷。
将容器作为镜像保存
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] docker commit -a “runoob.com” -m “my apache” a404c6c174a2 mymysql:v1

