docker 入门

Docker

概述

官网:https://docs.docker.com/

容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

组成

Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。

  • Image(镜像)
    Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
  • Container(容器)
    Docker 利用容器(Container)独立运行一个或一组应用。容器是使用镜像创建的运行实例。
    它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
  • Repository(仓库)
    仓库(Repository)是集中存放镜像文件的场所。

安装&卸载

安装

# 1.卸载
 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 2.需要的安装包
 sudo yum install -y yum-utils

# 3.设置镜像的仓库
 sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo


# 更新 yum 软件包索引
 sudo yum makecache fast

# 4.安装 docker (ce:社区版,ee:企业版)
 sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 5.启动 docker
 sudo systemctl start docker

# 6.判断是否安装成功
 docker version

# 7.hello-world
 sudo docker run hello-world

# 8.查看 docker 镜像

 sudo docker images

卸载

# 1.卸载依赖
 sudo yum remove docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 2.删除资源
 sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd

# /var/lib/docker docker 默认工作目录

常用命令

帮助文档: https://docs.docker.com/engine/reference/commandline/docker/

帮助命令

docker version              # 显示 docker 版本信息
docker info                 # 显示 docker 系统信息,包括镜像和容器的数量
docker [command] --help     # 帮指命令

镜像命令

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

# Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]

# List images

# Options:
# -a, --all             Show all images (default hides intermediate images)
# -q, --quiet           Only show image IDs

# [lixun@aliecs ~]$ docker images
# (仓库源)       (标签)     (ID)           (创建时间)      (大小)
# REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
# hello-world   latest    feb5d9fea6a5   9 months ago   13.3kB

docker search: 搜索镜像

docker search ${imageName} [-f(k=v)]
# Usage:  docker search [OPTIONS] TERM

# Search the Docker Hub for images

# Options:
# -f, --filter filter   Filter output based on conditions provided

# [lixun@aliecs ~]$ docker search mysql -f stars=3000
# NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
# mysql     MySQL is a widely used, open-source relation…   12782     [OK]
# mariadb   MariaDB Server is a high performing open sou…   4909      [OK]

docker pull: 下载镜像

# Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

# Pull an image or a repository from a registry

# docker pull hello-world => docker pull docker.io/library/hello-world:latest

# [lixun@aliecs ~]$ docker pull hello-world
# Using default tag: latest
# latest: Pulling from library/hello-world
# 2db29710123e: Pull complete
# Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
# Status: Downloaded newer image for hello-world:latest
# docker.io/library/hello-world:latest

docker rmi: 删除镜像

# Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]

# Remove one or more images

# Options:
#   -f, --force      Force removal of the image
#       --no-prune   Do not delete untagged parents

# 可以通过 REPOSITORY | ID | $()
# [lixun@aliecs ~]$ docker rmi hello-world:latest
# Untagged: hello-world:latest
# Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
# Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
# Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359

# 1.查询所有ID:     docker images -q
# 2.将IDs传给 rmi:  docker rmi $(docker images -q)

容器命令

docker run: 新建容器并运行镜像

# Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# Run a command in a new container

# Options:
#     --name string                    Assign a name to the container
# -d, --detach                         Run container in background and print container ID
# -i, --interactive                    Keep STDIN open even if not attached
# -t, --tty                            Allocate a pseudo-TTY

# -p, --publish list                   Publish a container's port(s) to the host
    # -p ip:主机端口:容器端口
    # -p 主机端口:容器端口
    # -p 容器端口
    # 容器端口
# -P, --publish-all                    Publish all exposed ports to random ports

进入容器

[lixun@aliecs /]$ docker run -it --name docker_centos centos /bin/bash
[root@e7e8837a0363 /]# ls
# bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
# dev  home  lib64  media       opt  root  sbin  sys  usr

exit: 从容器中退出,并关闭容器

[root@e7e8837a0363 /]# exit
# exit

Ctrl+P+Q: 退出容器,但不关闭容器

[root@e7e8837a0363 /]# 按 Ctrl+P+Q

docker exec & docker attach: 进入运行中的容器

# exec 开启一个新的终端

# Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

# Run a command in a running container
[lixun@aliecs /]$ docker exec -it e7e8 /bin/bash
[root@e7e8837a0363 /]# =

# attach 进入容器正在执行的终端
[lixun@aliecs /]$ docker attach e7e8
[root@e7e8837a0363 /]# ls
# bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
# dev  home  lib64  media       opt  root  sbin  sys  usr

