Docker Engine是一种开源容器化技术,用于构建和容器化您的应用程序。Docker Engine通过以下方式充当客户端-服务器应用程序:
- 具有长时间运行的守护进程的服务器dockerd。
- API,用于指定程序可以用来与Docker守护程序进行对话和指示的接口。
- 命令行界面(CLI)客户端docker。
CLI使用Docker API通过脚本或直接CLI命令控制或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。守护程序创建和管理Docker对象,例如映像,容器,网络和卷。
docker常用命令
中文版
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
$ docker --help Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers 一个可以独立运行的容器 Options: --config string 客户端配置文件的位置 (默认 "/home/mrdede/.docker") -c, --context string 用于连接守护进程的上下文的名称 (使用“DOCKER上下文使用”覆盖DOCKER主机env变量和默认上下文设置) -D, --debug 启用调试模式 -H, --host list 要连接的守护程序套接字 -l, --log-level string 设置日志级别 ("debug"|"info"|"warn"|"error"|"fatal") (默认 "info") --tls 使用 TLS, --tlsverify 的别名 --tlscacert string 仅由该CA签署的信任证书 (default "/home/mrdede/.docker/ca.pem") --tlscert string TLS证书文件的路径 (默认 "/home/mrdede/.docker/cert.pem") --tlskey string TLS密钥文件的路径 (默认 "/home/mrdede/.docker/key.pem") --tlsverify 使用TLS验证远程 -v, --version 打印版本信息并退出 Management Commands: builder 管理 构建 config 管理 Docker 配置 container 管理 容器 context 管理 上下文 engine 管理 docker 引擎 image 管理 镜像 network 管理 网络 node 管理 集群节点 plugin 管理 插件 secret 管理 Docker 秘密 service 管理 服务 stack 管理 Docker 堆栈 swarm 管理 集群 system 管理 Docker trust 管理 trust on Docker images volume 管理 容量 Commands: attach 将本地标准输入、输出和错误流附加到运行的容器 build 从 Dockerfile 构建映像 commit 根据容器的更改创建一个新映像 cp 在容器和本地文件系统之间复制文件/文件夹 create 创建一个新容器 deploy 部署新堆栈或更新现有堆栈 diff 检查容器文件系统上的文件或目录的更改 events 从服务器获取实时事件 exec 在运行的容器中运行命令 export 将容器的文件系统导出为目标归档文件 history 显示镜像的历史 images 镜像列表 import 从压缩文件中导入内容以创建文件系统映像 info 显示整个系统的信息 inspect 返回Docker对象的低级信息 kill 杀死一个或多个正在运行的容器(硬杀,相当于咱们的电脑直接拔电源) load 从tar存档或STDIN加载映像 login 登录到 Docker 远程库 logout 从 Docker 远程库注销 logs 获取容器的日志 pause 暂停一个或多个容器中的所有进程 port 列出容器的端口映射或特定映射 ps 列表容器 pull 从远程库提取镜像或存储库 push 将映像或存储库推送入远程库 rename 重命名一个容器 restart 重新启动一个或多个容器 rm 移除一个或多个容器(软杀,相当于咱们的电脑用鼠标点击【关机】按钮) rmi 删除一个或多个镜像 run 在新容器中运行命令 save 将一个或多个镜像保存到tar归档文件(默认情况下数据流形式保存到STDOUT) search 在Docker Hub中搜索镜像 start 启动一个或多个停止的容器 stats 显示容器资源使用统计数据的实时流 stop 停止一个或多个正在运行的容器 tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top 显示容器正在运行的进程 unpause 在一个或多个容器中取消暂停所有进程 update 更新一个或多个容器的配置 version 显示Docker版本信息 wait 阻塞一个或多个容器直到停止,然后打印它们的退出代码 运行“docker COMMAND --help” 获取命令的更多信息。 |
英文版
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
$ docker --help Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/home/mrdede/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/home/mrdede/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/home/mrdede/.docker/cert.pem") --tlskey string Path to TLS key file (default "/home/mrdede/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Management Commands: builder Manage builds config Manage Docker configs container Manage containers context Manage contexts engine Manage the docker engine image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes Commands: attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container deploy Deploy a new stack or update an existing stack diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes Run 'docker COMMAND --help' for more information on a command. |
实例:
帮助命令:
查看 docker 版本信息:
$ docker version
查看 docker 当前容器信息:
$ docker info
帮助信息:
$ docker –help
镜像命令:
查看当前主机存在的镜像:
$ docker images
列出本地所有镜像(含中间映像层):
$ docker images -a
只显示镜像ID:
$ docker images -q
只列出所有镜像的ID:
$docker images -qa
显示镜像的摘要信息:
$ docker images –digests
显示完整的镜像信息:
$ docker images –digests –no-trunc
搜索镜像
$ docker search [关键词]
搜索点赞大于30的镜像
$ docker search -s 30 [关键词]
下载镜像/拉取镜像:
$ docker pull [镜像名称][:版本号/lasest]
删除一个镜像
$ docker rmi [镜像名称][:版本号/lasest]
强制删除一个镜像
$ docker rmi -f [镜像名称][:版本号/lasest]
删除多个镜像
$ docker rmi-f [镜像名称1][:版本号/lasest] [镜像名称2][:版本号/lasest] [镜像名称N][:版本号/lasest]
删除本地全部镜像
$ docker rmi -f $(docker images -q)
$ docker rmi -f $(docker images -qa)
清除Docker缓存文件(下载/构建镜像时会有缓存):
$ docker system prune –volumes
容器命令:
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:
–name=”容器新名称”:为容器指定一个名称;
-d:后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
-P:随机商品映射;
-p:指定端口映射,有以下四种格式:
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
新建并启动一个交互性的容器:
$ docker run -it [镜像ID]
为新建的容器起一个别名:
$ docker run -it –name [容器别名] [镜像ID]
列出当前所有正在运行的容器:
$ docker ps
OPTIONS:
-a:列出所有正在运行和运行过的容器
-l:列出最近创建的容器
-n:显示最近创建的n个容器
-q:静默模式,只显示窗口编号
–no-trunc:不截断输出
列出所有正在运行和运行过的容器
$ docker ps -a
列出最近一个创建(打开的)的容器:
$ docker ps -l
列出最近8个创建(打开的)的容器:
$ docker ps -l -n 8
显示最近创建的n个容器:
$ docker ps -n 2
静默模式,只显示窗口编号:
$ docker ps -ql
退出出容器:
$ exit
退出容器,但容器继续运行:
Ctrl+P+Q
关闭所有正在运行的容器
0 |
$ sudo docker rm -f $(sudo docker ps -q) |
软停:
$ docker stop [容器ID]
硬停(相当于直接断电):
$ docker kill [容器ID]
进入一个已运行容器的控制台:
0 |
$ sudo docker exec -it [容器ID] /bin/bash |
在宿主机直接操作 docker 实例:
0 |
$ sudo docker exec -it [容器ID] ls -l /tmp |
把容器内的数据拷贝到宿主机:
0 |
$ sudo docker cp [ID]:/tmp/yum.log /root |
启动容器,前台运行:
0 |
$ sudo docker run -it rocket.chat |
启动容器,后台运行:
0 |
$ sudo docker run -d rocket.chat |
提交容器副本使之成为一个新镜像。当拉取的远程镜像自己修改过,而且准备以后一直使用自己修改后的镜像去部署项目,那么就使用到这个命令了。
$ sudo docker commit -a=”[作者]” -m=”[描述]” [一个正在运行着的容器ID] [新容器副本]:[自定义版本号]
0 |
$ sudo docker commit -a="mrdede" -m="这是我的第一个窗口副本" d52498cea537 mrdedePro/rocket.chat:1.0.0 |
删除所有容器/删除全部容器:
在在Windows系统中,cmd窗口下使用命令(docker rm $(docker ps -aq) )时,碰到个问题:
unknown shorthand flag: ‘a’ in -a
但是,如果单独使用 docker ps -aq ,这是没有问题的。
后来,无意间使用了一下PowerShell 窗口,成功执行了删除全部容器的命令,不知所以然……
$ sudo docker rm $(sudo docker ps -aq)
Docker数据卷容器:
数据共享和持久化保存,挂载,宿主机与容器的数据接口。
相当于U盘,也可以理解为是U盘插到电脑上,这样就可以数据共享传送
实现方法:1.直接使用命令添加,2.通过DockerFile文件添加。
使用命令添加数据卷:
$ sudo docker run -it -v [宿主机绝对路径]:[容器内绝对路径] [镜像名称]
0 |
$ sudo docker run -it -v /myDataApi:/dataApi rocket.chat |
查看数据是否挂载成功,以JSON格式输出
$ sudo docker inspect [ID]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ sudo docker inspect 3b34bc048204 [ { "Id": "3b34bc048204654efa87f278......", "Created": "2020-11-17T17:27:35.911528385Z", "Path": "/bin/bash", "Args": [], "State": { ...... }, ...... "HostConfig": { "Binds": [ "/myDataApi:/dataApi" ], ...... }, "GraphDriver": { "Data": { ...... }, "Name": "overlay2" }, "Mounts": [ { "Type": "bind", "Source": "/myDataApi", "Destination": "/dataApi", "Mode": "", "RW": true, "Propagation": "rprivate" }, ...... ], "Config": { "Image": "rocket.chat", "Volumes": { "/app/uploads": {} }, "WorkingDir": "/app/bundle", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { ...... } } ] |
上面信息有删减。
容器卷带权限,禁止容器内修改共享文件,在对接时加上“冒号ro”,容器只读
$ sudo docker run -it -v /myDataApi:/dataApi:ro rocket.chat
数据卷容器:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。
可以理解为数据U盘上挂载数据U盘。
实例一:
启动父容器 dc01:
0 |
$ sudo docker run -it -v --name dc01 mrdede/centos |
dc02 继承 dc01:
$ dudo docker -it –name dc02 –volumes-from dc01 mrdede/centos
dc03 继承 dc01:
$ dudo docker -it –name dc03 –volumes-from dc01 mrdede/centos
说明(试验结果):
- 因为dc01中存在数据卷 /dataVolumeContainer,所以 dc02 dc03 继承后,也存在数据卷 /dataVolumeContainer。
- 无论在 dc01 / dc02 / dc03 哪个容器添加文件,都会实现在其它容器中同步共享。
- 当删除 dc01 这个父容器后,dc02 / dc03 数据卷中的文件依然存在,并且也能达到 dc02 / dc03数据卷的共享。
- 假如再添加容器 dc04,继承dc03,则 dc02 / dc03 / dc04 容器的数据卷依然共享。
- 假如删除dc03,则dc02 和dc04容器的数据卷依然共享。
结论:
只要是源于同一祖先的继承,无论是继承了祖先,还是继承了祖先的某一后代,即便是出现了断代(如dc04继承了dc03,但后来dc03被删除或关闭),它们的数据卷都是共享的。
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
通过DockerFile文件添加数据卷:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
FROM 基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER 镜像维护者的姓名和邮箱地址 RUN 容器构建时需要运行的命令 EXPOSE 当前容器向外暴露的端口 WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 ENV 用来在构建镜像过程中设置环境变量,如:ENV MY_PATY /usr/mytest ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 COPY 类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。 语法: COPY src dest COPY ["src", "dest"] VOLUME 说明: 容器数据卷,用于数据保存和持久化工作。 只是容器内的 出于可移植和分享的考虑,用-v [主机目录]:[容器目录]这种方法不能直接在DockerFile中实现。 由于宿主机目录是依赖于特定宿主机的,并不能保证在所有的宿主机上都存在这样的特定目录。 语法: VOLUME ["/dataVolumeContainer", "/dataVolumeContainer2", "..."] CMD 指定一个容器启动时要运行的命令 DockerFile 中可以有多个 CMD 指令,但只有最后一个生效,CMD会被docker run之后的参数替换 语法: CMD 指令的格式和 RUN 相似,也是两种格式: * shell 格式: CMD <命令> * exec 格式: CMD ["可执行文件", "参数1", "参数2"...] * 参数列表格式: CMD ["参数1", "参数2"...],在指定了 ENTRYPOINT 指令后,用 CMD 指定具体参数 ENTRYPOINT 指定一个容器启动时要运行的(追加)命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数 ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |
Dockerfile 命令分组:
BUILD | BOTH | RUN |
---|---|---|
FROM | WORKDIR | CMD |
MAINTAINER | USER | ENV |
COPY | EXPOSE | |
ADD | VOLUME | |
RUN | ENTRYPOINT | |
ONBUILD | ||
.dockerignore |
DockerFile实例一:
文件DockerFile
0 1 2 3 4 5 6 7 8 9 10 |
# 以centos为基础镜像 FROM centos # 创建容器卷 VOLUME ["/dataVolumeContainer", "/dataVolumeContainer2"] # 输出到终端的信息 CMD echo "finished, -------success1" # 进入终端 CMD /bin/bash |
进入上面DockerFile文件所在目录,执行如下命令(带命令空间的镜像名称mrdede/centos,注意命令最后有一个点“.”):
$ sudo docker build -f ./DockerFile -t mrdede/centos .
注:
如果Docker使用命令挂载主机目录Docker访问出现cannot open directory .: Permission denied 报错,
解决办法:在挂载目录后多加一个 –privileged=true 参数即可。
如:
$ sudo docker run -it -v [宿主机绝对路径]:[容器内绝对路径] –privileged=true [镜像名称]
DockerFile实例二:
文件DockerFile2
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 基础镜像 FROM centos # 作者信息 MAINTAINER mrdede<1234567@qq.com> # 进入容器后的默认目录 ENV MYPATH /usr/local WORKDIR $MYPATH # 执行安装任务 RUN yum -y install vim RUN yum -y install net-tools # 对外暴露端口 EXPOSE 80 # 终端输出 CMD echo $MYPATH CMD echo "success----------ok" CMD /bin/bash |
终端执行命令:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
> docker build -f Dockerfile -t mycentos:1.3 . [+] Building 99.7s (8/8) FINISHED => [internal] load .dockerignore 0.2s => => transferring context: 2B 0.0s => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 32B 0.0s => [internal] load metadata for docker.io/library/centos:latest 0.0s => [1/4] FROM docker.io/library/centos 0.0s => CACHED [2/4] WORKDIR /usr/local 0.0s => [3/4] RUN yum -y install vim 83.5s => [4/4] RUN yum -y install net-tools 14.0s => exporting to image 1.9s => => exporting layers 1.9s => => writing image sha256:cf0942064f61b7acc59332811cab528fec3a79303fbc4cc805a4bd29c3834c5b 0.0s => => naming to docker.io/library/mycentos:1.3 0.0s |
注一:
在执行上面命令后,
报错 – “docker build” requires exactly 1 argument.:
原因:是因为少输入了最后那一个点“.”。
解决办法:加上最后那个点就好了。
注二:
当前执行构建时,可能会因为未知的错误被中断,
我所说的未知并非真正的未知,
只是因为第一次执行会报错中断,
第二次执行就正常构建成功了。
所以,大家在构建不成功时,就多跑两遍命令试试。
创建并进入容器:
> docker run -it mycentos:1.3
退出到宿主机,查看mycentos:1.3镜像
> docker images mycentos:1.3
用返回的镜像ID,查看镜像的变更历史:
> docker history [镜像ID]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
>docker history cf0942064f61 IMAGE CREATED CREATED BY SIZE COMMENT cf0942064f61 About an hour ago CMD ["/bin/sh" "-c" "/bin/bash"] 0B buildkit.dockerfile.v0 <missing> About an hour ago CMD ["/bin/sh" "-c" "echo \"success---------… 0B buildkit.dockerfile.v0 <missing> About an hour ago CMD ["/bin/sh" "-c" "echo $MYPATH"] 0B buildkit.dockerfile.v0 <missing> About an hour ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0 <missing> About an hour ago RUN /bin/sh -c yum -y install net-tools # bu… 14.4MB buildkit.dockerfile.v0 <missing> About an hour ago RUN /bin/sh -c yum -y install vim # buildkit 57.3MB buildkit.dockerfile.v0 <missing> About an hour ago WORKDIR /usr/local 0B buildkit.dockerfile.v0 <missing> About an hour ago ENV MYPATH=/usr/local 0B buildkit.dockerfile.v0 <missing> About an hour ago MAINTAINER mrdede<1234567@qq.com> 0B buildkit.dockerfile.v0 <missing> 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 3 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB |