去评论
dz插件网

docker常用命令总结

婷姐
2023/04/21 18:45:19
1.1 docker 命令帮助

docker 命令是最常使用的docker 客户端命令,其后面可以加不同的参数以实现不同的功能
docker 命令格式
  1. docker [OPTIONS] COMMAND
  2. COMMAND分为
  3. Management Commands #指定管理的资源对象类型,较新的命令用法,将命令按资源类型进行分类,方便使用
  4. Commands                         #对不同资源操作的命令不分类,使用容易产生混乱
docker 命令有很多子命令,可以用下面方法查看帮助
  1. #docker 命令帮助
  2. man docker
  3. docker
  4. docker --help
  5. #docker 子命令帮助
  6. man docker-COMMAND
  7. docker COMMAND --help
1.2 查看 Docker 相关信息

1.2.1 查看 docker 版本
  1. root@rocky8 ~]$ docker version
  2. Client: Docker Engine - Community
  3. Version:           19.03.15
  4. API version:       1.40
  5. Go version:        go1.13.15
  6. Git commit:        99e3ed8919
  7. Built:             Sat Jan 30 03:16:44 2021
  8. OS/Arch:           linux/amd64
  9. Experimental:      false
  10. Server: Docker Engine - Community
  11. Engine:
  12.   Version:          19.03.15
  13.   API version:      1.40 (minimum version 1.12)
  14.   Go version:       go1.13.15
  15.   Git commit:       99e3ed8919
  16.   Built:            Sat Jan 30 03:15:19 2021
  17.   OS/Arch:          linux/amd64
  18.   Experimental:     false
  19. containerd:
  20.   Version:          1.6.15
  21.   GitCommit:        5b842e528e99d4d4c1686467debf2bd4b88ecd86
  22. runc:
  23.   Version:          1.1.4
  24.   GitCommit:        v1.1.4-0-g5fd4c4d
  25. docker-init:
  26.   Version:          0.18.0
  27.   GitCommit:        fec3683
1.2.2 查看 docker 详解信息
  1. [root@ubuntu1804 ~]$ docker info
  2. Client:
  3. Debug Mode: false         #client 端是否开启 debug
  4. Server:
  5. Containers: 2                 #当前主机运行的容器总数
  6.   Running: 0                 #有几个容器是正在运行的
  7.   Paused: 0                 #有几个容器是暂停的
  8.   Stopped: 2                 #有几个容器是停止的
  9. Images: 4                         #当前服务器的镜像数
  10. Server Version: 19.03.5         #服务端版本
  11. Storage Driver: overlay2         #正在使用的存储引擎
  12.   Backing Filesystem: extfs #后端文件系统,即服务器的磁盘文件系统
  13.   Supports d_type: true         #是否支持 d_type
  14.   Native Overlay Diff: true #是否支持差异数据存储
  15. Logging Driver: json-file         #日志类型
  16. Cgroup Driver: cgroupfs         #Cgroups 类型
  17. Plugins:                                         #插件
  18.   Volume: local                         #卷
  19.   Network: bridge host ipvlan macvlan null overlay # overlay 跨主机通信
  20.   Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog                  # 日志类型
  21. Swarm: inactive                                 #是否支持 swarm
  22. Runtimes: runc                                 #已安装的容器运行时
  23. Default Runtime: runc                         #默认使用的容器运行时
  24. Init Binary: docker-init                 #初始化容器的守护进程,即 pid 为 1 的进程
  25. containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339 #版本
  26. runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 #runc 版本
  27. init version: fec3683                         #init 版本
  28. Security Options:                                 #安全选项
  29.   apparmor                                                 #安全模块,https://docs.docker.com/engine/security/apparmor/
  30.   seccomp                                                 #安全计算模块,即制容器操作,https://docs.docker.com/engine/security/seccomp/
  31.    Profile: default                         #默认的配置文件
  32. Kernel Version: 4.15.0-29-generic #宿主机内核版本
  33. Operating System: Ubuntu 18.04.1 LTS #宿主机操作系统
  34. OSType: linux                                                 #宿主机操作系统类型
  35. Architecture: x86_64                                 #宿主机架构
  36. CPUs: 1                                                         #宿主机 CPU 数量
  37. Total Memory: 962MiB                                 #宿主机总内存
  38. Name: ubuntu1804.wang.org                         #宿主机 hostname
  39. ID: IZHJ:WPIN:BRMC:XQUI:VVVR:UVGK:NZBM:YQXT:JDWB:33RS:45V7:SQWJ #宿主机 ID
  40. Docker Root Dir: /var/lib/docker         #宿主机关于docker数据的保存目录
  41. Debug Mode: false                                         #server 端是否开启 debug
  42. Registry: https://index.docker.io/v1/ #仓库路径
  43. Labels:
  44. Experimental: false                                 #是否测试版
  45. Insecure Registries:
  46.   127.0.0.0/8 :                                         #非安全的镜像仓库
  47. Registry Mirrors:
  48.   https://si7y70hh.mirror.aliyuncs.com/ #镜像仓库
  49. Live Restore Enabled: false #是否开启活动重启 (重启docker-daemon 不关闭容器 )
  50. WARNING: No swap limit support         #系统警告信息 (没有开启 swap 资源限制 )
