一、Docker 简介
Docker 是一个开源的容器引擎,它有助于更快地交付应用。Docker 可将应用程序和基础设施层隔离,并且能将基础设施当做程序一样进行管理。使用 Docker 可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
Docker 是基于 Linux 内置的 Namespace 和 CGroup 等系统内隔离机制而抽象出来的一种轻虚拟化技术。与 KVM、VirtualBox 和 Vmware 等虚拟机相比,它以一种轻量级的方式实现了运行空间的隔离。如果物理机是一幢住宅楼,虚拟机就是大楼中的一个个套间,而容器技术就是套间里的一个个隔断。不难理解,Docker 作为一种隔断,它并不能基于一种内核(Linux)提供另一种内核(Windows)的虚拟化运行环境。
所以说传统虚拟机技术是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统。Docker 容器是在操作系统上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量化。
- Docker 的官方网站:https//www.docker.com/
- Docker的 GitHub:https://github.com/docker/docker
二、Docker 架构
根据 Docker 官文档的架构图,可以看到主要包含以下组件。
- Docker Daemon(Docker 守护进程)
Docker daemon 是一个运行在宿主机(DOCKER_HOST)的后台进程,可通过 Docker Client 与之通信。
- Client(Docker 客户端)
Docker 客户端是 Docker 的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon 通信。图中的 docker build 等都是 Docker 的相关命令。
- Images(Docker 镜像)
Docker 镜像是一个只读模板,它包含创建 Docker 容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用 Docker 镜像可以运行 Docker 镜像中的程序。
- Container(容器)
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API 或者 CLI 命令来启停、移动、删除容器。
- Registry(仓库)
Docker Registry 是一个集中存储与分发镜像的服务。构建完 Docker 镜像后,就可以在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry 来避免镜像的手动复制。
一个 Docker Registry 可包含多个 Docker 仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker 镜像。这跟 Maven 的仓库有点类似,如果把 Docker Registry 比作 Maven 仓库的话,那么 Docker 仓库就可理解为某 jar 包的路径,而镜像标签则可裂解为 jar 包的版本号。
Docker Regsitry 可分为公有 Docker Registry 和私有 Docker Registry。最常用的 Docker Registry 莫过于官方的 Docker Hub,https://hub.docker.com/,这也是默认的 Docker Registry。Docker Hub 上存放着大量优秀的镜像,可使用 Docker 命令下载并使用。
三、安装 Docker
随着 Docker 的不断流行与发展,docker 公司(或称为组织)也开启了商业化之路,Docker 从 17.03 版本之后分为 CE(Community Edition) 和 EE(Enterprise Edition)。
Docker EE 由公司支持,可在经过认证的操作系统和云提供商中使用,并可运行来自 Docker Store 的、经过认证的容器和插件。
Docker CE 是免费的 Docker 产品的新名称,Docker CE 包含了完整的 Docker 平台,非常适合开发人员和运维团队构建容器 APP。事实上,Docker CE 17.03,可理解为 Docker 1.13.1 的 Bug 修复版本。因此,从 Docker 1.13 升级到 Docker CE 17.03 风险相对是较小的。
Docker 官方建议将 Docker 运行在 Linux 操作系统上。当然了,Docker 也可以运行在其他的平台,例如 Windows、MacOS 等。
比如在 CentOS 上安装 Docker CE 可参考官方文档:https://docs.docker.com/install/linux/docker-ce/centos/
3.1 系统要求
Docker 目前只能运行在 64 位平台上,并且要求内核版本不低于 3.10,实际上内核越新越好,过低的内核版本容易造成功能不稳当。
3.2 移除非官方软件包
有些 Linux 上面已经包含了旧版本的 Docker 软件包,名称是 'docker’ 或者 'docker-engine',新版本的 Docker 软件包名称为 'docker-ce' 或者 'docker-ee'。
使用 yum -y remove <软件包名称> 之后显示没有可以删除的软件包了,说明系统已经移除了旧版本或者系统本省不存在旧版本 docker。其实该命令只会移除旧版本的 Docker,/var/lib/docker 目录中的内容不会被删除,因此,旧版本 Docker 所创建的镜像、容器、卷等都会保留下来。
3.3 设置 Yum 源
Docker 有多种安装方式,比如 Yum 安装、RPM 包安装、Shell 安装等。
1. 安装 yum-utils
安装 yum-utils 后就能使用 yum-config-manager 工具设置 Yum 源了,而不需要自己手动修改去修改 /etc/yum.repos.d 目录下的 Yum 源文件了。r如果需要使用 deviceMapper 存储驱动,则 device-mapper-persistent-data 和 lvm2 也需要安装。
[root@masternode ~]# yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
如下所示:
2. 执行以下命令,添加 Docker 的 Yum 源
[root@masternode etc]# yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
如下所示:
可以看到已经成功添加了 Docker 的 Yum 源文件:docker-ce.repo
3. [可选]启用 test 仓库
Docker-ce 提供四种仓库: stable,edge,test,nightly。这些仓库包含在上面的 docker-ce.repo 文件中,但默认情况下只启用了 stable 仓库,其余是禁用的。
enabled=1 表示启用,为 0 时表示禁用此仓库(disable),如下:
[root@masternode yum.repos.d]# cat docker-ce.repo [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://download.docker.com/linux/centos/7/$basearch/stable enabled=1 gpgcheck=1 gpgkey=https://download.docker.com/linux/centos/gpg
......
如需启用测试仓库,可以使用:
[root@masternode yum.repos.d]# yum-config-manager --enable docker-ce-test
如下所示:
3.4 安装 Docker-ce
1. 更新 Yum 包的索引缓存
[root@masternode etc]# yum makecache
2. 安装 docker-ce
安装最新版本的 docker-ce
[root@masternode etc]# yum install docker-ce docker-ce-cli containerd.io
如果需要安装特定版本的 Docker CE,而不是最新版本。可以在 repo 中列出可用版本,然后选择并安装,如下:
[root@masternode etc]# yum list docker-ce --showduplicates | sort -r * updates: mirrors.zju.edu.cn Loading mirror speeds from cached hostfile Loaded plugins: fastestmirror, langpacks * extras: mirrors.zju.edu.cn docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable ...... docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable ...... * base: mirrors.zju.edu.cn Available Packages
其中,sort -r 表示对结果由高到低排序。
该表格有三列,第一列是软件包名称,第二列是版本字符串,第三列是仓库名称,表示软件包存储的位置,例如 docker-ce-stable,docker-ce-test 等。列出 Docker 版本后,可以使用如下命令安装指定版本的 Docker。
[root@masternode etc]# yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
其中,通过其完全限定的包名称安装特定版本,<VERSION_STRING> 即包名称(docker-ce)加上版本字符串(第2列),从第一个冒号(:)开始,直到第一个连字符,用连字符(-)分隔。例如:docker-ce-18.09.1
安装完成后,继续列出可用的 docker-ce 版本,如下:
[root@masternode etc]# yum list docker-ce --showduplicates | sort -r * updates: mirrors.zju.edu.cn Loading mirror speeds from cached hostfile Loaded plugins: fastestmirror, langpacks Installed Packages * extras: mirrors.zju.edu.cn docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.6-3.el7 @docker-ce-stable docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
发现第二行的第三列为:@docker-ce-stable,表示系统已经完成了该版本的安装。
3. 启动 Docker
[root@masternode etc]# systemctl start docker
4. 通过运行 hello world 映像验证 docker ce 是否正确安装
[root@masternode etc]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
如果看到如上的结果,则说明 docker 安装成功。此命令会下载测试映像并在容器中运行它。当在容器运行时,它会打印一条信息性消息并退出。
5. 查看 Docker 版本
[root@masternode etc]# docker version Client: Version: 18.09.6 API version: 1.39 Go version: go1.10.8 Git commit: 481bc77156 Built: Sat May 4 02:34:58 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 18.09.6 API version: 1.39 (minimum version 1.12) Go version: go1.10.8 Git commit: 481bc77 Built: Sat May 4 02:02:43 2019 OS/Arch: linux/amd64 Experimental: false
由结果可知当前 Docker 版本、API 版本、Go 语言版本等信息。
3.5 卸载 docker-ce
1. 卸载 docker 软件包
[root@masternode etc]# yum -y remove docker-ce
2. 如需删除镜像、容器、卷以及自定义的配置文件,可执行以下命令
[root@masternode etc]# rm -rf /var/lib/docker
3.6 配置镜像加速器
国内访问 Docker Hub 的速度很不稳定,有时候甚至出现连接不上的情况,使用加速器将会提升在国内获取 Docker 官方镜像的速度。常用的镜像加速器有:阿里云加速器,DaoCloud 加速器,网易蜂巢加速器等。此处以使用阿里云加速器为例。
阿里云官方加速器文档地址:https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.545.OY7haW
创建阿里云账号后,登录容器镜像服务控制台,点击左侧的镜像加速器菜单,即可看到阿里云为你独立分配的加速地址。
参照 CentOS 的配置说明,即可以配置镜像加速器。
[root@masternode docker]# mkdir -p /etc/docker [root@masternode docker]# tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://u7ezsy0l.mirror.aliyuncs.com"] } EOF [root@masternode docker]# sudo systemctl daemon-reload [root@masternode docker]# sudo systemctl restart docker
配置代码如上所示。
四、Docker 常用命令
Docker 有很多命令,主要分为 Docker 镜像常用命令和 Docker 容器常用命令。官方命令参考文档:https://docs.docker.com/engine/reference/commandline/docker/
使用 Docker 之前,需要先启动 Docker 服务,否则会提示没有连接,如下:
[root@masternode ~]# docker search java Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? [root@masternode ~]# systemctl start docker
启动 docker 服务之后,可以正常使用相关命令。
4.1 Docker 镜像常用命令
可以访问 Docker Hub 官网,查找需要的镜像,https://hub.docker.com/
1. 搜索镜像
使用 docker search 命令可以搜索远程仓库中共享的镜像,默认搜索官方仓库 Docker Hub 中的镜像。用法为 docker search TERM。
[root@masternode ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL AUTOMATED nginx Official build of Nginx. 11647 [OK] jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1622 [OK] richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 724 [OK] bitnami/nginx Bitnami nginx Docker Image 68 [OK] linuxserver/nginx An Nginx container, brought to you by LinuxS… 65 ......
可以看到返回了很多包含关键字的镜像,其中包括镜像名称、描述、星级(j表示该镜像的受欢迎程度)、是否官方镜像(标记为 [OK] 的镜像均由各软件的官方项目组创建和维护)、是否自动创建等,关于自动构建可以参考官方文档:https://docs.docker.com/docker-hub/builds/#how-automated-builds-work,其实就是指 Docker Hub 可以从外部存储库中的源代码自动构建镜像,并自动将构建的镜像推送到 Docker 存储库中。默认的输出结果按照星级评价降序排列。
2. 获取镜像
可以使用 docker pull 命令直接从 Docker Hub 镜像源来下载镜像。用法为 docker pull NAME [:TAG]。其中 NAME 是镜像仓库的名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本的信息)。如果不显式指定 TAG,则默认会选择 latest 标签,这会下载仓库中最新版本的镜像。
[root@masternode ~]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx fc7181108d40: Pull complete d2e987ca2267: Pull complete 0b760b431b11: Pull complete Digest: sha256:96fb261b66270b900ea5a2c17a26abbfabe95506e73c3a3c65869a6dbe83223a Status: Downloaded newer image for nginx:latest
比如:docker pull ubuntu:14.04,严格地讲,镜像的仓库名称中还应该添加仓库地址(即 registry,注册服务器)作为前缀,只是我们默认使用的是 Docker Hub Registry 中的 ununtu 仓库来下载标记为 14.04 的镜像。如果是从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢镜像源来下载 ubuntu:14.04 镜像,命令如下:
docker pull hub.c.163.com/public/ubuntu:14.04
3. 查看和设置镜像信息
(1)使用 images 命令列出镜像,如下:
[root@masternode ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f68d6e55e065 4 days ago 109MB hello-world latest fce289e99eb9 6 months ago 1.84kB
列出的信息包括:来自于哪个仓库,镜像的标签信息,镜像的 ID(唯一标识镜像),如果镜像的 ID 相同,说明它们目前实际上指向同一个镜像。创建时间(说明镜像的最后更新时间),镜像大小。
(2)使用 tag 命令来为本地镜像任意添加新的标签,如为 nginx 添加一个新的 nginx:new 镜像标签,命令如下:
[root@masternode ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f68d6e55e065 4 days ago 109MB hello-world latest fce289e99eb9 6 months ago 1.84kB [root@masternode ~]# docker tag nginx nginx:new [root@masternode ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f68d6e55e065 4 days ago 109MB nginx new f68d6e55e065 4 days ago 109MB hello-world latest fce289e99eb9 6 months ago 1.84kB
nginx:latest 和 nginx:new 的镜像 ID 相同,说明它们指向同一个镜像文件,只是别名不同,类似于 Linux 中的硬链接。
(3)使用 inspect 命令查看详细信息
这个详细信息包括制作者、适应架构、各层的数字摘要等信息。
[root@masternode ~]# docker inspect nginx:latest
返回的是一个 JSON 格式的信息,如果只需要其中一项内容时,可以使用参数来过滤。
(4)使用 history 命令查看镜像历史
[root@masternode ~]# docker history nginx:latest IMAGE CREATED CREATED BY SIZE COMMENT f68d6e55e065 4 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 4 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B <missing> 4 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 4 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B <missing> 4 days ago /bin/sh -c set -x && addgroup --system -… 54.1MB <missing> 4 days ago /bin/sh -c #(nop) ENV PKG_RELEASE=1~stretch 0B <missing> 4 days ago /bin/sh -c #(nop) ENV NJS_VERSION=0.3.3 0B <missing> 4 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.17.1 0B <missing> 3 weeks ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 3 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 3 weeks ago /bin/sh -c #(nop) ADD file:5ffb798d64089418e… 55.3MB
该命令可以列出各层的创建信息。
4. 删除镜像
使用 docker rmi 命令可以删除镜像,用法为 docker rmi IMAGE [IMAGE...],其中 IMAGE 可以为标签或 ID。当同一个镜像拥有多个标签的时候,docker rmi 只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。
[root@masternode ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f68d6e55e065 4 days ago 109MB nginx new f68d6e55e065 4 days ago 109MB hello-world latest fce289e99eb9 6 months ago 1.84kB [root@masternode ~]# docker rmi nginx:new Untagged: nginx:new [root@masternode ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest f68d6e55e065 4 days ago 109MB hello-world latest fce289e99eb9 6 months ago 1.84kB
删除所有镜像,如下:
docker rmi -f $(docker image),-f 参数表示强制删除。
5. 创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入,基于 Dockerfile 创建。其中使用基于 Dockerfile 创建镜像最为常用,docker build 命令将读取指定路径下(包含子目录)的 Dockerfile,并将该路径下的所有内容发送给 Docker 服务端,由服务端来创建镜像。如下:
docker build -t build_repo/first_image /tmp/docker_builder/
指定 Dockerfile 所在的目录为 /tmp/docker_builder/,并且希望生成镜像标签为 build_repo/first_image,参数 -t,--tag:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
6. 上传镜像
可以使用 docker push 命令上传镜像到仓库,默认上传到 Docker Hub 官方仓库(需要登录),用法为:
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT] /] NAME[:TAG]
用户在 Docker Hub 网站注册后可以上传自制的镜像,例如用户 user 上传本地的 test:lasest 镜像,可以先添加新的标签 user/test:latest,然后 用 docker push 命令上传镜像:
docker tag test:latest user/test:latest
docker push user/test:latest
第一次上传时,会提示输入登录信息或注册信息。
7. 存出和载入镜像
可以使用 docker save 和 docker load 命令来存出和载入镜像。
4.2 Docker 容器常用命令
1. 新建容器
可以使用 docker create 命令新建一个容器,但是新建后的容器处于停止状态。比如:使用 docker 镜像 nginx:latest 创建一个容器,并将容器命名为 mynginx,不指定容器名称时,默认容器名称为镜像名称。
docker create --name mynginx nginx:latest
2. 启动容器
使用 docker start 命令来启动一个已经创建的容器,如下:
docker start mynginx
除了创建容器后通过 start 命令来启动,也可以直接新建并启动容器。
3. 新建并启动容器
使用 docker run 命令可以新建并启动一个容器。-d 选项表示后台运行,-P 选项随机端口映射,-p 选项指定端口映射。比如:
docker run -d -p 91:80 nginx
这样可以启动一个 Nginx 容器,-d 参数表示后台运行,-p 参数使用了 宿主机端口:容器端口 格式,表示开放容器端口到宿主机端口。此时就可以访问 http://Docker 宿主机 IP:91/
docker run --name mynginx -d nginx:latest
使用 docker 镜像 nginx:latest 以后台模式启动一个容器,并将容器命名为 mynginx。
4. 停止容器
使用 docker stop 来终止一个运行中的容器。后面可以跟 容器 ID,也可以跟容器名称。处于终止状态的容器,可以通过 docker start 来再次启动
5. 强制停止容器
使用 docker kill 命令发送 SIGKILL 信号来强制停止容器。
6. 重启容器
使用 docker restart 来重启一个容器。此命令相当于先执行了 docker stop 命令,然后执行了 docker start 命令。
7. 列出容器
使用 docker ps 命令即可列出容器。-a 选项显示所有的容器,包括未运行的。-q 表示静默模式,只显示容器编号。docker ps -aq
表头含义如下:
CONTAINER_ID:表示容器 ID。
IMAGE:表示镜像名称。
COMMAND:表示启动容器时运行的运行的命令。
CREATED:表示容器的创建时间。
STATUS:表示容器运行的状态。Up 表示运行中,Exited 表示已停止。
PORTS:表示容器对外的端口号。
NAMES:表示容器名称。该名称默认由 Docker 自动生成,可以使用 docker run 命令的 --name 选项自行指定。
8. 进入容器
在使用 -d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。这个时候如果需要进入容器操作,有多种方法,包括使用官方的 attach 或 exec,以及第三方的 nsenter 工具。
通过 exec 命令对容器执行操作是最为推荐的方式,后面可以跟容器名称或者容器 ID,如下:
[root@masternode showdoc]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11f2354ab1cb showdoc "docker-php-entrypoi…" 10 hours ago Up 4 seconds 443/tcp, 9000/tcp, 0.0.0.0:4999->80/tcp showdoc [root@masternode showdoc]# docker exec -it 11f2354ab1cb /bin/bash bash-4.4# pwd /var/www/html/[/]
其中 -i 选项表示打开标准输入接受用户输入命令,默认为 false;-t 选项表示分配一个伪终端,默认为 false。
9. 删除容器
使用 docker rm 可以删除指定容器,后面可以跟多个容器 ID,以空格分隔。但是 docker rm 只能删除已经停止的容器,如需删除正在运行的容器,需要添加 -f 选项。
删除所有的容器使用:docker rm -f $(docker ps -a -q)
10. 导入和导出容器
如果需要将容器从一个系统迁移到另外一个系统,此时可以使用 docker export 和 docker import 命令来导出和导入容器。
实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使用 docker import 命令来导入一个容器快照到本地镜像库。这两者的区别在与容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
使用 docker 安装 app 可以参考另外一篇文章:使用 Docker 安装 showdoc
参考文档
所有评论(0)