docker ps: 列出容器

# Usage:  docker ps [OPTIONS]

# List containers

# Options:
#   -a, --all             Show all containers (default shows just running)
#   -f, --filter filter   Filter output based on conditions provided
#   -q, --quiet           Only display container IDs

# 运行的
[lixun@aliecs /]$ docker ps -a
# CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
# e7e8837a0363   centos      "/bin/bash"              12 minutes ago   Up 10 minutes                                                          docker_centos
# ALL
[lixun@aliecs /]$ docker ps -a
# CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                     PORTS                                                  NAMES
# 0ccbedd3924f   hello-world   "/hello"                 4 minutes ago    Exited (0) 4 minutes ago                                                          goofy_chebyshev
# e7e8837a0363   centos        "/bin/bash"              19 minutes ago   Up 16 minutes                                                                     docker_centos

docker rm: 删除容器

# Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]

# Remove one or more containers

# Options:
#   -f, --force     Force the removal of a running container (uses SIGKILL)

# ID 能确定唯一一个的时候,可以省略后面的
[lixun@aliecs /]$ docker rm f01f02
# f01f02

docker start | restart : 启动容器

# Usage:  docker start [OPTIONS] CONTAINER [CONTAINER...]

# Start one or more stopped containers

# Usage:  docker restart [OPTIONS] CONTAINER [CONTAINER...]

# Restart one or more containers

docker start | restart : 停止容器

# Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

# Stop one or more running containers

# Usage:  docker kill [OPTIONS] CONTAINER [CONTAINER...]

# Kill one or more running containers

其他常用命令

docker run -d

[lixun@aliecs ~]$ docker run -d centos
# eff9e88cae00d02f8d3d79270b088a0b624087f36a5473086f13b9ab5b682c0c

# 发现 centos 停止了
# [lixun@aliecs ~]$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED        STATUS        PORTS                                                  NAMES

# [注意]:docker 容器使用后天运行,就必须要有一个前台进程,docker 发现没有应用,就会自动停止

docker logs : 查看日志

# Usage:  docker logs [OPTIONS] CONTAINER

# Fetch the logs of a container

# Options:
#   -f, --follow         Follow log output
#   -n, --tail string    Number of lines to show from the end of the logs (default "all")
#   -t, --timestamps     Show timestamps

[lixun@aliecs ~]$ docker logs nginx -n 10 -t
# 2022-04-13T05:12:44.976028040Z /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
# 2022-04-13T05:12:44.976078133Z /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/2022-04-13T05:12:44.982263106Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
# 2022-04-13T05:12:44.998960474Z 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
# 2022-04-13T05:12:45.013403856Z 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
# 2022-04-13T05:12:45.013428008Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
# 2022-04-13T05:12:45.017048794Z /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
# 2022-04-13T05:12:45.018499309Z /docker-entrypoint.sh: Configuration complete; ready for start up

docker ps: 查看容器进程信息

# Usage:  docker top CONTAINER [ps OPTIONS]

# Display the running processes of a container

[lixun@aliecs ~]$ docker top nginx
# UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
# root                3561006             3560988             0                   Apr13               ?                   00:00:00            nginx: master process nginx -g daemon off;
# 101                 3561057             3561006             0                   Apr13               ?                   00:00:00            nginx: worker process

docker inspect: 查看容器信息

# Usage:  docker inspect [OPTIONS] NAME|ID [NAME|ID...]

# Return low-level information on Docker objects

# Options:
#   -f, --format string   Format the output using the given Go template

