【Docker系列】Docker操作常用命令
相关术语
Image:镜像。本文特指 Docker Image 。
Container:容器。本文特指 Docker Image Container。
Docker 通用操作
1.确认Docker版本
docker --version
2.获取帮助
docker --help
当然你也可以使用下列命令获取各项command的帮助
docker image --help
docker build --help
Image 相关操作
1.获取Image列表。
docker image ls
如果需要列出所有的Image(包括隐藏属性的Image)可以添加“-a”选项。
docker image ls -a
2.从Docker Hub获取Image
通用命令如下。其中ImageName表示镜像名称,TAG表示标签。默认从Docker Hub网站上下载。
docker image pull [ImageName]:[Tag]
示例:
docker image pull alpine:3.10.5
需要注意的是,这里的Tag可以省略。如果省略则默认为Tag为‘latest’的版本,即最新版本。
docker image pull alpine
通过docker image ls
命令我们可以看到两个不同版本的alpine
。
➜ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.10.5 be4e4bea2c2e 6 hours ago 5.58MB
alpine latest f70734b6a266 6 hours ago 5.61MB
常用的image都可以从Docker Hub上找到。alpine
是一个常用于生产环境的极简化Linux系统的Image。
3.更改Image的名称和tag
通用命令如下。Image:Tag
为更改前的状态,NewImage:NewTag
为更改后的状态。
docker image tag [Image:Tag] [NewImage:NewTag]
例如:
docker image tag alpine:3.10.5 helloworld:v1.0
通过docker image ls
命令,我们可以看到helloworld:v1.0
的镜像生成,而alpine:3.10.5
也仍然存在。
➜ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.10.5 be4e4bea2c2e 6 hours ago 5.58MB
helloworld v1.0 be4e4bea2c2e 6 hours ago 5.58MB
4.删除Image
通用命令如下。其中rm
是remove的缩写,-f
表示强制删除(即使由此Image生成的Continer正在运行,这个Image也会被删除)。
docker image rm -f [Image]:[Tag]
例如:
docker image rm -f alpine:latest
Container相关操作
Container
有5种状态,分别是:created(已创建),running(正在运行),paused(暂停中),exited(已终止),deleted(已删除)。
让我们来观察一张容器生命周期示意图:
出处:Docker | Docker技术基础梳理(三) – 容器生命周期管理
注释:图中的命令都不含有container
并非错误,而是旧版本的命令中都不包含container
,可以互换使用,但更推荐使用带有container
的命令。
Image为Container的模版,从Image出发,
使用 docker container create
命令创建一个新的容器(created);
使用 docker container start
命令来执行容器(running);
使用 docker container run
命令来执行容器(running);
使用 docker container restart
命令重启这个容器(running);
使用 docker container paused
命令暂停这个容器(paused);
使用 docker container unpaused
命令恢复运行容器(running);
使用 docker container stop
命令终止容器(exited);
使用 dokcer container rm [-f]
命令删除容器(deleted);
接着让我们具体来使用下这些命令。
查看Container状态
查看正在运行的容器:
docker ps
查看所以容器命令如下。这里的 -a
为 -all
的缩写,即查看全部容器。
docker ps -a
根据容器的某个值查看容器状态,可以使用如下命令:
docker ps -a -f name=value
这里的 name
表示项目名,value
表示此项目所对应的值。所有符合条件的结果都会被打印在命令行中。比如通过容器ID查看容器状态。(如何生成并启动Container将在下面介绍)
➜ docker ps -a -f ID=56114207ca65
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56114207ca65 ubuntu "/bin/bash" 52 seconds ago Up 19 seconds laughing_wright
创建Container
通用命令如下。其中ImageName为所要使用的Image的名称,Tag为其标签。Tag可以省略,在省略的情况下,默认标签为latest
。
docker container create [ImageName]:[Tag]
例如:
docker container create ubuntu:18.04
docker container create ubuntu:latest
docker container create ubuntu
后两个命令本质上没有区别。(2020/4/26时的latest版本为20.04)
如果创建交互模式的容器,需要增加-it
选项。
docker container create -it [ImageName]:[Tag]
例如
docker container create -it ubuntu:18.04
创建成功后,终端会返回给我们一个字符串。
➜ docker container create -it ubuntu:18.04
3aae22e8e5c165ea3d4fc3cea19b30228902bd5a81e049191638b3b1ae90a15f
这个字符串就是创建好的容器ID。我们可以通过docker ps -a
命令来查看上述容器是否已经被创建。
➜ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3aae22e8e5c1 ubuntu:18.04 "/bin/bash" 3 minutes ago Created dazzling_panini
可以看到,CONTAINER ID
为3aae22e8e5c1
的Container已经被创建。而这里的CONTAINER ID
则是上述容器ID的缩写(前12字符),指的是同一个Container。因此,在docker的所有命令中可以等价使用。
启动Container
通用命令如下。这里的[ContainerID]
指的是已经创建好的容器的ID,
docker container start [ContainerID]
我们在前面已经创建好了容器ID为3aae22e8e5c1
的Container,我们来启动这个容器。
docker container start 3aae22e8e5c1
使用docker ps
命令来查看上述Container是否处于运行状态。
➜ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3aae22e8e5c1 ubuntu:18.04 "/bin/bash" 13 minutes ago Up About a minute dazzling_panini
可以发现,容器ID为3aae22e8e5c1
的STATUS
为Up About a minute
,即running
状态。
需要注意的是,这里启动的为交互模式的容器。如果启动非交互模式的容器,则容器启动完成后便会进入终止状态。
# 创建容器
➜ docker container create ubuntu
3f6cb1ca05dc52620c1c1a9d8d5062edb9518d820617ac2fcb859c383e3212a0
# 启动容器
➜ docker container start 3f6cb1ca05dc
3f6cb1ca05dc
# 查看容器
➜ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f6cb1ca05dc ubuntu "/bin/bash" About a minute ago Exited (0) 4 seconds ago elastic_rubin
可以看到容器ID为 3f6cb1ca05dc
的容器 status
为 Exited
。
访问(连接)Container
通用命令:
docker container attach [ContainerID]
访问之前我们已经启动的容器ID为 3aae22e8e5c1
的容器。接着我们来访问一下该容器。
➜ docker container attach 3aae22e8e5c1
root@3aae22e8e5c1:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
可以看到我们成功连接了容器的主进程,并且可以执行shell命令。使用 exit
命令中断连接。
root@3aae22e8e5c1:/# exit
exit
查看该容器状态,可以发现该容器已经终止。
➜ docker ps -a -f ID=3aae22e8e5c1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3aae22e8e5c1 ubuntu:18.04 "/bin/bash" 5 hours ago Exited (0) 2 minutes ago dazzling_panini
创建并启动Container
如果需要创建之后立即启动容器,可以使用下面的命令:
docker container run [IMAGE]:[TAG]
例如:
docker container run hello-world:latest
以交互模式启动一个容器,使用选项 -it
。
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
在启动交互模式的同时,在容器内执行/bin/bash,方法如下:
docker container run -it [ImageName]:[Tag] /bin/bash
例如:使用镜像 nginx:latest
以交互模式启动一个容器,在容器内执行/bin/bash命令。
➜ docker container run -it nginx:latest /bin/bash
root@81e4292bb969:/# exit
exit
输入 exit
命令可以中断连接。中断的同时,容器也会终止运行。
如果需要给启动的容器附上一个名字,可以增加 “–Name”的选项。例如:
docker container run --name mynginx -it nginx:latest /bin/bash
查看该容器状态,可以发现 Names
一栏为 mynginx
。
➜ ~ git:(master) ✗ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
138e784ee1f3 nginx:latest "/bin/bash" 14 seconds ago Up 14 seconds 80/tcp mynginx
容器的80端口映射到主机随机端口,则需要添加 -p
选项。这里的选项 -d
表示后台运行容器,并返回容器ID。
docker container run -P -d nginx:latest
查看容器状态。发现容器的80端口映射到了主机端口32770。可以通过浏览器访问 localhost:32770
进行测试。
➜ ~ git:(master) ✗ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ab3750c9fc2 nginx:latest "nginx -g 'daemon of…" 6 seconds ago Up 5 seconds 0.0.0.0:32770->80/tcp gallant_mendel
也可以指定容器和主机的映射端口。比如将容器的80端口映射主机的1000端口,则命令如下:
docker container run -p 1000:80 -d nginx:latest
将容器的80端口映射主机的2000端口,将主机的目录 ~/data 映射到容器的 /data。
docker container run -p 2000:80 -v ~/data:/data -d nginx:latest
访问(连接)Container
通用命令:
docker container exec -it [containerID] /bin/bash
尝试连接上述挂载卷的容器:
➜ docker container exec -it 974f099cb6c8 /bin/bash
root@974f099cb6c8:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
我们发现容器主目录下挂载了 data
。
成功连接后,退出使用 exit
命令。并且退出后,容器会保持正常运行。
暂停Container
通用命令:
docker container pause [ContainerID]
例如:
➜ docker container pause 56114207ca65
56114207ca65
查看该容器状态。
➜ ~ git:(master) ✗ docker ps -a -f ID=56114207ca65
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56114207ca65 ubuntu "/bin/bash" About an hour ago Up About an hour (Paused) laughing_wright
可以看到该容器状态为 Up About an hour (Paused)
,即为暂停。
恢复Container
docker container unpause [ContainerID]
例如:
➜ docker container unpause 56114207ca65
56114207ca65
查看该容器状态。
➜ ~ git:(master) ✗ docker ps -a -f ID=56114207ca65
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56114207ca65 ubuntu "/bin/bash" About an hour ago Up About an hour laughing_wright
可以看到该容器状态为 Up About an hour
,即为正在运行。
停止Container
通用命令:
docker container stop [ContainerID]
例如:
➜ docker container stop 56114207ca65
56114207ca65
查看该容器状态。
➜ ~ git:(master) ✗ docker ps -a -f ID=56114207ca65
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
56114207ca65 ubuntu "/bin/bash" About an hour ago Exited (0) 3 seconds ago laughing_wright
可以看到该容器状态为 Exited (0) 3 seconds ago
,即为终止。
删除Container
通用命令:
docker container rm [ContainerID]
例如:
➜ docker container rm 56114207ca65
56114207ca65
查看该容器状态。
➜ docker ps -a -f ID=56114207ca65
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
可以看到该容器已被删除。