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