[lixun@aliecs ~]$ docker inspect nginx
# [
#     {
#         "Id": "bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518",
#         "Created": "2022-04-13T05:12:44.23192873Z",
#         "Path": "/docker-entrypoint.sh",
#         "Args": [
#             "nginx",
#             "-g",
#             "daemon off;"
#         ],
#         "State": {
#             "Status": "running",
#             "Running": true,
#             "Paused": false,
#             "Restarting": false,
#             "OOMKilled": false,
#             "Dead": false,
#             "Pid": 3561006,
#             "ExitCode": 0,
#             "Error": "",
#             "StartedAt": "2022-04-13T05:12:44.929720623Z",
#             "FinishedAt": "0001-01-01T00:00:00Z"
#         },
#         "Image": "sha256:605c77e624ddb75e6110f997c58876baa13f8754486b461117934b24a9dc3a85",
#         "ResolvConfPath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/resolv.conf",
#         "HostnamePath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/hostname",
#         "HostsPath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/hosts",
#         "LogPath": "/var/lib/docker/containers/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518/bba6a4b9a5726006a29cb02c687c0331883eb2d582df88a3438fc3cc09159518-json.log",
#         "Name": "/nginx",
#         "RestartCount": 0,
#         "Driver": "overlay2",
#         "Platform": "linux",
#         "MountLabel": "",
#         "ProcessLabel": "",
#         "AppArmorProfile": "",
#         "ExecIDs": null,
#         "HostConfig": {
#             "Binds": [
#                 "/home/lixun/nginx/www:/usr/share/nginx/html",
#                 "/home/lixun/nginx/conf/nginx.conf:/etc/nginx/nginx.conf",
#                 "/home/lixun/nginx/logs:/var/log/nginx"
#             ],
#             "ContainerIDFile": "",
#             "LogConfig": {
#                 "Type": "json-file",
#                 "Config": {}
#             },
#             "NetworkMode": "default",
#             "PortBindings": {
#                 "80/tcp": [
#                     {
#                         "HostIp": "",
#                         "HostPort": "6203"
#                     }
#                 ]
#             },
#             "RestartPolicy": {
#                 "Name": "no",
#                 "MaximumRetryCount": 0
#             },
#             "AutoRemove": true,
#             "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/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca-init/diff:/var/lib/docker/overlay2/79a03c67449efe18e3e9105f863a8e4ba81ae1a4b04ace16a968209dc43a35c0/diff:/var/lib/docker/overlay2/6d904ff6e200aebe24a95a821e789ce098fec352fed00bffbf9550241bb11325/diff:/var/lib/docker/overlay2/7350d8179cbd3c0eacd5db5a3b0388d7f75d3ec61de118bf6513730a86b2b7ed/diff:/var/lib/docker/overlay2/bb4a102a2d8f29cfc21032cbd685ea05241998c8894f92cd41f604527e84c867/diff:/var/lib/docker/overlay2/aad36878d63972d28a992e0816fce1b451545592bc1b405e0aeb9cc5dd2605da/diff:/var/lib/docker/overlay2/6da0630914ffb81f76737df0b3b0e1c1244ae54cfd28d653898676997663e911/diff",
#                 "MergedDir": "/var/lib/docker/overlay2/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca/merged",
#                 "UpperDir": "/var/lib/docker/overlay2/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca/diff",
#                 "WorkDir": "/var/lib/docker/overlay2/d80d163f4b9045b6911aaa8981bbb70b0d8debc6870210718b7e3c32a6f886ca/work"
#             },
#             "Name": "overlay2"
#         },
#         "Mounts": [
#             {
#                 "Type": "bind",
#                 "Source": "/home/lixun/nginx/www",
#                 "Destination": "/usr/share/nginx/html",
#                 "Mode": "",
#                 "RW": true,
#                 "Propagation": "rprivate"
#             },
#             {
#                 "Type": "bind",
#                 "Source": "/home/lixun/nginx/conf/nginx.conf",
#                 "Destination": "/etc/nginx/nginx.conf",
#                 "Mode": "",
#                 "RW": true,
#                 "Propagation": "rprivate"
#             },
#             {
#                 "Type": "bind",
#                 "Source": "/home/lixun/nginx/logs",
#                 "Destination": "/var/log/nginx",
#                 "Mode": "",
#                 "RW": true,
#                 "Propagation": "rprivate"
#             }
#         ],
#         "Config": {
#             "Hostname": "bba6a4b9a572",
#             "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.5",
#                 "NJS_VERSION=0.7.1",
#                 "PKG_RELEASE=1~bullseye"
#             ],
#             "Cmd": [
#                 "nginx",
#                 "-g",
#                 "daemon off;"
#             ],
#             "Image": "nginx",
#             "Volumes": null,
#             "WorkingDir": "",
#             "Entrypoint": [
#                 "/docker-entrypoint.sh"
#             ],
#             "OnBuild": null,
#             "Labels": {
#                 "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
#             },
#             "StopSignal": "SIGQUIT"
#         },
#         "NetworkSettings": {
#             "Bridge": "",
#             "SandboxID": "e3a0ccdb0bba851da103f0bd00bb1e933f551b36b701b18e00b01573bac6168b",
#             "HairpinMode": false,
#             "LinkLocalIPv6Address": "",
#             "LinkLocalIPv6PrefixLen": 0,
#             "Ports": {
#                 "80/tcp": [
#                     {
#                         "HostIp": "0.0.0.0",
#                         "HostPort": "6203"
#                     },
#                     {
#                         "HostIp": "::",
#                         "HostPort": "6203"
#                     }
#                 ]
#             },
#             "SandboxKey": "/var/run/docker/netns/e3a0ccdb0bba",
#             "SecondaryIPAddresses": null,
#             "SecondaryIPv6Addresses": null,
#             "EndpointID": "1d7b07de666ebebf7a1b22300010559b1522b6c22a3c0a92580e7c27ae884ca6",
#             "Gateway": "172.17.0.1",
#             "GlobalIPv6Address": "",
#             "GlobalIPv6PrefixLen": 0,
#             "IPAddress": "172.17.0.3",
#             "IPPrefixLen": 16,
#             "IPv6Gateway": "",
#             "MacAddress": "02:42:ac:11:00:03",
#             "Networks": {
#                 "bridge": {
#                     "IPAMConfig": null,
#                     "Links": null,
#                     "Aliases": null,
#                     "NetworkID": "45d7ef54759370db4f3d6be01c20731ae8124778aa8a1a2861aeac375ae5fc5d",
#                     "EndpointID": "1d7b07de666ebebf7a1b22300010559b1522b6c22a3c0a92580e7c27ae884ca6",
#                     "Gateway": "172.17.0.1",
#                     "IPAddress": "172.17.0.3",
#                     "IPPrefixLen": 16,
#                     "IPv6Gateway": "",
#                     "GlobalIPv6Address": "",
#                     "GlobalIPv6PrefixLen": 0,
#                     "MacAddress": "02:42:ac:11:00:03",
#                     "DriverOpts": null
#                 }
#             }
#         }
#     }
# ]

