docker简介、安装、常用命令

简介

Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。

Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker 的优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

1、快速,一致地交付您的应用程序

Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。

容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

  • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
  • 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
  • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
  • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

2、响应式部署和扩展

Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。

Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。

3、在同一硬件上运行更多工作负载

Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

Docker 架构

Docker 包括三个基本概念:

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

概念 说明
Docker 镜像(Images) Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。
Docker 容器(Container) 容器是独立运行的一个或一组应用,是镜像运行时的实体。
Docker 客户端(Client) Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。
Docker 主机(Host) 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker Registry Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
Docker Machine Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

Doker安装

安装docker

安装linux环境 centos7

参考文档:https://docs.docker.com/engine/install/centos/

安装前准备:环境查看

# 系统内核是 3.10 以上的
[root@quan ~]# uname -r
3.10.0-862.14.4.el7.x86_64

# 系统版本
[root@quan ~]# 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"

安装步骤:

  1. 卸载旧版本

    sudo yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
  2. 需要的安装包

    sudo yum install -y yum-utils
  3. 设置镜像的仓库(使用阿里云的地址)

    sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. 更新yum包索引(推荐,可略过)

    yum makecache fast
  5. 安装最新版docker

    sudo yum install docker-ce docker-ce-cli containerd.io
  6. 启动docker

    systemctl start docker
  7. 查看是否安装成功

    docker version
  8. 运行hello-world镜像

    docker run hello-world
  9. 查看hello-world镜像

    [root@quan ~]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    hello-world latest d1165f221234 3 weeks ago 13.3kB

卸载docker

卸载步骤:

  1. 卸载依赖

    sudo yum remove docker-ce docker-ce-cli containerd.io
  2. 删除资源

    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd

阿里云镜像加速

配置使用docker:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://n319v3jn.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker常用命名

帮助命令

docker version  # 版本
docker info # 详细信息
docker --help # 帮助信息

镜像命令

docker images

[root@quan ~]# docker images --help

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

List images # 列出本地镜像

Aliases:
docker image ls, docker image list, docker 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 Format output using a custom template: # 指定返回值的模板文件
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
--no-trunc Don't truncate output # 显示完整的镜像信息
-q, --quiet Only show image IDs # 只显示镜像ID

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像

各个选项说明:

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

列出本地镜像

docker images

从Docker Hub查找镜像。搜索的网站:https://hub.docker.com/

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

Usage: docker search [OPTIONS] TERM

Search Docker Hub for images # 从Docker Hub查找镜像

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 # 最大搜索结果数
--no-trunc Don't truncate output # 显示完整的镜像描述

参数说明:

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思
  • AUTOMATED: 自动构建

从Docker Hub查找tomcat镜像

docker search tomcat

从 Docker Hub 查找所有镜像名包含 java,并且收藏数大于 10 的镜像

docker search -f stars=10 java

docker pull

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

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

Download an image from a registry #从镜像仓库中拉取或者更新指定镜像

Aliases:
docker image pull, docker pull

Options:
-a, --all-tags Download all tagged images in the repository # 拉取所有 tagged 镜像
--disable-content-trust Skip image verification (default true) # 忽略镜像的校验,默认开启
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output

从Docker Hub下载mysql:latest版本。等价于 docker pull mysql:latest

docker pull mysql 

从Docker Hub下载mysql 5.7版本

docker pull mysql:5.7

docker rmi

[root@quan ~]# docker rmi --help

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

Remove one or more images # 删除本地一个或多个镜像。

Aliases:
docker image rm, docker image remove, docker rmi

Options:
-f, --force Force removal of the image # 强制删除
--no-prune Do not delete untagged parents # 不移除该镜像的过程镜像,默认移除

强制删除tomcat镜像,不指定TAG,默认删除latest版本

docker rmi -f hello-world

强制删除多个镜像,删除tomcat:latestmysql:5.7版本

docker rmi -f tomcat mysql:5.7

强制删除全部镜像

docker rmi -f $(docker images -qa)

容器命令

docker run

[root@VM-16-9-centos ~]# docker run --help

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

Create and run a new container from an image # 创建一个新的容器并运行一个命令

