Docker
1.简介¶
1.1 docker 是什么¶
- 使用最广泛的开源容器引擎
- 一种操作系统级的虚拟化技术
- 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制)
- 一个简单的应用程序打包工具
1.2 docker设计目标¶
- 提供简单的应用程序打包工具
- 开发人员和运维人员职责逻辑分离
- 多环境保持一致性
1.3 docker基本组成¶

- Docker Client:客户端
- Ddocker Daemon:守护进程
- Docker Images:镜像
- Docker Container:容器
- Docker Registry:镜像仓库
1.4 dockervs虚拟机¶

虚拟机从下到上理解:
- 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。
- 主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
- 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。
- 从操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。
- 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
- 应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。
docker从下到上理解:
- 基础设施(Infrastructure)。
- 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
- Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。
- 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
- 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。
对比虚拟机与Docker
Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
参数 | Container | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级(更彻底) |
操作系统 | 只支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统 |
1.5 docker引用场景¶
- 应用程序打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品(平台即服务)
1.6 docker设计目标¶
- 提供简单的应用程序打包工具
- 开发和运维人员职业逻辑分离
- 多环境保持一致性
1.7 docker基本组成¶
- docker client
- docker daemon
- docker images
- docker container
- docker registry
1.8 docker应用场景¶
- 应用程序打包和发布
- 应用程序隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供pass产品[平台即服务]
2. docker 安装¶
2.1 docker版本¶
- 社区版(Community Edition,CE)
- 企业版(Enterprise Edition,EE)
说白了,社区版是免费的,企业版是收费的,企业版本功能更多,且有专业的支持
2.2 支持平台¶
- Linux
- mac
- windows
Linux版本有(CentOS,Debian,Fedora,Oracle Linux,RHEL,SUSE和Ubuntu)等
2.3 安装¶
2.3.1 安装依赖¶
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
详细操作
[root@localhost ~]# sudo yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile epel/x86_64/metalink | 6.3 kB 00:00 * epel: ftp.jaist.ac.jp base | 3.6 kB 00:00 epel | 4.7 kB 00:04 extras | 3.4 kB 00:00 updates | 3.4 kB 00:00 (1/2): epel/x86_64/updateinfo | 985 kB 00:09 (2/2): epel/x86_64/primary_db | 6.7 MB 00:09 Package device-mapper-persistent-data-0.7.3-3.el7.x86_64 already installed and latest version Package 7:lvm2-2.02.180-10.el7_6.3.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package yum-utils.noarch 0:1.1.31-50.el7 will be installed --> Processing Dependency: python-kitchen for package: yum-utils-1.1.31-50.el7.noarch --> Processing Dependency: libxml2-python for package: yum-utils-1.1.31-50.el7.noarch --> Running transaction check ---> Package libxml2-python.x86_64 0:2.9.1-6.el7_2.3 will be installed ---> Package python-kitchen.noarch 0:1.1.1-5.el7 will be installed --> Processing Dependency: python-chardet for package: python-kitchen-1.1.1-5.el7.noarch --> Running transaction check ---> Package python-chardet.noarch 0:2.2.1-1.el7_1 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================= Installing: yum-utils noarch 1.1.31-50.el7 base 121 k Installing for dependencies: libxml2-python x86_64 2.9.1-6.el7_2.3 base 247 k python-chardet noarch 2.2.1-1.el7_1 base 227 k python-kitchen noarch 1.1.1-5.el7 base 267 k Transaction Summary ============================================================================================================================================================================================= Install 1 Package (+3 Dependent packages) Total download size: 861 k Installed size: 4.3 M Downloading packages: (1/4): python-chardet-2.2.1-1.el7_1.noarch.rpm | 227 kB 00:00:05 (2/4): python-kitchen-1.1.1-5.el7.noarch.rpm | 267 kB 00:00:00 (3/4): yum-utils-1.1.31-50.el7.noarch.rpm | 121 kB 00:00:00 (4/4): libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm | 247 kB 00:00:06 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 137 kB/s | 861 kB 00:00:06 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : python-chardet-2.2.1-1.el7_1.noarch 1/4 Installing : python-kitchen-1.1.1-5.el7.noarch 2/4 Installing : libxml2-python-2.9.1-6.el7_2.3.x86_64 3/4 Installing : yum-utils-1.1.31-50.el7.noarch 4/4 Verifying : libxml2-python-2.9.1-6.el7_2.3.x86_64 1/4 Verifying : python-kitchen-1.1.1-5.el7.noarch 2/4 Verifying : yum-utils-1.1.31-50.el7.noarch 3/4 Verifying : python-chardet-2.2.1-1.el7_1.noarch 4/4 Installed: yum-utils.noarch 0:1.1.31-50.el7 Dependency Installed: libxml2-python.x86_64 0:2.9.1-6.el7_2.3 python-chardet.noarch 0:2.2.1-1.el7_1 python-kitchen.noarch 0:1.1.1-5.el7 Complete!
2.3.2 添加包源¶
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
详细操作
[root@localhost ~]# sudo yum-config-manager \ > --add-repo \ > https://download.docker.com/linux/centos/docker-ce.repo Loaded plugins: fastestmirror adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repo
2.3.3 安装docker-ce¶
yum install -y docker-ce
详细操作
[root@localhost ~]# yum install -y docker-ce Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * epel: ftp.jaist.ac.jp docker-ce-stable | 3.5 kB 00:00:00 (1/2): docker-ce-stable/x86_64/updateinfo | 55 B 00:00:06 (2/2): docker-ce-stable/x86_64/primary_db | 27 kB 00:00:06 Resolving Dependencies --> Running transaction check ---> Package docker-ce.x86_64 3:18.09.5-3.el7 will be installed --> Processing Dependency: container-selinux >= 2.9 for package: 3:docker-ce-18.09.5-3.el7.x86_64 --> Processing Dependency: containerd.io >= 1.2.2-3 for package: 3:docker-ce-18.09.5-3.el7.x86_64 --> Processing Dependency: docker-ce-cli for package: 3:docker-ce-18.09.5-3.el7.x86_64 --> Processing Dependency: libcgroup for package: 3:docker-ce-18.09.5-3.el7.x86_64 --> Running transaction check ---> Package container-selinux.noarch 2:2.74-1.el7 will be installed --> Processing Dependency: policycoreutils-python for package: 2:container-selinux-2.74-1.el7.noarch ---> Package containerd.io.x86_64 0:1.2.5-3.1.el7 will be installed ---> Package docker-ce-cli.x86_64 1:18.09.5-3.el7 will be installed ---> Package libcgroup.x86_64 0:0.41-20.el7 will be installed --> Running transaction check ---> Package policycoreutils-python.x86_64 0:2.5-29.el7_6.1 will be installed --> Processing Dependency: setools-libs >= 3.3.8-4 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: libsemanage-python >= 2.5-14 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: audit-libs-python >= 2.1.3-4 for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: python-IPy for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.4)(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.2)(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: libapol.so.4(VERS_4.0)(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: checkpolicy for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: libqpol.so.1()(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Processing Dependency: libapol.so.4()(64bit) for package: policycoreutils-python-2.5-29.el7_6.1.x86_64 --> Running transaction check ---> Package audit-libs-python.x86_64 0:2.8.4-4.el7 will be installed ---> Package checkpolicy.x86_64 0:2.5-8.el7 will be installed ---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be installed ---> Package python-IPy.noarch 0:0.75-6.el7 will be installed ---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================= Installing: docker-ce x86_64 3:18.09.5-3.el7 docker-ce-stable 19 M Installing for dependencies: audit-libs-python x86_64 2.8.4-4.el7 base 76 k checkpolicy x86_64 2.5-8.el7 base 295 k container-selinux noarch 2:2.74-1.el7 extras 38 k containerd.io x86_64 1.2.5-3.1.el7 docker-ce-stable 22 M docker-ce-cli x86_64 1:18.09.5-3.el7 docker-ce-stable 14 M libcgroup x86_64 0.41-20.el7 base 66 k libsemanage-python x86_64 2.5-14.el7 base 113 k policycoreutils-python x86_64 2.5-29.el7_6.1 updates 456 k python-IPy noarch 0.75-6.el7 base 32 k setools-libs x86_64 3.3.8-4.el7 base 620 k Transaction Summary ============================================================================================================================================================================================= Install 1 Package (+10 Dependent packages) Total download size: 57 M Installed size: 241 M Downloading packages: (1/11): audit-libs-python-2.8.4-4.el7.x86_64.rpm | 76 kB 00:00:05 (2/11): checkpolicy-2.5-8.el7.x86_64.rpm | 295 kB 00:00:05 (3/11): container-selinux-2.74-1.el7.noarch.rpm | 38 kB 00:00:05 warning: /var/cache/yum/x86_64/7/docker-ce-stable/packages/containerd.io-1.2.5-3.1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY ] 724 kB/s | 31 MB 00:00:36 ETA Public key for containerd.io-1.2.5-3.1.el7.x86_64.rpm is not installed (4/11): containerd.io-1.2.5-3.1.el7.x86_64.rpm | 22 MB 00:00:52 (5/11): libcgroup-0.41-20.el7.x86_64.rpm | 66 kB 00:00:01 (6/11): python-IPy-0.75-6.el7.noarch.rpm | 32 kB 00:00:00 (7/11): setools-libs-3.3.8-4.el7.x86_64.rpm | 620 kB 00:00:00 (8/11): policycoreutils-python-2.5-29.el7_6.1.x86_64.rpm | 456 kB 00:00:05 (9/11): libsemanage-python-2.5-14.el7.x86_64.rpm | 113 kB 00:00:06 (10/11): docker-ce-cli-18.09.5-3.el7.x86_64.rpm | 14 MB 00:00:44 (11/11): docker-ce-18.09.5-3.el7.x86_64.rpm | 19 MB 00:01:45 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 546 kB/s | 57 MB 00:01:46 Retrieving key from https://download.docker.com/linux/centos/gpg Importing GPG key 0x621E9F35: Userid : "Docker Release (CE rpm) <docker@docker.com>" Fingerprint: 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35 From : https://download.docker.com/linux/centos/gpg Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libcgroup-0.41-20.el7.x86_64 1/11 Installing : setools-libs-3.3.8-4.el7.x86_64 2/11 Installing : audit-libs-python-2.8.4-4.el7.x86_64 3/11 Installing : checkpolicy-2.5-8.el7.x86_64 4/11 Installing : python-IPy-0.75-6.el7.noarch 5/11 Installing : libsemanage-python-2.5-14.el7.x86_64 6/11 Installing : policycoreutils-python-2.5-29.el7_6.1.x86_64 7/11 Installing : 2:container-selinux-2.74-1.el7.noarch 8/11 setsebool: SELinux is disabled. Installing : containerd.io-1.2.5-3.1.el7.x86_64 9/11 Installing : 1:docker-ce-cli-18.09.5-3.el7.x86_64 10/11 Installing : 3:docker-ce-18.09.5-3.el7.x86_64 11/11 Verifying : 1:docker-ce-cli-18.09.5-3.el7.x86_64 1/11 Verifying : libcgroup-0.41-20.el7.x86_64 2/11 Verifying : containerd.io-1.2.5-3.1.el7.x86_64 3/11 Verifying : policycoreutils-python-2.5-29.el7_6.1.x86_64 4/11 Verifying : libsemanage-python-2.5-14.el7.x86_64 5/11 Verifying : python-IPy-0.75-6.el7.noarch 6/11 Verifying : 3:docker-ce-18.09.5-3.el7.x86_64 7/11 Verifying : checkpolicy-2.5-8.el7.x86_64 8/11 Verifying : 2:container-selinux-2.74-1.el7.noarch 9/11 Verifying : audit-libs-python-2.8.4-4.el7.x86_64 10/11 Verifying : setools-libs-3.3.8-4.el7.x86_64 11/11 Installed: docker-ce.x86_64 3:18.09.5-3.el7 Dependency Installed: audit-libs-python.x86_64 0:2.8.4-4.el7 checkpolicy.x86_64 0:2.5-8.el7 container-selinux.noarch 2:2.74-1.el7 containerd.io.x86_64 0:1.2.5-3.1.el7 docker-ce-cli.x86_64 1:18.09.5-3.el7 libcgroup.x86_64 0:0.41-20.el7 libsemanage-python.x86_64 0:2.5-14.el7 policycoreutils-python.x86_64 0:2.5-29.el7_6.1 python-IPy.noarch 0:0.75-6.el7 setools-libs.x86_64 0:3.3.8-4.el7 Complete! You have new mail in /var/spool/mail/root
检查docker版本
[root@localhost ~]# docker -v Docker version 18.09.5, build e8ff056
2.3.4 配置开机自启¶
systemctl start docker systemctl enable docker
详细操作
[root@localhost ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: inactive (dead) Docs: https://docs.docker.com [root@localhost ~]# systemctl start docker [root@localhost ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled) Active: active (running) since Sun 2019-04-14 08:08:47 EDT; 1s ago Docs: https://docs.docker.com Main PID: 7609 (dockerd) Tasks: 14 Memory: 32.7M CGroup: /system.slice/docker.service └─7609 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.067860774-04:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc4201a6280, READY" module=grpc Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.068048242-04:00" level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc420173ee0, READY" module=grpc Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.093656532-04:00" level=info msg="Graph migration to content-addressability took 0.00 seconds" Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.094299381-04:00" level=info msg="Loading containers: start." Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.234793136-04:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17....IP address" Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.289552561-04:00" level=info msg="Loading containers: done." Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.316383386-04:00" level=info msg="Docker daemon" commit=e8ff056 graphdriver(s)=overlay2 version=18.09.5 Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.316510066-04:00" level=info msg="Daemon has completed initialization" Apr 14 08:08:47 localhost.localdomain dockerd[7609]: time="2019-04-14T08:08:47.325630082-04:00" level=info msg="API listen on /var/run/docker.sock" Apr 14 08:08:47 localhost.localdomain systemd[1]: Started Docker Application Container Engine. Hint: Some lines were ellipsized, use -l to show in full. [root@localhost ~]# systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
2.3.5 配置加速源¶
docker 下载镜像默认是从 docker hub 上下载的,但是很慢,所有我们需要配置从国内的镜像源,下载就很快。首推 DaoCloud
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io systemctl restart docker
详细操作
[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh docker version >= 1.12 {"registry-mirrors": ["http://f1361db2.m.daocloud.io"]} Success. You need to restart docker to take effect: sudo systemctl restart docker You have new mail in /var/spool/mail/root 添加后会再如下路径添加daemon.json 文件 [root@localhost ~]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://f1361db2.m.daocloud.io"]} [root@localhost ~]# systemctl restart docker
查看docker 的镜像仓库是否是配置的daocloud
docker info
详细操作
[root@localhost ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 18.09.5 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk sys logSwarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84 runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30 init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-957.10.1.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 1.777GiB Name: localhost.localdomain ID: S66N:NN62:5DJ4:77AX:OHR6:ZO6W:FK5J:TZQ5:LECF:TWTL:AYRZ:WFJN Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: # <---- 这个地方就可以看到了 http://f1361db2.m.daocloud.io/ Live Restore Enabled: false Product License: Community Engine
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同
2.3.6 简单测试¶
docker run -d -p 88:80 nginx docker ps
详细操作
启动nginx容器 [root@localhost ~]# docker run -d -p 88:80 nginx Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx 27833a3ba0a5: Pull complete eb51733b5bc0: Pull complete 994d4a01fbe9: Pull complete Digest: sha256:c6bcc3f6f4dfee535dc0cbdaa7f32901727dd93f92c8a45eacd5c6a6d080a9ad Status: Downloaded newer image for nginx:latest 6cdfdebc0d566dfe587fc1f7a184867ef6ace72a0aed6930d5703e0c46d05311 查看进程 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6cdfdebc0d56 nginx "nginx -g 'daemon of…" 46 seconds ago Up 45 seconds 0.0.0.0:88->80/tcp youthful_saha 查看服务 [root@localhost ~]# curl 127.0.0.1:88 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> 在浏览再次访问后,查看容器里面nginx日志 [root@localhost ~]# docker logs 6cdfdebc0d56 172.17.0.1 - - [14/Apr/2019:12:22:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-" [root@localhost ~]# docker logs 6cdfdebc0d56 172.17.0.1 - - [14/Apr/2019:12:22:50 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-" 192.168.186.1 - - [14/Apr/2019:12:24:50 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Core/1.63.6776.400 QQBrowser/10.3.2601.400 " "-"
3. 镜像管理¶
3.1 镜像¶
- 一个分层存储的文件
查看分层
[root@localhost ~]# docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT bb776ce48575 3 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 3 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B <missing> 3 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 3 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B <missing> 3 days ago /bin/sh -c set -x && apt-get update && apt… 54MB <missing> 3 days ago /bin/sh -c #(nop) ENV NJS_VERSION=1.15.11.0… 0B <missing> 3 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.15.11… 0B <missing> 2 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 2 weeks ago /bin/sh -c #(nop) ADD file:4fc310c0cb879c876… 55.3MB You have new mail in /var/spool/mail/root
- 一个软件的环境
- 一个镜像可以创建N个容器
- 一种标准化的交付
- 一个不包含Linux内核而又精简的Linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>
查看镜像中各层内容及大小,每层
对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/\<storage-driver\>
中。
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。地址如下:
https://hub.docker.com/explore
3.2 镜像与容器联系¶

容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时, 会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。 如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多 少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作 的,并不会修改镜像的源文件,这种方式提高磁盘利用率。 若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。