Docker容器相关的命令
查看容器
docker ps [OPTIONS]
OPTIONS常用的参数:
- -a: 查看所有容器
- -l: 查看最近创建的容器
- -n: 查看最后创建的n个容器
示例:
查看所有容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- CONTAINER ID: 容器ID
- IMAGE: 所属镜像
- COMMAND: 容器启动时执行的命令
- CREATED: 创建时间
- STATUS: 容器状态
- PORTS: 端口
- NAMES: 容器名称
查看最后创建的3个容器
docker ps -n 3
创建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS常用的参数:
- --name: 为创建的容器命名
- -i: 保持容器运行,通常与 -t 同时使用
- -t: 启动容器后进入命令行,即分配一个伪终端
- -d: 后台方式运行
- -v: 表示宿主机目录和容器目录的映射关系
- -p: 指定宿主机端口和容器端口的映射
- -P: 随机指定宿主机的可用端口和容器端口的映射
- --restart: 设置容器的重启策略,默认是no,不自动重启
- --restart=no: 不自动重启。
- --restart=on-failure[:max-retries]: 在容器非正常退出时(退出状态非0),才会重启容器,可以设置重启的次数。
- --restart=unless-stopped: 除非明确停止或 Docker 本身停止或重新启动,否则重新启动容器。
- --restart=always: 在容器退出时总是重启容器,不论容器状态如何。
通过镜像创建容器,运行容器并进入容器的 /bin/bash
:
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
示例:
$ docker run -it --name mycentos7 centos:7 /bin/bash
守护方式创建容器:
docker run -id --name 容器名称 镜像名称:标签
设置启动策略:
$ docker run --restart=always redis
在运行的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS常用的参数:
- --detach, -d: 在后台运行命令
- --interactive, -i: 即使没有附加也保持 STDIN 打开,和 -t 配合使用
- --tty, -t: 分配一个伪终端
- --env, -e: 设置环境变量
- --env-file: 读取环境变量文件
- --user, -u: 指定访问容器的用户名
- --workdir, -w: 指定容器内执行命令的目录
进入容器的CLI
docker exec -it 容器名称|容器ID /bin/bash
docker exec -it 容器名称|容器ID bash
示例:
$ docker exec -it centos7 /bin/bash
$ docker exec -it centos7 bash
在指定目录执行命令
$ docker exec -it -w /home centos7 pwd
/home
启动和停止容器
启动容器:
docker start 容器名称|容器ID
停止容器:
docker stop 容器名称|容器ID
重启容器:
docker restart 容器名称|容器ID
示例:
$ docker stop centos7
$ docker start centos7
$ docker restart centos7
查看容器信息
docker inspect 容器名称|容器ID
示例: 查看容器centos7详细信息,输入部分内容如下:
$ docker inspect centos7
[
{
"Id": "32f812f5126f93fe2f60fd39eb5bb14623dd962517f1a76ac3795289c7829964",
"Created": "2021-06-28T09:18:43.750614614Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 21044,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-06-28T09:35:26.210740682Z",
"FinishedAt": "2021-06-28T09:33:42.196548945Z"
},
"Image": "sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf",
...
]
直接输出容器的IP地址:
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' centos7
172.17.0.4
删除容器
正在运行的容器无法被删除
删除指定容器:
docker rm 容器名称|容器ID
删除多个容器:
docker rm 容器名称|容器ID 容器名称|容器ID
容器数据卷操作
创建容器的时候可以将宿主机的目录和容器内的目录映射起来。宿主机目录下文件内容的修改会影响到容器内的目录,反过来容器内的修改也会影响到宿主机。
当容器被删除的时候,宿主机的内容也不会被删除,目录挂载使用 -v
参数。
指定目录挂载
docker run -id -v /宿主机目录1:/容器目录1 -v /宿主机目录2:/容器目录2 镜像名
注:
- 目录必须是绝对路径
- 如果目录不存在,则会自动创建
- 可以挂载多个数据卷
示例:
$ docker run -id -v /data/docker_data:/abc/testdata --name nginx02 nginx
74cd773ebf4e56884e4c7cf5534c6e37f23511aa20bb95e4ea3cc444880e8564
$ docker exec -it nginx02 /bin/bash
$ cd /abc/testdata
匿名挂载
匿名挂载不需要指定宿主机的目录,只要指定容器内目录即可。
docker run -id -v /容器目录 镜像名
示例:
$ docker run -id -v /usr/local/container_data --name nginx03 nginx
查看volume数据卷:
$ docker volume ls
DRIVER VOLUME NAME
local 7fce5cd52db38d8c063495be3f604fa547dda0426f2a61ee1e2a04699b225bfe
查看nginx03信息:
$ docker inspect nginx03
...
"Mounts": [
{
"Type": "volume",
"Name": "7fce5cd52db38d8c063495be3f604fa547dda0426f2a61ee1e2a04699b225bfe",
"Source": "/var/lib/docker/volumes/7fce5cd52db38d8c063495be3f604fa547dda0426f2a61ee1e2a04699b225bfe/_data",
"Destination": "/usr/local/container_data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
可以看到Mounts下显示了数据的挂载信息,其中Source中指定的 /var/lib/docker/volumes
是宿主机数据卷目录
具名挂载
具名挂载就是给数据卷起了个名字,数据卷目录依然在/var/lib/docker/volumes
下
docker run -id -v 卷名:/容器目录 镜像名
示例:
$ docker run -id -v nginx_data:/usr/local/container_data --name nginx04 nginx
查看volume数据卷:
$ docker volume ls
DRIVER VOLUME NAME
local 7fce5cd52db38d8c063495be3f604fa547dda0426f2a61ee1e2a04699b225bfe
local nginx_data
查看 /var/lib/docker/volumes/
目录:
$ ls /var/lib/docker/volumes/
7fce5cd52db38d8c063495be3f604fa547dda0426f2a61ee1e2a04699b225bfe backingFsBlockDev metadata.db nginx_data
查看nginx04信息:
$ docker inspect nginx04
...
"Mounts": [
{
"Type": "volume",
"Name": "nginx_data",
"Source": "/var/lib/docker/volumes/nginx_data/_data",
"Destination": "/usr/local/container_data",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
...
或者通过 docker volume inspect 数据卷名称
查看对应挂载的信息。
挂载时设置权限
挂载数据卷时可以设置只能在宿主机进行文件操作,不允许在容器内部进行文件操作
- ro: 只读
- rw: 读写
设置只读:
docker run -id --name nginx-1 -v /test_data/test_data:/test/container_data:ro nginx
进入该容器中进行文件操作
$ docker exec -it nginx-1 /bin/bash
root@79cd0defa4db:/# cd /test/container_data/
root@79cd0defa4db:/test/container_data# touch test.txt
touch: cannot touch 'test.txt': Read-only file system
发现目录是只读权限是无法进行文件操作的。
设置读写:
docker run -id --name nginx-2 -v /test2_data/test2_data:/test/container_data:rw nginx
数据卷容器
数据卷容器用来实现多个容器之间的数据同步,使用 --volumes-from
参数实现。
1.创建容器nginx05
$ docker run -id -v /mydata/my_nginx_data:/usr/local/nginx_data --name nginx05 nginx
2.创建容器 nginx06 和 nginx07 继承 nginx05
$ docker run -id --volumes-from nginx05 --name nginx06 nginx
$ docker run -id --volumes-from nginx05 --name nginx07 nginx
当把容器nginx05删除后,容器nginx06和nginx07依然可以访问 /usr/local/nginx_data
目录。
查看日志
docker logs [OPTIONS] CONTAINER|CONTAINER ID
Options常用的参数:
- -f: 跟踪实时日志
- --since: 显示自某个timestamp之后的日志
- --tail: 显示多少行
- -t: 显示时间戳
显示最后10行:
docker logs -f -t --tail 10 nginx
显示某个时间之后的日志:
docker logs -f -t --since="2021-07-01T12:12:00" nginx
查看容器运行进程信息
docker top CONTAINER [ps OPTIONS]
示例:
$ docker top nginx
UID PID PPID C STIME TTY TIME CMD
root 36594 36575 2 13:53 ? 00:00:00 nginx -g daemon off;
拷贝文件
在容器和宿主机之间复制文件或文件夹。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
- SRC_PATH或DEST_PATH可以是文件或目录
- 容器可以正在运行或已停止
从容器复制文件到宿主机
$ sudo docker cp d9b1a66e4eb0:/tmp/test.txt /tmp/
当宿主机的目录不存在时:
$ docker cp d9b1a66e4eb0:/tmp/test.txt aaa/
no such directory
$ docker cp d9b1a66e4eb0:/tmp/test.txt aaa/aaa
invalid output path: directory "/tmp/fabric-baas-var/aaa" does not exist
从宿主机复制文件到容器
$ docker cp a.txt mycentos:/
$ docker exec -it mycentos bash
[root@d9b1a66e4eb0 /]# ls
a.txt anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
根据容器创建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS参数:
- --author, -a: 设置作者
- --change, -c: 使用Dockerfile指令来创建镜像
- --message, -m: 提交时的说明信息
- --pause, -p: 在提交期间暂停容器
$ docker commit nginx nginx:v1.0
sha256:8ee6f5fa5afacc523d87dd2fdef0896d6160cbc72b187ce8ef8c3bf233dcaa3b
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1.0 8ee6f5fa5afa 8 seconds ago 16MB
nginx latest 4f380adfc10f 2 weeks ago 133MB
容器导出和导入
容器导出
将本地的容器导出成文件
docker export [OPTIONS] CONTAINER
Options
- --output, -o: 指定写入到文件
docker export -o testcentos7.tar centos7
容器导入
从归档文件中创建镜像
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
Options参数:
- --change, -c: 应用Dockerfile指令创建镜像
- --message, -m: 在导入镜像时设置提交信息
- --platform: 如果服务器支持多平台,则设置平台
$ docker import -m 'import from testcentos7.tar' testcentos7.tar testcentos7:v1
sha256:a663ef26082e802fc6acbad194fb64eb300d3ffd3e21799e0ce249d0b5556082
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
testcentos7 v1 a663ef26082e 14 seconds ago 204MB
nginx latest 4f380adfc10f 2 weeks ago 133MB