docker cp: 从容器中拷贝文件

# Usage:  docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
#         docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

# Copy files/folders between a container and the local filesystem

# Use '-' as the source to read a tar archive from stdin
# and extract it to a directory destination in a container.
# Use '-' as the destination to stream a tar archive of a
# container source to stdout.

[lixun@aliecs docker]$ docker cp $(docker ps -q -f name=docker_centos):/home/docker/Main.java ./
[lixun@aliecs docker]$ ls
# Hello.java  Main.java
[lixun@aliecs docker]$ cat Main.java
# public class Main {
#         public static void main(String[] args) {
#                 System.out.println("Hello, Docker CentOS!");
#         }
# }

小结

# 当前 shell 下 attach 连接指定运行镜像
# attach        Attach to a running container
# 通过 Dockerfile 定制镜像
# build         Build an image from a Dockerfile
# 提交当前容器为新的镜像
# commit        Create a new image from a container's changes
# 从容器中拷贝指定文件或者目录到宿主机中
# cp            Copy files/folders from a container to a HOSTDIR or to STDOUT
# 创建一个新的容器,同 run 但不启动容器
# create        Create a new container
# 查看 docker 容器变化
# diff          Inspect changes on a container's filesystem
# 从 docker 服务获取容器实时事件
# events        Get real time events from the server
# 在已存在的容器上运行命令
# exec          Run a command in a running container
# 导出容器的内容流作为一个 tar 归档文件(对应 import)
# export        Export a container's filesystem as a tar archive
# 展示一个镜像形成历史
# history       Show the history of an image
# 列出系统当前镜像
# images        List images
# 从 tar 包中的内容创建一个新的文件系统映像(对应 export)
# import        Import the contents from a tarball to create a filesystem image
# 显示系统相关信息
# info          Display system-wide information
# 查看容器详细信息
# inspect       Return low-level information on a container or image
# kill 指定 docker 容器
# kill          Kill a running container
# 从一个 tar 包中加载一个镜像(对应 save)
# load          Load an image from a tar archive or STDIN
# 注册或者登陆一个 docker 源服务器
# login         Register or log in to a Docker registry
# 从当前 Docker registry 退出
# logout        Log out from a Docker registry
# 输出当前容器日志信息
# logs          Fetch the logs of a container
# 暂停容器
# pause         Pause all processes within a container
# 查看映射端口对应的容器内部源端口
# port          List port mappings or a specific mapping for the CONTAINER
# 列出容器列表
# ps            List containers
# 从 docker 镜像源服务器拉取指定镜像或者库镜像
# pull          Pull an image or a repository from a registry
# 推送指定镜像或者库镜像至 docker 源服务器
# push          Push an image or a repository to a registry
# 重命名容器
# rename        Rename a container
# 重启运行的容器
# restart       Restart a running container
# 移除一个或者多个容器
# rm            Remove one or more containers
# 移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者 -f 强制删除)
# rmi           Remove one or more images
# 创建一个新的容器并运行一个命令
# run           Run a command in a new container
# 保存一个镜像为一个 tar 包(对应 load)
# save          Save an image(s) to a tar archive
# 在 docker hub 中搜索镜像
# search        Search the Docker Hub for images
# 启动容器
# start         Start one or more stopped containers
# 统计容器使用资源
# stats         Display a live stream of container(s) resource usage statistics
# 停止容器
# stop          Stop a running container
# 给源中镜像打标签
# tag           Tag an image into a repository
# 查看容器中运行的进程信息
# top           Display the running processes of a container
# 取消暂停容器
# unpause       Unpause all processes within a container
# 查看容器版本号
# version       Show the Docker version information
# 截取容器停止时的退出状态值
# wait          Block until a container stops, then print its exit code

