LinuxLinux_Docker

Docker的安装及基础命令

2020-11-13  本文已影响0人  李白开水

一、概述

1.1. 学习路径

1.2. Docker核心

Docker的核心思想:打包装箱,每个箱子都是互相隔离的。

Docker容器技术:是一种虚拟化技术。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

沙箱:Sandboxie(又叫沙箱、沙盘)即是一个虚拟系统程序,允许你在沙盘环境中运行浏览器或其他程序,因此运行所产生的变化可以随后删除。它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。 在网络安全中,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。

Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket来连接。

Docker的服务端接受到Docker客户端的指令,就会执行这个命令。

Docker比VM快的原因:

  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,VM需要的是Guest OS。
    • 新建一个容器的时候,Docker不需要像虚拟机一样重新加载一个虚拟机内核,避免引导。虚拟机需要加载Guest OS,这个过程是分钟级别的,非常慢,而Docker是利用宿主机的操作系统,省略了这个复杂的过程。
    • <a href="https://sm.ms/image/O1wbXF5ahPQDpgW" target="_blank"><img src="https://i.loli.net/2020/11/02/O1wbXF5ahPQDpgW.png" ></a>

使用Docker的流程:

java——jar(环境)——打包项目带上环境(镜像)——(Docker仓库:商店)——下载发布的镜像——直接运行。

Docker相关网站:

Docker官网:https://www.docker.com/

官方文档:https://docs.docker.com/

Docker仓库:https://hub.docker.com/

Docker相关名词解释:

Docker镜像:好比是一个模板,可以通过这个模板来创建容器服务。

Docker容器:Docker利用容器技术,能够运行一个或者一组应用,容器通过镜像来创建。

Docker仓库:存放镜像的地方。仓库分为共有仓库和私有仓库。

二、Docker安装

安装在了阿里云服务器上,所以服务器的相关资源要准备好。

官方安装说明文档:https://docs.docker.com/engine/install/centos/

要安装Docker需要CentOS 7:

To install Docker Engine, you need a maintained version of CentOS 7. Archived versions aren’t supported or tested.

查看系统内核:

[root@izbp1h1sg6pkdch578k3w2z ~]# uname -r
3.10.0-514.26.2.el7.x86_64

系统版本:

