Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口( 类似 iPhone 的 app ),更重要的是容器性能开销极低。

Docker 的应用场景:
- Web 应用的自动化打包和发布;
- 自动化测试和持续集成、发布;
- 在服务型环境中部署和调整数据库或其他的后台应用;
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点:
1、简化程序:
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入 Docker 中进行管理。方便快捷已经是 Docker 的最大优势,过去需要用数天乃至数周的任务,在 Docker 容器的处理下,只需要数秒就能完成。
2、避免选择恐惧症:
如果你有选择恐惧症,还是资深患者。那么你可以使用 Docker 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3、节省开支:
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
一个完整的 Docker 有以下几个部分组成:
- DockerClient 客户端
- Docker Daemon 守护进程
- Docker Image 镜像
- DockerContainer 容器
Docker 架构:
Docker 使用客户端-服务器( C / S )架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
Docker 镜像( Images ):Docker 镜像是用于创建 Docker 容器的模板。
Docker 容器( Container ):容器是独立运行的一个或一组应用。
Docker 客户端( Client ):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
Docker 主机( Host ):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 仓库( Registry ):
- Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库;
- Docker Hub 提供了庞大的镜像集合供使用。
Docker Machine:Docker Machine 是一个简化 Docker 安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装 Docker ,比如 VirtualBox 、Digital Ocean 、Microsoft Azure 。
在 CentOS Linux 7 上安装 Docker :
Ricky 在 VMware 里最小化安装了一个 CentOS Linux 7 来做测试,具体 ISO 镜像名称为:CentOS-7-x86_64-Minimal-1810.iso ,具体 CentOS Linux 7 版本号为:
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@localhost ~]#
1 、现在我们执行更新命令,将操作系统升级到最新的版本:
[root@localhost ~]# sudo yum -y update
2 、卸载旧版本(如果安装过旧版本的话):
[root@localhost ~]# sudo yum -y remove docker docker-common docker-selinux docker-engine
3 、安装需要的软件包,yum-util 提供 yum-config-manager 功能,另外两个是 devicemapper 驱动依赖的:
[root@localhost ~]# sudo yum -y install yum-utils device-mapper-persistent-data lvm2
4 、设置 yum 源:
[root@localhost ~]# sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5 、可以查看所有仓库中所有 Docker 版本,并选择特定版本安装:
[root@localhost ~]# sudo yum list docker-ce --showduplicates | sort -r * updates: mirrors.aliyun.com Loading mirror speeds from cached hostfile Loaded plugins: fastestmirror * extras: mirrors.aliyun.com docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.7-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.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 18.06.2.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable * base: mirrors.aliyun.com Available Packages [root@localhost ~]#
6 、安装 Docker :
这里安装最新的稳定版本即可:
[root@localhost ~]# sudo yum -y install docker-ce # 由于 repo 中默认只开启 stable 仓库,故这里安装的是最新稳定版
7 、安装特定版本请使用如下命令:
[root@localhost ~]# sudo yum -y install <FQPN> # 例如:sudo yum -y install docker-ce-17.12.0.ce
8、启动并加入开机启动:
[root@localhost ~]# sudo systemctl start docker [root@localhost ~]# sudo systemctl enable docker
9、验证安装是否成功(有 Client 和 Service 两部分表示 Docker 安装启动都成功了):
[root@localhost ~]# docker version Client: Docker Engine - Community Version: 19.03.1 API version: 1.40 Go version: go1.12.5 Git commit: 74b1e89 Built: Thu Jul 25 21:21:07 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.1 API version: 1.40 (minimum version 1.12) Go version: go1.12.5 Git commit: 74b1e89 Built: Thu Jul 25 21:19:36 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18.0 GitCommit: fec3683 [root@localhost ~]#
在 CentOS Linux 7 上使用 Docker :
1 、现在我们下载一个 Docker 上的 nginx 镜像:
[root@localhost ~]# docker pull nginx
2 、查看当前可使用的镜像:
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest e445ab08b2be 2 weeks ago 126MB [root@localhost ~]#
3 、创建一个容器并运行(注意:这不是运行容器的命令,是创建容器的命令):
[root@localhost ~]# docker run -it --name nginx_test nginx /bin/bash
命令解析:
- docker :docker 的二进制执行文件;
- run :与前面的 docker 组合,docker run 命令表示创建一个容器并运行;
- -i :让容器内的标准输入( STDIN )保持打开;
- -t :让 docker 分配一个伪终端并绑定到容器的标准输入上;
- -it :就是同时使用上述两个参数,让 Docker 运行的容器具备交互的能力;
- –name nginx_test :给创建的容器自定义一个名字(当前起的名字为 nginx_test );
- nginx :表示使用名为 nginx 的镜像来创建当前的容器;
- /bin/bash :表示在容器里执行该命令,即启动容器内的终端,这样我们才能通过容器内的终端来操作容器。
4 、上述命令执行后我们就直接进入容器内的终端了,我们可以在容器内使用 cat /proc/version 命令查看当前系统的版本信息、使用 ls 命令查看当前目录下的文件、使用 which nginx 命令查看 Nginx 的可执行文件位于哪个目录、使用 nginx -V 命令查看 Nginx 的版本号:
[root@localhost ~]# docker run -it --name nginx_test nginx /bin/bash root@898f535b5d36:/# root@898f535b5d36:/# root@898f535b5d36:/# cat /proc/version Linux version 3.10.0-957.27.2.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Mon Jul 29 17:46:05 UTC 2019 root@898f535b5d36:/# root@898f535b5d36:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@898f535b5d36:/# root@898f535b5d36:/# which nginx /usr/sbin/nginx root@898f535b5d36:/# root@898f535b5d36:/# nginx -V nginx version: nginx/1.17.2 built by gcc 8.3.0 (Debian 8.3.0-6) built with OpenSSL 1.1.1c 28 May 2019 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.17.2/debian/debuild-base/nginx-1.17.2=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' root@898f535b5d36:/# root@898f535b5d36:/# exit exit [root@localhost ~]#
我们可以使用 exit 命令或者使用快捷键 Ctrl + D 来退出容器(注意:此时整个容器都会结束运行);如果只是退出容器的终端,而不想让容器结束运行,请使用快捷键 Ctrl + Q + P 。
5 、因为刚刚我们执行了 exit 命令,所以现在来看看容器是否还在运行。
通过 docker ps 命令我们可以看到,当前没有任何容器正在运行:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]#
使用命令 docker ps -a 可以查看当前服务器上所有的容器:
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 898f535b5d36 nginx "/bin/bash" 3 days ago Exited (0) About a minute ago nginx_test [root@localhost ~]#
使用命令 docker ps -l 可以查看最后一个创建的容器:
[root@localhost ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 898f535b5d36 nginx "/bin/bash" 3 days ago Exited (0) About a minute ago nginx_test [root@localhost ~]#
docker ps 命令的其他一些参数:
[root@localhost ~]# docker ps --help 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 [root@localhost ~]#
6 、现在我们启动容器,再使用快捷键 Ctrl + Q + P 退出容器看看。
使用命令 docker start xxx( xxx 为容器名或容器 ID )可以启动已经创建好的容器:
[root@localhost ~]# docker start nginx_test nginx_test [root@localhost ~]#
使用命令 docker attach xxx( xxx 为容器名或容器 ID )可以连接一个正在运行的容器:
[root@localhost ~]# docker attach nginx_test root@898f535b5d36:/# root@898f535b5d36:/# cat /proc/version Linux version 3.10.0-957.27.2.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Mon Jul 29 17:46:05 UTC 2019 root@898f535b5d36:/#
现在我们按下快捷键 Ctrl + Q + P ,可以看到已经退出了容器:
root@898f535b5d36:/# read escape sequence
[root@localhost ~]#
那容器是否还在后台运行呢?我们使用 docker ps 命令看一下:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
898f535b5d36 nginx "/bin/bash" 3 days ago Up 4 minutes 80/tcp nginx_test
[root@localhost ~]#
没问题,容器还在运行。
7 、关闭一个容器:
[root@localhost ~]# docker stop nginx_test nginx_test [root@localhost ~]#
使用 docker ps 命令可以看到容器已经关闭:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]#
8 、删除一个容器:
[root@localhost ~]# docker rm nginx_test nginx_test [root@localhost ~]#
使用 docker ps -a 命令可以看到容器已经删除掉了:
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost ~]#
9 、删除一个镜像:
[root@localhost ~]# docker rmi nginx Untagged: nginx:latest Untagged: nginx@sha256:eb3320e2f9ca409b7c0aa71aea3cf7ce7d018f03a372564dbdb023646958770b Deleted: sha256:e445ab08b2be8b178655b714f89e5db9504f67defd5c7408a00bade679a50d44 Deleted: sha256:4f71ea073b438369b87f20ad9cc8aca17efcd777a98ef6a396cebaa84355e46c Deleted: sha256:1758ea933cbf0900bc59fa45893440675d66d8848c3595f6f6ae9cdac34ecaf0 Deleted: sha256:d8a33133e477d367977987129313d9072e0ec80894ed4c52c2d88186f354c29a [root@localhost ~]#
使用 docker images 命令可以看到镜像已经删除掉了:
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE [root@localhost ~]#
10 、生产环境:如何确保在服务器开机的时候自动启动容器并将容器的相关端口映射到服务器呢?
我们现在重新下载刚刚被删除掉的 nginx 镜像:
[root@localhost ~]# docker pull nginx:latest
nginx:yyy 中的 yyy 表示 TAG(标签),latest 表示最新版的 Nginx 。
创建一个容器并运行(注意:这不是运行容器的命令,是创建容器的命令):
[root@localhost ~]# docker run -dit --name nginx_test -p 8080:80 --restart always nginx /bin/bash
命令解析:
- docker :docker 的二进制执行文件;
- run :与前面的 docker 组合,docker run 命令表示创建一个容器并运行;
- -d :在后台运行容器;
- -i :让容器内的标准输入( STDIN )保持打开;
- -t :让 docker 分配一个伪终端并绑定到容器的标准输入上;
- -dit :就是同时使用上述三个参数,让 Docker 运行的容器具备交互的能力,再在后台运行容器;
- –name nginx_test :给创建的容器自定义一个名字(当前起的名字为 nginx_test );
- -p 8080:80 :映射端口号,将容器里的 80 端口映射到服务器的 8080 端口;
- –restart always :只要容器不在运行状态就会启动容器;
- nginx :表示使用名为 nginx 的镜像来创建当前的容器;
- /bin/bash :表示在容器里执行该命令,即启动容器内的终端,这样我们才能通过容器内的终端来操作容器。
使用命令 docker ps 我们可以看到,容器正在后台运行:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d2ec7b3a8a65 nginx "/bin/bash" 6 minutes ago Restarting (0) 3 seconds ago nginx_test
[root@localhost ~]#
使用命令 netstat -ntlp 我们可以看到一个名为 docker-proxy 的进程正在监听服务器的 8080 端口:
# 先安装 net-tools ,否则无法使用 netstat 命令
[root@localhost ~]# yum -y install net-tools
[root@localhost ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1241/master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1076/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1241/master
tcp6 0 0 :::8080 :::* LISTEN 4707/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1076/sshd
[root@localhost ~]#
如果看不到上述这一项,请关闭容器后再打开:
[root@localhost ~]# docker stop nginx_test nginx_test [root@localhost ~]# docker start nginx_test
那我们现在是否能在服务器上访问容器内的 Nginx 呢?其实还不能。
[root@localhost ~]# curl http://127.0.0.1:8080 curl: (7) Failed connect to 127.0.0.1:8080; Connection refused [root@localhost ~]#
因为容器中的 Nginx 进程还没有启动。现在我们进入容器,并启动 Nginx ,再按快捷键 Ctrl + Q + P 退出容器:
[root@localhost ~]# docker attach nginx_test root@37b7209b148b:/# nginx root@37b7209b148b:/# root@37b7209b148b:/# read escape sequence [root@localhost ~]#
现在在服务器上访问容器内的 Nginx ,没有问题了:
[root@localhost ~]# curl http://127.0.0.1:8080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ... </body> </html> [root@localhost ~]#
这里需要注意的是,容器内的 Nginx 配置文件位于 /etc/nginx 和 /etc/nginx/conf.d 目录,站点根目录位于 /usr/share/nginx/html 。
现在我们重启服务器,看看容器是否会自动启动:
[root@localhost ~]# reboot Last login: Wed Aug 14 11:32:45 2019 from 192.168.177.1 [root@localhost ~]#
我们使用 docker ps 命令看看容器是否自动启动了:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0dce09b186f nginx "/bin/bash" 4 hours ago Up 20 minutes 0.0.0.0:8080->80/tcp nginx_test [root@localhost ~]#
没有问题,容器随服务器自动启动了。
那如何让容器在启动的时候,自动启动容器内的程序呢?正在研究中 …
(未完待续)
参考自:
- https://www.runoob.com/docker/docker-tutorial.html
- http://www.pianshen.com/article/9510232632/
发表评论?