Exercise

安装 Nginx

# 1.search
[lixun@aliecs ~]$ docker search nginx -f stars=1000
# NAME      DESCRIPTION                STARS     OFFICIAL   AUTOMATED
# nginx     Official build of Nginx.   17006     [OK]

# 2.pull
[lixun@aliecs ~]$ docker pull nginx
# Using default tag: latest
# latest: Pulling from library/nginx
# a2abf6c4d29d: Already exists
# a9edb18cadd1: Pull complete
# 589b7251471a: Pull complete
# 186b1aaa4aa6: Pull complete
# b4df32aa5a72: Pull complete
# a0bcbecc962e: Pull complete
# Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
# Status: Downloaded newer image for nginx:latest
# docker.io/library/nginx:latest

# 3.run
[lixun@aliecs ~]$ docker run -d --name nginx -p 6200:80 nginx
# 4c0dbb4322be3abf0d6ef4d6c89ec236b1f19281f16c77d8314742086f3efb91
[lixun@aliecs ~]$ docker ps
# CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                                                  NAMES
# 4c0dbb4322be   nginx       "/docker-entrypoint.…"   2 seconds ago    Up 1 second     0.0.0.0:6200->80/tcp, :::6200->80/tcp                  nginx

# 4.test
[lixun@aliecs ~]$ curl localhost:6200
# <!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>

# 5.nginx
[lixun@aliecs ~]$ docker exec -it nginx /bin/bash
root@4c0dbb4322be:/# whereis nginx
# nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx

安装 Tomcat

[lixun@aliecs docker]$ docker search tomcat -f stars=1000
# NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
# tomcat    Apache Tomcat is an open source implementati…   3345      [OK]

[lixun@aliecs docker]$ docker pull tomcat
# Using default tag: latest
# latest: Pulling from library/tomcat
# 0e29546d541c: Pull complete
# 9b829c73b52b: Pull complete
# cb5b7ae36172: Pull complete
# 6494e4811622: Pull complete
# 668f6fcc5fa5: Pull complete
# dc120c3e0290: Pull complete
# 8f7c0eebb7b1: Pull complete
# 77b694f83996: Pull complete
# 0f611256ec3a: Pull complete
# 4f25def12f23: Pull complete
# Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
# Status: Downloaded newer image for tomcat:latest
# docker.io/library/tomcat:latest

[lixun@aliecs docker]$ docker run -d --name tomcat -p 6201:8080 tomcat
# cb14f941e36d8f99915c61da2280d9c7afa79b61b8bd5a05946e2a9311236202

# 测试发现 404
[lixun@aliecs docker]$ curl localhost:6201
# <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>

# 查看 tomcat 文件
[lixun@aliecs docker]$ docker exec -it tomcat /bin/bash
root@cb14f941e36d:/usr/local/tomcat# ls
# BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
# CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@cb14f941e36d:/usr/local/tomcat# ls webapps -l
total 0

# 将 webapps.dist 复制到 webapps 下即可
root@cb14f941e36d:/usr/local/tomcat/# cp -r webapps.dist/* webapps

[lixun@aliecs docker]$ curl localhost:6201



