Docker

Docker 常用命令

Docker镜像命令

docker images 查看本地上的所有镜像

[root@localhost xiaoxie]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d2c94e258dcb   8 months ago   13.3kB
centos        latest    5d0da3dc9764   2 years ago    231MB

# REPOSITORY	仓库源
# TAG			版本号
# IMAGE ID		镜像id
# CREATED		镜像创建时间
# SIZE			镜像大小

# 命令参数
[root@localhost xiaoxie]# docker images --help
Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
Options:
  -a, --all             # 显示所有镜像(常用)
  -f, --filter filter	# 对结果进行筛选
  -q, --quiet           # 只显示镜像id(常用)
  
[root@localhost xiaoxie]# docker images -aq
d2c94e258dcb
5d0da3dc9764

docker search 搜索Hub上的镜像

[root@localhost xiaoxie]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL
mysql                           MySQL is a widely used, open-source relation…   14788     [OK]
mariadb                         MariaDB Server is a high performing open sou…   5640      [OK]
percona                         Percona Server is a fork of the MySQL relati…   624       [OK]
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   930       [OK]
bitnami/mysql                   Bitnami MySQL Docker Image                      106       
bitnami/mysqld-exporter                                                         6         
cimg/mysql                                                                      3         
ubuntu/mysql                    MySQL open source fast, stable, multi-thread…   57        
rapidfort/mysql                 RapidFort optimized, hardened image for MySQL   25        
rapidfort/mysql8-ib             RapidFort optimized, hardened image for MySQ…   9         
google/mysql                    MySQL server for Google Compute Engine          25        
rapidfort/mysql-official        RapidFort optimized, hardened image for MySQ…   9         
elestio/mysql                   Mysql, verified and packaged by Elestio         0

# 命令参数
[root@localhost xiaoxie]# docker search --help
Usage:  docker search [OPTIONS] TERM
Options:
  -f, --filter filter   # 通过筛选搜索 e.g:--filter=STARS=3000 或者 -f=STARS=3000

[root@localhost xiaoxie]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL
mysql     MySQL is a widely used, open-source relation…   14788     [OK]
mariadb   MariaDB Server is a high performing open sou…   5640      [OK]

docker pull 拉取Hub中的镜像

[root@localhost xiaoxie]# docker pull mysql
Using default tag: latest			# 如果不指定版本号 默认latest
latest: Pulling from library/mysql
558b7d69a2e5: Pull complete 		# 分层下载,docker image的核心,联合文件系统
2cb5a921059e: Pull complete 
b85878fb9bb2: Pull complete 
d16f3fd26a82: Pull complete 
afd51b5329cb: Pull complete 
374d2f7f3267: Pull complete 
4ea1bb2c9574: Pull complete 
1c9054053605: Pull complete 
d79cd2da03be: Pull complete 
e3a1aa788d17: Pull complete 
Digest: sha256:d7c20c5ba268c558f4fac62977f8c7125bde0630ff8946b08dde44135ef40df3		#签名 防伪标志
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest		# 真实地址

# docker pull mysql 相当于 docker pull docker.io/library/mysql:latest

# 下载指定版本
[root@localhost xiaoxie]# docker pull mysql:5.7
5.7: Pulling from library/mysql
20e4dcae4c69: Pull complete 		# 如果该文件already exits,那么就不需要重复下载,极大节省空间
1c56c3d4ce74: Pull complete 
e9f03a1c24ce: Pull complete 
68c3898c2015: Pull complete 
6b95a940e7b6: Pull complete 
90986bb8de6e: Pull complete 
ae71319cb779: Pull complete 
ffc89e9dfd88: Pull complete 
43d05e938198: Pull complete 
064b2d298fba: Pull complete 
df9a4d85569b: Pull complete
Digest: sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 删除镜像

