镜像相关命令

  1. 查看镜像

  1. root@vvkt7whznuckhiz2-0723575:~# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. nginx latest 08b152afcfae 5 days ago 133MB
  4. hello-world latest d1165f221234 4 months ago 13.3kB

Command-Line

  1. docker pull redis:6 # 拉取指定标签
  2. docker rmi redis:5 # 删除指定镜像
  3. docker rmi 08b152afcfae # 通过镜像ID删除镜像

参数介绍

  • REPOSITORY: 镜像在仓库中的名称,简称镜像名称

  • TAG: 镜像标签

  • IMAGE ID: 镜像ID

  • CREATED: 镜像创建日期(不是获取该镜像的日期)

  • SIZE: 镜像大小

  1. 这些镜像都存储在Docker宿主机的`/var/lib/docker`目录下
  1. 搜索镜像


如果需要从网络中查找镜像,可以通过以下命令搜索

  1. docker search 镜像名称
  • NAME : 镜像名字

  • DESCRIPTION: 版本描述

  • STARS: 关注度

  • OFFICIAL:是否为官方镜像

  1. 拉取镜像

  1. docker pull redis:6 # 拉取指定标签
  1. 容器相关的命令

  1. ### 查看正在运行的容器
  2. root@vvkt7whznuckhiz2-0723575:~# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. ### 查看特定命令的帮助
  5. root@vvkt7whznuckhiz2-0723575:~# docker ps --help
  6. Usage: docker ps [OPTIONS]
  7. List containers
  8. Options:
  9. -a, --all Show all containers (default shows just running)
  10. -f, --filter filter Filter output based on conditions provided
  11. --format string Pretty-print containers using a Go template
  12. -n, --last int Show n last created containers (includes all states) (default -1)
  13. -l, --latest Show the latest created container (includes all states)
  14. --no-trunc Don't truncate output
  15. -q, --quiet Only display container IDs
  16. -s, --size Display total file sizes
  17. ### 查看所有容器
  18. root@vvkt7whznuckhiz2-0723575:~# docker ps -a
  19. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  20. 8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
  21. d13713d9d85e hello-world "/hello" 3 days ago Exited (0) 3 days ago keen_ellis
  1. 查看停止状态的容器

  1. root@vvkt7whznuckhiz2-0723575:~# docker ps -f status=exited
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
  4. d13713d9d85e hello-world "/hello" 3 days ago Exited (0) 3 days ago keen_ellis
  1. 查看最后一次运行的容器

  1. root@vvkt7whznuckhiz2-0723575:~# docker ps -l
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
  1. 列出最近创建的几个容器

  1. docker ps -n 5
  2. root@vvkt7whznuckhiz2-0723575:~# docker ps -n 5
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 8238375a0c06 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago musing_chandrasekhar
  5. d13713d9d85e hello-world "/hello" 3 days ago Exited (0) 3 days ago keen_ellis

2.2 创建与启动容器

    1. docker run --name mynginx -p 3389:80 nginx # 前一个参数是映射端口号,后一个参数是容器内部端口号
    2. docker run --name mynginx -P nginx # 随机端口号
    3. ### 另开终端查看端口号
    4. root@vvkt7whznuckhiz2-0723575:~# docker ps
    5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    6. f83761dec854 nginx "/docker-entrypoint.…" 4 minutes ago Up 3 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp mynginx
    7. ### 删除容器
    8. root@vvkt7whznuckhiz2-0723575:~# docker rm mynginx
    9. mynginx
    10. ### 使用ID删除容器
    11. root@vvkt7whznuckhiz2-0723575:~# docker rm 1000057ad9b1
    12. 1000057ad9b1
  • -i :表示运行容器

  • -t :表示容器启动后会进入命令行,加入这两个参数之后,容器创建就能登录进去,即分配一个伪终端

  • –name :为创建的容器命名

  • -v :表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或者文件映射

    1. 注意L最好做目录映射,在宿主机上做修改,然后共享到容器上;
  • -d :则会创建一个守护式容器在后台运行(这样创建容器不会自动登录容器,如果只加-i -t两个参数,创建容器则会自动进入容器)

  • -p :表示端口映射,前者是宿主机端口,后者是容器内的映射端口,可以使用多个-p做多个端口映射

  • -P :构建随机端口映射

