Docker(1)

简介

是什么?

确保应用能够在这些环境中运行和通过质量检测.并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复.

Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----系统平滑移植,容器虚拟化技术。

解决了运行环境和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

能干嘛?

一次构建、随处运行

  • 更快速的应用交付和部署:

    传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

  • 更便捷的升级和扩缩容:

    随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

  • 更简单的系统运维:

    应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

  • 更高效的计算资源利用:

    Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

去哪下?

docker官网:http://www.docker.com

Docker Hub官网: https://hub.docker.com/

Docker 的基本组成

镜像(image)

image 文件生成的容器实例,本身也是一个文件,称为镜像文件.

  • Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器

  • 它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。

  • 相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象

  • Docker 面向对象
    容器 对象
    镜像

容器(container)

一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器.

  • 从面向对象角度
    • Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台
  • 从镜像容器角度:
    • 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

仓库(repository)

仓库(Repository)是集中存放镜像文件的场所。

  • 类似于Maven仓库,存放各种jar包的地方;github仓库,存放各种git项目的地方;Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。

  • 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等

总结

Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

镜像文件 image 文件生成的容器实例,本身也是一个文件,称为镜像文件.

工作原理

Docker 是一个Client-Server 结构的系统架构,Docker 守护进程运行在主机上,然后通过 Socker 连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器,容器,是一个运行时环境,就是一个个集装箱.

Docker 是一个 C/S 模式的架构,后端是一个松耦合架构,众多模块各司其职。

Docker运行的基本流程:

  1. 用户是使用 Docker Client 与 Docker Daemon 建立通信,并发送请求给后者.
  2. Docker Daemon 作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Clinet 的请求.
  3. Docker Daemon 执行 Docker 内部的一系列工作,每一项工作都是以一个 Job 的形式存在.
  4. Job 的运行过程中,当需要容器镜像时,则从 Docker Registry 中下载镜像,并通过镜像管理驱动 Graph driver 将下载镜像以 Graph 的形式存储.
  5. 当需要为 Docker 创建网络环境时,通过网络管理驱动 Network driver 创建并配置 Docker 容器网络环境.
  6. 当需要限制 Docker 容器运行资源或执行用户指令等操作是,则通过 Exec driver 来完成.
  7. Libcontainer 是一项独立的容器管理包,Network driver 以及 Exec driver 都是通过Libcontainer 来实现具体对容器进行的操作.

安装

https://docs.docker.com/engine/install/centos/ 官网安装操作指南

确认虚拟机版本是 CentOS7 及以上版本

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -r
3.10.0-1160.59.1.el7.x86_64

卸载旧版

yum list installed | grep docker
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

安装 gcc 相关

[root@localhost ~]# yum -y install gcc
[root@localhost ~]# yum -y install gcc-c++

设置存储库

官网推荐的是外网的地址,下载速度慢且会出现网络超时的问题.

[root@localhost ~]# yum install -y yum-utils
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

建立元数据缓存

[root@localhost ~]# yum makecache fast

安装 Docker