Aliases:
docker container run, docker run

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
--cgroupns string Cgroup namespace to use (host|private)
'host': Run the container in the Docker host's cgroup namespace
'private': Run the container in its own private cgroup namespace
'': Use the cgroup namespace as configured by the
default-cgroupns-mode option on the daemon (default)
--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) # 绑定容器到指定CPU运行
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
-d, --detach Run container in background and print container ID #后台运行容器,并返回容器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服务器,默认和宿主一致
--dns-option list Set DNS options
--dns-search list Set custom DNS search domains # 指定容器DNS搜索域名,默认和宿主一致
--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 # -h "mars": 指定容器的hostname;
--init Run an init inside the container that forwards signals and reaps processes
-i, --interactive Keep STDIN open even if not attached # 以交互模式运行容器,通常与 -t 同时使用;
--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)
--platform string Set platform if server is multi-platform capable
--privileged Give extended privileges to this container
-p, --publish list Publish a container's port(s) to the host # 指定端口映射,格式为:主机(宿主)端口:容器端口(小P)
-P, --publish-all Publish all exposed ports to random ports # 随机端口映射,容器内部端口随机映射到主机的端口(大P)
--pull string Pull image before running ("always", "missing", "never") (default "missing")
-q, --quiet Suppress the pull output
--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 the container
--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 # 为容器重新分配一个伪输入终端,通常与 -i 同时使用
--ulimit ulimit Ulimit options (default [])
-u, --user string Username or UID (format: <name|uid>[:<group|gid>])
--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

使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

docker run --name mynginx -d nginx:latest

使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

docker run -P -d nginx:latest

使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

docker run -p 80:80 -v /data:/data -d nginx:latest

绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#

以交互模式运行容器centos镜像

[root@quan ~]# docker run -it 300e315adb2f    
[root@7234c5d014bf /]# # 此时进入了docker中的centos中

docker ps

[root@quan ~]# docker ps --help

Usage: docker ps [OPTIONS]

List containers # 列列出容器

Aliases:
docker container ls, docker container list, docker container ps, docker ps

Options:
-a, --all Show all containers (default shows just running) # 显示所有的容器,包括未运行的。
-f, --filter filter Filter output based on conditions provided # 根据条件过滤显示的内容。
--format string Format output using a custom template: # 指定返回值的模板文件。
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
-n, --last int Show n last created containers (includes all states) (default -1) # 列出最近创建的n个容器。
-l, --latest Show the latest created container (includes all states) # 显示最近创建的容器
--no-trunc Don't truncate output # 不截断输出。
-q, --quiet Only display container IDs # 静默模式,只显示容器编号。
-s, --size Display total file sizes # 显示总的文件大小。

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

docker ps

显示最近创建的容器

docker ps -l

exit

exit 容器停止退出

ctrl+P+Q

ctrl+P+Q 容器不停止退出

docker start

[root@VM-16-9-centos ~]# docker start --help

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

Start one or more stopped containers # 启动一个或多个停止的容器。

Aliases:
docker container start, docker start

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 # 附加到容器的STDIN

启动nginx容器(容器ID为7234c5d014bf)

docker start 7234c5d014bf 

docker restart

[root@VM-16-9-centos ~]# docker restart --help

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

Restart one or more containers # 重新启动一个或多个容器。

Aliases:
docker container restart, docker restart

Options:
-s, --signal string Signal to send to the container
-t, --time int Seconds to wait before killing the container # 等待停止的秒钟,然后再杀死容器

重新启动nginx容器(容器ID为7234c5d014bf)

docker restart 7234c5d014bf 

docker stop

[root@VM-16-9-centos ~]# docker stop --help

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

Stop one or more running containers # 停止一个或多个运行中的容器

Aliases:
docker container stop, docker stop

Options:
-s, --signal string Signal to send to the container
-t, --time int Seconds to wait before killing the container

温柔停止nginx容器(容器ID为7234c5d014bf),就好比关机中选择开始-电源-关机。

docker stop 7234c5d014bf

docker kill

[root@VM-16-9-centos ~]# docker kill --help

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

