docker学习笔记

目录

[TOC]

1. 简介

Docker是GO语言实现的开源项目,基于Linux容器技术,主要目标是一次封装,到处运行

应用部署在Docker容器上,Docker容器在任何操作系统上都是一致的,因此实现了跨平台、跨服务器的部署(和Java虚拟机的理念类似)。

1.1 出现的原因

软件带环境安装,避免软更换环境后与环境的不兼容(开发环境->测试环境->生产环境->生产环境的集群发布)。

减少开人员与运维人员之间沟通的障碍,提高协作能力;微服务环境下,运维人员可快速得进行软件的部署,。

1.2 与传统虚拟化方式的区别

  • 传统的虚拟机技术是在宿主中模拟出一套硬件后,在上面运行一个完整的操作系统,在操作系统上运行自己需要的软件进程。当前宿主无法感知运行的系统。缺点:占用资源多、冗余步骤多、启动慢。
  • Docker基于Linux容器技术(LXC),容器内的应用进程直接运行于宿主的内核,每个容器有自己的文件系统,容器之间的进程不会互相影响,容器没有自己的内核和硬件虚拟。容器比传统虚拟机更为轻便。

1.3 优点

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

    Docker化之后,发布应用,只需要交付容器镜像环境,在新环境加载镜像运行即可。节省了部署以及部署后的验证时间。

  • 更便捷的升级和扩缩容

    微服务器架构模式下,需要重复发布大量的应用。Docker容器发布的快捷(发布简单、执行速度快),能支持微服务架构下的快速升级和扩容

  • 更简单的系统运维

    容器话后,容器在任何一个系统的运行结果都是一样的,减少了因底层环境问题导致的应用问题,保障了应用的稳定性。

  • 更高效的资源利用

    Docker容器化之后,不需要独立的物理机或者虚拟机进行环境部署,只依赖宿主机内的被隔离的进程。大大减少了对系统资源的额外消耗。

1.4 相关网址