[root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io

启动 Docker

[root@localhost ~]# systemctl start docker

运行 hello-world

[root@localhost ~]# docker run hello-world

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/

修改镜像加速器

https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["自己的阿里云镜像加速地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

扩展

run 干了什么

image


常用命令

帮助启动类

  • 启动: systemctl start docker
  • 停止: systemctl stop docker
  • 重启: systemctl restart docker
  • 查看状态: systemctl status docker
  • 开机启动: systemctl enable docker
  • 查看概要信息: docker info
  • 查看总体帮助文档: docker--help
  • 查看命令帮助文档: docker 具体命令 --help
  • 更新 docker 镜像的指令: docker update mysql --restart=always

镜像命令

  • docker images

    -a:列出本地所有的镜像(含历史映像层)

    -q:只显示镜像ID

[root@VM-0-12-centos docker]# docker images
镜像仓库源      镜像的标签版本号 镜像ID          镜像创建时间     镜像大小
REPOSITORY    TAG           IMAGE ID       CREATED        SIZE
hello-world   latest        feb5d9fea6a5   9 months ago   13.3kB

同一仓库源可以有多个 TAG 版本,代表这个仓库源的不同版本,我们使用REPOSITORY:TAG来定义不同的镜像.


[root@VM-0-12-centos docker]# docker images -q
feb5d9fea6a5
  • docker search 某个XXX镜像名字

    --limit : 只列出N个镜像,默认25个

[root@VM-0-12-centos docker]# docker search --limit 5 redis
镜像名称                   镜像说明                                         点赞数     是否官方     是否是自动构建的
NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
redis                    Redis is an open source key-value store that…   11064     [OK]
bitnami/redis            Bitnami Redis Docker Image                      223                  [OK]
bitnami/redis-sentinel   Bitnami Docker Image for Redis Sentinel         38                   [OK]
circleci/redis           CircleCI images for Redis                       14                   [OK]
bitnami/redis-exporter
  • docker pull 某个XXX镜像名字
docker pull 镜像名字[:TAG] 没有 TAG 就是最新版
  • docker system df 查看镜像/容器/数据卷所占的空间
[root@VM-0-12-centos docker]# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          1         1         13.26kB   0B (0%)
Containers      1         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B
  • docker rmi 某个XXX镜像名字ID

删除一个镜像

-f: 强制删除镜像

  • 删除全部: docker rmi -f $(docker images -qa)
[root@VM-0-12-centos docker]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   9 months ago   13.3kB
[root@VM-0-12-centos docker]# docker rmi feb5d9fea6a5
Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 17d8a49cb33f
[root@VM-0-12-centos docker]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412

容器命令

新建 + 启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG......]

docker run --name mysql --memory=512m --restart=always -v /usr/local/docker/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -p 33016:3306 -d mysql:5.7.38

OPTIONS 说明
  • --name="容器新名字" 为容器指定一个名称;

  • -d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);

  • -i:已交互模式运行容器,通常与 -t 同时使用;

  • -t: 为容器重新分配一个伪输入终端, 通常与 -i 同时使用;

    也即启动交互式容器(前台有伪终端,等待交互);

  • -P:随机端口映射,大写P

  • -p:指定端口映射,小写p