Kill one or more running containers # 杀掉一个或者多个正在运行的 Docker容器

Aliases:
docker container kill, docker kill

Options:
-s, --signal string Signal to send to the container # 向容器发送一个信号

强制停止nginx容器(容器ID为7234c5d014bf),就好比直接关电源

docker kill 879120ef4c74    

docker rm

[root@VM-16-9-centos ~]# docker rm --help

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

Remove one or more containers # 删除一个或多个容器。

Aliases:
docker container rm, docker container remove, docker rm

Options:
-f, --force Force the removal of a running container (uses SIGKILL) # 强制移走正在运行的容器(使用SIGKILL)
-l, --link Remove the specified link # 删除指定的链接
-v, --volumes Remove anonymous volumes associated with the container # 删除与容器关联的卷

删除nginx容器(容器ID为7234c5d014bf)

docker rm 7234c5d014bf 

删除所有容器

docker rm -f $(docker ps -aq)

docker logs

[root@VM-16-9-centos ~]# docker logs --help

Usage: docker logs [OPTIONS] CONTAINER

Fetch the logs of a container # 获取容器的日志

Aliases:
docker container logs, docker logs

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:37Z") or relative (e.g. "42m" for 42 minutes) #显示某个开始时间的所有日志
-n, --tail string Number of lines to show from the end of the logs (default "all") # 仅列出最新N条容器日志
-t, --timestamps Show timestamps # 显示时间戳
--until string Show logs before a timestamp (e.g. "2013-01-02T13:23:37Z") or relative (e.g. "42m" for 42 minutes)

跟踪查看容器mynginx的日志输出。(容器ID为7234c5d014bf)

docker logs -f 7234c5d014bf

查看容器mynginx从2016年7月1日后的最新10条日志。(容器ID为7234c5d014bf)

docker logs --since="2016-07-01" --tail=10 7234c5d014bf

docker top

[root@VM-16-9-centos ~]# docker top --help

Usage: docker top CONTAINER [ps OPTIONS]

Display the running processes of a container # 查看容器内运行的进程

Aliases:
docker container top, docker top

查看nginx容器(容器ID为7234c5d014bf)内的进程

docker top 7234c5d014bf

docker inspect

[root@VM-16-9-centos ~]# docker inspect --help

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

Return low-level information on Docker objects # 获取容器/镜像的元数据。

Options:
-f, --format string Format output using a custom template: # 指定返回值的模板文件。
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
-s, --size Display total file sizes if the type is container # 显示总的文件大小。
--type string Return JSON for specified type # 为指定类型返回JSON

查看nginx容器(容器ID为7234c5d014bf)内部细节,返回的是一个json

docker inspect 7234c5d014bf 

docker exec

[root@VM-16-9-centos ~]# docker exec --help

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

Execute a command in a running container # 在运行的容器中执行命令

Aliases:
docker container exec, docker exec

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
--env-file list Read in a file of environment variables
-i, --interactive Keep STDIN open even if not attached # 即使没有附加也保持STDIN 打开
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY # 分配一个伪终端
-u, --user string Username or UID (format: "<name|uid>[:<group|gid>]")
-w, --workdir string Working directory inside the container

通过 docker ps -a 命令查看已经在运行的容器,然后使用容器 ID (9df70f9a0714)进入容器。通过 exec 命令对指定的容器执行 bash。

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

docker exec -it 9df70f9a0714 /bin/bash

docker attach

[root@VM-16-9-centos ~]# docker attach --help

Usage: docker attach [OPTIONS] CONTAINER

Attach local standard input, output, and error streams to a running container # 连接到正在运行中的容器。

Aliases:
docker container attach, docker attach

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)

要attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

官方文档中说attach后可以通过CTRL-C来detach,但实际上经过我的测试,如果container当前在运行bash,CTRL-C自然是当前行的输入,没有退出;如果container当前正在前台运行进程,如输出nginx的access.log日志,CTRL-C不仅会导致退出容器,而且还stop了。这不是我们想要的,detach的意思按理应该是脱离容器终端,但容器依然运行。好在attach是可以带上–sig-proxy=false来确保CTRL-D或CTRL-C不会关闭容器。