[root@localhost xiaoxie]# docker rmi -f d404d78aa797
Untagged: mysql:5.5
Untagged: mysql@sha256:12da85ab88aedfdf39455872fb044f607c32fdc233cd59f1d26769fbf439b045
Deleted: sha256:d404d78aa797c87c255e5ae2beb5d8d0e4d095f930b1f20dc208eaa957477b74
Deleted: sha256:8ae7b3986b745c9cea4ea3789277dbf8543d6caed82c23d1ec19637813376df5
Deleted: sha256:6aaf52074d0d6ec3263af5f53b921a91ba3ddbeb2fece1a82ebe1bc5086c3814
Deleted: sha256:cf0a74866630c5d7ed05927cf981ac93b63ba83407872c9c0fbe0486d5f9806e
Deleted: sha256:e06cee897f9eb6bb5769f93cf6cd0285bb773d7e2bad6dfd5592a8682a6e6740
Deleted: sha256:4354e03e5a414adc57def51226d72fa2d117875a6c9665561a7c0fc85d23c46f
Deleted: sha256:647b973285178c7d4bf022c31baac404e0947d37be8e8e85731de8f7ca7e70e6
Deleted: sha256:c75ab456a585af40ca2ec8488164230deb81a1739d868604cb7b6661c24e37b5
Deleted: sha256:50a75eb6a0b2254fe5d96f999cc2087e72d515c93509a816bbd9ffb707a3b1b0
Deleted: sha256:1ae6616333a66450738a72a75c03bdf0236e0425ba0336ac5cdbe470ab6f4a3e
Deleted: sha256:68e318bd9263aedd19d9d73b051a262fa57e2a16f9c81c8b39163601020cd405
Deleted: sha256:6270adb5794c6987109e54af00ab456977c5d5cc6f1bc52c1ce58d32ec0f15f4

# 删除所有镜像
[root@localhost xiaoxie]# docker rmi -f $(docker images -aq)
Untagged: hello-world:latest
Untagged: hello-world@sha256:4bd78111b6914a99dbc560e6a20eab57ff6655aea4a80c50b0c5491968cbc2e6
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59

Docker容器命令

说明:有了镜像之后,才可以创建容器,我们下载centos镜像来进行测试

dockers run 创建一个容器并启动

[root@localhost xiaoxie]# docker run --help
Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
	  --name="Name"		# 指定容器名称
	  -d				# 以后台方式运行
      -it				# 以交互方式运行,进入容器查看内容
      -p				# 指定容器端口,端口映射
      		-p ip:主机端口:容器端口
      		-p 主机端口:容器端口
      		-p 容器端口
      		容器端口
      -P				# 随机指定端口
      
# 测试,启动并进入
[root@localhost xiaoxie]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   2 years ago   231MB

[root@localhost xiaoxie]# docker run -it 5d0 /bin/bash		# /bin/bash 指定shell命令
[root@bd8b7ec2aa7b /]# ls	# 查看容器内部的centos,与外面无关,是基础版本,很多命令不完整
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@bd8b7ec2aa7b /]# exit		# 退出并停止运行容器  若只退出不停止-->ctrl+q+p
exit
[root@localhost xiaoxie]# 

docker ps 查看当前正在运行的容器

[root@localhost xiaoxie]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# CONTAINER ID		容器id
# IMAGW				镜像名称
# CONMMAND			容器执行的命令
# CREATED			创建时间
# STATUS			启动时间
# PORTS				端口
# NAMES				容器名称

[root@localhost xiaoxie]# docker ps --help
Usage:  docker ps [OPTIONS]
Options:
  -a, --all             # 显示所有的容器
  -n, --last int        # 显示最近启动的int个容器
  -q, --quiet           # 只显示容器id

exit 退出容器

[root@bd8b7ec2aa7b /]# exit		# 直接退出并停止容器
ctrl+q+p						# 仅退出容器

docker rm 删除容器

[root@localhost xiaoxie]# docker rm --help
Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]
Options:
  -f, --force     # 强制删除,否则不能删除正在运行的容器
  -v, --volumes   # 删除与容器关联的匿名卷
  
# 删除所有容器
# 1、
[root@localhost xiaoxie]# docker rm -f $(docker ps -aq)
5e97bd05706d
957b11bdcd8d
bd8b7ec2aa7b
cdbaaab75753
# 2、
[root@localhost xiaoxie]# docker ps -aq|xargs docker rm -f
7de08079b439

启动与停止容器

docker start CONTAINER ID		# 启动容器
docker restart CONTAINER ID		# 重新启动容器
docker stop CONTAINER ID		# 停止容器
docker kill CONTAINER ID		# 强制停止容器

# CONTAINER ID		容器

常用其他命令

后台启动容器