[root@izbp1h1sg6pkdch578k3w2z ~]# uname -r
3.10.0-514.26.2.el7.x86_64
[root@izbp1h1sg6pkdch578k3w2z ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

在安装新版本前,要卸载老的版本:

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

执行结果:

[root@izbp1h1sg6pkdch578k3w2z ~]# sudo yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine
Loaded plugins: fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
No Match for argument: docker
No Match for argument: docker-client
No Match for argument: docker-client-latest
No Match for argument: docker-common
No Match for argument: docker-latest
No Match for argument: docker-latest-logrotate
No Match for argument: docker-logrotate
No Match for argument: docker-engine
No Packages marked for removal

安装需要的包:

sudo yum install -y yum-utils
image

设置镜像的仓库:

# 这个地址是官方文档给的,默认的镜像是国外的,会非常慢
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 这个是国内阿里云的,比较快
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
image

更新yum软件包索引:

yum makecache fast
image

安装Docker引擎:

sudo yum install docker-ce docker-ce-cli containerd.io

这里docker-ce是社区版的,docker-ee是企业版的。

image

启动Docker:

systemctl start docker
image

判断Docker是否成功安装:

docker version
image

运行hello-world:

docker run hello-world
image

说明:

[root@izbp1h1sg6pkdch578k3w2z ~]# docker run hello-world
# 本地没有找到hello-world镜像
Unable to find image 'hello-world:latest' locally
# 远程拉取镜像(pull),拉去官方library下的hello-world
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
# 签名信息,代表拉取OK
Digest: sha256:8c5aeeb6a5f3ba4883347d3747a7249f491766ca1caa47e5da5dfcf6b9b717c0
Status: Downloaded newer image for hello-world:latest

# 弹出这句话说明安装成功
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

查看下载的hello-world镜像:

docker images
image

卸载Docker:

# 卸载依赖
sudo yum remove docker-ce docker-ce-cli containerd.io

# 删除目录
sudo rm -rf /var/lib/docker

Docker的默认工作路径:/var/lib/docker

阿里云镜像加速:

三、Docker的常用命令

官方命令文档:https://docs.docker.com/reference/

3.1 帮助命令

# 显示Docker的版本信息
docker version

# 显示Docker的系统信息,包括镜像和容器的数量
docker info

# 帮助命令
docker 命令 --help

3.2. 镜像命令

docker images

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

[root@izbp1h1sg6pkdch578k3w2z ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
hello-world         latest              bf756fb1ae65        10 months ago       13.3kB

# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小

# 可选项
--all , -a # 列出所有的镜像
--digests       Show digests
--filter , -f       Filter output based on conditions provided
--format        Pretty-print images using a Go template
--no-trunc      Don’t truncate output
--quiet , -q # 只显示镜像的ID

docker search

image

这里搜索的mysql和在docker hub网页上搜索mysql的结果差不多:

image

可选项:

docker search -- help

[root@izbp1h1sg6pkdch578k3w2z ~]# docker search --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   # 过滤:Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output

docker pull

[root@izbp1h1sg6pkdch578k3w2z ~]# docker pull mysql
Using default tag: latest     # tag如果为空,默认下载的是最新版本的
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete   # 分层下载,docker image的核心:联合文件系统
49e22f6fb9f7: Pull complete 
842b1255668c: Pull complete 
9f48d1f43000: Pull complete 
c693f0615bce: Pull complete 
8a621b9dbed2: Pull complete 
0807d32aef13: Pull complete 
a56aca0feb17: Pull complete 
de9d45fd0f07: Pull complete 
1d68a49161cc: Pull complete 
d16d318b774e: Pull complete 
49e112c55976: Pull complete 
Digest: sha256:8c17271df53ee3b843d6e16d46cff13f22c9c04d6982eb15a9a47bd5c9ac7e2d  # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  # 真实地址

也就是说,以下两个命令是等价的:

docker pull mysql
docker pull docker.io/library/mysql:latest

指定版本下载:

[root@izbp1h1sg6pkdch578k3w2z ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
bb79b6b2107f: Already exists # 已经下载过的就不重复下载了
49e22f6fb9f7: Already exists 
842b1255668c: Already exists 
9f48d1f43000: Already exists 
c693f0615bce: Already exists 
8a621b9dbed2: Already exists 
0807d32aef13: Already exists 
f15d42f48bd9: Pull complete 
098ceecc0c8d: Pull complete 
b6fead9737bc: Pull complete 
351d223d3d76: Pull complete 
Digest: sha256:4d2b34e99c14edb99cdd95ddad4d9aa7ea3f2c4405ff0c3509a29dc40bcb10ef
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

查看下载的镜像:

image

docker rmi

删除可以指定镜像名称、镜像ID删除:

# 删除指定镜像
docker rmi -f 要删除的镜像ID

# 删除多个镜像
docker rmi -f 要删除的镜像ID1 要删除的镜像ID2 要删除的镜像ID3

# 删除全部镜像
docker rmi -f $(docker images -aq)

删除指定镜像:

image

再查看镜像,5.7版本的就被删掉了:

image

删除所有镜像:

image-20201102152121144

再查看镜像:

image

3.3. 容器命令

[root@izbp1h1sg6pkdch578k3w2z ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

[root@izbp1h1sg6pkdch578k3w2z ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        2 months ago        215MB

docker run

[root@izbp1h1sg6pkdch578k3w2z ~]# docker run -it centos /bin/bash
# -it:进入容器,交互运行
# 敲完命令后root旁边的名称变了

[root@313f004887e2 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# ls用来查看容器内的CentOS,这是一个基础版本,很多命令都是不完善的

# 后台启动容器
docker run -d 镜像名
# 使用这个命令有一个问题,就是运行完这个命令,再使用docker ps查看当前启动的容器,发现这个容器没有在启动。
# 这是因为docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。

退出:

[root@313f004887e2 /]# exit
exit
[root@izbp1h1sg6pkdch578k3w2z ~]# 

docker ps

# 查看正在运行的容器
[root@izbp1h1sg6pkdch578k3w2z ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@izbp1h1sg6pkdch578k3w2z ~]# 

# 查看运行过的容器
[root@izbp1h1sg6pkdch578k3w2z ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
313f004887e2        centos              "/bin/bash"         5 minutes ago       Exited (0) 2 minutes ago                       lucid_euler
00a27b2c1031        bf756fb1ae65        "/hello"            5 hours ago         Exited (0) 5 hours ago                         gracious_zhukovsky
[root@izbp1h1sg6pkdch578k3w2z ~]# 

# 可选参数
docker ps      # 当前正在运行的容器
docker ps -a   # 列出当前正在运行的容器+历史运行过的容器
docker ps -n=? # 显示最近创建过的?个容器
docker ps -q   # 只显示容器的编号

docker rm

# 删除指定容器,不能删除正在运行的容器,如果要强制删除,使用rm -f
docker rm 容器ID

# 删除所有的容器
docker rm -f $(docker ps -aq)

# 使用管道删除所有的容器
docker ps -a|xargs docker rm

启动和停止容器:

# 启动容器
docker start 容器ID

# 重启容器
docker reatrt 容器ID

# 停止当前运行的容器
docker stop 容器ID

# 强制停止当前容器
docker kill 容器ID

3.4. 常见其他命令

查看日志:

docker logs -tf --tail 10 容器名
# 10是参数,显示最近10条日志,如果容器还在运行,那么会持续打印

查看容器中进程信息:

docker top 容器ID

[root@izbp1h1sg6pkdch578k3w2z ~]# docker top 9252b12a6602
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                6411                6379                0                   16:43               ?                   00:00:00            /bin/bash
[root@izbp1h1sg6pkdch578k3w2z ~]# 

查看镜像的元数据:

docker inspect 容器ID

[root@izbp1h1sg6pkdch578k3w2z ~]# docker inspect 9252b12a6602
[
    {
        "Id": "9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97",
        "Created": "2020-11-02T08:43:43.721119773Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 6411,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-11-02T08:43:44.090485585Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
        "ResolvConfPath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/hostname",
        "HostsPath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/hosts",
        "LogPath": "/var/lib/docker/containers/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97/9252b12a6602078e3ff84d1cef8b45ac4215e7c76cb3d28191b82e4ae1578f97-json.log",
        "Name": "/strange_bose",
        "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,
            "Capabilities": null,
            "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/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a-init/diff:/var/lib/docker/overlay2/6a46a96a239b06d0b6380fb7518c179f7bad2c2c65885eaa86dd7373d66b3e80/diff",
                "MergedDir": "/var/lib/docker/overlay2/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a/merged",
                "UpperDir": "/var/lib/docker/overlay2/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a/diff",
                "WorkDir": "/var/lib/docker/overlay2/ded86c07f57a2fbef466eaa0bb93eaa829d84477fd1c59b672b81d351738581a/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "9252b12a6602",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200809",
                "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": "6e5aaf69cc376ab504a4a467affff18a5b9a523749193f81fba57b54cf959c6e",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/6e5aaf69cc37",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "1d425e094d0342b53c951454b74f4625bb5c215e71e4071d6bfe55cdf15f0d35",
            "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": "31fb0281bc366eb473643efd1e191636af07f9244742e6942a7818c8b6761a50",
                    "EndpointID": "1d425e094d0342b53c951454b74f4625bb5c215e71e4071d6bfe55cdf15f0d35",
                    "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@izbp1h1sg6pkdch578k3w2z ~]# 

进入当前正在运行的容器:

# 容器通常都是使用后台方式运行的,需要进入容器修改一些配置

# 方式一
 容器ID /bin/bash

[root@izbp1h1sg6pkdch578k3w2z ~]# docker exec -it 9252b12a6602 /bin/bash
[root@9252b12a6602 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@9252b12a6602 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:43 pts/0    00:00:00 /bin/bash
root        14     0  0 08:50 pts/1    00:00:00 /bin/bash
root        28    14  0 08:50 pts/1    00:00:00 ps -ef

# 方式二
docker attach 容器id

# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在执行的终端,不会启动新的

从容器内拷贝文件到主机上:

docker cp 容器ID:容器内路径 目的主机路径

# 过程:进入docker容器内,在容器内新建一个文件,将这个文件拷贝到主机上
# 当前的拷贝是一个手动的过程,之后可以使用 -v 卷的技术,可以实现自动同步

3.5. 命令小结

image

练习1:部署Nginx

练习2:装一个Tomcat

# 官方提供的命令
docker run -it --rm tomcat:9.0

# 带--rm命令选项,这种方法一般用作测试,等价于在容器退出后,执行docker rm -v,也就是退出后立即删除该容器使用
# 使用这个命令就不用先pull了

3.6. Docker可视化

portainer:

上一篇下一篇

猜你喜欢

热点阅读