容器mynginx将访问日志指到标准输出,连接到容器查看访问信息。

docker attach --sig-proxy=false mynginx

进入正在运行的容器并以命令行交互。直接进入容器启动命令的终端,不会启动新的进程。重新进入

attach重新进入终端

[root@quan ~]# docker attach ede86e41f39c
[root@ede86e41f39c /]# 终端

exec不进入centos,在宿主机上执行centos中的命令ls -l /tmp

docker exec -t ede86e41f39c ls -l /tmp  

docker cp

[root@VM-16-9-centos ~]# docker cp --help

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

`docker cp 容器ID:容器内路径 目的主机路径` 从容器内拷贝文件到主机上

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.

Aliases:
docker container cp, docker cp

Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH # 保持源目标中的链接
-q, --quiet Suppress progress output during copy. Progress output is automatically suppressed if no terminal is attached

拷贝容器ede86e41f39c中tmp目录下yum.log文件到宿主机root目录下

docker cp ede86e41f39c:/tmp/yum.log /root 

将主机/tmp/test目录拷贝到容器96f7f14e99ab的/tmp目录下。

docker cp /tmp/test 96f7f14e99ab:/tmp/

将主机/tmp/test目录拷贝到容器96f7f14e99ab中,目录重命名为test2。

docker cp /tmp/test 96f7f14e99ab:/test2

将容器96f7f14e99ab的/tmp目录拷贝到主机的/tmp目录中。

docker cp  96f7f14e99ab:/tmp /tmp/

Docker镜像

UnionFS

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

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

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等等。

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

分层的镜像

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

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

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

镜像特点

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

docker commit

[root@quan ~]# docker commit --help

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

Create a new image from a container's changes # 从容器创建一个新的镜像

Aliases:
docker container commit, docker commit

Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") # 提交的镜像作者
-c, --change list Apply Dockerfile instruction to the created image # 使用Dockerfile指令来创建镜像
-m, --message string Commit message # 提交时的说明文字
-p, --pause Pause container during commit (default true) # 在commit时,将容器暂停

将容器a404c6c174a2 保存为新的镜像,并添加提交人信息和说明信息。

docker commit -a "ljq" -m "my apache" a404c6c174a2  ljq/mytomcat:1.2

Docker容器数据卷

docker容器数据卷是什么?

当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程中产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享。通俗地来说,docker容器数据卷可以看成是我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。

容器的持久化。容器间继承+共享数据。

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

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

数据卷

直接命令添加

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

宿主机/tmp/myData目录与容器centos中的/tmp/myDataVontainer数据共享。容器和宿主机之间数据共享。容器停止退出后,主机修改后数据同步

docker run -it -v /tmp/myData:/tmp/myDataVontainer centos

ro只读,容器内的数据只读,不能增删改

docker run -it -v /tmp/myData:/tmp/myDataVontainer:ro centos

DockerFile添加