范例: 解决上述SWAP报警提示
官方文档: https://docs.docker.com/install/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities
  1. [root@ubuntu1804 ~]# vim /etc/default/grub
  2. GRUB_DEFAULT=0
  3. GRUB_TIMEOUT_| echo Debian`
  4. GRUB_CMDLINE_LINUX_DEFAULT=""
  5. GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 swapaccount=1" #修改此行
  6. [root@ubuntu1804 ~]# update-grub
  7. [root@ubuntu1804 ~]# reboot
1.3 镜像管理命令

1.3.1 搜索镜像

官网: http://hub.docker.com
在官方的docker 仓库中搜索指定名称的docker镜像,也会有很多三方镜像。
执行docker search命令进行搜索
格式如下:
  1. Usage: docker search [OPTIONS] TERM
  2. Options:
  3.   -f, --filter filter Filter output based on conditions provided
  4.         --format string Pretty-print search using a Go template
  5.         --limit int Max number of search results (default 25)
  6.         --no-trunc Don't truncate output
  7. 说明:
  8. OFFICIAL:         官方
  9. AUTOMATED:         使用第三方docker服务来帮助编译镜像,可以在互联网上面直接拉取到镜像,减少了繁琐的编译过程
范例: 选择性的查找镜像
  1. #搜索点赞100个以上的镜像
  2. root@rocky8 ~]$ docker search --filter=stars=100 centos
  3. NAME                DESCRIPTION                                 STARS               OFFICIAL            AUTOMATED
  4. centos              DEPRECATED; The official build of CentOS.   7461                [OK]
1.3.2 下载镜像

从 docker 仓库将镜像下载到本地,命令格式如下:
  1. docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  2. Options:
  3.   -a, --all-tags                  Download all tagged images in the repository
  4.           --disable-content-trust     Skip image verification (default true)
  5.           --platform                  string Set platform if server is multi-platform capable
  6.   -q, --quiet                      Suppress verbose output
  7. NAME: 是镜像名,一般的形式 仓库服务器:端口/项目名称/镜像名称
  8. :TAG: 即版本号,如果不指定:TAG,则下载最新版镜像
镜像下载保存的路径: /var/lib/docker/overlay2/镜像ID
注意: 镜像下载完成后,会自动解压缩,比官网显示的可能会大很多
  1. docker pull rockylinux:9-minimal
  2. docker pull ubuntu:focal-20221130
1.3.3 查看本地镜像

docker images 可以查看下载至本地的镜像
格式:
  1. docker images [OPTIONS] [REPOSITORY[:TAG]]
  2. docker image ls [OPTIONS] [REPOSITORY[:TAG]]
  3. #常用选项:
  4. -q, --quiet          Only show numeric IDs
  5. -a, --all        Show all images (default hides intermediate images)
  6.         --digests          Show digests
  7.         --no-trunc          Don't truncate output
  8. -f, --filter          filter Filter output based on conditions provided
  9.         --format          string Pretty-print images using a Go template
执行结果的显示信息说明:
  1. REPOSITORY                 #镜像所属的仓库名称
  2. TAG                         #镜像版本号(标识符),默认为latest
  3. IMAGE ID                 #镜像唯一ID标识,如果ID相同,说明是同一个镜像有多个名称
  4. CREATED                 #镜像在仓库中被创建时间
  5. SIZE                         #镜像的大小
Repository仓库
1.3.4 镜像导出

利用docker save命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用
格式:
  1. docker save [OPTIONS] IMAGE [IMAGE...]
  2. Options:
  3.   -o, --output string   Write to a file, instead of STDOUT
  4. #说明:
  5. Docker save 使用IMAGE ID导出,在导入后的镜像没有REPOSITORY和TAG,显示为<none>
常见用法:
  1. docker save -o /path/file.tar IMAGE1 IMAGE2 ...
  2. docker save IMAGE1 IMAGE2 ... > /path/file.tar
范例: 导出指定镜像
  1. [root@rocky8 ~]$ docker save alpine:latest -o alpine.tar
  2. [root@rocky8 ~]$ scp alpine.tar 10.0.0.100:
范例: 导出所有镜像至不同的文件中
  1. [root@rocky8 ~]$ docker images | awk 'NR!=1{print $1,$2}'|while read repo tag;do docker save $repo:$tag -o /opt/$repo-$tag.tar;done
  2. [root@rocky8 ~]$ ll /opt/*.tar
  3. -rw------- 1 root root   7347200 Jan 13 20:04 /opt/alpine-latest.tar
  4. -rw------- 1 root root     24064 Jan 13 20:04 /opt/hello-world-latest.tar
  5. -rw------- 1 root root 145905152 Jan 13 20:04 /opt/nginx-latest.tar
  6. -rw------- 1 root root 121435136 Jan 13 20:04 /opt/rockylinux-9-minimal.tar
  7. -rw------- 1 root root  75167744 Jan 13 20:04 /opt/ubuntu-focal-20221130.tar
范例:导出所有镜像到一个打包文件
  1. #方法1: 使用image ID导出镜像,在导入后的镜像没有REPOSITORY和TAG,显示为<none>
  2. docker save `docker images -qa` -o /opt/all.tar
  3. #方法2:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
  4. docker save $(docker images | awk 'NR!=1{print $1":"$2}') -o all-tags.tar
  5. #方法3:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
  6. docker save $(docker image ls --format "{{.Repository}}:{{.Tag}}") -o all-tags.tar
1.3.5 镜像导入

利用docker load命令可以将镜像导出的打包或压缩文件再导入
格式:
  1. docker load [OPTIONS]
  2. #选项
  3. -i, --input string Read from tar archive file, instead of STDIN
  4. -q, --quiet Suppress the load output
常见用法:
  1. docker load -i /path/file.tar
  2. docker load < /path/file.tar
范例: 镜像导入
  1. [root@ubuntu2004 ~]$ docker load -i alpine.tar
  2. 8e012198eea1: Loading layer  7.338MB/7.338MB
  3. Loaded image: alpine:latest
  4. [root@ubuntu2004 ~]$ docker images
  5. REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
  6. alpine       latest    042a816809aa   3 days ago   7.05MB
面试题: 将一台主机的所有镜像传到另一台主机
  1. #方法1:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
  2. [root@rocky8 ~]$ docker save $(docker images | awk 'NR!=1{print $1":"$2}') -o all-tags.tar
  3. [root@ubuntu2004 ~]$ docker load < all-tags.tar
  4. [root@ubuntu2004 ~]$ docker images
  5. REPOSITORY    TAG              IMAGE ID       CREATED         SIZE
  6. alpine        latest           042a816809aa   3 days ago      7.05MB
  7. rockylinux    9-minimal        c50e7a3e6f7f   3 weeks ago     118MB
  8. ubuntu        focal-20221130   d5447fc01ae6   5 weeks ago     72.8MB
  9. nginx         latest           605c77e624dd   12 months ago   141MB
  10. hello-world   latest           feb5d9fea6a5   15 months ago   13.3kB
  11. #方法2:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG
  12. [root@rocky8 ~]$ docker save $(docker image ls --format "{{.Repository}}:{{.Tag}}") -o all-tags.tar
  13. [root@ubuntu2004 ~]$ docker load < all-tags.tar
  14. [root@ubuntu2004 ~]$ docker images
  15. REPOSITORY    TAG              IMAGE ID       CREATED         SIZE
  16. alpine        latest           042a816809aa   3 days ago      7.05MB
  17. rockylinux    9-minimal        c50e7a3e6f7f   3 weeks ago     118MB
  18. ubuntu        focal-20221130   d5447fc01ae6   5 weeks ago     72.8MB
  19. nginx         latest           605c77e624dd   12 months ago   141MB
  20. hello-world   latest           feb5d9fea6a5   15 months ago   13.3kB
1.3.6 删除镜像

docker rmi 命令可以删除本地镜像
格式
  1. docker rmi [OPTIONS] IMAGE [IMAGE...]
  2. docker image rm [OPTIONS] IMAGE [IMAGE...]
  3. #选项:
  4. -f, --force Force removal of the image
  5.         --no-prune Do not delete untagged parents
范例:
  1. [root@ubuntu2004 ~]$ docker images
  2. REPOSITORY    TAG              IMAGE ID       CREATED         SIZE
  3. alpine        latest           042a816809aa   3 days ago      7.05MB
  4. rockylinux    9-minimal        c50e7a3e6f7f   3 weeks ago     118MB
  5. ubuntu        focal-20221130   d5447fc01ae6   5 weeks ago     72.8MB
  6. nginx         latest           605c77e624dd   12 months ago   141MB
  7. hello-world   latest           feb5d9fea6a5   15 months ago   13.3kB
  8. #删除镜像
  9. [root@ubuntu2004 ~]$ docker rmi ubuntu:focal-20221130
  10. Untagged: ubuntu:focal-20221130
  11. Deleted: sha256:d5447fc01ae62c20beffbfa50bc51b2797f9d7ebae031b8c2245b5be8ff1c75b
  12. Deleted: sha256:0002c93bdb3704dd9e36ce5153ef637f84de253015f3ee330468dccdeacad60b
  13. [root@ubuntu2004 ~]$ docker images
  14. REPOSITORY    TAG         IMAGE ID       CREATED         SIZE
  15. alpine        latest      042a816809aa   3 days ago      7.05MB
  16. rockylinux    9-minimal   c50e7a3e6f7f   3 weeks ago     118MB
  17. nginx         latest      605c77e624dd   12 months ago   141MB
  18. hello-world   latest      feb5d9fea6a5   15 months ago   13.3kB
强制删除正在使用的镜像,也会删除对应的容器
范例: 删除所有镜像
  1. [root@ubuntu2004 ~]$ docker rmi $(docker images -q)
1.3.7 镜像打标签

docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定的仓库
格式
  1. docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  2. #TARGET_IMAGE[:TAG]格式一般形式
  3. 仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本
TAG默认为latest
范例
  1. [root@rocky8 ~]$ docker tag rockylinux:9-minimal harbor.yanlinux.org:80/k8s/rockylinux:9
  2. [root@rocky8 ~]$ docker images
  3. REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
  4. alpine                                  latest              042a816809aa        3 days ago          7.05MB
  5. harbor.yanlinux.org:80/k8s/rockylinux   9                   c50e7a3e6f7f        3 weeks ago         118MB
  6. rockylinux                              9-minimal           c50e7a3e6f7f        3 weeks ago         118MB
  7. ubuntu                                  focal-20221130      d5447fc01ae6        5 weeks ago         72.8MB
  8. nginx                                   latest              605c77e624dd        12 months ago       141MB
  9. hello-world                             latest              feb5d9fea6a5        15 months ago       13.3kB
  10. #然后就可以将镜像传到仓库中
  11. [root@rocky8 ~]$ docker push harbor.yanlinux.org:80/k8s/rockylinux:9
总结: 企业使用镜像及常见操作: 搜索、下载、导出、导入、删除
命令总结:
  1. docker search centos           #搜索镜像
  2. docker pull alpine                           #拉取镜像
  3. docker images                  #查看本地所有镜像
  4. docker save > /opt/centos.tar  #导出镜像
  5. docker load -i /opt/centos.tar #导入本地镜像
  6. docker rmi 镜像ID/镜像名称       #删除指定ID的镜像,此镜像对应容器正启动镜像不能被删除,除非将容器全部关闭
1.4 容器操作基础命令

容器相关命令
  1. [root@rocky8 ~]$ docker container
  2. Usage:        docker container COMMAND
  3. Manage containers
  4. Commands:
  5.   attach      Attach local standard input, output, and error streams to a running container
  6.   commit      Create a new image from a container's changes
  7.   cp          Copy files/folders between a container and the local filesystem
  8.   create      Create a new container
  9.   diff        Inspect changes to files or directories on a container's filesystem
  10.   exec        Run a command in a running container
  11.   export      Export a container's filesystem as a tar archive
  12.   inspect     Display detailed information on one or more containers
  13.   kill        Kill one or more running containers
  14.   logs        Fetch the logs of a container
  15.   ls          List containers
  16.   pause       Pause all processes within one or more containers
  17.   port        List port mappings or a specific mapping for the container
  18.   prune       Remove all stopped containers
  19.   rename      Rename a container
  20.   restart     Restart one or more containers
  21.   rm          Remove one or more containers
  22.   run         Run a command in a new container
  23.   start       Start one or more stopped containers
  24.   stats       Display a live stream of container(s) resource usage statistics
  25.   stop        Stop one or more running containers
  26.   top         Display the running processes of a container
  27.   unpause     Unpause all processes within one or more containers
  28.   update      Update configuration of one or more containers
  29.   wait        Block until one or more containers stop, then print their exit codes
1.4.1 启动容器

docker run 可以启动容器,进入到容器,并随机生成容器ID和名称。docker run等价于docker pull + docker start
帮助: man docker run
命令格式:
  1. docker run [选项] [镜像名] [shell命令] [参数]
  2. #选项:
  3. -i, --interactive                 Keep STDIN open even if not attached,通常和-t一起使用
  4. -t, --tty                                 分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进入
  5. -d, --detach                         Run container in background and print container ID,台后运行,默认前台
  6. --name string                         Assign a name to the container
  7. --h, --hostname string         Container host name
  8. --rm                                         Automatically remove the container when it exits
  9. -p, --publish list                 Publish a container's port(s) to the host
  10. -P, --publish-all                 Publish all exposed ports to random ports
  11. --dns list                                 Set custom DNS servers
  12. --entrypoint string         Overwrite the default ENTRYPOINT of the image
  13. --restart policy
  14. --privileged                         Give extended privileges to container
  15. -e, --env=[]                         Set environment variables
  16. --env-file=[]                         Read in a line delimited file of environment variables
--restart 可以指定四种不同的policy
POLICY说明
no默认no,容器退出后不自动重启
on-failure[:max-retries]仅当容器以非零退出状态退出时,才重新启动。(可选)限制 Docker 守护程序尝试的重新启动重试次数。
always无论退出状态如何,始终重新启动容器。如果指定始终,Docker 守护程序将无限期地尝试重新启动容器。容器也将始终在守护程序启动时启动,无论容器的当前状态如何。利用此选项可以实现自动启动容器
unless-stopped无论退出状态如何,始终重新启动容器,但如果容器之前已进入停止状态,则不要在守护程序启动时启动它。
注意: 容器启动后,如果容器内没有前台运行的进程,将自动退出停止
从容器内退出,并停止容器:
  1. exit
从容器内退出,且容器不停止:
  1. ctrl+p+q
范例:启动后台守护并指定运行容器的名字
  1. [root@rocky8 ~]$ docker run -d --name web01 nginx
  2. [root@rocky8 ~]$ docker ps
  3. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  4. b0b9221c09a9        nginx               "/docker-entrypoint.…"   5 seconds ago       Up 5 seconds        80/tcp              web01
范例: 一次性运行容器中命令
  1. [root@rocky8 ~]$ docker run alpine cat /etc/issue
  2. Welcome to Alpine Linux 3.17
  3. Kernel \r on an \m (\l)
  4. [root@rocky8 ~]$ docker run alpine du -sh /
  5. 7.0M        /
范例: 运行交互式容器并退出
退出两种方式:
  1. [root@rocky8 ~]$ docker run -it alpine sh
  2. / # ls
  3. bin    etc    lib    mnt    proc   run    srv    tmp    var
  4. dev    home   media  opt    root   sbin   sys    usr
  5. / # cat /etc/issue
  6. Welcome to Alpine Linux 3.17
  7. Kernel \r on an \m (\l)
  8. #查看容器是在运行
  9. [root@rocky8 ~]$ docker ps
  10. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  11. bad7e7c5ef39        alpine              "sh"                     7 seconds ago       Up 7 seconds                            angry_knuth
  12. #现在在容器中执行退出
  13. / # exit
  14. #查看容器是否运行
  15. [root@rocky8 ~]$ docker ps
  16. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  17. ##另外一种退出容器的方法
  18. ##ctrl+p+q
  19. / # [22:13:43 root@rocky8 ~]$ docker ps
  20. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  21. 2bae444f9796        alpine              "sh"                     51 seconds ago      Up 51 seconds                           nifty_davinci
  22. #这种情况相当于临时从容器中出来,还可以利用以下命令进入进去
  23. [root@rocky8 ~]$ docker exec -it 2bae444f9796 sh
  24. / #
1.4.2 查看容器信息

1.4.2.1 显示当前存在容器

格式:
  1. docker ps [OPTIONS]
  2. docker container ls [OPTIONS]
  3. 选项:
  4. -a, --all                                 Show all containers (default shows just running)
  5. -q, --quiet                         Only display numeric IDs
  6. -s, --size                                 Display total file sizes
  7. -f, --filter filter         Filter output based on conditions provided
  8. -l, --latest                         Show the latest created container (includes all states)
  9. -n, --last int                         Show n last created containers (includes all states)(default -1)
范例:
  1. #显示正在运行的容器
  2. [root@rocky8 ~]$ docker ps
  3. CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
  4. d5bc9651615e        nginx                          "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        80/tcp                           web02
  5. 3d9a0cbfa238        docs/docker.github.io:latest   "/docker-entrypoint.…"   8 minutes ago       Up 8 minutes        80/tcp, 0.0.0.0:4000->4000/tcp   hardcore_curie
  6. #显示全部容器,包括退出状态的容器
  7. [root@rocky8 ~]$ docker ps -a
  8. CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                     PORTS                            NAMES
  9. d5bc9651615e        nginx                          "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes               80/tcp                           web02
  10. 69cb07c29477        nginx                          "/docker-entrypoint.…"   4 minutes ago       Exited (0) 4 minutes ago                                    web01
  11. 3d9a0cbfa238        docs/docker.github.io:latest   "/docker-entrypoint.…"   9 minutes ago       Up 9 minutes               80/tcp, 0.0.0.0:4000->4000/tcp   hardcore_curie
  12. #只显示容器ID
  13. [root@rocky8 ~]$ docker ps -aq
  14. d5bc9651615e
  15. 69cb07c29477
  16. 3d9a0cbfa238
  17. #显示容器大小
  18. [root@rocky8 ~]$ docker ps -s
  19. CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                            NAMES               SIZE
  20. d5bc9651615e        nginx                          "/docker-entrypoint.…"   5 minutes ago       Up 5 minutes        80/tcp                           web02               1.09kB (virtual 141MB)
  21. 3d9a0cbfa238        docs/docker.github.io:latest   "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes       80/tcp, 0.0.0.0:4000->4000/tcp   hardcore_curie      2B (virtual 1GB)
  22. #显示最新创建的容器
  23. root@rocky8 ~]$ docker ps -l
  24. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  25. d5bc9651615e        nginx               "/docker-entrypoint.…"   5 minutes ago       Up 5 minutes        80/tcp              web02
范例:显示指定状态的容器
  1. [root@rocky8 ~]$ docker ps -f "status=exited"
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
  3. 69cb07c29477        nginx               "/docker-entrypoint.…"   9 minutes ago       Exited (0) 9 minutes ago                       web01
1.4.2.2 查看容器内的进程
  1. docker top CONTAINER [ps OPTIONS]
范例:
  1. root@rocky8 ~]$ docker top web02
  2. UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
  3. root                2483                2468                0                   12:42               ?                   00:00:00            nginx: master process nginx -g daemon off;
  4. 101                 2534                2483                0                   12:42               ?                   00:00:00            nginx: worker process
  5. 101                 2535                2483                0                   12:42               ?                   00:00:00            nginx: worker process
1.4.2.3 查看容器资源使用情况
  1. docker stats [OPTIONS] [CONTAINER...]
  2. Display a live stream of container(s) resource usage statistics
  3. Options:
  4. -a, --all                         Show all containers (default shows just running)
  5.         --format                 string Pretty-print images using a Go template
  6.         --no-stream         Disable streaming stats and only pull the first result
  7.         --no-trunc                 Do not truncate output
范例:
  1. root@rocky8 ~]$ docker stats web02
  2. CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
  3. d5bc9651615e        web02               0.00%               3.434MiB / 1.748GiB   0.19%               1.01kB / 0B         410kB / 25.6kB      3
范例:限制内存使用大小
  1. [root@ubuntu1804 ~]#docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" elasticsearch:7.6.2
  2. [root@ubuntu1804 ~]#docker stats
  3. CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK PIDS
  4. 29282e91d773 elasti254.23310.5MiB / 1.924GiB 15.76% 766B / 0B 766kB /46kB 22
1.4.2.4 查看容器的详细信息

docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等
  1. docker inspect [OPTIONS] NAME|ID [NAME|ID...]
  2. Options:
  3. -f, --format string         Format the output using the given Go template
  4. -s, --size                                 Display total file sizes if the type is container
范例:
  1. root@rocky8 ~]$ docker inspect web02
  2. [
  3.     {
  4.         "Id": "d5bc9651615e461124d93651567548013db082229c7a0fbfe79ef211381c69e6",
  5.         "Created": "2023-01-16T04:42:40.652945855Z",
  6.         "Path": "/docker-entrypoint.sh",
  7.         "Args": [
  8.             "nginx",
  9.             "-g",
  10.             "daemon off;"
  11.         ],
  12.         "State": {
  13.             "Status": "running",
  14.             "Running": true,
  15.             "Paused": false,
  16.             "Restarting": false,
  17.             "OOMKilled": false,
  18.             "Dead": false,
  19.             "Pid": 2483,
  20.             "ExitCode": 0,
  21.             "Error": "",
  22.             "StartedAt": "2023-01-16T04:42:40.939507921Z",
  23.             "FinishedAt": "0001-01-01T00:00:00Z"
  24.         },
  25.         "Image": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
  26.         "ResolvConfPath": "/var/lib/docker/containers/d5bc9651615e461124d93651567548013db082229c7a0fbfe79ef211381c69e6/resolv.conf",
  27.         "HostnamePath": "/var/lib/docker/containers/d5bc9651615e461124d93651567548013db082229c7a0fbfe79ef211381c69e6/hostname",
  28.         "HostsPath": "/var/lib/docker/containers/d5bc9651615e461124d93651567548013db082229c7a0fbfe79ef211381c69e6/hosts",
  29.         "LogPath": "/var/lib/docker/containers/d5bc9651615e461124d93651567548013db082229c7a0fbfe79ef211381c69e6/d5bc9651615e461124d93651567548013db082229c7a0fbfe79ef211381c69e6-json.log",
  30.         "Name": "/web02",
  31.         "RestartCount": 0,
  32.         "Driver": "overlay2",
  33.         "Platform": "linux",
  34.         "MountLabel": "",
  35.         "ProcessLabel": "",
  36.         "AppArmorProfile": "",
  37.         "ExecIDs": null,
  38.         "HostConfig": {
  39.             "Binds": null,
  40.             "ContainerIDFile": "",
  41.             "LogConfig": {
  42.                 "Type": "json-file",
  43.                 "Config": {}
  44.             },
  45.             "NetworkMode": "default",
  46.             "PortBindings": {},
  47.             "RestartPolicy": {
  48.                 "Name": "no",
  49.                 "MaximumRetryCount": 0
  50.             },
  51.             "AutoRemove": false,
  52.             "VolumeDriver": "",
  53.             "VolumesFrom": null,
  54.             "CapAdd": null,
  55.             "CapDrop": null,
  56.             "Capabilities": null,
  57.             "Dns": [],
  58.             "DnsOptions": [],
  59.             "DnsSearch": [],
  60.             "ExtraHosts": null,
  61.             "GroupAdd": null,
  62.             "IpcMode": "private",
  63.             "Cgroup": "",
  64.             "Links": null,
  65.             "OomScoreAdj": 0,
  66.             "PidMode": "",
  67.             "Privileged": false,
  68.             "PublishAllPorts": false,
  69.             "ReadonlyRootfs": false,
  70.             "SecurityOpt": null,
  71.             "UTSMode": "",
  72.             "UsernsMode": "",
  73.             "ShmSize": 67108864,
  74.             "Runtime": "runc",
  75.             "ConsoleSize": [
  76.                 0,
  77.                 0
  78.             ],
  79.             "Isolation": "",
  80.             "CpuShares": 0,
  81.             "Memory": 0,
  82.             "NanoCpus": 0,
  83.             "CgroupParent": "",
  84.             "BlkioWeight": 0,
  85.             "BlkioWeightDevice": [],
  86.             "BlkioDeviceReadBps": null,
  87.             "BlkioDeviceWriteBps": null,
  88.             "BlkioDeviceReadIOps": null,
  89.             "BlkioDeviceWriteIOps": null,
  90.             "CpuPeriod": 0,
  91.             "CpuQuota": 0,
  92.             "CpuRealtimePeriod": 0,
  93.             "CpuRealtimeRuntime": 0,
  94.             "CpusetCpus": "",
  95.             "CpusetMems": "",
  96.             "Devices": [],
  97.             "DeviceCgroupRules": null,
  98.             "DeviceRequests": null,
  99.             "KernelMemory": 0,
  100.             "KernelMemoryTCP": 0,
  101.             "MemoryReservation": 0,
  102.             "MemorySwap": 0,
  103.             "MemorySwappiness": null,
  104.             "OomKillDisable": false,
  105.             "PidsLimit": null,
  106.             "Ulimits": null,
  107.             "CpuCount": 0,
  108.             "CpuPercent": 0,
  109.             "IOMaximumIOps": 0,
  110.             "IOMaximumBandwidth": 0,
  111.             "MaskedPaths": [
  112.                 "/proc/asound",
  113.                 "/proc/acpi",
  114.                 "/proc/kcore",
  115.                 "/proc/keys",
  116.                 "/proc/latency_stats",
  117.                 "/proc/timer_list",
  118.                 "/proc/timer_stats",
  119.                 "/proc/sched_debug",
  120.                 "/proc/scsi",
  121.                 "/sys/firmware"
  122.             ],
  123.             "ReadonlyPaths": [
  124.                 "/proc/bus",
  125.                 "/proc/fs",
  126.                 "/proc/irq",
  127.                 "/proc/sys",
  128.                 "/proc/sysrq-trigger"
  129.             ]
  130.         },
  131.         "GraphDriver": {
  132.             "Data": {
  133.                 "LowerDir": "/var/lib/docker/overlay2/0581b9be2f2d1496b4b64de5b11514bbac17c9d4a8790a6d43a9c1b8e45c129a-init/diff:/var/lib/docker/overlay2/ac2a6764ef29d802f6d57c03311285e004854c1125392c571a54a0e51e7aa770/diff:/var/lib/docker/overlay2/00498af85ccf1634977fabaa1e8bc0347de69aa93c9a498932291ef6cc66ad2d/diff:/var/lib/docker/overlay2/e85525a30c0dc487cfe1bfed9931cc85994a3655f1194d5e357c9f52a29eb0c7/diff:/var/lib/docker/overlay2/616978347c6243ee5a035fb5dcd055a5bb72052fbc54e7da735babeef558d2aa/diff:/var/lib/docker/overlay2/6c5ffca8e721e566c9f03345b9bedc31db36328a5ec6a78c828d0b2ca4b21d89/diff:/var/lib/docker/overlay2/1dde0f444f04a43847d956a6cea24ce25fcc74c784086fe0f51ed17bb75e9ae8/diff",
  134.                 "MergedDir": "/var/lib/docker/overlay2/0581b9be2f2d1496b4b64de5b11514bbac17c9d4a8790a6d43a9c1b8e45c129a/merged",
  135.                 "UpperDir": "/var/lib/docker/overlay2/0581b9be2f2d1496b4b64de5b11514bbac17c9d4a8790a6d43a9c1b8e45c129a/diff",
  136.                 "WorkDir": "/var/lib/docker/overlay2/0581b9be2f2d1496b4b64de5b11514bbac17c9d4a8790a6d43a9c1b8e45c129a/work"
  137.             },
  138.             "Name": "overlay2"
  139.         },
  140.         "Mounts": [],
  141.         "Config": {
  142.             "Hostname": "d5bc9651615e",
  143.             "Domainname": "",
  144.             "User": "",
  145.             "AttachStdin": false,
  146.             "AttachStdout": false,
  147.             "AttachStderr": false,
  148.             "ExposedPorts": {
  149.                 "80/tcp": {}
  150.             },
  151.             "Tty": false,
  152.             "OpenStdin": false,
  153.             "StdinOnce": false,
  154.             "Env": [
  155.                 "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
  156.                 "NGINX_VERSION=1.21.5",
  157.                 "NJS_VERSION=0.7.1",
  158.                 "PKG_RELEASE=1~bullseye"
  159.             ],
  160.             "Cmd": [
  161.                 "nginx",
  162.                 "-g",
  163.                 "daemon off;"
  164.             ],
  165.             "Image": "nginx",
  166.             "Volumes": null,
  167.             "WorkingDir": "",
  168.             "Entrypoint": [
  169.                 "/docker-entrypoint.sh"
  170.             ],
  171.             "OnBuild": null,
  172.             "Labels": {
  173.                 "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
  174.             },
  175.             "StopSignal": "SIGQUIT"
  176.         },
  177.         "NetworkSettings": {
  178.             "Bridge": "",
  179.             "SandboxID": "83b75e77e1d7de17af47765c03f4c9e3aba0f93a615542e9e385fd97f29f961c",
  180.             "HairpinMode": false,
  181.             "LinkLocalIPv6Address": "",
  182.             "LinkLocalIPv6PrefixLen": 0,
  183.             "Ports": {
  184.                 "80/tcp": null
  185.             },
  186.             "SandboxKey": "/var/run/docker/netns/83b75e77e1d7",
  187.             "SecondaryIPAddresses": null,
  188.             "SecondaryIPv6Addresses": null,
  189.             "EndpointID": "374829f09a774a1e0fc90815b29ff6964bb417bb788ef2e0e1264b1db9312e91",
  190.             "Gateway": "172.17.0.1",
  191.             "GlobalIPv6Address": "",
  192.             "GlobalIPv6PrefixLen": 0,
  193.             "IPAddress": "172.17.0.3",
  194.             "IPPrefixLen": 16,
  195.             "IPv6Gateway": "",
  196.             "MacAddress": "02:42:ac:11:00:03",
  197.             "Networks": {
  198.                 "bridge": {
  199.                     "IPAMConfig": null,
  200.                     "Links": null,
  201.                     "Aliases": null,
  202.                     "NetworkID": "745daa224c76c2091d6852549ffaaa346bae3a7a2128186e5bbf40cbddf416a3",
  203.                     "EndpointID": "374829f09a774a1e0fc90815b29ff6964bb417bb788ef2e0e1264b1db9312e91",
  204.                     "Gateway": "172.17.0.1",
  205.                     "IPAddress": "172.17.0.3",
  206.                     "IPPrefixLen": 16,
  207.                     "IPv6Gateway": "",
  208.                     "GlobalIPv6Address": "",
  209.                     "GlobalIPv6PrefixLen": 0,
  210.                     "MacAddress": "02:42:ac:11:00:03",
  211.                     "DriverOpts": null
  212.                 }
  213.             }
  214.         }
  215.     }
  216. ]
范例:选择性查看
  1. root@rocky8 ~]$ docker inspect -f "{{.State.Status}}" web02
  2. running
  3. root@rocky8 ~]$ docker inspect --format="{{.State.Status}}" web02
  4. running
1.4.3 删除容器

docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉
格式
  1. docker rm [OPTIONS] CONTAINER [CONTAINER...]
  2. docker container rm [OPTIONS] CONTAINER [CONTAINER...]
  3. #选项:
  4. -f, --force         Force the removal of a running container (uses SIGKILL)
  5. -v, --volumes         Remove the volumes associated with the container
  6. #删除停止的容器
  7. docker container prune [OPTIONS]
  8. Options:
  9.         --filter filter Provide filter values (e.g. 'until=<timestamp>')
  10.   -f, --force Do not prompt for confirmation
范例:
  1. root@rocky8 ~]$ docker ps -a
  2. CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS                      PORTS                            NAMES
  3. ceb134349daf        alpine                         "/bin/sh"                50 seconds ago      Exited (0) 50 seconds ago                                    sharp_swanson
  4. d5bc9651615e        nginx                          "/docker-entrypoint.…"   25 minutes ago      Up 25 minutes               80/tcp                           web02
  5. 69cb07c29477        nginx                          "/docker-entrypoint.…"   25 minutes ago      Exited (0) 25 minutes ago                                    web01
  6. 3d9a0cbfa238        docs/docker.github.io:latest   "/docker-entrypoint.…"   30 minutes ago      Up 30 minutes               80/tcp, 0.0.0.0:4000->4000/tcp   hardcore_curie
  7. #删除web01容器
  8. root@rocky8 ~]$ docker rm web01
  9. web01
  10. [root@rocky8 ~]$ docker ps -a
  11. CONTAINER ID        IMAGE                          COMMAND                  CREATED              STATUS                          PORTS                            NAMES
  12. ceb134349daf        alpine                         "/bin/sh"                About a minute ago   Exited (0) About a minute ago                                    sharp_swanson
  13. d5bc9651615e        nginx                          "/docker-entrypoint.…"   25 minutes ago       Up 25 minutes                   80/tcp                           web02
  14. 3d9a0cbfa238        docs/docker.github.io:latest   "/docker-entrypoint.…"   31 minutes ago       Up 31 minutes                   80/tcp, 0.0.0.0:4000->4000/tcp   hardcore_curie
范例: 删除指定状态的容器
  1. [root@rocky8 ~]$ docker rm $(docker ps -qf status=exited)
  2. ceb134349daf
  3. [root@rocky8 ~]$ docker ps -a
  4. CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
  5. d5bc9651615e        nginx                          "/docker-entrypoint.…"   27 minutes ago      Up 27 minutes       80/tcp                           web02
  6. 3d9a0cbfa238        docs/docker.github.io:latest   "/docker-entrypoint.…"   32 minutes ago      Up 32 minutes       80/tcp, 0.0.0.0:4000->4000/tcp   hardcore_curie
1.4.4 容器的启动和停止

格式
  1. docker start|stop|restart|pause|unpause 容器ID
批量正常启动或关闭所有容器
  1. docker start $(docker ps -a -q)
  2. docker stop $(docker ps -a -q)
范例
  1. [root@rocky8 ~]$ docker ps -a
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
  3. e4af980c1bff        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp              web01
  4. #停止容器
  5. [root@rocky8 ~]$ docker stop web01
  6. [root@rocky8 ~]$ docker ps -a
  7. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
  8. e4af980c1bff        nginx               "/docker-entrypoint.…"   2 minutes ago       Exited (0) 4 seconds ago                       web01
  9. #启动nginx容器
  10. [root@rocky8 ~]$ docker start web01
  11. web01
  12. [root@rocky8 ~]$ docker ps -a
  13. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  14. e4af980c1bff        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 2 seconds        80/tcp              web01
  15. #重启nginx容器
  16. [root@rocky8 ~]$ docker restart web01
  17. [10:05:45 root@rocky8 ~]$ docker ps -a
  18. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  19. e4af980c1bff        nginx               "/docker-entrypoint.…"   4 minutes ago       Up 4 seconds        80/tcp              web01
范例: 启动并进入容器
  1. root@rocky8 ~]$ docker run --name=rocky -it rockylinux:9-minimal bash
  2. bash-5.1# ls
  3. afs  dev  home        lib64            media  opt         root  sbin  sys  usr
  4. bin  etc  lib        lost+found  mnt    proc  run   srv   tmp  var
  5. bash-5.1# cat /etc/os-release
  6. NAME="Rocky Linux"
  7. VERSION="9.1 (Blue Onyx)"
  8. ID="rocky"
  9. ID_LIKE="rhel centos fedora"
  10. VERSION_ID="9.1"
  11. PLATFORM_ID="platform:el9"
  12. PRETTY_NAME="Rocky Linux 9.1 (Blue Onyx)"
  13. ANSI_COLOR="0;32"
  14. LOGO="fedora-logo-icon"
  15. CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
  16. HOME_URL="https://rockylinux.org/"
  17. BUG_REPORT_URL="https://bugs.rockylinux.org/"
  18. ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
  19. ROCKY_SUPPORT_PRODUCT_VERSION="9.1"
  20. REDHAT_SUPPORT_PRODUCT="Rocky Linux"
  21. REDHAT_SUPPORT_PRODUCT_VERSION="9.1"
  22. bash-5.1# exit
  23. exit
  24. #启动并进入rocky容器
  25. [root@rocky8 ~]$ docker start -i rocky
  26. bash-5.1# cat etc/issue
  27. \S
  28. Kernel \r on an \m
  29. bash-5.1#
范例: 暂停和恢复容器
  1. #暂停web01容器
  2. [root@rocky8 ~]$ docker pause web01
  3. [root@rocky8 ~]$ docker ps -a
  4. CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                     PORTS               NAMES
  5. 03357d030c20        rockylinux:9-minimal   "bash"                   6 minutes ago       Exited (0) 2 minutes ago                       rocky
  6. e4af980c1bff        nginx                  "/docker-entrypoint.…"   11 minutes ago      Up 7 minutes (Paused)      80/tcp              web01 #状态中加上了paused标志
  7. #恢复容器
  8. [root@rocky8 ~]$ docker unpause web01
  9. web01
  10. [root@rocky8 ~]$ docker ps -a
  11. CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                     PORTS               NAMES
  12. 03357d030c20        rockylinux:9-minimal   "bash"                   7 minutes ago       Exited (0) 3 minutes ago                       rocky
  13. e4af980c1bff        nginx                  "/docker-entrypoint.…"   12 minutes ago      Up 8 minutes               80/tcp              web01
1.4.5 给正在运行的容器发信号

docker kill 可以给容器发信号,默认号SIGKILL,即9信号
格式
  1. docker kill [OPTIONS] CONTAINER [CONTAINER...]
  2. #选项:
  3. -s, --signal string   Signal to send to the container (default "KILL")
范例:
  1. [root@rocky8 ~]$ docker kill web01
  2. web01
  3. [root@rocky8 ~]$ docker ps -a
  4. CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                      PORTS               NAMES
  5. 03357d030c20        rockylinux:9-minimal   "bash"                   9 minutes ago       Exited (0) 6 minutes ago                        rocky
  6. e4af980c1bff        nginx                  "/docker-entrypoint.…"   15 minutes ago      Exited (137) 1 second ago                       web01
1.4.6 进入正在运行的容器

1.4.6.1 使用attach命令

docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器
格式:
  1. docker attach [OPTIONS] CONTAINER
1.4.6.2 使用exec命令

在运行中的容器启动新进程,可以执行单次命令,以及进入容器
测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式
格式:
  1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
  2. 常用选项:
  3. -d, --detach                 Detached mode: run command in the background
  4. -e, --env list                 Set environment variables
  5. -i, --interactive         Keep STDIN open even if not attached
  6. -t, --tty                         Allocate a pseudo-TTY
  7. #常见用法
  8. docker exec -it 容器ID sh|bash
范例:
  1. #执行一次性命令
  2. [root@rocky8 ~]$ docker exec rocky cat /etc/redhat-release
  3. Rocky Linux release 9.1 (Blue Onyx)
  4. #进入容器,执行命令,exit退出容器不停止
  5. [root@rocky8 ~]$ docker exec -it rocky bash
  6. bash-5.1# cat /etc/redhat-release
  7. Rocky Linux release 9.1 (Blue Onyx)
1.4.7 暴露所有容器端口

容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务
docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始
使用随机端口 时,当停止容器后再启动可能会导致端口发生变化
  1. -P , --publish-all= true | false默认为false
  2. #示例:
  3. docker run -P docker.io/nginx #映射容器所有暴露端口至随机本地端口
范例
  1. [root@rocky8 ~]$ docker run -d  --name web01 -P nginx
  2. [root@rocky8 ~]$ docker ps -a
  3. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
  4. 46b790b7393a        nginx               "/docker-entrypoint.…"   4 seconds ago       Up 4 seconds        0.0.0.0:32768->80/tcp   web01
docker port 可以查看容器的端口映射关系
格式
  1. docker port CONTAINER [PRIVATE_PORT[/PROTO]]
范例
  1. [root@rocky8 ~]$ docker port web01
  2. 80/tcp -> 0.0.0.0:32768
端口映射的本质就是利用NAT技术实现的
1.4.8 指定端口映射

docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口
注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同
方式1: 容器80端口映射宿主机本地随机端口
  1. docker run -p 80 --name nginx-test-port1 nginx
方式2: 容器80端口映射到宿主机本地端口81
  1. docker run -p 81:80 --name nginx-test-port2 nginx
方式3: 宿主机本地IP:宿主机本地端口:容器端口
  1. docker run -p 10.0.0.100:82:80 --name nginx-test-port3 docker.io/nginx
方式4: 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始
  1. docker run -p 10.0.0.100::80 --name nginx-test-port4 docker.io/nginx
方式5: 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议
  1. docker run -p 10.0.0.100:83:80/udp --name nginx-test-port5 docker.io/nginx
方式6: 一次性映射多个端口+协议
  1. docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx
范例:
  1. [root@rocky8 ~]$ docker run  -d -p 8080:80 --name web02 nginx
  2. 846ca3aa883687906cbc14884d2fc2c89d47884a1f3236c3f73bab628f18a121
  3. [root@rocky8 ~]$ docker ps -a
  4. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
  5. 846ca3aa8836        nginx               "/docker-entrypoint.…"   5 seconds ago       Up 4 seconds        0.0.0.0:8080->80/tcp    web02
  6. 46b790b7393a        nginx               "/docker-entrypoint.…"   20 minutes ago      Up 20 minutes       0.0.0.0:32768->80/tcp   web01
  7. [root@rocky8 ~]$ ss -ntl
  8. State      Recv-Q     Send-Q           Local Address:Port            Peer Address:Port     Process     
  9. LISTEN     0          128                    0.0.0.0:22                   0.0.0.0:*                    
  10. LISTEN     0          128                       [::]:22                      [::]:*                    
  11. LISTEN     0          128                          *:32768                      *:*                    
  12. LISTEN     0          128                          *:8080                       *:*
实战案例: 修改已经创建的容器的端口映射关系
  1. [root@ubuntu1804 ~]#docker run -d -p 80:80 --name nginx01 nginx
  2. dc5d7c1029e582a3e05890fd18565367482232c151bba09ca27e195d39dbcc24
  3. [root@ubuntu1804 ~]#docker port nginx01
  4. 80/tcp -> 0.0.0.0:80
  5. [root@ubuntu1804 ~]#lsof -i:80
  6. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  7. docker-pr 2364 root 4u IPv6 35929 0t0 TCP *:http (LISTEN)
  8. [root@ubuntu1804 ~]#ls
  9. /var/lib/docker/containers/dc5d7c1029e582a3e05890fd18565367482232c151bba09ca27e195d39dbcc24/
  10. checkpoints
  11. hostconfig.json         mounts
  12. config.v2.json
  13. hostname                         resolv.conf
  14. dc5d7c1029e582a3e05890fd18565367482232c151bba09ca27e195d39dbcc24-json.log hosts
  15.         resolv.conf.hash
  16. [root@ubuntu1804 ~]#systemctl stop docker
  17. [root@ubuntu1804 ~]#vim
  18. /var/lib/docker/containers/dc5d7c1029e582a3e05890fd18565367482232c151bba09ca27e195d39dbcc24/hostconfig.json
  19. "PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"80"}]}
  20. #PortBindings后80/tcp对应的是容器内部的80端口,HostPort对应的是映射到宿主机的端口80 修改此处为8000
  21. [root@ubuntu1804 ~]#systemctl start docker
  22. [root@ubuntu1804 ~]#docker start nginx01
  23. [root@ubuntu1804 ~]#docker port nginx01
  24. 80/tcp -> 0.0.0.0:8000
范例:实现wordpress应用
  1. #部署mysql
  2. [root@rocky8 ~]$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=123456  --name mysql mysql:8.0.31-oracle
  3. #下载wordpress
  4. [root@rocky8 ~]$ docker run -d -p 80:80 --name wordpress wordpress:php7.4-apache

1.4.9 查看容器的日志

docker logs 可以查看容器中运行的进程在控制台输出的日志信息
格式
  1. docker logs [OPTIONS] CONTAINER
  2. 选项:
  3. --details Show extra details provided to logs
  4. -f, --follow Follow log output
  5. --since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
  6. --tail string Number of lines to show from the end of the logs (default "all")
  7. -t, --timestamps Show timestamps
  8. --until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
范例:
  1. [root@rocky8 ~]$ docker logs wordpress
  2. WordPress not found in /var/www/html - copying now...
  3. Complete! WordPress has been successfully copied to /var/www/html
  4. AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
  5. AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
  6. [Tue Jan 17 04:10:22.767095 2023] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.51 (Debian) PHP/7.4.26 configured -- resuming normal operations
  7. ......
1.4.10 传递运行命令

容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构
建镜像的时候指定容器启动时运行的前台命令
容器里的PID为1的守护进程的实现方式
范例:
  1. [root@rocky8 ~]$ docker run --name rocky rockylinux:9-minimal cat /etc/os-release
  2. NAME="Rocky Linux"
  3. VERSION="9.1 (Blue Onyx)"
  4. ID="rocky"
  5. ID_LIKE="rhel centos fedora"
  6. VERSION_ID="9.1"
  7. PLATFORM_ID="platform:el9"
  8. PRETTY_NAME="Rocky Linux 9.1 (Blue Onyx)"
  9. ANSI_COLOR="0;32"
  10. LOGO="fedora-logo-icon"
  11. CPE_NAME="cpe:/o:rocky:rocky:9::baseos"
  12. HOME_URL="https://rockylinux.org/"
  13. BUG_REPORT_URL="https://bugs.rockylinux.org/"
  14. ROCKY_SUPPORT_PRODUCT="Rocky-Linux-9"
  15. ROCKY_SUPPORT_PRODUCT_VERSION="9.1"
  16. REDHAT_SUPPORT_PRODUCT="Rocky Linux"
  17. REDHAT_SUPPORT_PRODUCT_VERSION="9.1"
1.4.11 容器内和宿主机之间复制文件
  1. docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
  2. docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
  3. Options:
  4.   -a, --archive                 Archive mode (copy all uid/gid information)
  5.   -L, --follow-link         Always follow symbol link in SRC_PATH
范例:
  1. [root@rocky8 ~]$ docker run -itd --rm alpine
  2. #将宿主机文件复制到容器中
  3. [root@rocky8 ~]$ docker cp /etc/hosts 2b91caf6ba44:/
  4. [root@rocky8 ~]$ docker exec -it 2b91caf6ba44 sh
  5. / # cat hosts
  6. 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  7. ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  8. #将容器内的文件复制到宿主机
  9. [root@rocky8 ~]$ docker cp 2b91caf6ba44:/bin/busybox /usr/local/bin/
  10. [root@rocky8 ~]$ ls /usr/local/bin/
  11. busybox
1.5 Docker镜像制作和管理命令

Docker的镜像制作分为手动制作(基于容器)和自动制作(基于DockerFile),企业通常都是基于Dockerfile制作镜像
  1. docker commit #通过修改现有容器,将之手动构建为镜像
  2. docker build  #通过Dockerfile文件,批量构建为镜像
1.5.1 docker commit 手动构建镜像

1.5.1.1 基于容器手动制作镜像步骤

docker commit 格式
  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
  2. #选项
  3. -a, --author         string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
  4. -c, --change         list Apply Dockerfile instruction to the created image
  5. -m, --message         string Commit message
  6. -p, --pause         Pause container during commit (default true)
  7. #说明:
  8. 制作镜像和CONTAINER状态无关,停止状态也可以制作镜像
  9. 如果没有指定[REPOSITORY[:TAG]],REPOSITORY和TAG都为<none>
  10. 提交的时候标记TAG号: 生产当中常用,后期可以根据TAG标记创建不同版本的镜像以及创建不同版本的容器
基于容器手动制作镜像步骤具体如下:
1.5.1.2 实战案例: 基于 rocky8.5 制作 自我需求的rocky 镜像
  1. #运行容器
  2. [root@rocky8 ~]$ docker run  -it  rockylinux:9-minimal sh
  3. #安装基础包
  4. [root@c85d96e2158a ~]# yum -y install bash-completion psmisc tree vim lsof iproute git net-tools
  5. #创建组和用户
  6. [root@c85d96e2158a ~]# groupadd -g 88 www
  7. [root@c85d96e2158a ~]# useradd -g www -u 88 -r -s /sbin/nologin -M -d /home/www www
  8. [root@c85d96e2158a ~]# id www
  9. uid=88(www) gid=88(www) groups=88(www)
  10. #清楚yum缓存,减少制作的镜像的大小
  11. [root@rocky8 ~]$ docker commit rocky9 rockylinux:v8.5-2023-01-17
  12. sha256:1af952b962d9501a4249c69132baa733e384933c6db76d0794a40998c38af588
  13. [root@rocky8 ~]$ docker images
  14. REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
  15. rockylinux                            v8.5-2023-01-17     1af952b962d9        3 seconds ago       327MB
1.5.2 利用 DockerFile 文件执行 docker build 自动构建镜像

1.5.2.1 Dockerfile 文件格式

Dockerfile 是一个有特定语法格式的文本文件
dockerfile 官方说明: https://docs.docker.com/engine/reference/builder/
帮助: man 5 dockerfile
Dockerfile 文件说明
1.5.2.2 Dockerfile 相关指令

dockerfile 文件中的常见指令:
  1. ADD
  2. COPY
  3. ENV
  4. EXPOSE
  5. FROM
  6. LABEL
  7. STOPSIGNAL
  8. USER
  9. VOLUME
  10. WORKDIR