# <!DOCTYPE html>
# <html lang="en">
#     <head>
#         <meta charset="UTF-8" />
#         <title>Apache Tomcat/10.0.14</title>
#         <link href="favicon.ico" rel="icon" type="image/x-icon" />
#         <link href="tomcat.css" rel="stylesheet" type="text/css" />
#     </head>

#     <body>
#         <div id="wrapper">
#             <div id="navigation" class="curved container">
#                 <span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
#                 <span id="nav-hosts"><a href="/docs/">Documentation</a></span>
#                 <span id="nav-config"><a href="/docs/config/">Configuration</a></span>
#                 <span id="nav-examples"><a href="/examples/">Examples</a></span>
#                 <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
#                 <span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
#                 <span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
#                 <br class="separator" />
#             </div>
#             <div id="asf-box">
#                 <h1>Apache Tomcat/10.0.14</h1>
#             </div>
#             <div id="upper" class="curved container">
#                 <div id="congrats" class="curved container">
#                     <h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
#                 </div>
#                 <div id="notice">
#                     <img id="tomcat-logo" src="tomcat.svg" alt="[tomcat logo]" />
#                     <div id="tasks">
#                         <h3>Recommended Reading:</h3>
#                         <h4><a href="/docs/security-howto.html">Security Considerations How-To</a></h4>
#                         <h4><a href="/docs/manager-howto.html">Manager Application How-To</a></h4>
#                         <h4><a href="/docs/cluster-howto.html">Clustering/Session Replication How-To</a></h4>
#                     </div>
#                 </div>
#                 <div id="actions">
#                     <div class="button">
#                         <a class="container shadow" href="/manager/status"><span>Server Status</span></a>
#                     </div>
#                     <div class="button">
#                         <a class="container shadow" href="/manager/html"><span>Manager App</span></a>
#                     </div>
#                     <div class="button">
#                         <a class="container shadow" href="/host-manager/html"><span>Host Manager</span></a>
#                     </div>
#                 </div>
#                 <br class="separator" />
#             </div>
#             <div id="middle" class="curved container">
#                 <h3>Developer Quick Start</h3>
#                 <div class="col25">
#                     <div class="container">
#                         <p><a href="/docs/setup.html">Tomcat Setup</a></p>
#                         <p><a href="/docs/appdev/">First Web Application</a></p>
#                     </div>
#                 </div>
#                 <div class="col25">
#                     <div class="container">
#                         <p><a href="/docs/realm-howto.html">Realms & AAA</a></p>
#                         <p><a href="/docs/jndi-datasource-examples-howto.html">JDBC DataSources</a></p>
#                     </div>
#                 </div>
#                 <div class="col25">
#                     <div class="container">
#                         <p><a href="/examples/">Examples</a></p>
#                     </div>
#                 </div>
#                 <div class="col25">
#                     <div class="container">
#                         <p><a href="https://wiki.apache.org/tomcat/Specifications">Servlet Specifications</a></p>
#                         <p><a href="https://wiki.apache.org/tomcat/TomcatVersions">Tomcat Versions</a></p>
#                     </div>
#                 </div>
#                 <br class="separator" />
#             </div>
#             <div id="lower">
#                 <div id="low-manage" class="">
#                     <div class="curved container">
#                         <h3>Managing Tomcat</h3>
#                         <p>For security, access to the <a href="/manager/html">manager webapp</a> is restricted.
#                         Users are defined in:</p>
#                         <pre>$CATALINA_HOME/conf/tomcat-users.xml</pre>
#                         <p>In Tomcat 10.0 access to the manager application is split between
#                            different users. &nbsp; <a href="/docs/manager-howto.html">Read more...</a></p>
#                         <br />
#                         <h4><a href="/docs/RELEASE-NOTES.txt">Release Notes</a></h4>
#                         <h4><a href="/docs/changelog.html">Changelog</a></h4>
#                         <h4><a href="https://tomcat.apache.org/migration.html">Migration Guide</a></h4>
#                         <h4><a href="https://tomcat.apache.org/security.html">Security Notices</a></h4>
#                     </div>
#                 </div>
#                 <div id="low-docs" class="">
#                     <div class="curved container">
#                         <h3>Documentation</h3>
#                         <h4><a href="/docs/">Tomcat 10.0 Documentation</a></h4>
#                         <h4><a href="/docs/config/">Tomcat 10.0 Configuration</a></h4>
#                         <h4><a href="https://wiki.apache.org/tomcat/FrontPage">Tomcat Wiki</a></h4>
#                         <p>Find additional important configuration information in:</p>
#                         <pre>$CATALINA_HOME/RUNNING.txt</pre>
#                         <p>Developers may be interested in:</p>
#                         <ul>
#                             <li><a href="https://tomcat.apache.org/bugreport.html">Tomcat 10.0 Bug Database</a></li>
#                             <li><a href="/docs/api/index.html">Tomcat 10.0 JavaDocs</a></li>
#                             <li><a href="https://github.com/apache/tomcat/tree/10.0.x">Tomcat 10.0 Git Repository at GitHub</a></li>
#                         </ul>
#                     </div>
#                 </div>
#                 <div id="low-help" class="">
#                     <div class="curved container">
#                         <h3>Getting Help</h3>
#                         <h4><a href="https://tomcat.apache.org/faq/">FAQ</a> and <a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></h4>
#                         <p>The following mailing lists are available:</p>
#                         <ul>
#                             <li id="list-announce"><strong><a href="https://tomcat.apache.org/lists.html#tomcat-announce">tomcat-announce</a><br />
#                                 Important announcements, releases, security vulnerability notifications. (Low volume).</strong>
#                             </li>
#                             <li><a href="https://tomcat.apache.org/lists.html#tomcat-users">tomcat-users</a><br />
#                                 User support and discussion
#                             </li>
#                             <li><a href="https://tomcat.apache.org/lists.html#taglibs-user">taglibs-user</a><br />
#                                 User support and discussion for <a href="https://tomcat.apache.org/taglibs/">Apache Taglibs</a>
#                             </li>
#                             <li><a href="https://tomcat.apache.org/lists.html#tomcat-dev">tomcat-dev</a><br />
#                                 Development mailing list, including commit messages
#                             </li>
#                         </ul>
#                     </div>
#                 </div>
#                 <br class="separator" />
#             </div>
#             <div id="footer" class="curved container">
#                 <div class="col20">
#                     <div class="container">
#                         <h4>Other Downloads</h4>
#                         <ul>
#                             <li><a href="https://tomcat.apache.org/download-connectors.cgi">Tomcat Connectors</a></li>
#                             <li><a href="https://tomcat.apache.org/download-native.cgi">Tomcat Native</a></li>
#                             <li><a href="https://tomcat.apache.org/taglibs/">Taglibs</a></li>
#                             <li><a href="/docs/deployer-howto.html">Deployer</a></li>
#                         </ul>
#                     </div>
#                 </div>
#                 <div class="col20">
#                     <div class="container">
#                         <h4>Other Documentation</h4>
#                         <ul>
#                             <li><a href="https://tomcat.apache.org/connectors-doc/">Tomcat Connectors</a></li>
#                             <li><a href="https://tomcat.apache.org/connectors-doc/">mod_jk Documentation</a></li>
#                             <li><a href="https://tomcat.apache.org/native-doc/">Tomcat Native</a></li>
#                             <li><a href="/docs/deployer-howto.html">Deployer</a></li>
#                         </ul>
#                     </div>
#                 </div>
#                 <div class="col20">
#                     <div class="container">
#                         <h4>Get Involved</h4>
#                         <ul>
#                             <li><a href="https://tomcat.apache.org/getinvolved.html">Overview</a></li>
#                             <li><a href="https://tomcat.apache.org/source.html">Source Repositories</a></li>
#                             <li><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></li>
#                             <li><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></li>
#                         </ul>
#                     </div>
#                 </div>
#                 <div class="col20">
#                     <div class="container">
#                         <h4>Miscellaneous</h4>
#                         <ul>
#                             <li><a href="https://tomcat.apache.org/contact.html">Contact</a></li>
#                             <li><a href="https://tomcat.apache.org/legal.html">Legal</a></li>
#                             <li><a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
#                             <li><a href="https://www.apache.org/foundation/thanks.html">Thanks</a></li>
#                         </ul>
#                     </div>
#                 </div>
#                 <div class="col20">
#                     <div class="container">
#                         <h4>Apache Software Foundation</h4>
#                         <ul>
#                             <li><a href="https://tomcat.apache.org/whoweare.html">Who We Are</a></li>
#                             <li><a href="https://tomcat.apache.org/heritage.html">Heritage</a></li>
#                             <li><a href="https://www.apache.org">Apache Home</a></li>
#                             <li><a href="https://tomcat.apache.org/resources.html">Resources</a></li>
#                         </ul>
#                     </div>
#                 </div>
#                 <br class="separator" />
#             </div>
#             <p class="copyright">Copyright &copy;1999-2022 Apache Software Foundation.  All Rights Reserved</p>
#         </div>
#     </body>