运行效果

2.3 守护方式创建容器

  1. root@vvkt7whznuckhiz2-0723575:~# docker run -di --name mynginx -p 3389:80 nginx
  2. 0964fdf13ec3f8ced15ba3a177fd2b303391bf46341a43750e6c2bb70b96969a

补充

命令行终端实际以软件形式运行,可以直接进入相应目录,/bin/bash 或者/bin/sh【exit】退出

  1. ### 进入容器内部文件
  2. root@vvkt7whznuckhiz2-0723575:~# docker exec -it mynginx /bin/bash
  3. root@0964fdf13ec3:/# ls
  4. bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
  5. boot docker-entrypoint.d etc lib media opt root sbin sys usr

查看Docker配置文件:cat /etc/nginx/conf.d/default.conf

  1. server {
  2. listen 80;
  3. listen [::]:80;
  4. server_name localhost;
  5. #access_log /var/log/nginx/host.access.log main;
  6. location / {
  7. root /usr/share/nginx/html;
  8. index index.html index.htm;
  9. }
  10. #error_page 404 /404.html;
  11. # redirect server error pages to the static page /50x.html
  12. #
  13. error_page 500 502 503 504 /50x.html;
  14. location = /50x.html {
  15. root /usr/share/nginx/html;
  16. }
  17. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  18. #
  19. #location ~ \.php$ {
  20. # proxy_pass http://127.0.0.1;
  21. #}
  22. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  23. #
  24. #location ~ \.php$ {
  25. # root html;
  26. # fastcgi_pass 127.0.0.1:9000;
  27. # fastcgi_index index.php;
  28. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  29. # include fastcgi_params;
  30. #}
  31. # deny access to .htaccess files, if Apache's document root
  32. # concurs with nginx's one
  33. #
  34. #location ~ /\.ht {
  35. # deny all;
  36. #}
  37. }

2.3 停止与启动容器

  1. ### 停止容器
  2. docker stop 容器名称 | 容器ID
  3. ### 启动容器
  4. docker start 容器名称 | 容器ID

2.4 文件拷贝

如果我们需要将文件拷贝到容器内部可以使用cp命令

  1. docker cp 需要拷贝的文件或目录 容器名称:容器目录
  2. docker cp test.txt mynginx:/etc

也可以将文件从容器内拷贝出来

  1. docker cp 容器名称:容器目录 需要拷贝的文件或者目录
  2. docker cp mynginx:/etc/abc.txt /root

其他操作

  1. ### 运行并且进入容器内目录
  2. docker exec -it mynginx /bin/bash
  3. ### 查看文件
  4. root@0964fdf13ec3:/etc# cat test.txt
  5. Test the function of copying files.

2.5 目录挂载(容器数据卷操作)

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定的,也就是说容器内的操作也会影响到宿主机,实现备份功能。

但是容器被删除的时候,宿主机内容并不会被删除。如果多个容器挂载在同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响。

容器和宿主机之间数据卷属于引用关系,数据卷是从外界挂载到容器内部的,所以可以脱离容器的生命周期而独立存在,而正式由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除之后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。

创建容器添加-v参数,格式为:宿主机目录:容器目录, 例如:

  1. docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
  2. # 多目录挂载
  3. docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2:镜像名

目录挂载操作可能会出现权限不足的提示,这是因为CentOS7的安全模块SELinux把权限禁止掉了,在docker run时通过--privileged=true给该容器加权限来解决挂载的目录没有权限的问题

操作思路:1. 创建容器即绑定目录挂载关系;2. 修改配置文件中的[Mount];3. 拷贝出来文件,重新创建并且挂载

常用命令

  1. ### 查看docker配置信息
  2. docker inspect niginx03
  3. ### 创建容器时则绑定文件目录
  4. docker run -di --name nginx03 -p 3389:80 -v /mydata/docker_nginx/:/abc/123 nginx
  5. ### 补充 tree命令
  6. tree -L 1
  7. ### 进入容器内操作文件
  8. docker exec -it mynginx /bin/bash