[官网 https://www.docker.com][https://www.docker.com]

仓库 https://hub.docker.com

1.5 名词解释

  • 镜像

    镜像是一个只读模板,一个镜像可以创建很多容器。类似于Java中的类。

  • 容器

    容器是通过镜像创建的运行实例,在容器上独立运行一个或一组应用。

    每个容器都是相互隔离的。

    可以把容器看做一个简易版的Linux环境+运行在上面的程序。

    容器是可读可写的。

  • 仓库

    仓库是集中存放镜像文件的场所,可以下载和提交镜像。最大的仓库是Dock Hub

2. Docker的安装

2.1 版本说明

Centos 7.3.1611

查看版本相关命令:

  • 查看centos版本号
[root@localhost etc]# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core)
  • 查看内核版本
[root@localhost etc]# uname -r
3.10.0-514.el7.x86_64
  • 查看操作系统位数
[root@localhost etc]# getconf LONG_BIT
64

2.2 官方文档

centos安装Docker

2.3 安装步骤(首次安装-社区版)

如之前安装过,需参照官网进行卸载。

(1)安装需要的软件包

yum install -y yum-utils device-mapper-persistent-data lvm2

(2)设置稳定的镜像仓库

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(3)更新yum软件包索引

yum makecache fast

(4)安装docker ce(社区版)

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

(5)启动docker

systemctl start docker

(6)测试

docker version

docker run hello-world

2.4 配置镜像加速

(1)创建目录

mkdir -p /etc/docker

(2)创建及配置文件

vim /etc/docker/daemon.json

​ 文件中配置以下内容:

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

(3)重新加载服务配置文件

systemctl daemon-reload

(4)重启docker

systemctl restart docker

(5)检查加速器是否生效

docker info

如出现如下内容,则说明配置生效:

Registry Mirrors:
http://hub-mirror.c.163.com/

3. Docker常用命令

3.1 帮助命令

#查看版本
docker version

#查看信息
docker info

#查看帮助信息
docker --help

3.2 镜像命令

3.1.1 docker images

(1)用途

列出本地主机上的镜像

[root@localhost etc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        10 months ago       1.84kB

(2)各个选项说明

REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

查看帮助:

(3)查看帮助

[root@localhost etc]# docker --help images

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

List images

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show numeric IDs

(4)Options说明

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

-q:只显示镜像ID

--digests:显示镜像的摘要信息

--no-trunc:显示完整的镜像信息

3.1.2 docker search 某个镜像名字

(1)用途

查询仓库内的镜像。查询网址:http://hub.docker.com

(2)命令模板

docker search [OPTIONS] 镜像名字

(3)查看帮助

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

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

(3)OPTIONS说明:

--no-trunc : 显示完整的镜像描述

-s : 列出收藏数不小于指定值的镜像。

--automated : 只列出 automated build类型的镜像;

3.1.3 docker pull 某个镜像的名字

(1)用途

下载镜像

(2)模板

docker pull 镜像名字[:TAG]

(3)查看帮助

[root@localhost ~]# docker --help pull

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

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
  -q, --quiet                   Suppress verbose output

3.1.4 docker rmi 某个镜像id

(1)用途

删除镜像

(2)查看帮助

[root@localhost ~]# docker --help 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

(3)命令模板

  • 删除单个

    docker rim -f 镜像ID

  • 删除多个

    docker rmi -f 镜像名1:TAG 镜像名2:TAG

  • 删除全部

    docker rmi -f $(docker images -qa)

3.3 容器命令

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

(1)用途

新建并启动容器

(2)查看帮助

[root@localhost ~]# docker run --help

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

Run a command in a new container

Options:
      --add-host list                  Add a custom host-to-IP mapping (host:ip)
  -a, --attach list                    Attach to STDIN, STDOUT or STDERR
      --blkio-weight uint16            Block IO (relative weight), between 10 and 1000, or 0 to
                                       disable (default 0)
      --blkio-weight-device list       Block IO weight (relative device weight) (default [])
      --cap-add list                   Add Linux capabilities
      --cap-drop list                  Drop Linux capabilities
      --cgroup-parent string           Optional parent cgroup for the container
      --cidfile string                 Write the container ID to the file
      --cpu-period int                 Limit CPU CFS (Completely Fair Scheduler) period
      --cpu-quota int                  Limit CPU CFS (Completely Fair Scheduler) quota
      --cpu-rt-period int              Limit CPU real-time period in microseconds
      --cpu-rt-runtime int             Limit CPU real-time runtime in microseconds
  -c, --cpu-shares int                 CPU shares (relative weight)
      --cpus decimal                   Number of CPUs
      --cpuset-cpus string             CPUs in which to allow execution (0-3, 0,1)
      --cpuset-mems string             MEMs in which to allow execution (0-3, 0,1)
  -d, --detach                         Run container in background and print container ID
      --detach-keys string             Override the key sequence for detaching a container
      --device list                    Add a host device to the container
      --device-cgroup-rule list        Add a rule to the cgroup allowed devices list
      --device-read-bps list           Limit read rate (bytes per second) from a device (default [])
      --device-read-iops list          Limit read rate (IO per second) from a device (default [])
      --device-write-bps list          Limit write rate (bytes per second) to a device (default [])
      --device-write-iops list         Limit write rate (IO per second) to a device (default [])
      --disable-content-trust          Skip image verification (default true)
      --dns list                       Set custom DNS servers
      --dns-option list                Set DNS options
      --dns-search list                Set custom DNS search domains
      --domainname string              Container NIS domain name
      --entrypoint string              Overwrite the default ENTRYPOINT of the image
  -e, --env list                       Set environment variables
      --env-file list                  Read in a file of environment variables
      --expose list                    Expose a port or a range of ports
      --gpus gpu-request               GPU devices to add to the container ('all' to pass all GPUs)
      --group-add list                 Add additional groups to join
      --health-cmd string              Command to run to check health
      --health-interval duration       Time between running the check (ms|s|m|h) (default 0s)
      --health-retries int             Consecutive failures needed to report unhealthy
      --health-start-period duration   Start period for the container to initialize before
                                       starting health-retries countdown (ms|s|m|h) (default 0s)
      --health-timeout duration        Maximum time to allow one check to run (ms|s|m|h) (default 0s)
      --help                           Print usage
  -h, --hostname string                Container host name
      --init                           Run an init inside the container that forwards signals
                                       and reaps processes
  -i, --interactive                    Keep STDIN open even if not attached
      --ip string                      IPv4 address (e.g., 172.30.100.104)
      --ip6 string                     IPv6 address (e.g., 2001:db8::33)
      --ipc string                     IPC mode to use
      --isolation string               Container isolation technology
      --kernel-memory bytes            Kernel memory limit
  -l, --label list                     Set meta data on a container
      --label-file list                Read in a line delimited file of labels
      --link list                      Add link to another container
      --link-local-ip list             Container IPv4/IPv6 link-local addresses
      --log-driver string              Logging driver for the container
      --log-opt list                   Log driver options
      --mac-address string             Container MAC address (e.g., 92:d0:c6:0a:29:33)
  -m, --memory bytes                   Memory limit
      --memory-reservation bytes       Memory soft limit
      --memory-swap bytes              Swap limit equal to memory plus swap: '-1' to enable
                                       unlimited swap
      --memory-swappiness int          Tune container memory swappiness (0 to 100) (default -1)
      --mount mount                    Attach a filesystem mount to the container
      --name string                    Assign a name to the container
      --network network                Connect a container to a network
      --network-alias list             Add network-scoped alias for the container
      --no-healthcheck                 Disable any container-specified HEALTHCHECK
      --oom-kill-disable               Disable OOM Killer
      --oom-score-adj int              Tune host's OOM preferences (-1000 to 1000)
      --pid string                     PID namespace to use
      --pids-limit int                 Tune container pids limit (set -1 for unlimited)
      --privileged                     Give extended privileges to this container
  -p, --publish list                   Publish a container's port(s) to the host
  -P, --publish-all                    Publish all exposed ports to random ports
      --read-only                      Mount the container's root filesystem as read only
      --restart string                 Restart policy to apply when a container exits (default "no")
      --rm                             Automatically remove the container when it exits
      --runtime string                 Runtime to use for this container
      --security-opt list              Security Options
      --shm-size bytes                 Size of /dev/shm
      --sig-proxy                      Proxy received signals to the process (default true)
      --stop-signal string             Signal to stop a container (default "SIGTERM")
      --stop-timeout int               Timeout (in seconds) to stop a container
      --storage-opt list               Storage driver options for the container
      --sysctl map                     Sysctl options (default map[])
      --tmpfs list                     Mount a tmpfs directory
  -t, --tty                            Allocate a pseudo-TTY
      --ulimit ulimit                  Ulimit options (default [])
  -u, --user string                    Username or UID (format: [:])
      --userns string                  User namespace to use
      --uts string                     UTS namespace to use
  -v, --volume list                    Bind mount a volume
      --volume-driver string           Optional volume driver for the container
      --volumes-from list              Mount volumes from the specified container(s)
  -w, --workdir string                 Working directory inside the container

(3)OPTIONS说明

  • --name="容器的名字":为容器指定一个名称
  • -d:后台运行容器,并返回容器ID,也即启动守护式容器
  • -i:以交互模式运行容器,通常与-t同时使用
  • -t:为容器重新分配一个伪输入终端,通常与-i同时使用
  • -P:随机端口映射
  • -p:指定端口映射
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort
    • containerPort

(4)COMMAND说明

在容器内执行命令,如:

docker run -it centos /bin/bash 
3.3.2 docker ps [OPTIONS]

(1)用途

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

(2)查看帮助

[root@localhost ~]# docker --help 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
      --format string   Pretty-print containers using a Go template
  -n, --last int        Show n last created containers (includes all states) (default -1)
  -l, --latest          Show the latest created container (includes all states)
      --no-trunc        Don't truncate output
  -q, --quiet           Only display numeric IDs
  -s, --size            Display total file sizes

(3)OPTIONS说明

  • -a:列出当前所有正在运行+历史上运行过的容器

  • -l:显示最近创建的容器

  • -n:显示最近n个创建的容器

  • -q:静默模式,只显示容器编号

  • --no-trunc:不截断输出

3.3.4 退出
  • exit

    停止容器并退出

  • ctrl+P+Q

    容器不停止退出

3.3.5 启动容器
  • docker start 容器ID或容器名
[root@localhost ~]# docker --help start

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

Start one or more stopped containers

Options:
  -a, --attach               Attach STDOUT/STDERR and forward signals
      --detach-keys string   Override the key sequence for detaching a container
  -i, --interactive          Attach container's STDIN

3.3.6 重启容器
  • docker restart 容器ID或容器名
[root@localhost ~]# docker --help restart

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

Restart one or more containers

Options:
  -t, --time int   Seconds to wait for stop before killing the container (default 10)
3.3.7 停止容器
  • docker stop 容器ID或容器名
[root@localhost ~]# docker --help stop

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

Stop one or more running containers

Options:
  -t, --time int   Seconds to wait for stop before killing it (default 10)
3.3.8 强制停止容器
  • docker kill 容器ID或容器名
[root@localhost ~]# docker --help kill

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

Kill one or more running containers

Options:
  -s, --signal string   Signal to send to the container (default "KILL")
3.3.9 删除已停止的容器
  • 删除一个

    docker rm 容器ID

  • 删除多个

    • docker rm -f $(docker ps -a -q)
    • docker ps -a -q | xargs docker rm
[root@localhost ~]# docker --help rm

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

Remove one or more containers

Options:
  -f, --force     Force the removal of a running container (uses SIGKILL)
  -l, --link      Remove the specified link
  -v, --volumes   Remove the volumes associated with the container
3.3.10 启动守护式进程

Docker容器后台运行(docker run -d centos),就必须有一个前台进程。

容器运行的命令(内置的或手动调用的[COMMOND])如不是那些一直挂起的命令(比如运行top,tail),容器启动后,就会自动退出

最佳解决方案:将你要运行的程序,以前台进程的形式运行

3.3.11 查看容器日志

(1)命令

docker logs -f -t --tail 容器ID

(2)查看帮助

[root@localhost ~]# docker --help logs

Usage:  docker logs [OPTIONS] CONTAINER

Fetch the logs of a container

Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
      --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)

(3)OPTIONS说明

  • -t:加入时间戳
  • -f:跟随最新的日志打印
  • --tail 数字:显示最后多少条
3.3.12 查看容器内运行的进程

(1)命令

docker top 容器ID

(2)查看帮助

[root@localhost ~]# docker --help top

Usage:  docker top CONTAINER [ps OPTIONS]

Display the running processes of a container
3.3.13 查看容器内部细节

(1)命令

docker inspect 容器ID

(2)实例

[root@localhost ~]# docker inspect 152ba12b05b1
[
    {
        "Id": "152ba12b05b14b531ce712ce15e1fd9f75bf8ea67392db39967cd9b7c937f107",
        "Created": "2019-11-24T03:07:14.138317277Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 3847,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2019-11-24T03:07:14.889584292Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
......[部分代码]
3.3.14 进入正在运行的容器并以命令交互运行
3.3.14.1 exec命令

exec是在容器中打开新的终端,并且可以启动新的进程

(1)命令模板:

docker exec -it 容器ID bashshell

(2)查看帮助

[root@localhost ~]# docker --help exec

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

Run a command in a running container

Options:
  -d, --detach               Detached mode: run command in the background
      --detach-keys string   Override the key sequence for detaching a container
  -e, --env list             Set environment variables
  -i, --interactive          Keep STDIN open even if not attached
      --privileged           Give extended privileges to the command
  -t, --tty                  Allocate a pseudo-TTY
  -u, --user string          Username or UID (format: [:])
  -w, --workdir string       Working directory inside the container

(3)实例

"容器ID"为需要加入的容器ID,"bashshell"为需要运行的命令,如:

[root@localhost ~]# docker exec -it 152ba12b05b1 /bin/bash
[root@152ba12b05b1 /]#

上述情况,执行exit命令,运行的容器并不会终止(因为通过exec命令,新开了一个/bin/bash进程,关闭的是此次前端进程),如下:

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
152ba12b05b1        centos:centos7.3.1611   "/bin/bash"         13 minutes ago      Up 13 minutes                           centos-test
[root@localhost ~]# docker exec -it 152ba12b05b1 /bin/bash
[root@152ba12b05b1 /]# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
152ba12b05b1        centos:centos7.3.1611   "/bin/bash"         17 minutes ago      Up 17 minutes                           centos-test
[root@localhost ~]#
3.3.14.2 attach命令

attach 直接进入容器启动命令的终端,不会启动新的进程。此情况下,如果没有其他前端进程,执行exit将会关闭容器。

(1)命令模板

docker attach 容器ID

(2)查看帮助

[root@localhost ~]# docker --help attach

Usage:  docker attach [OPTIONS] CONTAINER

Attach local standard input, output, and error streams to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)
3.3.15 从容器拷贝文件到主机

(1)命令模板

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

(2)查看帮助

[root@localhost ~]# docker --help 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.

Options:
  -a, --archive       Archive mode (copy all uid/gid information)
  -L, --follow-link   Always follow symbol link in SRC_PATH

3.4 常用命令总结

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

4. DockFile镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有软件内容,包括代码、运行时、库、环境变量和配置文件。

4.1 概念

4.1.1 UnionFS(联合文件系统)

UnionFS(联合文件系统)是一种分层、轻量级并且高性能的文件系统,它只支持对文件系统的修改并作为一次提交来一层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(基础镜像没有父镜像),可以制作各种具体的应用镜像。

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

4.1.2 Docker镜像加载原理

docker的镜像实际是由一层层的文件系统组成,这种层级的文件系统UnionFS包括两层,底层是bootfs,bootfs之上是rootfs。

(1)bootfs

bootfs(boot file system)主要包含bootloadkernel(linux内核基础),bootloader主要引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs

这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成后整个内核就都在内存中了,此时内存的使用权已有bootfs转交给内核,此时系统也会卸载bootfs。

(2)rootfs

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

(3)Docker镜像大小的问题

为什么Docker中的Conts系统只有200MB??

对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以,因为底层直接使用Host的kernel,自己只需要提供rootfs就行了。

因此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以共用bootfs

4.1.3 分层的镜像

下载镜像时(pull),根据输出的日志,可以看到下载的镜像,是在下载一层层的镜像。一层层的镜像叠加后,得到我们需要的目标镜像。

如镜像下载过程如下:

[root@localhost ~]# docker pull tomcat:8.5.49-jdk8
8.5.49-jdk8: Pulling from library/tomcat
844c33c7e6ea: Pull complete
ada5d61ae65d: Pull complete
f8427fdf4292: Pull complete
f025bafc4ab8: Pull complete
67b8714e1225: Extracting [>                                                  ]  65.54kB/4.935MB
64b12da521a3: Download complete
2e38df533772: Downloading [==========================>                        ]   55.1MB/104.2MB
4144d55bbb47: Download complete
a767078bbe38: Download complete
81f4cc5808bc: Download complete
4.1.4 为什么镜像要分层

好处:共享资源

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

4.2 特点

Docker镜像都是只读的。

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

4.3 Docker镜像commit操作补充

4.3.1 命令
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
4.3.2 帮助文档
[root@localhost ~]# docker --help commit

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith ")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)
4.3.2 案例

(1)hub上下载tomcat镜像并本地运行

docker run -it -p 8080:8080 tomcat:8.5.49-jdk8

(2)删除对应容器的doc目录

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS              PORTS                    NAMES
f29fdd5788a9        tomcat:8.5.49-jdk8   "catalina.sh run"   7 minutes ago       Up 7 minutes        0.0.0.0:8080->8080/tcp   cocky_meitner
[root@localhost ~]# docker exec -it f29fdd5788a9 /bin/bash
root@f29fdd5788a9:/usr/local/tomcat# rm -rf webapps/docs/

此时访问tomcat中自带的docs将返回404错误

(3)提交一个不带docs目录的tomcat镜像

[root@localhost ~]# docker commit -a="yjpdd" -m="delete tomcat docs" f29fdd5788a9 yjpdd/tomcat:1.0
sha256:e72d43ad224a308609e6e40eccc98e19785f179a8448420a8f83ce381246a4d9
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
yjpdd/tomcat        1.0                 e72d43ad224a        6 seconds ago       507MB
tomcat              8.5.49-jdk8         6408fdc94212        15 hours ago        507MB
centos              centos7.3.1611      c5d48e81b986        8 months ago        192MB
[root@localhost ~]#

(4)启动新提交的镜像,新创建的容器没有docs目录

docker run --name mytomcat -it -p 7070:8080 yjpdd/tomcat:1.0

5. 容器数据卷

5.1 概念

类似redis的本地存储文件rdb和afo。

docker的理念:

  • 将运用与运行的环境打包成容器运行,运行可以伴随着容器,但是我们对数据的要求是持久化的

  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据成为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。

为了能保存数据在docker中,我们使用卷。

5.2 用处

(1)容器的持久化

(2)容器间继承+共享数据

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

卷的设计目的就是数据的持久化,完全独立于容器的声明周期,因此Docker不会在容器删除时,删除其挂载的数据卷。

特点:

(1)数据卷可在容器之间共享或重用数据

(2)卷中的更改可以直接生效

(3)数据卷中的更改不会包含在镜像的更新中

(4)数据卷的生命周期一直持续到没有容器使用它为止

5.2 数据卷

5.2.1 直接命令添加

(1)命令

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

(2)举例

  • 创建映射路径的容器:
docker run --name mycentos -it -v /myDir:/myDirContent centos:centos7.3.1611
  • 查看数据卷是否挂载成功
[root@localhost myDir]# docker inspect d9b14a0ee45a
#输出内容包含
"Mounts": [
    {
        "Type": "bind",
        "Source": "/myDir",
        "Destination": "/myDirContent",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
]
  • 校验同步性
    • 测试宿主机或容器更路径内容后,是否生效
    • 测试容器关闭后,更改宿主机内容,重启容器后是否生效

5.2.2 docker File添加

可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷,如:

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录

举例:

(1)根目录下创建“mydocker”文件夹并进入

[root@localhost /]# mkdir /mydocker
[root@localhost /]# cd /mydocker/

(2)创建docker File文件“dockerFile”

[root@localhost mydocker]# cat dockerFile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash

(3)build后生成新镜像“yjpdd/centos”

[root@localhost mydocker]# docker build -f /mydocker/dockerFile -t yjpdd/centos .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
 ---> 0f3e07c0138f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> Running in d37229cd91d5
Removing intermediate container d37229cd91d5
 ---> 83971c7d3784
Step 3/4 : CMD echo "finished,--------success1"
 ---> Running in e08b3b15cc1a
Removing intermediate container e08b3b15cc1a
 ---> 917ce7ba5394
Step 4/4 : CMD /bin/bash
 ---> Running in a275bc9ab6b6
Removing intermediate container a275bc9ab6b6
 ---> a50252d5ef01
Successfully built a50252d5ef01
Successfully tagged yjpdd/centos:latest

(4)启动容器

发现文件目录(dataVolumeContainer1、dataVolumeContainer2)已创建好

[root@localhost mydocker]# docker run -it yjpdd/centos /bin/bash
[root@d97082e09e53 /]# ls
bin  dataVolumeContainer1  dataVolumeContainer2  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

(5)查看宿主机中对应的文件目录地址

#执行命令
[root@localhost mydocker]# docker inspect d97082e09e53

#查看文件内容
"Mounts": [
    {
        "Type": "volume",
        "Name": "27d1c32b132d20cbfcecb69b69a99943c172459344c796e8bf9314741cb1559f",
        "Source": "/var/lib/docker/volumes/27d1c32b132d20cbfcecb69b69a99943c172459344c796e8bf9314741cb1559f/_data",
        "Destination": "/dataVolumeContainer1",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    },
    {
        "Type": "volume",
        "Name": "94a8d4ca7202112a17cc7422fcf84636c5b3f10f110b3094db8cf22ce29fe7ae",
        "Source": "/var/lib/docker/volumes/94a8d4ca7202112a17cc7422fcf84636c5b3f10f110b3094db8cf22ce29fe7ae/_data",
        "Destination": "/dataVolumeContainer2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

5.2.3 补充

Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个--privileged=true参数

5.3 数据卷容器

5.3.1 概念

关键字:--volumes-from

命名的容器挂载数据卷,其他容易通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。

容器之间的配置信息传递,数据卷的生命周期一致持续到没有容器使用它位置。

5.3.2 案例

(1)根据5.2.2中根据Docker File创建的容器卷创建三个容器

创建容器dc01,dc02,dc03

#创建父容器
docker run --name dc01 -it yjpdd/centos
#创建子容器
docker run --name dc02 -it --volumes-from dc01 yjpdd/centos
#创建子容器
docker run --name dc03 -it --volumes-from dc01 yjpdd/centos

(2)校验文件的一致性

经测试,删除被依赖的父类,容器共享仍然有效。

容器之间的配置信息传递,数据卷的生命周期一致持续到没有容器使用它位置。

6. DockerFile解析

6.1 概念

DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建步骤:

(1)编写DockerFile文件

(2)docker build

(3)docker run

文件示例:

FROM scratch
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images
ADD centos-7-docker.tar.xz /

LABEL name="CentOS Base Image" \
    vendor="CentOS" \
    license="GPLv2" \
    build-date="20161214"

CMD ["/bin/bash"]

6.2 DockerFile构建过程解析

6.2.1 DockerFile基础知识

(1)每条保留字指令都必须大写字母,且后面要跟随至少一个参数

(2)指令按照从上到下,顺序执行

(3)#表示注释

(4)每条指令都会创建一个新的镜像层,并对镜像进行提交

6.2.2 Docker执行DockerFile的大致流程

(1)docker从基础镜像运行一个容器

(2)执行一条指令并对容器做出修改

(3)执行类似docker commit的操作提交一个新的镜像层

(4)docker再基于刚提交的镜像运行一个新容器

(5)执行DockerFile中的下一条执行知道所有指令都执行完成

说明:

DockerFile中的每一条执行,都会先根据上一部的镜像(开始的时候是基础镜像)产生一个新容器,A然后根据指令更改容器后,提交一个新的镜像,再根据新的镜像运行一个新的容器,继续A,执行下一个指令。

符合6.2.1(4)中提到的“每条执行都会创建一个新的镜像层,并对镜像进行提交”

基于原理:

  • 镜像是只读的,不可以更改

  • 容器是可以更改的

  • 容器可以提交成镜像(commit)

6.2.3 小总结

从应用软件的角度来看,DockerFile、Docker镜像与Docker容器分别代码软件的三个不同阶段。

  • DockerFile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行状态

DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

(1)DockerFile。需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这是需要考虑如何设计namespace的控制权限)等等。

(2)Docker镜像,在用DockerFile定义一个文件后,docker build时会产生一个docker镜像,当运行Docker镜像时,会真正开始提供服务

(3)Docker容器,容器是直接提供服务的

6.3 DockerFile体系结构(保留字指令)

  • FROM:基础镜像。当前镜像时基于哪个镜像的

  • MAINTAINER:镜像维护者的姓名和邮箱地址

  • RUN:容器构建时需要运行的命令

  • EXPOSE:当前容器对外暴露的端口

  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点

  • ENV:用来在构建镜像过程中设置环境变量

  • ADD:将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包

  • COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录,复制到新的一层的镜像内的<目标路径>位置。

  • VOLUME:容器数据卷,用于数据保存和持久化工作

  • CMD:指定一个容器启动时要运行的命令,DockerFile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

CMD指令的格式和RUN相似:

  • shell格式:CMD <命令>
  • exec格式:CMD ["可执行文件","参数1","参数2"...]
  • 参数列表格式:CMD["参数1","参数2"...]。在指定了ENTRYPOINT指令后,用CMD指定具体的参数
  • ENTRYPOINT:指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动的程序及参数
  • ONBUILD:当前构建一个被继承的DockerFile是运行命令,父进项在被子类继承后,父镜像的ONBUILD被触发

6.3 案例

6.3.1 Base镜像(scratch)

Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。

FROM scratch
6.3.2 自定义Centos

完成功能:

(1) 更改/user/local为登录路径(默认路径是/)

(2)支持vim编辑器(默认不支持)

(3)支持查看网络配置ifconfig(默认不支持)

步骤:

(1)创建dockerFile文件

[root@localhost mydockerfile]# pwd
/mydockerfile
[root@localhost mydockerfile]# vim dockerfile

(2)编写dockerFile文件

#基础镜像
FROM centos
#创建人信息
MAINTAINER pdd
#定义变量
ENV MYPATH /user/local
#设置默认登录目录
WORKDIR $MYPATH

#运行命令
RUN yum -y install vim
RUN yum -y install net-tools

#对外暴露端口
EXPOSE 80

#指定容器启动时运行的命令(只有最后一个会生效,会被Run之后的命令替换)
CMD echo $MYPATH
CMD echo "success ----------ok"
CMD /bin/bash

(3)构建镜像

".":代表当前路径

docker build -t mycentos:1.0 .

执行过程如下(共10步,对应dockerFile中的10条指令):

[root@localhost mydockerfile]# ls
dockerfile
[root@localhost mydockerfile]# docker build -t mycentos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM centos
latest: Pulling from library/centos
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
 ---> 0f3e07c0138f
Step 2/10 : MAINTAINER pdd
 ---> Running in 3242d8cc4816
Removing intermediate container 3242d8cc4816
 ---> 8140a41ea673
Step 3/10 : ENV MYPATH /user/local
 ---> Running in 61e5f240a5b6
Removing intermediate container 61e5f240a5b6
 ---> 5d4c35e13916
Step 4/10 : WORKDIR $MYPATH
 ---> Running in 4310d8bd9f26
Removing intermediate container 4310d8bd9f26
 ---> 8ebeb43f3636
Step 5/10 : RUN yum -y install vim
 ---> Running in 6dfadcf048b0
CentOS-8 - AppStream                            1.3 MB/s | 6.3 MB     00:04
CentOS-8 - Base                                 965 kB/s | 7.9 MB     00:08
CentOS-8 - Extras                               604  B/s | 2.1 kB     00:03
Dependencies resolved.
================================================================================
 Package             Arch        Version                   Repository      Size
================================================================================
Installing:
 vim-enhanced        x86_64      2:8.0.1763-10.el8         AppStream      1.4 M
Installing dependencies:
 gpm-libs            x86_64      1.20.7-15.el8             AppStream       39 k
 vim-common          x86_64      2:8.0.1763-10.el8         AppStream      6.3 M
 vim-filesystem      noarch      2:8.0.1763-10.el8         AppStream       48 k
 which               x86_64      2.21-10.el8               BaseOS          49 k

Transaction Summary
================================================================================
Install  5 Packages

Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-15.el8.x86_64.rpm         35 kB/s |  39 kB     00:01
(2/5): vim-filesystem-8.0.1763-10.el8.noarch.rp 690 kB/s |  48 kB     00:00
(3/5): which-2.21-10.el8.x86_64.rpm             180 kB/s |  49 kB     00:00
(4/5): vim-enhanced-8.0.1763-10.el8.x86_64.rpm  887 kB/s | 1.4 MB     00:01
(5/5): vim-common-8.0.1763-10.el8.x86_64.rpm    2.4 MB/s | 6.3 MB     00:02
--------------------------------------------------------------------------------
Total                                           1.4 MB/s | 7.8 MB     00:05
warning: /var/cache/dnf/AppStream-02e86d1c976ab532/packages/gpm-libs-1.20.7-15.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - AppStream                             14 kB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) "
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : which-2.21-10.el8.x86_64                               1/5
  Installing       : vim-filesystem-2:8.0.1763-10.el8.noarch                2/5
  Installing       : vim-common-2:8.0.1763-10.el8.x86_64                    3/5
  Installing       : gpm-libs-1.20.7-15.el8.x86_64                          4/5
  Running scriptlet: gpm-libs-1.20.7-15.el8.x86_64                          4/5
  Installing       : vim-enhanced-2:8.0.1763-10.el8.x86_64                  5/5
  Running scriptlet: vim-enhanced-2:8.0.1763-10.el8.x86_64                  5/5
  Running scriptlet: vim-common-2:8.0.1763-10.el8.x86_64                    5/5
  Verifying        : gpm-libs-1.20.7-15.el8.x86_64                          1/5
  Verifying        : vim-common-2:8.0.1763-10.el8.x86_64                    2/5
  Verifying        : vim-enhanced-2:8.0.1763-10.el8.x86_64                  3/5
  Verifying        : vim-filesystem-2:8.0.1763-10.el8.noarch                4/5
  Verifying        : which-2.21-10.el8.x86_64                               5/5

Installed:
  vim-enhanced-2:8.0.1763-10.el8.x86_64 gpm-libs-1.20.7-15.el8.x86_64
  vim-common-2:8.0.1763-10.el8.x86_64   vim-filesystem-2:8.0.1763-10.el8.noarch
  which-2.21-10.el8.x86_64

Complete!
Removing intermediate container 6dfadcf048b0
 ---> e8a11e706535
Step 6/10 : RUN yum -y install net-tools
 ---> Running in f221b0caea50
error: rpmdb: damaged header #175 retrieved -- skipping.
error: rpmdb: damaged header #175 retrieved -- skipping.
error: rpmdbNextIterator: skipping h#     175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Last metadata expiration check: 0:00:14 ago on Mon Nov 25 11:18:42 2019.
Dependencies resolved.
================================================================================
 Package         Arch         Version                        Repository    Size
================================================================================
Installing:
 net-tools       x86_64       2.0-0.51.20160912git.el8       BaseOS       323 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 323 k
Installed size: 1.0 M
Downloading Packages:
net-tools-2.0-0.51.20160912git.el8.x86_64.rpm   255 kB/s | 323 kB     00:01
--------------------------------------------------------------------------------
Total                                            49 kB/s | 323 kB     00:06
CentOS-8 - Base                                 1.6 MB/s | 1.6 kB     00:00
error: rpmdbNextIterator: skipping h#     175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
warning: /var/cache/dnf/BaseOS-f6a80ba95cf937f2/packages/net-tools-2.0-0.51.20160912git.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
error: rpmdbNextIterator: skipping h#     175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
error: rpmdbNextIterator: skipping h#     175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) "
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
error: rpmdbNextIterator: skipping h#     175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Key imported successfully
error: rpmdbNextIterator: skipping h#     175 blob size(13252): BAD, 8 + 16 * il(71) + dl(12108)
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1
  Running scriptlet: net-tools-2.0-0.51.20160912git.el8.x86_64              1/1
  Verifying        : net-tools-2.0-0.51.20160912git.el8.x86_64              1/1

Installed:
  net-tools-2.0-0.51.20160912git.el8.x86_64

Complete!
Removing intermediate container f221b0caea50
 ---> 1592e3613d33
Step 7/10 : EXPOSE 80
 ---> Running in a8047a6b1c9a
Removing intermediate container a8047a6b1c9a
 ---> 0d3474d470f1
Step 8/10 : CMD echo $MYPATH
 ---> Running in c4010e82a252
Removing intermediate container c4010e82a252
 ---> 6c53476cffca
Step 9/10 : CMD echo "success ----------ok"
 ---> Running in 67c9daf4a174
Removing intermediate container 67c9daf4a174
 ---> be8ef19afb82
Step 10/10 : CMD /bin/bash
 ---> Running in 79dea2932d5b
Removing intermediate container 79dea2932d5b
 ---> eeb3c1346c88
Successfully built eeb3c1346c88
Successfully tagged mycentos:1.0
[root@localhost mydockerfile]#

(4)运行

[root@localhost mydockerfile]# docker run -it mycentos:1.0
[root@50ab13983dce local]# pwd
/user/local
[root@50ab13983dce local]# vim 1.log
[root@50ab13983dce local]# ls
1.log
[root@50ab13983dce local]# ifconfig
eth0: flags=4163  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 648 (648.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@50ab13983dce local]#

(5)查看镜像变更历史

[root@localhost mydockerfile]# docker history mycentos:1.0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
eeb3c1346c88        8 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B
be8ef19afb82        8 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
6c53476cffca        8 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B
0d3474d470f1        8 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B
1592e3613d33        8 minutes ago       /bin/sh -c yum -y install net-tools             14.3MB
e8a11e706535        8 minutes ago       /bin/sh -c yum -y install vim                   66.8MB
8ebeb43f3636        9 minutes ago       /bin/sh -c #(nop) WORKDIR /user/local           0B
5d4c35e13916        9 minutes ago       /bin/sh -c #(nop)  ENV MYPATH=/user/local       0B
8140a41ea673        9 minutes ago       /bin/sh -c #(nop)  MAINTAINER pdd               0B
0f3e07c0138f        7 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
           7 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
           7 weeks ago         /bin/sh -c #(nop) ADD file:d6fdacc1972df524a…   220MB

完整信息可通过以下命令查看:

docker history mycentos:1.0 --no-trunc
6.3.3 自定义Tomcat

7. Docker常用安装

测试步骤

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

7.1 安装mysql

(1)下载镜像

docker pull mysql:5.6

(2)创建并生成容器

docker run -p 1234:3306 --name mysqlSimple -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

(3)创建并生成容器(挂载外部资源)

docker run -p 1111:3306 --name mysqlTrans -e MYSQL_ROOT_PASSWORD=123456 -d -v /mydocker/mysqlData/data:/var/lib/mysql -v /mydocker/mysqlData/config:/etc/mysql/conf.d mysql:5.6

7.2 安装redis

(1)下载镜像

(2)创建并生成容器

8. Docker开启远程访问

8.1 修改配置文件

vi /usr/lib/systemd/system/docker.service

文件中[Service]中更改ExecStart以下内容:

更改前:

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

更改后:

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

8.2 刷新配置,重启Docker

systemctl daemon-reload

systemctl restart docker

8.3 查看docker进程是否监听

[root@localhost ~]# netstat -ano | grep 2375
tcp6       0      0 :::2375                 :::*                    LISTEN      off (0.00/0/0)

8.4 查看系统网络端口2375是否被docker所监听

[root@localhost ~]# netstat -tulp | grep 2375
tcp6       0      0 [::]:2375               [::]:*                  LISTEN      8056/dockerd

9. Centos7关闭防火墙

9.1 查看防火墙状态

firewall-cmd --state

9.2 关闭防火墙服务

systemctl stop firewalld.service

9.3 禁止防火墙开机启动

systemctl disable firewalld.service 

你可能感兴趣的:(docker学习笔记)