在 CentOS Linux 7 上安装和使用 Docker

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

docker
docker

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 ):

  1. Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库;
  2. 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/

这篇文章对你有帮助吗?

相关文章

发表评论?

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据