Docker容器操作

Docker容器操作

容器是Docker的另一个核心概念,类似于轻量级的沙箱,用来运行和隔离应用;简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

1:创建并启动容器

创建容器:docker create -it {image_name}
docker create命令新建的容器处于停止状态,可以使用docker start命令来启动它。
[root@virtual_host ~]# docker create -it nginx:alpine 
83c0f73fb4dfbfdc304843de12752b388d2093e36e270beb4b500861b8698b15
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS    PORTS     NAMES
83c0f73fb4df   nginx:alpine   "/docker-entrypoint.…"   7 seconds ago   Created             kind_diffie

# 启动容器:docker start {container_id}  //容器ID前三位
[root@virtual_host ~]# docker start 83c
83c
[root@virtual_host ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS     NAMES
83c0f73fb4df   nginx:alpine   "/docker-entrypoint.…"   46 seconds ago   Up 2 seconds   80/tcp    kind_diffie

#直接新建并启动容器
[root@virtual_host ~]# docker run -d nginx:alpine
dcb2c4af1738554cd7ab03fca11dd9c01bdaf536cf81aa877fcfe93ccc3d1785
[root@virtual_host ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS        PORTS     NAMES
dcb2c4af1738   nginx:alpine   "/docker-entrypoint.…"   2 seconds ago   Up 1 second   80/tcp    amazing_pike


# -i表示让容器的标准输入打开,-t表示分配一个伪终端,要把-i -t 放到镜像名字前面
守护态运行
[root@virtual_host ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@virtual_host ~]# docker run -itd centos /bin/bash
1d59e3ab74bffabdf46b0ce25a000724e265483292d920ed85dd06ab49922cd0
[root@virtual_host ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
1d59e3ab74bf   centos    "/bin/bash"   8 seconds ago   Up 7 seconds             determined_lumiere
[root@virtual_host ~]# docker exec -it determined_lumiere /bin/bash
[root@1d59e3ab74bf /]# cat /etc/redhat-release 
CentOS Linux release 8.4.2105

当使用docker run来创建并启动容器时,Docker在后台运行的标准操作:
(1)检查本地是否存在指定的镜像centos,不存在就从公有仓库下载
(2)利用镜像创建并启动一个容器
(3)分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
(4)从宿主主机配置的桥接网络接口中桥接一个虚拟接口到容器中去
(5)从地址池配置一个IP地址给容器
(6)执行用户指定的应用程序
(7)执行完毕后,容器被终止

2:停止容器

1:# 启动一个容器并将其暂停
[root@virtual_host ~]# docker run --name devopsdu --rm -it centos /bin/bash
[root@ea8df7cfe4bb /]# cat /etc/redhat-release 
CentOS Linux release 8.4.2105

[root@virtual_host ~]# docker pause nginx 
nginx
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                   PORTS     NAMES
9ba130941a26   nginx:alpine   "/docker-entrypoint.…"   13 seconds ago   Up 12 seconds (Paused)   80/tcp    nginx
[root@virtual_host ~]# docker unpause nginx 
nginx
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
9ba130941a26   nginx:alpine   "/docker-entrypoint.…"   31 seconds ago   Up 31 seconds   80/tcp    nginx

2:# 终止容器
使用docker stop来终止一个运行中的容器,命令的格式为docker stoop [container]首先向容器发送SIGTERM信号,等待一段超时时间(默认为10s)后,-t  时间设置 ,再发送SIGKILL信号来终止容器,docker kill命令会直接发送SIGKILL信号来强行终止容器。

# 停止容器, 
[root@virtual_host ~]# docker run -d --name nginx nginx:alpine 
0e9f65c468140128aa50897b075547f0ff0ff731a3ceb8f626be719e0c2bc46c
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
0e9f65c46814   nginx:alpine   "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   80/tcp    nginx
[root@virtual_host ~]# docker stop nginx 
nginx
[root@virtual_host ~]# docker start nginx
nginx

#强制终止
[root@virtual_host ~]# docker kill nginx 
nginx
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                       PORTS     NAMES
0e9f65c46814   nginx:alpine   "/docker-entrypoint.…"   47 seconds ago   Exited (137) 4 seconds ago             nginx

#自动清除所有处于停止状态的容器
[root@virtual_host ~]# docker container prune 
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
0e9f65c468140128aa50897b075547f0ff0ff731a3ceb8f626be719e0c2bc46c

Total reclaimed space: 1.095kB

3、进入容器

(1)attach命令
[root@virtual_host ~]# docker run -itd --name devopsdu centos /bin/bash
34c1174dc84de98f31f96429bb3334f45bae0d4ca18d2c1b6355cdc086f7155e
[root@virtual_host ~]# docker attach devopsdu 
[root@34c1174dc84d /]# cat /etc/redhat-release 
CentOS Linux release 8.4.2105

注意:使用attach命令有时候并不方便,当多个窗口同时使用attach命令链接到同一个容器的时候,所有窗口都会同步显示。
当某个窗口因命令阻塞时,其他窗口也无法进行操作。

(2)exec命令(推荐方式)
[root@virtual_host ~]# docker run -d --name nginx nginx:alpine 
8aaf333304063b647ce48af987c945e8250fcd77091ece68b28f31baceb75fe1
[root@virtual_host ~]# docker exec -it nginx /bin/sh
/ # cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.15.0
PRETTY_NAME="Alpine Linux v3.15"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"

4:删除容器

可以使用docker rm 命令来删除处于终止或退出状态的容器,命令格式为docker [container] rm [ -f | -l | -v ] CONTAINER
默认情况下,docker rm 只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果需要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
选项:
-f:强行终止并删除在运行的一个容器
-l:删除容器的链接,但保留容器
-v:删除容器挂载的数据卷

# 查看所有容器
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                     PORTS     NAMES
9482481e9cba   centos         "/bin/bash"              5 seconds ago    Exited (0) 3 seconds ago             centos
50c87171a35e   nginx:alpine   "/docker-entrypoint.…"   16 seconds ago   Up 15 seconds              80/tcp    nginx

# 删除已经终止容器:centos
[root@virtual_host ~]# docker rm centos 
centos
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
50c87171a35e   nginx:alpine   "/docker-entrypoint.…"   46 seconds ago   Up 45 seconds   80/tcp    nginx

# 删除正在运行的id为c1a的容器,也就是nginx
[root@virtual_host ~]# docker rm -f nginx 
nginx
[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

5:导入和导出容器

当我们需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入和导出功能。

5.1导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令
格式为:docker export [-o|–out[=””] CONTAINER_ID,其中使用-o选项来指定导出tar文件名,也可以使用重定向来实现。

#查看容器

[root@virtual_host ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
58ec56df4ebc   nginx:alpine   "/docker-entrypoint.…"   6 seconds ago   Up 5 seconds   80/tcp    nginx

#导出nginx-1和nginx-2的容器
[root@virtual_host ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
4a338e62ca9d   nginx:alpine   "/docker-entrypoint.…"   2 seconds ago    Up 1 second     80/tcp    nginx-2
837de1ffbdb1   nginx:alpine   "/docker-entrypoint.…"   11 seconds ago   Up 11 seconds   80/tcp    nginx-1
[root@virtual_host ~]# docker export -o nginx-1.tar nginx-1
[root@virtual_host ~]# docker export nginx-2 > nginx-2.tar
[root@virtual_host ~]# ls
anaconda-ks.cfg  dockerfile  nginx-1.tar  nginx-2.tar  nginx.tar

5.2 导入容器
导出的tar文件可以传输到其他机器上,然后再通过导入命令导入到系统中,实现容器的迁移。
[root@virtual_host ~]# docker import nginx-1.tar nginx:devopsdu
sha256:5380c5e0ee7c145b67b2e5d2e299b8fc05c6bd0523fd5495be1857bc719a9453

[root@virtual_host ~]# docker images
REPOSITORY   TAG        IMAGE ID       CREATED         SIZE
nginx        devopsdu   5380c5e0ee7c   7 seconds ago   23.2MB

6:查看容器

#查看容器详细信息
docker container inspect 626 //使用容器ID或者名称

[root@virtual_host ~]# docker container inspect nginx 
[
    {
        "Id": "93cb0dca4da1d1b1d5e9d41fddb69cfcab8a9ca009474371da07e733eeb1db75",
        "Created": "2021-12-28T08:38:41.10699125Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 18447,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-12-28T08:38:41.378339945Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:bef258acf10dc257d641c47c3a600c92f87be4b4ce4a5e4752b3eade7533dcd9",
        "ResolvConfPath": "/var/lib/docker/containers/93cb0dca4da1d1b1d5e9d41fddb69cfcab8a9ca009474371da07e733eeb1db75/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/93cb0dca4da1d1b1d5e9d41fddb69cfcab8a9ca009474371da07e733eeb1db75/hostname",
        "HostsPath": "/var/lib/docker/containers/93cb0dca4da1d1b1d5e9d41fddb69cfcab8a9ca009474371da07e733eeb1db75/hosts",
        "LogPath": "/var/lib/docker/containers/93cb0dca4da1d1b1d5e9d41fddb69cfcab8a9ca009474371da07e733eeb1db75/93cb0dca4da1d1b1d5e9d41fddb69cfcab8a9ca009474371da07e733eeb1db75-json.log",
        "Name": "/nginx",
        "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,
            "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",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "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"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/0ab91017fb0c4e9e686638c8edd9d3dcc8ab4af64c495dbb3e5b24ddab9e0cad-init/diff:/var/lib/docker/overlay2/b1f22e0aca4bfa8d9f4a0edf47d1a3b28d8083747eb57a67db157f10424bb105/diff:/var/lib/docker/overlay2/87fe6cd85652c34fce956b7b8016195b26415384a5b4cc43e25c38167cc82269/diff:/var/lib/docker/overlay2/b7df82a8a43d29434bb88c9b42b8871142d9ec6669ca6449376197cc3a671c75/diff:/var/lib/docker/overlay2/e810da10875fce2428f3a954259542a867c392718cb094ebe52fa059f4fc33fc/diff:/var/lib/docker/overlay2/de9c211022d861116556f5faa8835d0d5b337538883d91c4e6c7cf5eea00751f/diff:/var/lib/docker/overlay2/488e37689dca758209cf04ea333fb6675a9346e81661119ce956fead39b416fe/diff",
                "MergedDir": "/var/lib/docker/overlay2/0ab91017fb0c4e9e686638c8edd9d3dcc8ab4af64c495dbb3e5b24ddab9e0cad/merged",
                "UpperDir": "/var/lib/docker/overlay2/0ab91017fb0c4e9e686638c8edd9d3dcc8ab4af64c495dbb3e5b24ddab9e0cad/diff",
                "WorkDir": "/var/lib/docker/overlay2/0ab91017fb0c4e9e686638c8edd9d3dcc8ab4af64c495dbb3e5b24ddab9e0cad/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "93cb0dca4da1",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.21.6",
                "NJS_VERSION=0.7.2",
                "PKG_RELEASE=1"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "nginx:alpine",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "119cdeb591ee8da5d0c489c7fe9d23630cbb104221cf53ef05d4baeb6e90460d",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/119cdeb591ee",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "04489ac73c58703c8e46ab6ef30bdf44def1d858f4b92aa297f6f69edfb3263a",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "d4268ed40a0d09cce2de1d61997df946b6209ab7919e6a50427bbe0490b2340c",
                    "EndpointID": "04489ac73c58703c8e46ab6ef30bdf44def1d858f4b92aa297f6f69edfb3263a",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
#查看容器内进程
[root@virtual_host ~]# docker top nginx 
UID      PID      PPID    C   STIME        TTY       TIME        CMD
root     18447    18429   0    03:38         ?      00:00:00  nginx: master process nginx -g daemon off;

#查看容器的统计信息
[root@virtual_host ~]# docker stats -a nginx
CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O     BLOCK I/O     PIDS
93cb0dca4da1   nginx     0.00%     1.332MiB / 972.3MiB   0.14%     656B / 0B   0B / 24.6kB   2


6.1复制本地文件到容器内
[root@virtual_host ~]# echo "<a href="https://www.cnblogs.com/devopsdu"><h1>DevOpsDu</h1></a>" >>index.html
[root@virtual_host ~]# docker cp index.html nginx:/usr/share/nginx/html/index.html


#查看容器内文件
[root@virtual_host ~]# docker exec -it nginx /bin/sh
/ # cat /usr/share/nginx/html/index.html 
<a href=https://www.cnblogs.com/devopsdu><h1>DevOpsDu</h1></a>

[root@virtual_host ~]# curl 172.17.0.2
<a href=https://www.cnblogs.com/devopsdu><h1>DevOpsDu</h1></a>

6.2 查看容器内的变更
[root@ecs-test ~]# docker container diff 626
[root@virtual_host ~]# docker container diff nginx 
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
C /root
A /root/.ash_history
C /run
A /run/nginx.pid
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /etc
C /etc/nginx
C /etc/nginx/conf.d
C /etc/nginx/conf.d/default.conf


6.3 查看端口映射
[root@virtual_host ~]# docker run -d --name nginx -p 80:80 nginx:alpine 
644257f48fa7bf9c55bccecfc1f0f84a4514b1755cb7dc46ca36133b461ad134
[root@virtual_host ~]# docker container port nginx 
80/tcp -> 0.0.0.0:80
80/tcp -> :::80

6.4 更新配置
container update 命令可以更新容器的一些运行时的配置,主要是一些资源限制份额
用法:docker  update [OPTIONS] CONTAINER [CONTAINER…]
选项

名称,简写	           描述
–blkio-weight	      阻塞IO(相对权重),介于10和1000之间,或0禁用(默认为0)
–cpu-period	          限制CPU CFS(完全公平的调度程序)周期
–cpu-quota	          限制CPU CFS(完全公平的调度程序)配额
–cpu-rt-period	      限制CPU实时周期(以微秒为单位)
–cpu-rt-runtime	      以微秒为单位限制CPU实时运行时间
–cpu-shares, -c	      CPU份额(相对权重)
–cpus	              限制cpu个数
–cpuset-cpus	      允许执行的CPU(0-3,0.1)
–cpuset-mems	      允许执行的内存率(0-3,0.1)
–kernel-memory	      内核内存限制
–memory, -m	          内存限制
–memory-reservation   内存软限制
–memory-swap	      交换限制等于内存加交换:’-1‘以启用无限制的交换
–restart	          重新启动在容器退出时应用的策略

例如:限制总配额为1秒,容器nginx 所占用时间为10%
[root@virtual_host ~]# docker update --cpu-quota 1000000 nginx
nginx
[root@virtual_host ~]# docker update --cpu-period 100000 nginx 
nginx

[root@virtual_host ~]# docker inspect nginx | grep CpuPeriod
            "CpuPeriod": 100000,
[root@virtual_host ~]# docker inspect nginx | grep CpuQ
            "CpuQuota": 1000000,
posted @ 2022-02-03 17:27  Layzer  阅读(64)  评论(0)    收藏  举报