镜像相关命令
root@vvkt7whznuckhiz2-0723575:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 08b152afcfae 5 days ago 133MB
hello-world latest d1165f221234 4 months ago 13.3kB
Command-Line
docker pull redis:6 # 拉取指定标签
docker rmi redis:5 # 删除指定镜像
docker rmi 08b152afcfae # 通过镜像ID删除镜像
参数介绍
REPOSITORY: 镜像在仓库中的名称,简称镜像名称
TAG: 镜像标签
IMAGE ID: 镜像ID
CREATED: 镜像创建日期(不是获取该镜像的日期)
SIZE: 镜像大小
这些镜像都存储在Docker宿主机的`/var/lib/docker`目录下
如果需要从网络中查找镜像,可以通过以下命令搜索
docker search 镜像名称
NAME : 镜像名字
DESCRIPTION: 版本描述
STARS: 关注度
OFFICIAL:是否为官方镜像
docker pull redis:6 # 拉取指定标签
### 查看正在运行的容器
root@vvkt7whznuckhiz2-0723575:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
### 查看特定命令的帮助
root@vvkt7whznuckhiz2-0723575:~# docker ps --help
Usage: docker ps [OPTIONS]
List containers
Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes
### 查看所有容器
root@vvkt7whznuckhiz2-0723575:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
d13713d9d85e hello-world "/hello" 3 days ago Exited (0) 3 days ago keen_ellis
root@vvkt7whznuckhiz2-0723575:~# docker ps -f status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
d13713d9d85e hello-world "/hello" 3 days ago Exited (0) 3 days ago keen_ellis
root@vvkt7whznuckhiz2-0723575:~# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
docker ps -n 5
root@vvkt7whznuckhiz2-0723575:~# docker ps -n 5
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
d13713d9d85e hello-world "/hello" 3 days ago Exited (0) 3 days ago keen_ellis
2.2 创建与启动容器
docker run --name mynginx -p 3389:80 nginx # 前一个参数是映射端口号,后一个参数是容器内部端口号
docker run --name mynginx -P nginx # 随机端口号
### 另开终端查看端口号
root@vvkt7whznuckhiz2-0723575:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f83761dec854 nginx "/docker-entrypoint.…" 4 minutes ago Up 3 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp mynginx
### 删除容器
root@vvkt7whznuckhiz2-0723575:~# docker rm mynginx
mynginx
### 使用ID删除容器
root@vvkt7whznuckhiz2-0723575:~# docker rm 1000057ad9b1
1000057ad9b1
-i :
表示运行容器-t :
表示容器启动后会进入命令行,加入这两个参数之后,容器创建就能登录进去,即分配一个伪终端–name :
为创建的容器命名-v :
表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或者文件映射注意L最好做目录映射,在宿主机上做修改,然后共享到容器上;
-d :
则会创建一个守护式容器在后台运行(这样创建容器不会自动登录容器,如果只加-i -t两个参数,创建容器则会自动进入容器)-p :
表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射-P :
构建随机端口映射
运行效果
2.3 守护方式创建容器
root@vvkt7whznuckhiz2-0723575:~# docker run -di --name mynginx -p 3389:80 nginx
0964fdf13ec3f8ced15ba3a177fd2b303391bf46341a43750e6c2bb70b96969a
补充
命令行终端实际以软件形式运行,可以直接进入相应目录,/bin/bash 或者/bin/sh【exit】退出
### 进入容器内部文件
root@vvkt7whznuckhiz2-0723575:~# docker exec -it mynginx /bin/bash
root@0964fdf13ec3:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
查看Docker配置文件:cat /etc/nginx/conf.d/default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
2.3 停止与启动容器
### 停止容器
docker stop 容器名称 | 容器ID
### 启动容器
docker start 容器名称 | 容器ID
2.4 文件拷贝
如果我们需要将文件拷贝到容器内部可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称:容器目录
docker cp test.txt mynginx:/etc
也可以将文件从容器内拷贝出来
docker cp 容器名称:容器目录 需要拷贝的文件或者目录
docker cp mynginx:/etc/abc.txt /root
其他操作
### 运行并且进入容器内目录
docker exec -it mynginx /bin/bash
### 查看文件
root@0964fdf13ec3:/etc# cat test.txt
Test the function of copying files.
2.5 目录挂载(容器数据卷操作)
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。
但是容器被删除的时候,宿主机内容并不会被删除。如果多个容器挂载在同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。
容器和宿主机之间数据卷属于引用关系,数据卷是从外界挂载到容器内部的,所以可以脱离容器的生命周期而独立存在,而正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除之后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。
创建容器添加-v
参数,格式为:宿主机目录:容器目录
, 例如:
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2:镜像名
目录挂载操作可能会出现权限不足的提示,这是因为CentOS7的安全模块SELinux把权限禁止掉了,在docker run时通过
--privileged=true
给该容器加权限来解决挂载的目录没有权限的问题操作思路:1. 创建容器即绑定目录挂载关系;2. 修改配置文件中的[Mount];3. 拷贝出来文件,重新创建并且挂载
常用命令
### 查看docker配置信息
docker inspect niginx03
### 创建容器时则绑定文件目录
docker run -di --name nginx03 -p 3389:80 -v /mydata/docker_nginx/:/abc/123 nginx
### 补充 tree命令
tree -L 1
### 进入容器内操作文件
docker exec -it mynginx /bin/bash
指定目录挂载
### 主机2 创建目录并且进入
mkdir /mydata/docker_nginx
cd /mydata/docker_nginx
vim test.txt(我是配置文件)
### 主机1 创建容器并且指定目录
docker run -di --name nginx02 -p 3389:80 -v /mydata/docker_nignx/:/abc/123 nginx
### 主机1 进入系统指定目录
cd /mydata/docker_nginx
### 主机2 进入容器nginx02
docker exec -it nginx02 /bin/bash
### 主机2 查看相关文件
cd /abc/123
ls
2.5.1匿名挂载
匿名挂载只需要写容器目录即可,容器外对应的目录会在/var/lib/docker /volumes中生成。
# 匿名挂载
docker run -di -v /usr/local/data --name centos7 centos:7
# 查看volume数据卷信息
docker volume ls
实操代码
1. docker run -di -v /usr/local/data --name nginx05 nginx
2. ls /var/lib/docker/volumes/ # 存放镜像文件的目录
# 预期结果
dab8a70d6214a5ea4d7fbf74efd20d5de5e08b853ef7b3237aba23d823ce8a2a
metadata.db
# 补充---查看文件创建时间
# stat file / stat *
2.5.2 具名挂载
具名挂载就是给数据卷起了个名字,容器外对应的目录会在/var/lib/docker/volume 中生成。
#匿名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
#查看volume数据卷信息
docker volume ls
#主机1 实操代码
docker run -di -v docker_nginx_data:/usr/local/contain --name nginx01 nginx
#主机1 进入指定目录,查看docker内部文件
cd /var/docker/volumes
ls
docker_nginx_data
cd docker_nginx_data/_data/
#主机2
docker exec -it nginx01 /bin/bash
cd /usr/local/contain
ls
touch mix.txt
#主机1 检查文件同步
ls
mix.txt
2.5.4 查看目录挂载关系
docker inspect nginx01 | grep Mounts -A 20
### 预期输出结果
"Mounts": [
{
"Type": "volume",
"Name": "docker_nginx_data",
"Source": "/var/lib/docker/volumes/docker_nginx_data/_data",
"Destination": "/usr/local/contain",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "2ca5b2ae89ae",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
# 方法2
root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# docker run -di -v docker_nginx_data:/usr/local/contain --name nginx01 nginx
e8acc16c9d9195ae05a9414a5ba1a61f9b4220a082daa341a528eef3decf7eba
root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# docker volume inspect docker_nginx_data
[
{
"CreatedAt": "2021-08-07T16:33:32+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/docker_nginx_data/_data",
"Name": "docker_nginx_data",
"Options": null,
"Scope": "local"
}
]
2.5.5 设置目录/文件权限(只读/只写)
#主机1 创建容器
root@vvkt7whznuckhiz2-0723575:~# docker run -di --name nginx02 -P -v /nydata/docker_nginx:/abc:ro nginx
2a793b9c67c9e6bac7fe56ff602ca91783289b0b6e2dbda78cbd224bff661a7e
root@vvkt7whznuckhiz2-0723575:~# cd /mydata/docker_nginx/
root@vvkt7whznuckhiz2-0723575:/mydata/docker_nginx# ls
test.txt
# 主机2 查看文件
root@vvkt7whznuckhiz2-0723575:~# docker exec -it nginx02 /bin/bash
root@2a793b9c67c9:/# cd /abc/
root@2a793b9c67c9:/abc# ls
root@2a793b9c67c9:/abc# touch 123.txt
touch: cannot touch '123.txt': Read-only file system
2.5.6 读写模式
# 主机1
root@vvkt7whznuckhiz2-0723575:~# docker run -di --name nginx03 -P -v /nydata/docker_nginx:/tecent:rw nginx
d0362b1efe39508a3d2c997789ef185aacdbce3cdb10e6bf29e36bbe94ed7200
root@vvkt7whznuckhiz2-0723575:~# cd /nydata/docker_nginx
root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# ls
599.txt
# 主机2
root@vvkt7whznuckhiz2-0723575:~# docker exec -it nginx03 /bin/bash
root@d0362b1efe39:/# cd tecent
root@d0362b1efe39:/tecent# ls
599.txt
root@d0362b1efe39:/tecent# touch 1024.text
root@d0362b1efe39:/tecent# ls
1024.text 599.txt
# 主机1
root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# ls
1024.text 599.txt
2.5.7 继承挂载[volumes-from]
# 主机1
root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# docker run -di --name nginx04 --volumes-from nginx03:ro nginx
# 主机2
root@vvkt7whznuckhiz2-0723575:~# docker exec -it nginx04 /bin/bash
root@352eea7b736c:/# cd /tecent
root@352eea7b736c:/tecent# ls
1024.text 599.txt
root@352eea7b736c:/tecent# touch 1998.txt
touch: cannot touch '1998.txt': Read-only file system
2.5.8 查看容器IP地址
我们可以通过以下命令查看容器的元信息。
- docker inspect 容器名称|容器ID
也可以直接执行下面的命令直接输出IP地址。- docker inspect —format=’ {{ .NetworkSettings.IPAddress}} ‘ 容器名称|容器ID
# docker inspect nginx03
# 预期输出结果
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "899b1a3fb8da357f7a3b4d4115911a9467fabf7e9a540232ec39870104cc1c19",
"EndpointID": "6cd23b40384f85d9c99d2dd0505c5a0826302edb8a404dfd3d5b6b3b718a6a8a",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
# docker inspect --format=' {{ .NetworkSettings.IPAddress}} ' nginx03
root@vvkt7whznuckhiz2-0723575:~# docker inspect --format=' {{ .NetworkSettings.IPAddress}} ' nginx03
172.17.0.2
2.5.9 同时停止和删除多个容器
docker stop nginx03 nginx04 nginx05 nginx06 nginx07 nginx08 nginx09
docker rm nginx03 nginx04 nginx05 nginx06 nginx07 nginx08 nginx09