# </html>

可视化 portainer-ce

# 1.docker search
[lixun@aliecs ~]$ docker search portainer -f stars=1000
# NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
# portainer/portainer      This Repo is now deprecated, use portainer/p…   2235
# portainer/portainer-ce   Portainer CE - a lightweight service deliver…   1206

# 2.docker pull
[lixun@aliecs ~]$ docker pull portainer/portainer-ce
# Using default tag: latest
# latest: Pulling from portainer/portainer-ce
# 0ea73420e2bb: Pull complete
# c367f59be2e1: Pull complete
# b71b88d796e2: Pull complete
# Digest: sha256:4f126c5114b63e9d1bceb4b368944d14323329a9a0d4e7bb7eb53c9b7435d498
# Status: Downloaded newer image for portainer/portainer-ce:latest
# docker.io/portainer/portainer-ce:latest

# 3.docker run
[lixun@aliecs /]$ docker run -d -p 6211:8000 -p 6212:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
# 499b255f0e3673c0bef1fd3311df8742a2919236278cc7692af2933e98ad595a
[lixun@aliecs /]$ docker ps
# CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                                                                                            NAMES
# 499b255f0e36   portainer/portainer-ce   "/portainer"             5 seconds ago   Up 4 seconds   9000/tcp, 0.0.0.0:6211->8000/tcp, :::6211->8000/tcp, 0.0.0.0:6212->9443/tcp, :::6212->9443/tcp   portainer

