← 返回首页
CentOS7下安装Docker
发表时间:2019-12-27 17:33:54
讲解在CentOS7下如何安装Docker和Docker常用命令

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

那Docker由什么组成呢, 包括三个基本概念:

仓库(Repository) 镜像(Image) 容器(Container)

打个比方:你如果想玩英雄联盟中骚气的亚索,你首先得有这个英雄(Docker的镜像),然后你得花金币去英雄商店(Docker的仓库)买,接着进游戏就会看到一个半蹲的发型飘逸的剑客(Docker的容器),所以:

1)其中Registry是Docker用于存放镜像文件的仓库,Docker 仓库的概念跟Git 类似(就像商店存放所有的英雄,只是更改英雄的权限在某些非程序员手里)。

2)所谓镜像就是构建容器的源代码,是一个只读的模板,由一层一层的文件系统组成的,类似于虚拟机的镜像(英雄也是只读的,有自己的技能被动,你也不能进行操作)。

3)那么容器就是由Docker镜像创建的运行实例,类似于虚拟机,容器之间是相互隔离的,包含特定的应用及其所需的依赖文件(好比每个英雄都是隔离的,都有自己的皮肤,技能以及走的路线)。

以上关系如下图所示:

1.Docker的安装 docker官方说要安装3.8以上的Docker,建议Linux内核在3.10以上(ubuntu下要linux内核3.8以上, RHEL/Centos 的内核修补过, centos6.5的版本就可以——这个可以试试),可以使用以下命令检查:

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# uname -r
3.10.0-1062.1.2.el7.x86_64

如果版本在3.10以上说明符合安装要求。

1)把yum包更新到最新

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# yum update

2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的.

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

3)设置yum源(选择其中一个) yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4)可以查看所有仓库中所有docker版本,并选择特定版本安装.

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
可安装的软件包
 * updates: mirrors.cn99.com
Loading mirror speeds from cached hostfile
 * extras: mirrors.aliyun.com
docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
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

5)安装Docker,命令:yum install docker-ce-版本号,我选的是docker-ce-18.03.1.ce,如下:

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# yum install docker-ce-18.03.1.ce

6)启动Docker,命令:systemctl start docker,然后加入开机启动,如下:

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# systemctl start docker
[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# systemctl enable docker

2.开启远程连接

编辑docker.server文件

vim /usr/lib/systemd/system/docker.service

添加远程连接配置。

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

如果报以下错误:

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

修改配置如下:

ExecStart=/usr/bin/dockerd -H  unix:///var/run/docker.sock  -H tcp://192.168.5.23:2375

#注意:如果是云服务器
ExecStart=/usr/bin/dockerd -H  unix:///var/run/docker.sock  -H tcp://0.0.0.0:2375

重新加载Docker配置生效

systemctl daemon-reload 
systemctl restart docker

3.Docker常用命令

1)查看镜像。

#查看docker的版本
[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker version --format '{{.Server.Version}}'
[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker images

2)查看帮助

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker --help

3)拉取镜像

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker pull ubuntu

4)运行容器

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker run ubuntu /bin/echo "Hello world"

5)拉取web镜像并执行web容器

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker pull training/webapp
Using default tag: latest
latest: Pulling from training/webapp
e190868d63f8: Pull complete 
909cd34c6fd7: Pull complete 
0b9bfabab7c1: Pull complete 
a3ed95caeb02: Pull complete 
10bbbc0fc0ff: Pull complete 
fca59b508e9f: Pull complete 
e7ae2541b15b: Pull complete 
9dd97ef58ce9: Pull complete 
a4c1b0cb7af7: Pull complete 
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker run -d -p 32768:5000 training/webapp python app.py
a0ab8914a4a0b8b18fc039561a69b149bb4ef8011bf58a14ddf0f35ea749a68b

Docker 开放了 5000 端口(默认 Python Flask 端口),我们指定把该端口映射到主机端口 32768 上。通过 -p 参数来设置不一样的端口

打开浏览器测试运行: 注意:首先要保证您的云服务器开放了32768端口。