指定目录挂载

  1. ### 主机2 创建目录并且进入
  2. mkdir /mydata/docker_nginx
  3. cd /mydata/docker_nginx
  4. vim test.txt(我是配置文件)
  5. ### 主机1 创建容器并且指定目录
  6. docker run -di --name nginx02 -p 3389:80 -v /mydata/docker_nignx/:/abc/123 nginx
  7. ### 主机1 进入系统指定目录
  8. cd /mydata/docker_nginx
  9. ### 主机2 进入容器nginx02
  10. docker exec -it nginx02 /bin/bash
  11. ### 主机2 查看相关文件
  12. cd /abc/123
  13. ls

2.5.1匿名挂载

匿名挂载只需要写容器目录即可,容器外对应的目录会在/var/lib/docker /volumes中生成。

  1. # 匿名挂载
  2. docker run -di -v /usr/local/data --name centos7 centos:7
  3. # 查看volume数据卷信息
  4. docker volume ls

实操代码

  1. 1. docker run -di -v /usr/local/data --name nginx05 nginx
  2. 2. ls /var/lib/docker/volumes/ # 存放镜像文件的目录
  3. # 预期结果
  4. dab8a70d6214a5ea4d7fbf74efd20d5de5e08b853ef7b3237aba23d823ce8a2a
  5. metadata.db
  6. # 补充---查看文件创建时间
  7. # stat file / stat *

2.5.2 具名挂载

具名挂载就是给数据卷起了个名字,容器外对应的目录会在/var/lib/docker/volume 中生成。

  1. #匿名挂载
  2. docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
  3. #查看volume数据卷信息
  4. docker volume ls
  5. #主机1 实操代码
  6. docker run -di -v docker_nginx_data:/usr/local/contain --name nginx01 nginx
  7. #主机1 进入指定目录,查看docker内部文件
  8. cd /var/docker/volumes
  9. ls
  10. docker_nginx_data
  11. cd docker_nginx_data/_data/
  12. #主机2
  13. docker exec -it nginx01 /bin/bash
  14. cd /usr/local/contain
  15. ls
  16. touch mix.txt
  17. #主机1 检查文件同步
  18. ls
  19. mix.txt

Docker操作命令 - 图1