参数 说明
-p hostPost:containerPort 端口映射 -p 8080:80
-p ip:hostPost:containerPort 配置监听地址 -p 10.0.0.1:8080:80
-p ip::containerPort 随机分配端口 -p 10.0.0.100::80
-p hostPost:containerPort:udp 指定协议 -p 8080:80:tcp
-p 81:80 -p 443:443 指定多个
启动交互式容器
[root@VM-0-12-centos docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
ubuntu       latest    ba6acccedd29   8 months ago   72.8MB
[root@VM-0-12-centos docker]# docker run -it ubuntu bash
root@d40983ae61dd:/# 

列出当前所有正在运行的容器

docker ps [OPTIONS]

OPTIONS说明(常用):
  • -a :列出当前所有正在运行的容器+历史上运行过的
  • -l :显示最近创建的容器。
  • -n:显示最近n个创建的容器。
  • -q :静默模式,只显示容器编号。
[root@VM-0-12-centos /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
00d1b3d76fee   ubuntu    "bash"    18 seconds ago   Up 18 seconds             competent_torvalds

退出容器

exit

run 进去容器,exit 退出,容器停止

ctrl+p+q

run进去容器,

启动以停止运行的容器

docker start 容器ID或者容器名

重启容器

docker restart 容器ID或者容器名

停止容器

docker stop 容器ID或者容器名

强制停止容器

docker kill 容器ID或容器名

删除已停止的容器

docker rm 容器ID

一次性删除多个容器实例

docker rm -f $(docker ps -a -q)

启动守护式容器(后台服务器)

在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。

docker run -d 容器名

[root@VM-0-12-centos /]# docker run -d redis
07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9
[root@VM-0-12-centos /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS      NAMES
07ded90b56af   redis     "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   6379/tcp   intelligent_meninsky
00d1b3d76fee   ubuntu    "bash"                   3 hours ago     Up 3 hours                competent_torvalds

查看容器日志

docker logs 容器ID

[root@VM-0-12-centos /]# docker logs 07ded90b56af
1:C 23 Jun 2022 09:05:40.303 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 23 Jun 2022 09:05:40.303 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 23 Jun 2022 09:05:40.303 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 23 Jun 2022 09:05:40.304 * monotonic clock: POSIX clock_gettime
1:M 23 Jun 2022 09:05:40.304 * Running mode=standalone, port=6379.
1:M 23 Jun 2022 09:05:40.304 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 23 Jun 2022 09:05:40.304 # Server initialized
1:M 23 Jun 2022 09:05:40.304 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1'to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 23 Jun 2022 09:05:40.304 * Ready to accept connections

查看容器内运行的进程

docker top 容器ID

[root@VM-0-12-centos /]# docker top 07ded90b56af
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             31140               31120               0                   17:05               ?                   00:00:00            redis-server *:6379

查看容器内部细节

docker inspect 容器ID

[root@VM-0-12-centos /]# docker inspect 07ded90b56af
[
    {
        "Id": "07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9",
        "Created": "2022-06-23T09:05:40.024477806Z",
        "Path": "docker-entrypoint.sh",
        "Args": [
            "redis-server"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 31140,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-06-23T09:05:40.289655512Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
        "ResolvConfPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/hostname",
        "HostsPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/hosts",
        "LogPath": "/var/lib/docker/containers/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9/07ded90b56afbb588a9872f8d0c71368f5f788230dbc7d71140afa9183860ba9-json.log",
        "Name": "/intelligent_meninsky",
        "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/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255-init/diff:/var/lib/docker/overlay2/05a8a4f1851e58cedf41a415398bb5cf39a32e326456951e6cc8d4a673e73e05/diff:/var/lib/docker/overlay2/8469b8e50c809cf1dc6f9c63ffc1fc5dc128cd73c1f92aa41187ee93f8a3be67/diff:/var/lib/docker/overlay2/193be01a8240889e740be1723fa5888ecc59bc6587ccb98306549947ed8c6c40/diff:/var/lib/docker/overlay2/aeaecb8e4ce8a77e4f47b62510351e91a5219593f40937aa764fa09f339ee4f5/diff:/var/lib/docker/overlay2/c269d2f03c12c5ec91a847865cead78e8b5effed0e77b9ef40085275f2e77853/diff:/var/lib/docker/overlay2/3160e9a44ba0655bee0354c0c2b4c5c11fa43aff0f3a0ace5be92a0188bdcfb0/diff",
                "MergedDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/merged",
                "UpperDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/diff",
                "WorkDir": "/var/lib/docker/overlay2/bb796e8eab985295a83f9e1bf7c6ac92920f1d720d276ba2385dab993aa8e255/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [
            {
                "Type": "volume",
                "Name": "554b0c5f868d14bab3cede05faf0415b8f7edccf94ea9bc7084bb3fb2bca8133",
                "Source": "/var/lib/docker/volumes/554b0c5f868d14bab3cede05faf0415b8f7edccf94ea9bc7084bb3fb2bca8133/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        "Config": {
            "Hostname": "07ded90b56af",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.12",
                "REDIS_VERSION=6.2.6",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
                "REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
            ],
            "Cmd": [
                "redis-server"
            ],
            "Image": "redis",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "f57ab2e208029d1363f4a8d556a2839d0b7c4bfd055b953fb989e4adf499cb52",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "6379/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/f57ab2e20802",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "ab2ae64ddea6caaaa0654f7afacd644848e5f555d51d0e3ba23d5070e5cd6cbd",
            "Gateway": "172.18.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.18.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:12:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "359b060a5722ca714f272fee7ec1b866f2f20ba1f27a244d393046c7cb19d10d",
                    "EndpointID": "ab2ae64ddea6caaaa0654f7afacd644848e5f555d51d0e3ba23d5070e5cd6cbd",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入正在运行的容器并以命令行交互

docker exec -it 容器ID bashShell

docker attach 容器ID

上述两个区别
  • attach 直接进入容器启动命令的终端,不会启动新的进程, 用exit退出,会导致容器的停止。
  • exec 是在容器中打开新的终端,并且可以启动新的进程, 用exit退出,不会导致容器的停止。

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

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

[root@VM-0-12-centos docker]# ll
total 0
[root@VM-0-12-centos docker]# pwd
/usr/local/docker
[root@VM-0-12-centos docker]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS      NAMES
07ded90b56af   redis     "docker-entrypoint.s…"   35 minutes ago   Up 35 minutes   6379/tcp   intelligent_meninsky
00d1b3d76fee   ubuntu    "bash"                   3 hours ago      Up 3 hours                 competent_torvalds
[root@VM-0-12-centos docker]# docker cp 00d1b3d76fee:/tmp/a.txt /usr/local/docker/
[root@VM-0-12-centos docker]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 23 17:40 a.txt

导入和导出容器

export 导出容器的内容留作为一个tar归档文件[对应import命令]

import 从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]

[root@VM-0-12-centos docker]# docker export 00d1b3d76fee > export.tar
[root@VM-0-12-centos docker]# ll
total 73400
-rw-r--r-- 1 root root        0 Jun 23 17:40 a.txt
-rw-r--r-- 1 root root 75159040 Jun 23 17:45 export.tar

[root@VM-0-12-centos docker]# cat export.tar | docker import - test/ubuntu:1.0
sha256:6b48c540913df35a1daccfcdc14b56a04edc96f8ec5a0f84c8b6f48bcbb2b474
[root@VM-0-12-centos docker]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
test/ubuntu   1.0       6b48c540913d   16 seconds ago   72.8MB
redis         latest    7614ae9453d1   6 months ago     113MB
ubuntu        latest    ba6acccedd29   8 months ago     72.8MB
[root@VM-0-12-centos docker]# docker run -it 6b48c540913d bash
root@ee539a48a5c6:/# cd /tmp/
root@ee539a48a5c6:/tmp# ll
total 8
drwxrwxrwt 2 root root 4096 Jun 23 09:40 ./
drwxr-xr-x 1 root root 4096 Jun 23 09:52 ../
-rw-r--r-- 1 root root    0 Jun 23 09:40 a.txt

Docker 镜像

简介

是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。

分层的镜像

以我们的pull为例,在下载的过程中我们可以看到docker的镜像好像是在一层一层的在下载.

UnionFS

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M??

对于一个精简的 OS, rootfs 可以很小, 只需要包括最基本的命令, 工具和程序库就可以了, 因为底层直接用 Host 的 kernel, 自己只需要提供 rootfs 就行了,.由此可见对于不同的 linux 发行版, bootfs 基本是一致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs.,

为什么 Docker 镜像要采用这种分层结构呢?

镜像分层最大的一个好处就是共享资源,方便复制迁移,就是为了复用。

比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

重点理解

Docker 镜像层都是只读的, 容器层是可写的.

当容器启动时, 一个新的可写层被加载到镜像的顶部. 这一层通常被称作 "容器层", "容器层" 之下都叫 "镜像层".

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

image

镜像Commit操作

docker commit 提交容器副本使之成为一个新的镜像

docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]

案例演示

ubuntu 安装 vim
root@ee539a48a5c6:/# vim a.txt
bash: vim: command not found
root@ee539a48a5c6:/tmp# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:2 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [881 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:7 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [27.5 kB]
Get:8 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1331 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:10 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [1979 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:12 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1411 kB]
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2420 kB]
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1161 kB]
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [30.3 kB]
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [54.2 kB]
Get:18 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [27.1 kB]
Fetched 22.8 MB in 10s (2345 kB/s)
Reading package lists... Done

root@ee539a48a5c6:/tmp# apt-get -y install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
......
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/vim.1.gz (of link group editor) doesn't exist
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...


安装完成后进行 commit 操作
[root@VM-0-12-centos /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
test/ubuntu   1.0       6b48c540913d   20 hours ago   72.8MB
redis         latest    7614ae9453d1   6 months ago   113MB
ubuntu        latest    ba6acccedd29   8 months ago   72.8MB

[root@VM-0-12-centos /]# docker commit -m="add vim cmd" -a="zzyy" ee539a48a5c6 test/myubuntu:1.1
sha256:051bc4b8a6dc20c72f1224f077bdd3888b0ca725bebc26d9e6e5623a6cbadb6a

[root@VM-0-12-centos /]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
test/myubuntu   1.1       051bc4b8a6dc   15 seconds ago   178MB
test/ubuntu     1.0       6b48c540913d   20 hours ago     72.8MB
redis           latest    7614ae9453d1   6 months ago     113MB
ubuntu          latest    ba6acccedd29   8 months ago     72.8MB

镜像中多了一个 test/myubuntu 的镜像, 其大小有 178MB.

启动新建的镜像后,其中自带了vim的功能.

镜像发布到阿里云

大致流程

image

具体步骤

https://cr.console.aliyun.com/repository/cn-hangzhou/learn_docker_images/docker_images/details

1. 登录阿里云Docker Registry

$ docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像

$ docker pull registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]

3. 将镜像推送到Registry

$ docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:[镜像版本号]

请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

4. 选择合适的镜像仓库地址

从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。

如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

5. 示例

[root@VM-0-12-centos /]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
test/myubuntu   1.1       051bc4b8a6dc   15 seconds ago   178MB
test/ubuntu     1.0       6b48c540913d   20 hours ago     72.8MB
redis           latest    7614ae9453d1   6 months ago     113MB
ubuntu          latest    ba6acccedd29   8 months ago     72.8MB
[root@VM-0-12-centos /]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
test/myubuntu   1.1       051bc4b8a6dc   36 minutes ago   178MB
test/ubuntu     1.0       6b48c540913d   21 hours ago     72.8MB
redis           latest    7614ae9453d1   6 months ago     113MB
ubuntu          latest    ba6acccedd29   8 months ago     72.8MB
[root@VM-0-12-centos /]# docker login --username=15673348377 registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@VM-0-12-centos /]# docker tag 051bc4b8a6dc registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:1.1
[root@VM-0-12-centos /]#
[root@VM-0-12-centos /]#
[root@VM-0-12-centos /]# docker push registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images:1.1
The push refers to repository [registry.cn-hangzhou.aliyuncs.com/learn_docker_images/docker_images]
18ff89b424df: Pushing [==============>                                    ]  29.42MB/104.8MB
3414f251cfcb: Pushing [========>                                          ]  12.48MB/72.78MB
18ff89b424df: Pushed
3414f251cfcb: Pushed
1.1: digest: sha256:1a62548283122eadf1fc312195f0fd564b1dc549521dd8d8e4e880090abd1858 size: 741

镜像发布到私有库

大致流程和发布到阿里云类似.

下载私服工具

Docker Registry

工具简介

官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。

Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。

Docker Registry是官方提供的工具,可以用于构建私有镜像仓库;

搭建私服的步骤

下载镜像

docker pull registry

运行私有库

运行私有库Registry,相当于本地有个私有Docker hub

docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry 默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调;

查看私服库上的镜像

curl -XGET http://192.168.111.162:5000/v2/_catalog

[root@VM-0-12-centos docker]# curl -XGET http://localhost:5000/v2/_catalog
{"repositories":["test/myubuntu"]}

将镜像发布到私服

修改镜像的 tag

公式: docker tag 镜像:Tag Host:Port/Repository:Tag

docker tag  test/myubuntu:1.2  localhost:5000/test/myubuntu:1.2
修改配置文件,使其支持http
[root@VM-0-12-centos docker]# vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://8p4po18u.mirror.aliyuncs.com"],
  "insecure-registries": ["localhost:5000"]
}

push 镜像到主机
docker push  localhost:5000/test/myubuntu:1.2
a8bb6d556bb6: Pushed
9f54eef41275: Pushed
1.2: digest: sha256:fea65b4a65b5e2a7a8c070232f2aed54f76332943c9288d273e7f65f1a3a8d7b size: 741

容器数据卷

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

--privileged=true: 如果是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了额,如果要开启,我们一般使用--privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

简介

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷.将 Docker 容器内的数据保存进宿主机的磁盘中.

能干嘛

将运用于运行的环境打包镜像, run 后形成容器实例运行, 但是我么对数据的要求希望是持久化的.

Docker 容器产生的数据, 如果不备份, 那么当容器实例删除后, 容器内的数据自然也就没有了, 为了能保存数据在 Docker 中我们使用卷.

特点:

  • 数据卷可在容器之间共享或重用数据.
  • 卷中的更改可以直接实时生效.
  • 数据卷中的更改不会包含在镜像的更新中.
  • 数据卷的生命周期一直持续到没有容器使用它为止.

实战案例

docker

[root@VM-0-12-centos ~]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
root@7a46ffc0299f:/# cd /tmp/docker_data/
root@7a46ffc0299f:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:25 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:25 ../
root@7a46ffc0299f:/tmp/docker_data# touch dockerin.txt
root@7a46ffc0299f:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:26 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:25 ../
-rw-r--r-- 1 root root    0 Jun 24 14:26 dockerin.txt
root@7a46ffc0299f:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:26 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:25 ../
-rw-r--r-- 1 root root    0 Jun 24 14:26 dockerin.txt
-rw-r--r-- 1 root root    0 Jun 24 14:26 hostin.txt

主机

[root@VM-0-12-centos ~]# cd "/tmp/docker_data"
-bash: cd: /tmp/docker_data: No such file or directory
[root@VM-0-12-centos ~]# cd /tmp/host_data/
[root@VM-0-12-centos host_data]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 24 22:26 dockerin.txt
[root@VM-0-12-centos host_data]# touch hostin.txt

数据共享

  1. docker 修改,主机同步获取.
  2. 主机修改,docker同步获取.
  3. docker容器stop,主机修改,docker容器重启后数据依旧同步.

读写规则映射添加说明

读写(默认)

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名

默认就是读写

只读

容器实例内部被限制,只能读取不能写

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

卷的继承和共享

docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu

容器1完成和宿主机的映射

[root@VM-0-12-centos ~]# docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=u1 ubuntu
root@7a46ffc0299f:/# cd /tmp/docker_data/

容器2继承容器1的卷规则

[root@VM-0-12-centos host_data]# docker run -it --privileged=true --volumes-from u1 --name u2 ubuntu
root@5f7b57866841:/# cd /tmp/docker_data/
root@5f7b57866841:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Jun 24 14:26 ./
drwxrwxrwt 1 root root 4096 Jun 24 14:48 ../
-rw-r--r-- 1 root root    0 Jun 24 14:26 dockerin.txt
-rw-r--r-- 1 root root    0 Jun 24 14:26 hostin.txt
root@5f7b57866841:/tmp/docker_data#

继承父容器后相当于也是直接挂载了对应的宿主机的路径,会直接同步对应的数据.

且父容器挂掉后还是可以继续同步,互不干扰.

常规软件安装

总体流程

  • 搜素镜像
  • 拉取镜像
  • 查看镜像
  • 启动镜像
  • 停止容器
  • 移除容器

安装 tomcat

docker hub 上查找tomcat镜像

[root@VM-0-12-centos ~]# docker search --limit 5 tomcat
NAME                          DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
tomcat                        Apache Tomcat is an open source implementati…   3344      [OK]
tomee                         Apache TomEE is an all-Apache Java EE certif…   97        [OK]
bitnami/tomcat                Bitnami Tomcat Docker Image                     45                   [OK]
secoresearch/tomcat-varnish   Tomcat and Varnish 5.0                          0                    [OK]
semoss/docker-tomcat          Tomcat, Java, Maven, and Git on top of debian   0                    [OK]

从 docker hub 上拉取 tomcat 镜像到本地

不指定版本默认拉取最新一版.

[root@VM-0-12-centos ~]# docker pull tomcat
Using default tag: latest
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Extracting  82.44MB/203.1MB
77b694f83996: Download complete
0f611256ec3a: Download complete
4f25def12f23: Download complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest

通过 docker images 查询镜像

[root@VM-0-12-centos ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
tomcat       latest    fb5657adc892   6 months ago   680MB

通过镜像创建对应的容器

[root@VM-0-12-centos ~]# docker run -it -p 8080:8080 tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED

访问tomcat容器

防火墙先得开放8080端口;

由于最新版的tomcat有两个文件夹,webapps.dist和webapps, webapps 里面是没有初始化页面的,需要将webapps删除后将webapps.dist 改名字为webapps.

[root@VM-0-12-centos ~]# docker exec -it 6c5834abd30e bash
root@6c5834abd30e:/usr/local/tomcat# ll
bash: ll: command not found
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt
root@6c5834abd30e:/usr/local/tomcat# ls -l
total 160
-rw-r--r-- 1 root root 18994 Dec  2  2021 BUILDING.txt
-rw-r--r-- 1 root root  6210 Dec  2  2021 CONTRIBUTING.md
-rw-r--r-- 1 root root 60269 Dec  2  2021 LICENSE
-rw-r--r-- 1 root root  2333 Dec  2  2021 NOTICE
-rw-r--r-- 1 root root  3378 Dec  2  2021 README.md
-rw-r--r-- 1 root root  6905 Dec  2  2021 RELEASE-NOTES
-rw-r--r-- 1 root root 16517 Dec  2  2021 RUNNING.txt
drwxr-xr-x 2 root root  4096 Dec 22  2021 bin
drwxr-xr-x 1 root root  4096 Jun 25 02:42 conf
drwxr-xr-x 2 root root  4096 Dec 22  2021 lib
drwxrwxrwx 1 root root  4096 Jun 25 02:42 logs
drwxr-xr-x 2 root root  4096 Dec 22  2021 native-jni-lib
drwxrwxrwx 2 root root  4096 Dec 22  2021 temp
drwxr-xr-x 2 root root  4096 Dec 22  2021 webapps
drwxr-xr-x 7 root root  4096 Dec  2  2021 webapps.dist
drwxrwxrwx 2 root root  4096 Dec  2  2021 work
root@6c5834abd30e:/usr/local/tomcat# cd webapps.dist/
root@6c5834abd30e:/usr/local/tomcat/webapps.dist# ll
bash: ll: command not found
root@6c5834abd30e:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@6c5834abd30e:/usr/local/tomcat/webapps.dist# cd ..
root@6c5834abd30e:/usr/local/tomcat# ll
bash: ll: command not found
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt
root@6c5834abd30e:/usr/local/tomcat# cd webapps
root@6c5834abd30e:/usr/local/tomcat/webapps# ls
root@6c5834abd30e:/usr/local/tomcat/webapps# cd ..
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt	 NOTICE		RUNNING.txt  lib	     temp	   work
CONTRIBUTING.md  README.md	bin	     logs	     webapps
LICENSE		 RELEASE-NOTES	conf	     native-jni-lib  webapps.dist
root@6c5834abd30e:/usr/local/tomcat# rm -rf webapps
root@6c5834abd30e:/usr/local/tomcat# mv webapps.dist/ webapps
root@6c5834abd30e:/usr/local/tomcat# ls
BUILDING.txt	 NOTICE		RUNNING.txt  lib	     temp
CONTRIBUTING.md  README.md	bin	     logs	     webapps
LICENSE		 RELEASE-NOTES	conf	     native-jni-lib  work

免修改版说明

下载低版本的 tomcat,这样的话就不需要配置了.

docker pull billygoo/tomcat8-jdk8

docker run -d -p 8080:8080 --name mytomcat8 billygoo/tomcat8-jdk8

安装 mysql

docker hub上面查找镜像

[root@VM-0-12-centos ~]# docker search --limit 5 mysql
NAME             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql            MySQL is a widely used, open-source relation…   12769     [OK]
mariadb          MariaDB Server is a high performing open sou…   4906      [OK]
percona          Percona Server is a fork of the MySQL relati…   579       [OK]
phpmyadmin       phpMyAdmin - A web interface for MySQL and M…   557       [OK]
circleci/mysql   MySQL is a widely used, open-source relation…   26

docker hub 拉取镜像

[root@VM-0-12-centos ~]# docker pull mysql:5.7.38
[root@VM-0-12-centos ~]# docker images mysql:5.7.38
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
mysql        5.7.38    74a6a7ec181f   2 days ago   462MB

使用镜像

简单版

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

简单版存在的问题一个是 docker 上默认字符集编码隐患

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

第二个问题就是没有进行容器卷的绑定, 数据不能持久化, 容器一关闭后数据就消失了.

实战版

docker run -d -p 33026:3306 --privileged=true -v /usr/local/docker/myMysql/log:/var/log/mysql -v /usr/local/docker/myMysql/data:/var/lib/mysql -v /usr/local/docker/myMysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7.8

启动命令详解

docker run -d -p 3306:3306 --privileged=true 指定端口和开启访问权限配置

-v /zzyyuse/mysql/log:/var/log/mysql 挂载docker 的 mysql 容器的日志文件

-v /zzyyuse/mysql/data:/var/lib/mysql 挂载 docker 的 mysql 容器的数据文件

-v /zzyyuse/mysql/conf:/etc/mysql/conf.d 挂载 docker 的 mysql 容器的配置文件

-e MYSQL_ROOT_PASSWORD=123456 指定mysql的密码

--name mysql mysql:5.7

启动后初始化配置文件

进入宿主机挂载的目录下创建mysql的配置文件:

[root@VM-0-12-centos conf]# pwd
/usr/local/docker/myMysql/conf
[root@VM-0-12-centos conf]# vim my.cnf

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

进入容器中查看同步后的配置文件:

root@73af070ce4dc:/etc/mysql/conf.d# cd /etc/mysql/conf.d
root@73af070ce4dc:/etc/mysql/conf.d# cd /
root@73af070ce4dc:/# cd /etc/mysql/conf.d
root@73af070ce4dc:/etc/mysql/conf.d# ls
my.cnf
root@73af070ce4dc:/etc/mysql/conf.d# cat my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

更改完配置文件后重启mysql容器,再查看数据库的编码集,就已经全部更改为utf8了.

[root@VM-0-12-centos myMysql]# docker restart 73af070ce4dc
73af070ce4dc
[root@VM-0-12-centos myMysql]# docker exec -it 73af070ce4dc bash
root@73af070ce4dc:/# mysql -uroot -p
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec

安装 redis

查找和拉取与tomcat还有mysql是一样的.

docker pull redis:6.0.8

[root@VM-0-12-centos myMysql]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
bb79b6b2107f: Pull complete
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
3f806f5245c9: Pull complete
f8a4497572b2: Pull complete
eafe3b6b8d06: Pull complete
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Downloaded newer image for redis:6.0.8
docker.io/library/redis:6.0.8

使用镜像

简单版
[root@VM-0-12-centos docker]# docker run -d -p 6379:6379 redis:6.0.8
实战版
准备配置文件

需要将redis的配置文件准备到宿主机上,这样后续操作才可以更好进行.

  1. 修改redis.conf文件
  2. 开启redis验证 可选
    1. requirepass 123
  3. 允许redis外地连接 必须
    1. 注释掉 # bind 127.0.0.1
  4. daemonize no
    1. 将daemonize yes注释起来或者 daemonize no设置,因为该配置和docker run中-d参数冲突,会导致容器一直启动失败...
启动命令

docker run -p 6379:6379 --name redis --privileged=true -v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf

posted @ 2022-06-23 21:33  李小龙他哥  阅读(465)  评论(0编辑  收藏  举报