[root@quan /]# mkdir /myDocker        # 在宿主机创建myDocker目录      
[root@quan /]# cd myDocker # 进入目录
[root@quan myDocker]# vim DockerFile # vim编辑DockerFile,输入以下内容,保存退出
# vloumn test
FROM centos
VOLUME ["/myDataVloumnContainer","/myDataVloumnContainer2"]
CMD echo "finshed.........success1"
CMD /bin/bash
[root@quan myDocker]# docker build -f /myDocker/DockerFile -t ljq/centos . # build后生成容器
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["/myDataVloumnContainer","/myDataVloumnContainer2"]
---> Running in 71eaa5e8131a
Removing intermediate container 71eaa5e8131a
---> 054fb740d1c0
Step 3/4 : CMD echo "finshed.........success1"
---> Running in 565d0c478189
Removing intermediate container 565d0c478189
---> ff09761ac5e5
Step 4/4 : CMD /bin/bash
---> Running in 1fcdedc30ce3
Removing intermediate container 1fcdedc30ce3
---> 08a899a94f47
Successfully built 08a899a94f47
Successfully tagged ljq/centos:latest
[root@quan myDocker]# docker images # 此时就会在ljq/centos中新建myDataVloumnContainer,myDataVloumnContainer2
[root@quan myDocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ljq/centos latest 08a899a94f47 51 seconds ago 209MB
tomcat latest 040bdb29ab37 2 months ago 649MB
[root@quan myDocker]# docker run -it ljq/centos
[root@96dbbdca76e3 /]# ls -l # 容器ljq/centos已经有myDataVloumnContainer,myDataVloumnContainer2目录
total 56
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 30 14:12 dev
drwxr-xr-x 1 root root 4096 Mar 30 14:12 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Mar 30 14:12 myDataVloumnContainer
drwxr-xr-x 2 root root 4096 Mar 30 14:12 myDataVloumnContainer2
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 85 root root 0 Mar 30 14:12 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Mar 28 12:11 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
[root@quan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
96dbbdca76e3 ljq/centos "/bin/sh -c /bin/bash" 2 minutes ago Up 2 minutes zealous_bell
[root@quan ~]# docker inspect 96dbbdca76e3
# 宿主机的/var/lib/docker/volumes/813012e58ffd493564318f46a54fbf9a14c5affffc71949aff26cc8a952a961c/_data
# /var/lib/docker/volumes/b27737e57537c6453c20d97c2d1579a7bf22b7af4966b90022b055eed30d8e0d/_data
# 就是宿主机的数据共享目录
"Mounts": [
{
"Type": "volume",
"Name": "813012e58ffd493564318f46a54fbf9a14c5affffc71949aff26cc8a952a961c",
"Source": "/var/lib/docker/volumes/813012e58ffd493564318f46a54fbf9a14c5affffc71949aff26cc8a952a961c/_data",
"Destination": "/myDataVloumnContainer2",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "b27737e57537c6453c20d97c2d1579a7bf22b7af4966b90022b055eed30d8e0d",
"Source": "/var/lib/docker/volumes/b27737e57537c6453c20d97c2d1579a7bf22b7af4966b90022b055eed30d8e0d/_data",
"Destination": "/myDataVloumnContainer",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

"Image": "ljq/centos",
"Volumes": {
"/myDataVloumnContainer": {},
"/myDataVloumnContainer2": {}
},

数据卷容器

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

容器间传递共享(–volumes-from)

[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ljq/centos latest 08a899a94f47 22 hours ago 209MB
tomcat latest 040bdb29ab37 2 months ago 649MB
centos latest 300e315adb2f 3 months ago 209MB
[root@quan ~]# docker run -it --name dc01 ljq/centos # 父容器dc01
[root@quan ~]# docker run -it --name dc02 --volumes-from dc01 ljq/centos # doc02继承dc01
[root@quan ~]# docker run -it --name dc03 --volumes-from dc01 ljq/centos # doc03继承dc01
[root@quan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
214d99cdc828 ljq/centos "/bin/sh -c /bin/bash" About a minute ago Up About a minute dc03
05fb95aefba8 ljq/centos "/bin/sh -c /bin/bash" 3 minutes ago Up 3 minutes dc02
0587cee7d97a ljq/centos "/bin/sh -c /bin/bash" 6 minutes ago Up 6 minutes dc01
[root@0587cee7d97a /]# ls -l # 此时3个容器myDataVloumnContainer和myDataVloumnContainer2 数据共享
# 删除dc01,dc02修改后dc03仍然可以访问,删除dc02后dc03仍然可以访问,新建dc04继承dc03后再删除dc03仍然可以访问
# 结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
drwxr-xr-x 2 root root 4096 Mar 31 12:25 myDataVloumnContainer
drwxr-xr-x 2 root root 4096 Mar 31 12:25 myDataVloumnContainer2

DockerFile

什么是dockerFile

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

构建三步骤:编写Dockerfile文件,docker build,docker run

Dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

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

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

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

  • Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等
  • Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务
  • Docker容器,容器是直接提供服务的。

保留字指令

命令 命令说明
FROM 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER 镜像维护者的姓名和邮箱地址
RUN 容器构建时需要运行的命令
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV 用来在构建镜像过程中设置环境变量
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定一个容器启动时要运行的命令。Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令。ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数
ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

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

案例一:自定义mycentos

自定义mycentos目的使我们自己的镜像具备如下:修改登陆后的默认路径, 支持vim编辑器,支持查看网络配置ifconfig

[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 3 months ago 209MB
[root@quan ~]# docker run -it centos /bin/bash
[root@66192209812d /]# pwd # docker容器中centos进入的是根目录 /
/
[root@66192209812d /]# vim abc.txt # docker容器中centos不支持vim
bash: vim: command not found
[root@66192209812d /]# ifconfig # docker容器中centos不支持ifconfig
bash: ifconfig: command not found
[root@quan ~]# cd /myDocker/
[root@quan myDocker]# vim DockerFile # 编写DockerFile文件
FROM centos
MAINTAINER ljq<ljq@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "success......ok"
CMD /bin/bash
[root@quan myDocker]# docker build -f /myDocker/DockerFile -t mycentos:1.3 . # 构建 .表示当前目录
[root@quan myDocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.3 ebb2e07256d4 56 seconds ago 291MB
centos latest 300e315adb2f 3 months ago 209MB
[root@quan myDocker]# docker run -it mycentos:1.3 # 运行
[root@0314fd41c780 local]# pwd # 落脚点为 /usr/local
/usr/local
[root@0314fd41c780 local]# vim a.txt # vim编辑器可以使用
[root@0314fd41c780 local]# ifconfig # ifconfig可以使用
[root@quan myDocker]# docker images mycentos
REPOSITORY TAG IMAGE ID CREATED SIZE
mycentos 1.3 ebb2e07256d4 6 minutes ago 291MB
[root@quan myDocker]# docker history ebb2e07256d4 # 【docker history 镜像名】 列出镜像的变更历史
IMAGE CREATED CREATED BY SIZE COMMENT
ebb2e07256d4 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
ef3857259a56 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
c06c070a0204 6 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
87da59e0ee99 6 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
8d6053b16555 6 minutes ago /bin/sh -c yum -y install net-tools 23.3MB
26db8f887f2f 6 minutes ago /bin/sh -c yum -y install vim 58MB
3d87e5f916e1 7 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
89f645430934 7 minutes ago /bin/sh -c #(nop) ENV mypath=/usr/local 0B
d02266cb199f 7 minutes ago /bin/sh -c #(nop) MAINTAINER ljq<ljq@126.co… 0B
300e315adb2f 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB

案例二:CMD/ENTRYPOINT

CMD/ENTRYPOINT 都是指定一个容器启动时要运行的命令

CMD:Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

ENTRYPOINT :docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合

[root@quan ~]# docker run -it -p 8888:8080 tomcat    # 这个是正常启动tomcat
[root@quan ~]# docker run -it -p 8888:8080 tomcat ls -l # 在后面加 ls -l相当于CMD指令,会替换掉tomcat最后的指令 CMD ["catalina.sh", "run"]),这样则启动tomcat失败

curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。如果系统没有curl可以使用yum install curl安装,也可以下载安装。

[root@quan ~]# curl http://www.baidu.com    # curl命令,执行后,www.baidu.com的html就会显示在屏幕上了
[root@quan ~]# cd /myDocker/
[root@quan myDocker]# vim DockerFile
FROM centos
ENTRYPOINT ["curl","-s","cip.cc"]
[root@quan myDocker]# docker build -f /myDocker/DockerFile -t myip:1.1 .
[root@quan myDocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myip 1.1 c0bdae061dad 10 seconds ago 209MB
[root@quan myDocker]# docker run -it myip:1.1
IP : 47.100.24.6
地址 : 中国 上海
运营商 : 阿里云/电信/联通/移动/铁通/教育网

数据二 : 上海市 | 阿里云

数据三 : 中国上海上海 | 阿里云

URL : http://www.cip.cc/47.100.24.6
[root@quan myDocker]# docker run -it myip:1.1 -i # 此时在后面加一个参数相当于传递一个新参数,此时命令为 ["curl","-s", -i "cip.cc"]
HTTP/1.1 200 OK # 不是CMD的覆盖,而是ENTRYPOINT的追加
Server: openresty
Date: Sat, 03 Apr 2021 02:10:13 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-cip-c: H

IP : 47.100.24.6
地址 : 中国 上海
运营商 : 阿里云/电信/联通/移动/铁通/教育网

数据二 : 上海市 | 阿里云

数据三 : 中国上海上海 | 阿里云

URL : http://www.cip.cc/47.100.24.6

案例三:ONBUILD

[root@quan ~]# cd /myDocker/
[root@quan myDocker]# vim DockerFile
FROM centos
ENTRYPOINT ["curl","-s","cip.cc"]
ONBUILD RUN echo "father images onbuild......"
[root@quan myDocker]# docker build -f /myDocker/DockerFile -t myip/father:1.1 .
[root@quan myDocker]# vim DockerFile2
FROM myip/father:1.1
ENTRYPOINT ["curl","-s","cip.cc"]
[root@quan myDocker]# docker build -f /myDocker/DockerFile2 -t myip/son:1.1 .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM myip/father:1.1
# Executing 1 build trigger
---> Running in 064d951dc6a7
father images onbuild......
Removing intermediate container 064d951dc6a7
---> edd020a63c36
Step 2/2 : ENTRYPOINT ["curl","-s","cip.cc"]
---> Running in 2af6a39c0d54
Removing intermediate container 2af6a39c0d54
---> 1db2bca3d182
Successfully built 1db2bca3d182
Successfully tagged myip/son:1.1
[root@quan myDocker]# cat DockerFile
FROM centos
ENTRYPOINT ["curl","-s","cip.cc"]
ONBUILD RUN echo "father images onbuild......" # myip/son:1.1 继承自 myip/father:1.1,执行myip/father:1.1的ONBUILD,父类的ONBUILD被执行

案例五:自定义镜像Tomcat9

[root@quan /]# cd /myDocker/tomcat9/
[root@quan tomcat9]# touch c.txt
[root@quan tomcat9]# ls -l
total 166516
-rw-r--r-- 1 root root 11487016 Apr 3 11:27 apache-tomcat-9.0.44.tar.gz
-rw-r--r-- 1 root root 0 Apr 3 11:21 c.txt
-rw-r--r-- 1 root root 159019376 Apr 3 11:28 jdk-8u11-linux-x64.tar.gz
[root@quan tomcat9]# vim DockerFile
FROM centos
MAINTAINER ljq<ljq@126.com>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下并重命名
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.44.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.44
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.44
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.44/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.44/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.44/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.44/bin/logs/catalina.out
[root@quan tomcat9]# docker build -f /myDocker/tomcat9/DockerFile -t mytomcat9 .
[root@quan tomcat9]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat9 latest 53af9d756618 5 minutes ago 607MB
[root@quan tomcat9]# docker run -d -p 9080:8080 --name myt9 -v /myDocker/tomcat9/test:/usr/local/apache-tomcat-9.0.44/webapps/test -v /myDocker/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.44/logs --privileged=true mytomcat9
[root@quan tomcat9]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c524b2450a6c mytomcat9 "/bin/sh -c '/usr/lo…" 27 seconds ago Up 24 seconds 0.0.0.0:9080->8080/tcp myt9
[root@quan tomcat9]# ls -l
total 166528
-rw-r--r-- 1 root root 11487016 Apr 3 11:27 apache-tomcat-9.0.44.tar.gz
-rw-r--r-- 1 root root 0 Apr 3 11:21 c.txt
-rw-r--r-- 1 root root 1037 Apr 3 11:39 DockerFile
-rw-r--r-- 1 root root 159019376 Apr 3 11:28 jdk-8u11-linux-x64.tar.gz
drwxr-xr-x 2 root root 4096 Apr 3 12:07 test
drwxr-xr-x 2 root root 4096 Apr 3 12:07 tomcat9logs
[root@quan tomcat9]# docker exec c524b2450a6c ls -l # 这里查询的是/usr/local目录下的文件,因为落脚点是/usr/local
total 56
drwxr-xr-x 3 root root 4096 Apr 3 04:08 aegis
drwxr-xr-x 1 root root 4096 Apr 3 03:53 apache-tomcat-9.0.44
drwxr-xr-x 2 root root 4096 Nov 3 15:22 bin
-rw-r--r-- 1 root root 0 Apr 3 03:21 cincontainer.txt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 games
drwxr-xr-x 2 root root 4096 Nov 3 15:22 include
drwxr-xr-x 8 10 143 4096 Jun 17 2014 jdk1.8.0_11
drwxr-xr-x 2 root root 4096 Nov 3 15:22 lib
drwxr-xr-x 3 root root 4096 Dec 4 17:37 lib64
drwxr-xr-x 2 root root 4096 Nov 3 15:22 libexec
drwxr-xr-x 2 root root 4096 Nov 3 15:22 sbin
drwxr-xr-x 5 root root 4096 Dec 4 17:37 share
drwxr-xr-x 2 root root 4096 Nov 3 15:22 src
[root@quan ~]# docker exec c524b2450a6c java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)

Docker常用安装

安装tomcat

[root@quan ~]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 2989 [OK]
[root@quan ~]# docker pull tomcat
[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 040bdb29ab37 2 months ago 649MB
[root@quan ~]# docker run -it -p 8080:8080 tomcat
[root@quan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3fa8eeb70cf9 tomcat "catalina.sh run" 44 seconds ago Up 40 seconds 0.0.0.0:8080->8080/tcp brave_maxwell

安装mysql

[root@quan ~]# docker search mysql
[root@quan ~]# docker pull mysql
[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest c8562eaf9d81 2 months ago 546MB
[root@quan ~]# docker run -p 3306:3306 --name mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/logs:/logs -v /usr/local/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
[root@quan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e34e861b5719 mysql:5.6 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp mysql
[root@quan ~]# docker exec -it e34e861b5719 /bin/bash
root@e34e861b5719:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.50 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.03 sec)

安装redis

[root@quan ~]# docker search redis
[root@quan ~]# docker pull redis
[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 621ceef7494a 2 months ago 104MB
[root@quan ~]# docker run -p 6379:6379 -v /usr/local/myredis/data:/data -v /usr/local/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes
[root@quan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae5139dfe541 redis "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:6379->6379/tcp cranky_allen
[root@quan ~]# docker exec -it ae5139dfe541 redis-cli
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"

本地镜像发布到阿里云

[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 621ceef7494a 2 months ago 104MB
[root@quan ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59e937d759b7 redis "docker-entrypoint.s…" 35 seconds ago Up 32 seconds 0.0.0.0:6379->6379/tcp thirsty_roentgen
[root@quan ~]# docker commit -a ljq -m "my new redis" 59e937d759b7 myredis:1.1
[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myredis 1.1 0a7a7dca8c28 13 seconds ago 104MB
redis latest 621ceef7494a 2 months ago 104MB
[root@quan ~]# docker login --username=1032905347@qq.com registry.cn-shanghai.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@quan ~]# docker tag 0a7a7dca8c28 registry.cn-shanghai.aliyuncs.com/lianjq/myredis:1.1.2
[root@quan ~]# docker push registry.cn-shanghai.aliyuncs.com/lianjq/myredis:1.1.2
The push refers to repository [registry.cn-shanghai.aliyuncs.com/lianjq/myredis]
b2ee95f92839: Pushed
3480f9cdd491: Pushed
a24a292d0184: Pushed
f927192cc30c: Pushed
1450b8f0019c: Pushed
8e14cb7841fa: Pushed
cb42413394c4: Pushed
1.1.2: digest: sha256:11e88398a0298e90308e68c58082ec92eb70dd30919a523e2b98e2fec9b4973a size: 1779
[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myredis 1.1 0a7a7dca8c28 28 minutes ago 104MB
redis latest 621ceef7494a 2 months ago 104MB
[root@quan ~]# docker pull registry.cn-shanghai.aliyuncs.com/lianjq/myredis:1.1.2
[root@quan ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myredis 1.1 0a7a7dca8c28 28 minutes ago 104MB
registry.cn-shanghai.aliyuncs.com/lianjq/myredis 1.1.2 0a7a7dca8c28 28 minutes ago 104MB
redis latest 621ceef7494a 2 months ago 104MB