Docker基础篇——容器的简单操作

确保docker已经就绪

[root@localhost docker]# docker info
Client:
 Debug Mode: false

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 19.03.8
 Storage Driver: devicemapper
  Pool Name: docker-253:0-69362259-pool
  Pool Blocksize: 65.54kB
  Base Device Size: 10.74GB
  Backing Filesystem: xfs
  Udev Sync Supported: true
  Data file: /dev/loop0
  Metadata file: /dev/loop2
  Data loop file: /var/lib/docker/devicemapper/devicemapper/data
  Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
  Data Space Used: 10.94MB
  Data Space Total: 107.4GB
  Data Space Available: 9.634GB
  Metadata Space Used: 581.6kB
  Metadata Space Total: 2.147GB
  Metadata Space Available: 2.147GB
  Thin Pool Minimum Free Space: 10.74GB
  Deferred Removal Enabled: true
  Deferred Deletion Enabled: true
  Deferred Deleted Device Count: 0
  Library Version: 1.02.158-RHEL7 (2019-05-13)
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-123.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 979.9MiB
 Name: localhost.localdomain
 ID: Y3EJ:KMOB:KWLB:6D3L:XBS6:RG2H:MPHN:WIIG:AE6A:KJPT:Q3LR:5LKH
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

运行第一个容器

sudo docker run -i -t redhat /bin/bash
  • -i :保证容器中STDIN是开启的;
  • -t:告诉docker为要创建的容器分配一个为tty终端;
  • redhat:说明使用的是redhat镜像,这是一个基础镜像,docker会检查本地是否存在redhat镜像,如果不存在则会从Docker Hub上下载并保存。
  • docker在文件系统内部使用这个镜像创建一个新的容器,该容器拥有自己的网略、IP地址,以及一个用来和宿主机进行通信的桥接网络接口,在容器中运行/bin/bash启动一个Bash shell。
[root@localhost docker]# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
5bed26d33875: Pulling fs layer 
f11b29a9c730: Downloading 
930bda195c84: Download complete 
78bf9a5ad49e: Download complete 
docker: Get https://registry-1.docker.io/v2/library/ubuntu/manifests/latest: Get https://auth.docker.io/token?scope=repository%3Alibrary%2Fubuntu%3Apull&service=registry.docker.io: net/http: TLS handshake timeout.
See 'docker run --help'.

请求超时,可能使镜像没选对或者网速太慢,修改镜像源,使用阿里云镜像源;
/etc/docker/daemon.json

{
"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
}

重新启动docker

systemctl restart docker.service 
docker run -i -t ubuntu /bin/bash

Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
5bed26d33875: Pull complete 
f11b29a9c730: Pull complete 
930bda195c84: Pull complete 
78bf9a5ad49e: Pull complete 
Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d
Status: Downloaded newer image for ubuntu:latest

使用第一个容器

退出容器

exit

查看宿主机当前系统容器列表

docker ps -a # 查看所有容器
docker ps # 只能查看正在运行的容器

容器命令

docker会给创建的容器自动生成一个随机的名称,也可以指定一个名称:

[root@localhost docker]# docker run --name bob_the_container -i -t ubuntu /bin/bash
root@4f43e992c2bc:/# exit
exit
[root@localhost docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
4f43e992c2bc        ubuntu              "/bin/bash"         15 seconds ago      Exited (0) 2 seconds ago                         bob_the_container
81014d1bbf16        ubuntu              "/bin/bash"         12 minutes ago      Exited (100) 4 minutes ago                       wonderful_wilson

一个合法的容器名只能包含以下字符:a-z,A-Z,0-9,下划线,圆点,横线。容器命名必须是唯一的,如果想要使用容器名称已经存在,则可以用docker rm命令删除已有的同名容器后再来创建。

重新启动已经停止的容器

docker start bob_the_container
# 或者使用容器id来指定
docker start 4f43e992c2bc

附着到容器上

重新启动后会运行一个交互式会话shell,此外也可以使用docker attach 容器名/容器id重新附着到该容器的会话上;

创建守护式容器

docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
a684b624df6257b8be73ef098ec03aa78aaecf8ae16b4535df37514d0fb1fccb

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
a684b624df62        ubuntu              "/bin/sh -c 'while t…"   21 seconds ago      Up 18 seconds                                     daemon_dave
4f43e992c2bc        ubuntu              "/bin/bash"              10 minutes ago      Exited (0) 10 minutes ago                         bob_the_container
81014d1bbf16        ubuntu              "/bin/bash"              22 minutes ago      Exited (100) 15 minutes ago                       wonderful_wilson

容器内部都在干什么

[root@localhost docker]# docker logs daemon_dave
hello world
hello world
hello world
hello world
hello world
hello world
hello world

# 可以使用-f来监控docker日志
 docker logs -f  daemon_dave
# 使用-t 为每条日志加上时间戳
 docker logs -ft  daemon_dave

查看容器内的进程

 docker top daemon_dave
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                84752               84733               0                   17:15               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
root                85219               84752               0                   17:20               ?                   00:00:00            sleep 1

停止守护式容器

docker stop daemon_dave

自动重新启动容器

docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

标志on-failure表示只有当容器的退出代码为非0值的时候才会自动启动,还可以设置重启次数:

# 当容器退出代码为非0时,最多重启5次
--restart=on-failure:5

深入容器

可以使用docker inspect来获取更多的容器信息

[root@localhost docker]# docker inspect daemon_dave
[
    {
        "Id": "a684b624df6257b8be73ef098ec03aa78aaecf8ae16b4535df37514d0fb1fccb",
        "Created": "2020-04-04T10:15:21.563956999Z",
        "Path": "/bin/sh",
        "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": "2020-04-04T10:15:23.317426519Z",
            "FinishedAt": "2020-04-04T10:22:17.086870381Z"
        },

也可以使用-f或者--format标志来选定查看结果:

[root@localhost docker]# docker inspect --format='{{ .State.Running }}' daemon_dave
false
[root@localhost docker]# docker inspect --format='{{ .NetworkSettings.IPAddress }}' daemon_dave

删除容器

docker rm 容器id/容器名

如何删除所有容器

docker rm `docker ps -a -q`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章