2.5.4 查看目录挂载关系

  1. docker inspect nginx01 | grep Mounts -A 20
  2. ### 预期输出结果
  3. "Mounts": [
  4. {
  5. "Type": "volume",
  6. "Name": "docker_nginx_data",
  7. "Source": "/var/lib/docker/volumes/docker_nginx_data/_data",
  8. "Destination": "/usr/local/contain",
  9. "Driver": "local",
  10. "Mode": "z",
  11. "RW": true,
  12. "Propagation": ""
  13. }
  14. ],
  15. "Config": {
  16. "Hostname": "2ca5b2ae89ae",
  17. "Domainname": "",
  18. "User": "",
  19. "AttachStdin": false,
  20. "AttachStdout": false,
  21. "AttachStderr": false,
  22. "ExposedPorts": {
  23. "80/tcp": {}
  24. # 方法2
  25. root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# docker run -di -v docker_nginx_data:/usr/local/contain --name nginx01 nginx
  26. e8acc16c9d9195ae05a9414a5ba1a61f9b4220a082daa341a528eef3decf7eba
  27. root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# docker volume inspect docker_nginx_data
  28. [
  29. {
  30. "CreatedAt": "2021-08-07T16:33:32+08:00",
  31. "Driver": "local",
  32. "Labels": null,
  33. "Mountpoint": "/var/lib/docker/volumes/docker_nginx_data/_data",
  34. "Name": "docker_nginx_data",
  35. "Options": null,
  36. "Scope": "local"
  37. }
  38. ]

2.5.5 设置目录/文件权限(只读/只写)

  1. #主机1 创建容器
  2. root@vvkt7whznuckhiz2-0723575:~# docker run -di --name nginx02 -P -v /nydata/docker_nginx:/abc:ro nginx
  3. 2a793b9c67c9e6bac7fe56ff602ca91783289b0b6e2dbda78cbd224bff661a7e
  4. root@vvkt7whznuckhiz2-0723575:~# cd /mydata/docker_nginx/
  5. root@vvkt7whznuckhiz2-0723575:/mydata/docker_nginx# ls
  6. test.txt
  7. # 主机2 查看文件
  8. root@vvkt7whznuckhiz2-0723575:~# docker exec -it nginx02 /bin/bash
  9. root@2a793b9c67c9:/# cd /abc/
  10. root@2a793b9c67c9:/abc# ls
  11. root@2a793b9c67c9:/abc# touch 123.txt
  12. touch: cannot touch '123.txt': Read-only file system

2.5.6 读写模式

  1. # 主机1
  2. root@vvkt7whznuckhiz2-0723575:~# docker run -di --name nginx03 -P -v /nydata/docker_nginx:/tecent:rw nginx
  3. d0362b1efe39508a3d2c997789ef185aacdbce3cdb10e6bf29e36bbe94ed7200
  4. root@vvkt7whznuckhiz2-0723575:~# cd /nydata/docker_nginx
  5. root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# ls
  6. 599.txt
  7. # 主机2
  8. root@vvkt7whznuckhiz2-0723575:~# docker exec -it nginx03 /bin/bash
  9. root@d0362b1efe39:/# cd tecent
  10. root@d0362b1efe39:/tecent# ls
  11. 599.txt
  12. root@d0362b1efe39:/tecent# touch 1024.text
  13. root@d0362b1efe39:/tecent# ls
  14. 1024.text 599.txt
  15. # 主机1
  16. root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# ls
  17. 1024.text 599.txt

2.5.7 继承挂载[volumes-from]

  1. # 主机1
  2. root@vvkt7whznuckhiz2-0723575:/nydata/docker_nginx# docker run -di --name nginx04 --volumes-from nginx03:ro nginx
  3. # 主机2
  4. root@vvkt7whznuckhiz2-0723575:~# docker exec -it nginx04 /bin/bash
  5. root@352eea7b736c:/# cd /tecent
  6. root@352eea7b736c:/tecent# ls
  7. 1024.text 599.txt
  8. root@352eea7b736c:/tecent# touch 1998.txt
  9. touch: cannot touch '1998.txt': Read-only file system

2.5.8 查看容器IP地址

我们可以通过以下命令查看容器的元信息。

  1. docker inspect 容器名称|容器ID
    也可以直接执行下面的命令直接输出IP地址。
  2. docker inspect —format=’ {{ .NetworkSettings.IPAddress}} ‘ 容器名称|容器ID
  1. # docker inspect nginx03
  2. # 预期输出结果
  3. "Gateway": "172.17.0.1",
  4. "GlobalIPv6Address": "",
  5. "GlobalIPv6PrefixLen": 0,
  6. "IPAddress": "172.17.0.2",
  7. "IPPrefixLen": 16,
  8. "IPv6Gateway": "",
  9. "MacAddress": "02:42:ac:11:00:02",
  10. "Networks": {
  11. "bridge": {
  12. "IPAMConfig": null,
  13. "Links": null,
  14. "Aliases": null,
  15. "NetworkID": "899b1a3fb8da357f7a3b4d4115911a9467fabf7e9a540232ec39870104cc1c19",
  16. "EndpointID": "6cd23b40384f85d9c99d2dd0505c5a0826302edb8a404dfd3d5b6b3b718a6a8a",
  17. "Gateway": "172.17.0.1",
  18. "IPAddress": "172.17.0.2",
  19. "IPPrefixLen": 16,
  20. "IPv6Gateway": "",
  21. "GlobalIPv6Address": "",
  22. "GlobalIPv6PrefixLen": 0,
  23. "MacAddress": "02:42:ac:11:00:02",
  24. "DriverOpts": null
  25. # docker inspect --format=' {{ .NetworkSettings.IPAddress}} ' nginx03
  26. root@vvkt7whznuckhiz2-0723575:~# docker inspect --format=' {{ .NetworkSettings.IPAddress}} ' nginx03
  27. 172.17.0.2

2.5.9 同时停止和删除多个容器

  1. docker stop nginx03 nginx04 nginx05 nginx06 nginx07 nginx08 nginx09
  2. docker rm nginx03 nginx04 nginx05 nginx06 nginx07 nginx08 nginx09