官方文档:https://docs.docker.com/engine/reference/commandline/run/ 提供了完整的Docker命令列表,也可以使用docker help
命令来获取这些命令,通过docker COMMAND --help
、docker help COMMAND
获取命令的详细使用;
命令 | 用途 |
---|---|
docker --help |
查看docker命令 |
docker help XXX |
查看具体命名使用 |
docker pull [options] name[:tag] |
从远端仓库获取image到本地;name:要拉取的镜像的名称,tag指定要拉取的镜像的版本,默认下载最新版本 |
docker push name | 推送镜像到远程仓库 |
docker build --no-cache -t . |
通过Dockerfile构建镜像: 创建image; .代表当前路径、-t标签名、禁止缓存 |
docker history [image] | 查看镜像构建的过程 |
docker commit -a -m -p 容器name 镜像name |
通过容器构建镜像:保存改动为新的image;-a作者信息/-m容器信息/-p不暂停正在执行的容器–pause=true |
docker images [-a -f -q --no-trunc][repository][:tag] |
列出本地已有image,验证pull是否成功;repository:指定要查看的镜像的名称(本机镜像多的时候才用) -all/-filter/–no-trunc 容器id不截断/-quiet只显示容器id |
docker run [options] image[:tag][command][arg...] |
运行container;image:要运行的镜像的名称;command:镜像要运行起来的时候要执行什么命令;arg:command所依赖的参数 |
docker run -d -i -t ] image[:tag][command][arg...] |
后台运行,返回容器ID;-interactive/-ttp |
docker run --name=名字 -i -t ... |
自定义容器名字 |
docker run -v ~/datavolume:data:ro -i -t imagesName |
为容器创建数据卷;-v:指定数据卷本机文件系统中的目录,和在容器中映射的目录名,肉设置文件权限为只读 |
docker run --volumes-from [containerName] |
使用**–volumes-from**命令来指定新建容器所连接的数据卷容器,–volumes-from选项的值就是已经挂载了数据卷的容器的容器名字; |
docker ps |
列出正在运行的container |
docker ps -a -l |
列出所有container;-all/-latest |
docker inspect (CONTAINER/IMAGES)name/id |
查看刚才已经建立的容器的状态 |
docker rm name/id |
删除已经结束的container,删除容器之前要先stop容器 |
docker rmi -f --no-proune name/id |
删除image,删除镜像之前要先删除容器;-force/–n-proune保留删除镜像中未打标签的父镜像 |
docker rmi $(docker images -q) |
删除所有镜像($后面显示所有镜像id) |
docker cp |
在host和container之间拷贝文件 |
docker exec name/id |
在运行的容器中启动新的进程; 进入到容器的内部,执行一些命令 |
docker exec -i -t -d name/id 命令+参数 |
-i保证输入有效,-t分配一个伪终端,输入内容 |
docker stop name/id |
停掉某个容器 |
docker run -p 8080:80 name |
开放一个容器的端口到主机上,默认是空的;主机端口:容器端口 |
docker run -P name |
开放容器所有的端口到一个随机的主机端口,不用指定端口号 |
netstat -na!grep 8080 |
查看端口是否开放,然后在浏览器输入地址端口号 |
docker start name/id |
启动一个或多少已经被停止的容器 |
docker stop |
停止一个运行中的容器:发送一个信号给一个容器,等待容器的停止 |
docker skill |
停止一个运行中的容器:直接停止一个容器 |
docker restart |
重启容器 |
docker attach 容器ID |
进入一个正在运行的容器 |
-e是docker的一个参数,可以为容器指定一个环境变量; | 是一个键值对:key=value |
docker logs -f -t --tail name |
查看logs了解容器内部运行的情况;–follow/–timestamps//–tail=all(返回结尾处多少数量的日志,默认all) |
docker top name/id |
查看运行中容器的进程情况 |
docker info |
查看docker的信息 |
docker search |
查找镜像 |
docker run -i -t ubuntu /bin/bash
-i
:-interactive,保证容器中STDIN是开启的;开启了input输入功能,能实现用户与命令行进行实时交互,而不是一个运行后台服务的容器;【以交互的方式启动容器】
-d
:-daemonized,创建守护式容器(后台运行,不能实现实时交互);-d
与-i
不能同时使用;
-t
:告诉Docker为要创建的容器分配一个伪tty终端;-t
与-i
通常一起使用;
-p [宿主机IP地址:宿主机端口:容器端口]
:用来控制Docker在运行时应该公开哪些网络端口给外部(宿主机);
运行一个容器时,Docker可以通过两种方式来在宿主机上分配端口:
-p 80
:Docker可以在宿主机上随机选择一个位于49153~65535的一个比较大的端口号来映射到容器中的80端口;-p 80:80
:可以在Docker宿主机中指定一个具体的端口号来映射到容器中的80端口上;-p 8080:80
;-p 127.0.0.1:80:80
:将容器的80端口绑定到宿主机的127.0.0.1这个IP的80端口上;-p 127.0.0.1::80
:将容器的80端口绑定到宿主机的127.0.0.1这个IP的随机端口上;-P
:用来对外公开 在Dockerfile中的EXPOSE指令中设置的所有端口;
EXPOSE 80
命令会将容器内的80端口对本地宿主机公开,并且绑定到宿主机的一个随机端口上;该命令会将 用来构建镜像的Dockerfile文件中的EXPOSE指令指定 的其他端口也一并公开;
--link
:创建两个容器间的父子连接;被连接的容器必须运行在同一个Docker宿主机上,不同Docker宿主机山运行的容器无法连接;
2个参数:要连接的容器、连接后容器的别名,之间冒号分隔开;
别名可以让我们访问公开的信息而不用关注底层容器的名字;
连接让父容器有能力访问子容器,并且把子容器的一些连接细节分享给父容器,这些细节有助于配置应用程序并使用这个连接;
连接也能得到一些安全上的好处:启动子容器时不用使用-p公开端口,因为通过把容器连接在一起们可以让父容器直接让问任意子容器的公开端口,并且只有使用link标志连接的父容器才能连接子容器的端口;子容器的端口不需要对本地宿主机公开;
可以在启动Docker守护进程时加上--icc=false
标志关闭所有没有连接的容器之间的通信,强制Docker只允许有连接的容器之间互相通信;
可以把多个容器连接在一起;可以把一个容器与多个容器连接在一起;
Docker在父容器里的以下两个地方写入了连接信息:/etc/hosts
文件中、包含连接信息的环境变量中;
root@deec416db260:/# cat /etc/hosts
/ env
-w
:设置容器内的工作目录,run命令指定的-w参数会覆盖Dockerfile文件的WORKDIR指令设置的工作目录;
-h、--hostname
:为容器设置主机名,不设置的时候使用容器ID代替;
-e
:用来传递环境变量,-e设置的环境变量将只会在运行时有效;
--rm
:容器退出后随之将其删除;默认情况下为了排障需求,退出的容器不需要立即删除,除非手动docker rm,若只是随便创建一个容器看看结果,而不需要排障和保留结果,可以使用此参数,避免浪费空间;
-u
:覆盖Dockerfile文件中USER指令设置的值;即指定用来运行镜像的用户;
被创建- -v
:允许我们将宿主机的目录作为卷,挂载到容器里面;
这个参数指定了卷的源目录(本地宿主机的目录)和容器里面的目的目录,这两个目录通过冒号**:** 来分隔;若目录不存在,Docker会自动创建一个;也可以在目录后面加上rw/ro来指定目的目录的读写状态;
--name containerName
:给容器指定一个名称,而不是使用自动生成的名称;
在多数Docker命令中,可以用容器的名称代替容器ID,容器名称有助于分辨容器,当构建容器和应用程序之间的逻辑连接时,容器的名称也有助于从逻辑上理解连接关系;so推荐使用容器名称代替ID,以更加方便的管理容器;容器名称必须唯一!
(合法容器名只能包含:大小写字母、数字、下划线_、圆点. 、横线-)
--restart=always
:若由于某种错误而导致容器停止运行,可以通过--restart
让Docker自动重新启动该容器;
--restart
标志会检查容器的退出代码,并据此来决定是否需要重启容器,默认的行为是Docker不会重启容器;
Eg:docker run --restart=always --name containerName -d ubuntu COMMAND
--restart=always
:无论容器的退出代码是什么,Docker都会重启该容器;--restart=on-failure:X
:之后当容器的退出代码为非0值时才会自动重启容器,X指定Docker尝试自动重启的次数,最多重启X次;不写:X的话默认无限次数重启;-g 参数:这个参数会传递给Dockerfile中用ENTRYPOINT指定的命令;
Eg:docker run -it ubuntu -g "daemon off;"
、ENTRYPOINT ["/usr/sbin/nginx"]
,这样在这里的该命令为/usr/sbin/nginx -g "daemon off;"
,该命令会以前台的方式启动Nginx守护进程,此时这个容器就会作为一台Web服务器来运行;
ubuntu:告诉Docker基于ubuntu镜像来创建容器;ubuntu镜像是一个常备镜像,也可以成为**“基础base”镜像**;执行这个命令之后,Docker会先检查本地是否存在ubuntu镜像,若本地没有ubuntu镜像,Docker会连接官方维护的镜像仓库,查看是否有该镜像,若找到,则下载该镜像并保存到本地宿主机中;(这里的ubuntu指的是ubuntu仓库名,这个ubuntu仓库里面包含多个标签名不同的ubuntu镜像)
ubuntu:标签名
:在仓库名后面加上冒号和标签名来指定该仓库中的某一镜像;没有指定标签的话,默认下载/使用标签名=latest的镜像;
-i … /bin/bash:告诉Docker在新容器中要运行的命令:本例在容器中运行/bin/bash命令启动了一个Bash shell;当容器创建完之后,Docker就会执行容器中的/bin/bash命令,这时就可以看到容器内的shell了;
现在已经以root用户登录到了新的容器中了,容器ID为d39370…;
这是一个完整的Ubuntu系统,可以用它来做任何事情:
hostname
;cat /etc/hosts
;ip a
;ps -aux
apt-get update && apt-get install vim
exit
,docker ps -a
docker ps
:不带参数:查看当前系统中正在运行的容器;
-a
:带参数-a:列出所有的容器,包括正在运行的和已经停止的;
-i
:列出最后一次运行的容器,包括正在运行的和已经停止的;
-n X
:显示最后X个容器,不管容器是在运行还是已经停止;
-q
:表示只需要返回容器的ID,其他信息不返回;
-l
:显示最新的被创建容器;
docker start containerName/ID
:重新启动一个已经停止的容器;
docker restart containerName/ID
:重启一个容器;
docker stop containerName/ID
:停止一个运行中的容器:发送一个信号给一个容器,等待容器的停止;
docker skill containerName/ID
:停止一个运行中的容器:直接停止一个容器;
docker attach containerName/ID
:附着到容器上(进入到一个正在运行的容器);
Docker容器重新启动的时候,会沿用Docker run 命令时指定的参数来运行,so我们容器重新启动后会运行一个交互会话shell,因此,也可以用docker attach命令,重新附着到该容器的会话上;
docker run ...
== docker start/restart containerName/ID
+ docker attach containerName/ID
docker logs -f X -t containerName/ID
:获取容器的日志;默认会输出最后几条日志项并返回;
-f
:监控Docker的日志,日志实时更新,可以通过Ctrl+C
退出日志跟踪;X为限定获取日志的最后X行,X的值是int型整数;
-t
:为每条日志项前面加上时间戳;可以与-f
同时使用;
docker top containerName/ID
:查看容器内部运行的所有进程:PID、运行进程的用户USER、进程执行的命令command;
docker exec -d/-i containerName/ID command
:在容器内部额外启动新的进程;
可在容器内部运行的容器有两种:
交互式任务-i:交互式任务保持在前台运行;【以交互的方式进入容器】
docker exec -i -t containerName /bin/bash
:在containerName容器中创建一个新的bash会话,有了这个会话,就可以在该容器中运行其他命令了;
守护式任务(后台任务)-d:后台任务在容器内运行,且没有交互需求;对于需要在容器内部打开shell的任务,交互式任务很实用;通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控、管理任务;
docker exec -d containerName touch /etc/new_file
:在容器containerName内部创建(touch)一个空文件;
docker inspect --format=‘{{ .State.Running}}’ containerName/ID1 [containerName/ID2]
:深入容器,获取容器的更多信息;
该命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置等数据;(可以同时指定多个容器,并显示每个容器的输出结果)
-f/--format
:选定查看结果;(支持完整的GO语言模板)
‘{{ .Name}}’
返回容器的名字;‘{{ .State.Running}}’
返回容器的运行状态;‘{{ .NetworkSettings.IPAddress}}’
返回容器的IP地址;docker rm ID
:删除容器;
注意:正在运行的容器无法删除,必须先通过docker stop或docker kill命令停止容器,然后再删除rm容器;
小技巧:docker rm 'docker ps -a -q'
:删除所有容器;
docker images [imageName]
:列出Docker主机上可用的镜像;
指定镜像名可以限制镜像列表中只显示指定的镜像的内容;
docker pull imageName[:tagName]
:拉取imageName仓库的所有内容到本地;
镜像名后面加上冒号和标签名可以拉取指定标签的镜像,不指定标签名默认拉取指定的镜像仓库名下的所有不同标签名的镜像;
docker search imageName
:查找所有Docker Hub上公共的可用镜像;(也可以直接在镜像网站上直接查找镜像,复制拉取命令到命令行执行;)
构建镜像一般都是基于一个已有的基础镜像,构建新镜像;
构建镜像有两种方式:
(1)docker commit
:可以将此想想象为我们是在往版本控制系统里提交变更;
先创建一个容器:docker run -i -t ubuntu /bin/bash
;此命令创建一个基于ubuntu镜像的交互式容器,进入到容器内部,直接执行一系列操作;
在容器里面做出修改(就像修改代码一样):在容器中安装Apache,将这个容器作为一个web服务器来运行:apt-get -yqq update
、apt-get -y install apache2
;
安装完Apache之后,为了保存当前状态,而不是每次都创建一个新容器并在此安装Apache,需要先exit
从容器里面退出来;
最后将修改提交为一个新的镜像:docker commit containerID 目标镜像仓库名/镜像名
;
containerID指定了要提交的修改过的容器的ID,可以通过docker ps -l -q
命令得到刚创建的容器的ID;docker commit
提交的只是创建容器的镜像与容器的当前状态之间的差异的部分,这使得该更新非常轻量;
也可以在提交镜像时指定更多的数据(标签)来详细描述所做的修改:
docker commit -m="A new custom image" --author="zxj" containerID 镜像仓库名/镜像名:tag
:
-m
指定新创建的镜像的提交信息;
--author
用来列出该镜像的作者的信息;
:tag
为镜像增加一个标签;
(2)docker build
+ dockerfile文件:(推荐使用:更灵活、更强大)
注意:执行Docker build
命令时,需要cd
到构建环境目录下!
推荐使用Dockerfile文件+docker build命令来构建镜像;Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像;
创建Dockerfile文件步骤:(创建一个包含简单Web服务器的Docker镜像)
static_web
,在里面创建初始的Dockerfile:这个static_web目录就是我们的构建环境,Docker称此环境为上下文(context),或构建上下文(build context);Docker会在构建镜像时将构建上下文和该上下文中的文件和目录上传到Docker守护进程,这样守护进程就能直接访问你想在镜像中存储的任何代码、文件、其他数据;mkdir static_web
:创建目录;cd static_web
:进入到目录内部;touch Dockerfile
:创建新的Dockerfile文件;vi Dockerfile
:进入到vi编辑器,编写dockerfile文件,保存,退出;docker build -t="镜像仓库名/镜像名:tag" .
:构建新镜像-t
为新镜像设置了仓库和名称,以及标签,若没有指定任何标签,Docker将会自动为镜像设置一个latest标签;命令中最后的**点(.)**告诉Docker到本地目录中去找Dockerfile文件,也可以指定一个Git仓库的源地址来指定Dockerfile的位置;Sending build context to Docker daemon
;.dockerignore
命名的文件的话,那么该文件内容会被按行进行分割,每一行都是一条文件过滤匹配模式;这很像.gitignore
文件,该文件用来设置哪些文件不会被上传到构建上下文中去;该文件中模式的匹配规则采用了Go语言中的filepath;构建镜像之后需要共享和发布镜像:
先在Docker Hub https://id.docker.com/ 中创建账号;
登录账号:docker login
:登录之后会将个人认证信息保存到$HOME/.dockercfg
文件中,供后面使用;
docker history imageID
:查看镜像构建过程,可以看到新构建的镜像的每一层,以及创建这些层的Dockerfile指令;
history命令从新构建的镜像的最后一层开始,追溯到最开始的父镜像;展示了每步之间构建的新层,以及创建这个层所使用的Dockerfile里的指令;
docker port containerID 80
:指定了想要查看映射情况的容器的ID和容器的端口号,这里是80,该命令返回宿主机中映射的端口;
docker push 用户名/仓库名
:在镜像构建完毕之后,将其推送到Docker hub;
docker rmi [用户名/]镜像名或imageID
:删除镜像;
删除镜像时,可以看到Docker的分层文件系统:每一个Deleted:行
都代表一个镜像层被删除;
可以在命令行中指定一个镜像名列表来删除多个镜像;
可以删除所有镜像:docker rmi 'docker images -a -q'
;
删除镜像操作只会删除本地的镜像,上传到Docker Hub上的镜像不会被删除,在Docker Hub上依然存在;
若想删除Docker Hub上的镜像仓库,需要登录到Docker Hub上使用Deleted repository
链接来删除;