# docker run -d 容器id
[root@localhost xiaoxie]# docker run -d centos		# 后台启动容器
4c6d4b679d5cf24b171dec431f8e4d166ef5a0ce8426009f6bc413e8edec4a90		# 返回容器id
[root@localhost xiaoxie]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 问题 --> docker ps 之后发现没有正在运行的容器
# 原因 --> 容器启动之后发现没有运行在其上的前台程序,就自动停止了

# 总结 --> docker容器在后台运行必需要提供有效服务

查看日志命令

docker logs -f -t --tail int 容器id
[root@localhost xiaoxie]# docker logs -t -f --tail 10 4c6d
# 没有日志显示

# 编写一段shell脚本
[root@localhost xiaoxie]# docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
# /bin/bash		打开一个终端,若不指定,则执行程序设计者默认指定的程序(此程序可能不能执行shell命令)
# -c "while..."	在终端中执行该命令

[root@localhost xiaoxie]# docker logs -tf --tail 10 ac3
2024-01-22T01:40:36.936466726Z hello world
2024-01-22T01:40:37.938387807Z hello world
2024-01-22T01:40:38.940547381Z hello world
2024-01-22T01:40:39.942601351Z hello world
2024-01-22T01:40:40.944530138Z hello world
2024-01-22T01:40:41.946383214Z hello world
2024-01-22T01:40:42.948689202Z hello world
2024-01-22T01:40:43.950710379Z hello world
2024-01-22T01:40:44.952687777Z hello world
2024-01-22T01:40:45.955903867Z hello world
# -t		显示时间戳
# -f		格式化
# --tail int	显示最近int条日志,若不加上,则显示容器所有日志

查看容器中的进程信息

docker top 容器id
[root@localhost xiaoxie]# docker top ac3
Error response from daemon: container ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7 is not running
# 只能查看正在运行的容器

[root@localhost xiaoxie]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
360c83810a6b   centos    "/bin/bash -c 'while…"   4 seconds ago   Up 4 seconds             reverent_zhukovsky
[root@localhost xiaoxie]# docker top 360
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                35312               35289               0                   09:49               ?       
root                35386               35312               0                   09:50               ?       

查看镜像和容器的元数据