6)停止web容器运行

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
a0ab8914a4a0        training/webapp     "python app.py"     4 minutes ago       Up 4 minutes        0.0.0.0:32768->5000/tcp   nifty_swirles
[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker stop a0ab8914a4a0
a0ab8914a4a0

7)删除容器和镜像

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
a0ab8914a4a0        training/webapp     "python app.py"          8 minutes ago       Exited (137) 2 minutes ago                       nifty_swirles
e95ba4eddb13        ubuntu              "/bin/echo 'Hello wo…"   31 minutes ago      Exited (0) 31 minutes ago                        confident_volhard

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker rm nifty_swirles
nifty_swirles

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              549b9b86cb8d        8 days ago          64.2MB
training/webapp     latest              6fae60ef3446        4 years ago         349MB

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker rmi training/webapp
Untagged: training/webapp:latest
Untagged: training/webapp@sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Deleted: sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557
Deleted: sha256:875bde2b9e2d99e7c1362993645a474fe621475c6fc1b1623c9ed5312b7bdeae
Deleted: sha256:bbdb5ee3757ef8f2633694016df5840fc3410422b37c22f98c0300e295ce75cc
Deleted: sha256:d718446240e3f48a904ad4bbf2a1f61737c5d70df35b8210d674a9517cdc9803
Deleted: sha256:a890440f4933412f9aafb056eb2f07f2276ed756631a81e960d4a8a6de5857a3
Deleted: sha256:68a74799a9e67953725058ef21a530f100025088943446aa60c73fba7beebd47
Deleted: sha256:b23e4b6b440d0e9ab4ffd7852fbf81edd6d5eb606e24d4950d83502e14af2856
Deleted: sha256:f115b0453c71fb4d21fdb6f579201984bd5033ae28ed5908978576a19282418b
Deleted: sha256:b0da82df3229cd06a2992449f2310caaa42f09fdfb088f4a98c5ea587ea85c7e
Deleted: sha256:f6f162dad6e64715d3d07e21d4574733860a557f2f89228d07909c1f6f04e882
Deleted: sha256:088f9eb16f16713e449903f7edb4016084de8234d73a45b1882cf29b1f753a5a
Deleted: sha256:799115b9fdd1511e8af8a8a3c8b450d81aa842bbf3c9f88e9126d264b232c598
Deleted: sha256:3549adbf614379d5c33ef0c5c6486a0d3f577ba3341f573be91b4ba1d8c60ce4
Deleted: sha256:1154ba695078d29ea6c4e1adb55c463959cd77509adf09710e2315827d66271a

[root@iZ2zeivn9mqkylfc0vwvpnZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              549b9b86cb8d        8 days ago          64.2MB

3.虚拟更改IP之后Docker配置

虚拟机更改IP之后,由于Docker绑定的IP也被修改,造成Docker无法启动。

查看docker配置文件位置:

systemctl show --property=FragmentPath docker

修改docker.service的配置。

[root@localhost conf]# cd /usr/lib/systemd/system/

[root@localhost conf]# vim docker.service


[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H unix:///var/run/docker.sock -H tcp://192.168.6.23:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always

更改IP后重启docker.

systemctl daemon-reload
systemctl start docker

4.Docker SSL加密访问

docker启用远程管理端口默认没有ssl,很容易被当作矿机使用。

生成ca证书,在服务器上创建一个文件夹,用于存放证书。

mkdir /usr/tls
cd /usr/tls

创建key,输入密码,确认密码,后面需要使用这个密码。

openssl genrsa -aes256 -out ca-key.pem 4096

填写一些信息,用于生成加密的字符串,随便填就可以了,主要是为了生成加密字符串。

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

Country Name (2 letter code) [XX]:china
State or Province Name (full name) []:Guizhou
Locality Name (eg, city) [Default City]:Guiyang
Organization Name (eg, company) [Default Company Ltd]:gmsj
Organizational Unit Name (eg, section) []:java
Common Name (eg, your name or your server's hostname) []:zlh

生成server-key.pem

openssl genrsa -out server-key.pem 4096

绑定IP或者域名,$HOST填写你的服务器外网IP 或者服务器外网域名。

openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr

生成ca-key,需要输入之前的密码。

echo extendedKeyUsage = serverAuth >> extfile.cnf

openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out server-cert.pem -extfile extfile.cnf

openssl genrsa -out key.pem 4096

openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo extendedKeyUsage = clientAuth >> extfile.cnf

生成cert.pem。


openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \-CAcreateserial -out cert.pem -extfile extfile.cnf

修改权限。

chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

然后修改docker.service。

vim /lib/systemd/system/docker.service

在Execstart中加入我们刚刚生成的证书。

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/usr/tls/ca.pem --tlscert=/usr/tls/server-cert.pem --tlskey=/usr/tls/server-key.pem
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

重启docker。

systemctl daemon-reload
systemctl restart docker