Docker 镜像

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包 docker 镜像,就可以直接跑起来!
如何得到镜像:

  • Docker Hub 下载
  • DockerFile 制作

Docker 镜像加载原理

UnionFS(联合文件系统)

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker 镜像加载原理

Docker 的镜像实际由一层一层的文件系统组成:

  • bootfs(boot file system)主要包含 bootloader 和 kernel。bootloader 主要是引导加载 kernel,完成后整个内核就都在内存中了。此时内存的使用权已由 bootfs 转交给内核,系统卸载 bootfs。可以被不同的 Linux 发行版公用。
  • rootfs(root file system),包含典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件。rootfs 就是各种不同操作系统发行版(Ubuntu,Centos 等)。因为底层直接用 Host 的 kernel,rootfs 只包含最基本的命令,工具和程序就可以了。
  • 分层理解
    所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的容器层。
    容器在启动时会在镜像最外层上建立一层可读写的容器层(R/W),而镜像层是只读的(R/O)。

提交镜像

[lixun@aliecs ~]$ docker run -d -p 6201:8080 --name tomcat tomcat
# 05b29d1bcc58702cfa3c7e8421a3254fbcc83bd2d9358af12faf3b54feb02cf1

[lixun@aliecs ~]$ docker exec -it tomcat /bin/bash
root@05b29d1bcc58:/usr/local/tomcat# ls
# BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     work
# CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps.dist
root@05b29d1bcc58:/usr/local/tomcat# mv webapps.dist webapps
root@05b29d1bcc58:/usr/local/tomcat# ls
# BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     work
# CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps

[lixun@aliecs ~]$ docker ps
# CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                                            NAMES
# cb14f941e36d   tomcat                   "catalina.sh run"        5 hours ago      Up 3 minutes    0.0.0.0:6201->8080/tcp, :::6201->8080/tcp

[lixun@aliecs ~]$ docker commit -a "lixun" -m "webapps.dist renamed webapps" 05b29d1bcc58 my_tomcat:1.0
# sha256:cc55275594cde1deb6b455ee4da60a6d2b1ffae3116fac51edf49cefdd0ec5c0

[lixun@aliecs ~]$ docker images
# REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
# my_tomcat                1.0       cc55275594cd   20 seconds ago   684MB
# tomcat                   latest    fb5657adc892   6 months ago     680MB

数据卷

# docker
[lixun@aliecs ~]$ docker run -it -v /home/lixun/docker/test_volume:/home/docker/test_volume centos /bin/bash
[root@464d88fad400 /]# cd /home/docker/test_volume
[root@464d88fad400 test_volume]# echo Hello,Volume > volume.txt


# linux
[lixun@aliecs ~]$ cd docker/test_volume/
[lixun@aliecs test_volume]$ cat volume.txt 
Hello,Volume