# 镜像
[root@localhost xiaoxie]# docker inspect centos
[
    {
        "Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",	# 镜像id
        "RepoTags": [
            "centos:latest"		# 版本
        ],
        "RepoDigests": [
            "centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-09-15T18:20:05.184694267Z",	# 创建时间
        "Container": "9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1",
        "ContainerConfig": {
            "Hostname": "9bf8a9e2ddff",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [		# 启动构建容器默认执行的命令
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",#镜像唯一标识符
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "DockerVersion": "20.10.7",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [		# 容器运行时的默认命令
                "/bin/bash"
            ],
            "Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 231268856,
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/merged",
                "UpperDir": "/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/diff",
                "WorkDir": "/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

# 容器
[root@localhost xiaoxie]# docker inspect ac3
[
    {
        "Id": "ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7",
        "Created": "2024-01-22T01:33:33.709932938Z",
        "Path": "/bin/bash",		# 指定容器启动时 执行的可执行文件的路径
        "Args": [		# 命令参数
            "-c",
            "while true; do echo hello world; sleep 1; done"
        ],
        "State": {
            "Status": "exited",		# 容器状态
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 137,
            "Error": "",
            "StartedAt": "2024-01-22T01:33:33.913971868Z",
            "FinishedAt": "2024-01-22T01:45:55.97373744Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/hostname",
        "HostsPath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/hosts",
        "LogPath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7-json.log",
        "Name": "/tender_joliot",		# 容器名称
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                59,
                114
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": [],
            "BlkioDeviceWriteBps": [],
            "BlkioDeviceReadIOps": [],
            "BlkioDeviceWriteIOps": [],
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": [],
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware",
                "/sys/devices/virtual/powercap"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067-init/diff:/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/diff",
                "MergedDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067/merged",
                "UpperDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067/diff",
                "WorkDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "ac3e148ce486",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash",
                "-c",
                "while true; do echo hello world; sleep 1; done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "dd2d2513cf1d09528ae8d57375c166d5711c8a7074a5cafffdb7f2f1ffa24d74",
            "SandboxKey": "/var/run/docker/netns/dd2d2513cf1d",
            "Ports": {},
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "ac3e148ce486"
                    ],
                    "MacAddress": "02:42:ac:11:00:02",
                    "NetworkID": "56d59c49780411782a0ebf273ed19bba9fab690efe08569e78b0da2991bd0bf7",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null,
                    "DNSNames": null
                }
            }
        }
    }
]

进入当前正在运行的容器

# 容器一般以后台的方式运行,有时候需要进入容器,修改一些配置

dockers exec -it 容器id COMMAND		# 进入容器,开启一个新的终端并进入(常用)
[root@localhost xiaoxie]# docker exec -it 2ad /bin/bash
[root@2ad0db2056f7 /]# 

docker attach 容器id					# 进入容器正在执行的终端,不会启动新的进程
[root@localhost xiaoxie]# docker attach 2ad
[root@2ad0db2056f7 /]# 

从容器拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径
[root@localhost xiaoxie]# docker cp 2ad0db2056f7:/home/hello.json /home
Successfully copied 1.54kB to /home

# 只要容器的资源还存在,是否在运行都可以拷贝
# 拷贝是一个手动的过程,未来可以利用 -v 卷的技术,实现自动同步

小结

images		# 查看本地镜像
search		# 搜索镜像
pull		# 拉取镜像	先在本地查找,没有则去hub仓库源中
rmi			# 删除镜像

create		# 创建容器
run			# 创建并运行容器
pause		# zan'j
ps			# 查看正在运行的容器
rm			# 删除容器
exec		# 进入容器
attach		# 进入容器
	
start		# 运行容器
restart		# 重新运行容器
stop		# 停止容器
kill		# 强制停止容器

logs		# 查看容器日志
top			# 查看容器中进程信息
inspect		# 查看镜像或者容器的元数据
cp			# 拷贝文件

image-20240123232403336

作业1:部署nginx服务

# 1.搜索nginx版本	search
# 2.下载镜像		pull
# 3.运行容器		run
[root@localhost xiaoxie]# docker run -d --name nginx01 -p 8080:80 nginx
126156ff8b8c43c84aa00afa5eb5f0f4ceeb1aab2471d4b19c5b406eafe2f05d
# -d		后台运行
# --name 	容器名称
# -p 宿主机端口:容器内部端口	端口暴露		
[root@localhost xiaoxie]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
126156ff8b8c   nginx     "/docker-entrypoint.…"   8 seconds ago   Up 7 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx01

# 4.测试服务
[root@localhost xiaoxie]# curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

# 进入nginx配置目录
[root@localhost xiaoxie]# docker exec -it nginx01 /bin/bash
root@126156ff8b8c:/# cd etc/nginx
root@126156ff8b8c:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params

image-20240122113359166

作业2:部署tomcat服务器

[root@localhost xiaoxie]# docker run -d -p 8080:8080 --name tomcat tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
df2fac849a45: Already exists 
c506251a0ae0: Already exists 
127f7734cc88: Already exists 
eabc79a4d7f6: Already exists 
cb0704fc9e82: Already exists 
9ea8abad4482: Already exists 
603cbf094c6d: Pull complete 
8f7f215520e6: Pull complete 
Digest: sha256:a384d1dde45ce44c90d30ab920f5d020d44f20d4607cd001d4243c0cbbe4b335
Status: Downloaded newer image for tomcat:latest
1a37cbf104273b873197eb93e4fc97546fc08387990fe31d21c022d3f4404c58

# 问题:服务器返回404
# 解决:
# 进入容器内部
[root@localhost xiaoxie]# docker exec -it 1a3 /bin/bash
# 将webapps.dist/中的内容全部拷贝到webapps中
root@1a37cbf10427:/usr/local/tomcat# cp -r webapps.dist/* webapps

image-20240122142011151

思考:每次操作tomcat中的文件都需要进入容器,如何在容器外部实现文件映射,在外面放置项目,自动同步到容器中

Docker 镜像

镜像原理

镜像是一个独立软件包,用来打包程序和其运行时所需要的环境、库和配置文件

如何得到一个镜像:

  • 从仓库源获取
  • 朋友拷贝给你
  • 自己制作镜像,使用Dockerfile

联合文件系统:是一个高级、轻量、高性能的文件系统,我们下载镜像时一层一层的就是这些分层的文件系统,它们可以多个镜像共用,

docker的镜像实际上就是由一层一层的文件系统构成的

对于一个精简的OS系统,rootfs很小,使用的是宿主机的内核,只提供一些简单指令,对于不同发行的linux版本,也就是rootfs有差别,底层的bootfs是一致的

容器的启动是秒级的!而虚拟机是分钟级别的

镜像分层:所有的镜像都有一个基础镜像层,当我们修改的时候,就会在其上层创建一个新的镜像层,

我们下载的时候也是分层,这样如果有已经存在的层级,我们就可以实现复用

Docker的镜像都是只读的,当我们运行容器的时候,就是在镜像的上面加了一层可写层,这一层就叫做容器层,容器层之下的都叫做镜像层

提交镜像

在可写的容器层修改之后,可以 docker commit 保存容器的状态,封装成镜像

[root@localhost xiaoxie]# docker commit -a="xiaoxie" -m="add webapps and change the index.jsp" c4 tomcat02:1.0
sha256:ce4448807188519692bf7e6c4befa79937c9739df7bec84d28cea7a87450430c

[root@localhost xiaoxie]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
tomcat02     1.0       ce4448807188   13 seconds ago   458MB
tomcat       latest    69bd221063cf   6 days ago       454MB

容器数据卷

问题:如果数据都存在容器中,那么如果容器一删除,数据也就全部丢失了

解决:

容器之间可以有一个数据共享的技术

Docker中的数据可以同步到本地

这就是卷技术,目录的挂载,将容器中的目录挂载到linux上

总结:容器的持久化和同步操作,容器之间可以数据共享

数据卷挂载

方式一:使用命令的方式挂载 -v

[root@localhost xiaoxie]# docker run -d -p 8080:8080 -v \ /home/xiaoxie/tomcat_test:/usr/local/tomcat/webapps/ROOT --name tomcat01 tomcat

c486c9a98d41c8c1ef53dc06ed796b5342751cb23319bde3d06bf8d1f5284087

# 将webapps.list/* 全部拷贝到webapps之后
[root@localhost xiaoxie]# cd tomcat_test/
[root@localhost tomcat_test]# ls
asf-logo-wide.svg  bg-button.png  bg-middle.png  bg-nav.png  bg-upper.png  favicon.ico  index.jsp  RELEASE-NOTES.txt  tomcat.css  tomcat.svg  WEB-INF

# 此后我们在容器外的tomcat_test中修改内容,就会自动同步到容器内中的webapps中

# 查看容器 docker inspect
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/xiaoxie/tomcat_test",				# 挂载的目标路径
                "Destination": "/usr/local/tomcat/webapps/ROOT",	# 源路径
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

具名和匿名挂载

# 匿名挂载 
[root@localhost xiaoxie]# docker run -P -d -v /etc/nginx --name nginx01 nginx
a4fa7f44864c8b34e86bb43670943c1aa2fbd96bbfcc966a75816bb19a7fb919
# 查看 volume卷 的情况
[root@localhost xiaoxie]# docker volume ls
DRIVER    VOLUME NAME
local     cc0b38d987743e3d49f3c37ff66688d1c6dec177091271619bfba115e8061a78

# 具名挂载
[root@localhost xiaoxie]# docker run -P -d -v juming-nginx:/etc/nginx --name nginx02 nginx
d91af7f082f65cddf9e45cd4f7e0660f5ac3c6956cdb413c816d404ecec3e572
[root@localhost xiaoxie]# docker volume ls
DRIVER    VOLUME NAME

# 这二者都没有指定容器外的映射路径
[root@localhost xiaoxie]# docker volume inspect juming-nginx 
[
    {
        "CreatedAt": "2024-01-24T01:57:10+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

具名和匿名挂载会挂载到 /var/lib/docker/volumes/xxx/_data 这个目录中

拓展:

docker run -P -d -v juming-nginx:/etc/nginx:ro --name nginx02 nginx
docker run -P -d -v juming-nginx:/etc/nginx:rw --name nginx02 nginx

ro	# 只读
rw	# 可读可写

初识Dockerfile

# 编写一个dockerfile
[root@localhost docker-test]# cat dockerfile1 
# ===============================
FROM centos

VOLUME ["volume01", "volume02"]

CMD echo "---end---"
CMD /bin/bash
# ===============================
[root@localhost docker-test]# docker build -f dockerfile1 -t xiaoxie/centos .
[+] Building 0.1s (5/5) FINISHED        				                                      docker:default
 => [internal] load build definition from dockerfile1                                                   0.0s
 => => transferring dockerfile: 179B                                                                    0.0s
 => [internal] load metadata for docker.io/library/centos:latest                                        0.0s
 => [internal] load .dockerignore                                                                       0.0s
 => => transferring context: 2B                                                                         0.0s
 => [1/1] FROM docker.io/library/centos:latest                                                          0.0s
 => exporting to image                                                                                  0.0s
 => => exporting layers                                                                                 0.0s
 => => writing image sha256:139235ade34847ff60bb087950d6bfc135d69865c42012862ca936647598ae1e            0.0s
 => => naming to docker.io/xiaoxie/centos                                                               0.0s

# 进入容器查看
[root@localhost docker-test]# docker run -it  xiaoxie/centos:1.1
[root@92e354af7d13 /]# ls -l
total 0
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Jan 23 19:06 dev
drwxr-xr-x.   1 root root  66 Jan 23 19:06 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 231 root root   0 Jan 23 19:06 proc
dr-xr-x---.   2 root root 162 Sep 15  2021 root
drwxr-xr-x.  11 root root 163 Sep 15  2021 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jan 23 14:49 sys
drwxrwxrwt.   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 144 Sep 15  2021 usr
drwxr-xr-x.  20 root root 262 Sep 15  2021 var
drwxr-xr-x.   2 root root   6 Jan 23 19:06 volume01			# 这两个就是在创建镜像时,自动挂载的卷,
drwxr-xr-x.   2 root root   6 Jan 23 19:06 volume02			# 它们在容器外一定对应某一个目录


[root@localhost docker-test]# docker inspect 92
        "Mounts": [
            {
                "Type": "volume",
                "Name": "afde119ff5c6d0b3c69a66c107aaa0f09e2ef9e018615965c4b609e2854f223c",
                "Source": "/var/lib/docker/volumes/afde119ff5c6d0b3c69a66c107aaa0f09e2ef9e018615965c4b609e2854f223c/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "3c8f8f4827b9fd072d0b73afa689d2b9978291f08bdfd785aee2ad50ea20ceb5",
                "Source": "/var/lib/docker/volumes/3c8f8f4827b9fd072d0b73afa689d2b9978291f08bdfd785aee2ad50ea20ceb5/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

# 它们就同步在容器外下列目录中
/var/lib/docker/volumes/afde119ff5c6d0b3c69a66c107aaa0f09e2ef9e018615965c4b609e2854f223c/_data
/var/lib/docker/volumes/3c8f8f4827b9fd072d0b73afa689d2b9978291f08bdfd785aee2ad50ea20ceb5/_data

image-20240123132509413

DockerFile

Dockerfile介绍

dockerfile 是用来构建镜像的一个文件,里面是一些脚本指令,定义了构建镜像的步骤,源代码

dockerimages 是构建的镜像,企业最终交付的产品

docker容器就是镜像运行起来提供服务的

构建步骤

  1. 编写一个 dockerfile 文件
  2. docker build 构建镜像
  3. dockr run 运行镜像
  4. docker push 发布镜像

基础:

  • 每个指令都是大写的
  • 指令从上到下顺序执行
  • # 表示注释
  • 每个指令都会创建一个新的镜像层,并提交

Dockerfile指令

FROM			# 基础镜像,一切从这里开始构建
MAINTAINER		# 构建镜像的作者	姓名+邮箱
RUN				# 镜像构建时执行的命令
ADD				# 添加新的内容,比如tomcat.tar.gz
WORKDIR			# 自动切换到指定工作目录
VOLUME			# 运行时挂载的目录
EXPOSE			# 端口映射
CMD				# 容器运行时执行的命令
ENTRYPOINT		# 容器运行时执行的命令
ONBUILD			# 使用该 Dockerfile 构建的最终镜像作为基础镜像时,成功构建之后执行的命令
COPY			# 类似ADD,将文件拷贝到镜像中
ENV				# 构建时设置环境变量

CMD 和 ENTRYPOINT 的区别

CMD # 只有最后面一个 CMD 命令才能被执行,且该命令在容器运行时可以被替换
ENTRYPOINT # 在容器运行时追加命令

# CMD
[root@localhost docker-test]# cat Dockerfile 
FROM centos
CMD ["ls", "-a"]

[root@localhost docker-test]# docker build -t mycentos:0.1 .
[root@localhost docker-test]# docker run mycentos:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# CMD 不可以追加命令参数
[root@localhost docker-test]# docker run mycentos:0.1 -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled

# 命令只能替换
[root@localhost docker-test]# docker run mycentos:0.1 ls -la
total 0
drwxr-xr-x.   1 root root   6 Jan 23 21:27 .
drwxr-xr-x.   1 root root   6 Jan 23 21:27 ..
-rwxr-xr-x.   1 root root   0 Jan 23 21:27 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Jan 23 21:27 dev
drwxr-xr-x.   1 root root  66 Jan 23 21:27 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 233 root root   0 Jan 23 21:27 proc
dr-xr-x---.   2 root root 162 Sep 15  2021 root
drwxr-xr-x.  11 root root 163 Sep 15  2021 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jan 23 14:49 sys
drwxrwxrwt.   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 144 Sep 15  2021 usr
drwxr-xr-x.  20 root root 262 Sep 15  2021 var
# ENTRYPOINT
[root@localhost docker-test]# cat Dockerfile 
FROM centos
ENTRYPOINT ["ls", "-a"]

[root@localhost docker-test]# docker build -t mycentos:0.2 .
[root@localhost docker-test]# docker run mycentos:0.2
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

[root@localhost docker-test]# docker run mycentos:0.2 -l
total 0
drwxr-xr-x.   1 root root   6 Jan 23 21:31 .
drwxr-xr-x.   1 root root   6 Jan 23 21:31 ..
-rwxr-xr-x.   1 root root   0 Jan 23 21:31 .dockerenv
lrwxrwxrwx.   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Jan 23 21:31 dev
drwxr-xr-x.   1 root root  66 Jan 23 21:31 etc
drwxr-xr-x.   2 root root   6 Nov  3  2020 home
lrwxrwxrwx.   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x.   2 root root   6 Nov  3  2020 media
drwxr-xr-x.   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x.   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x. 233 root root   0 Jan 23 21:31 proc
dr-xr-x---.   2 root root 162 Sep 15  2021 root
drwxr-xr-x.  11 root root 163 Sep 15  2021 run
lrwxrwxrwx.   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x.  13 root root   0 Jan 23 14:49 sys
drwxrwxrwt.   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x.  12 root root 144 Sep 15  2021 usr
drwxr-xr-x.  20 root root 262 Sep 15  2021 var

作业:构建自己的centos

# 1、编辑 Dockerfile 文件
[root@localhost docker-test]# cat Dockerfile 
FROM centos
MAINTAINER xiaoxie<523934596@qq.com>

ENV PATH /home
WORKDIR $PATH

# 这里有点问题暂时未解决!!!!!!!!!!!!!!!
RUN yum -y install vim
RUN yum -y install net-tools 

VOLUME ["volume01"]
EXPOSE 80

CMD ["ls", "-la"] 
CMD /bin/bash
CMD echo $PATH

发布镜像

DockerHub

1、在 https://hub.docker.com/ 注册DockerHub账号

2、登录账号

[root@localhost docker-test]# docker login --help
Usage:  docker login [OPTIONS] [SERVER]
Options:
  -p, --password string   # 密码
      --password-stdin    Take the password from stdin
  -u, --username string   # 用户名

3、本地提交镜像

[root@localhost docker-test]# docker push --help
Usage:  docker push [OPTIONS] NAME[:TAG]
Options:
  -a, --all-tags                Push all tags of an image to the repository
      --disable-content-trust   Skip image signing (default true)
  -q, --quiet                   Suppress verbose output

阿里云镜像服务

1、注册并登录阿里云账号

2、找到容器镜像服务

3、创建命名空间

4、创建容器镜像

5、浏览阿里云(其中有 docker push 的步骤)

小结

docker命令-docker命令分类

Docker 网络

#通过脚本一次创建6个redis配置
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
# 通过脚本一次启动6个redis容器
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port}
-v /mydata/redis/node-${port}/data:/data
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

P28中yum下载出现No URLs in mirrorlist error的原因大致为:
Centos8不再维护,在2022年1月31日,CentOS团队从官方镜像中移除CentOS 8的所有包。
解决方式:dockerfile第一行FROM centos:7。

posted @ 2025-04-01 15:25  小依昂阳  阅读(36)  评论(0)    收藏  举报