一个完整的 Docker 由以下几个部分组成:
DockerClient 客户端
Docker Daemon 守护进程
Docker Image 镜像
DockerContainer 容器
从上图可以知道,虚拟机比 docker 容器多了 Guest OS (Guest Operating System),也就是多云西宁虚拟机时需要多消耗内核存储,因为只要虚拟机开启就会消耗内存;而docker 没有这个,运行时是一个进程,所以不会消耗太多的资源。
容器的出现对于开发人员来说,一次构建任何地方都可以运行;
对于运维人员来说,一次构建就可以运行任何。
Docker 使用客户端 - 服务器(C/S)架构,使用远程API管理和创建Docker 容器。Docker 客户端与 Docker 守护进程通信,后者负责构建,运行和分发 Docker容器。Docker客户端和守护进程可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用REST API,通过UNIX套接字或网络接口进行通信。
Client:客户端通过命令行或其他工具与守护进程通信,客户端会将这些命令发送给守护进程,然后执行这些命令。命令使用Docker API,Docker客户端可以与多个守护进程通信。
Docker daemon:Docker守护进程(docker daemon)监听Docker API请求并管理Docker对象,如镜像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker Host:Docker Host 是物理机或虚拟机,用于执行Docker守护进程的仓库。
Docker Registry:Docker仓库用于存储Docker镜像,可以是Docker Hub这种公共仓库,也可以是个人搭建的私有仓库。使用docker pull或docker run命令时,将从配置的仓库中提取所需的镜像。使用docker push命令时,镜像将被推送到配置的仓库。
https://docs.docker.com/
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/
此处用已经下载好的版本来完成安装:
将下载好的软件包放在真机的 apache 默认发布目录中,然后在虚拟机中编辑原件仓库即可;
[root@server1 ~]# vim /etc/yum.repos.d/docker.repo
[root@server1 ~]# cat /etc/yum.repos.d/docker.repo
[docker]
name=docker-ce
baseurl=http://172.25.25.250/docker-ce
gpgcheck=0
[root@server1 ~]# yum repolist ##列出软件仓库的信息
[root@server1 ~]# yum install docker-ce -y ##安装docker 软件包
[root@server1 ~]# systemctl enable --now docker.service ##设定开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@server1 ~]# docker info ##查看信息
开启容器之后,在当前主机上会开启一个桥接接口;此处所有容器的网关为docker0 上的信息;
[root@server1 ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 19.03.15
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.6 (Maipo)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.952GiB
Name: server1
ID: TLHU:36PR:7S7W:JCMA:EQ4D:6GM3:376K:LFRV:A4CP:TCNF:HQ6A:FCSC
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
注:此处查看到的信息有两个警告信息;这是容器桥接的问题,是防防火墙的原因,因为容器需要防火墙的支持。
[root@server1 ~]# sysctl -a | grep bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@server1 ~]# cd /etc/sysctl.d/
[root@server1 sysctl.d]# vim docker.conf
[root@server1 sysctl.d]# cat docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server1 sysctl.d]# sysctl --system ##使其识别
[root@server1 sysctl.d]# docker info ##此时再次查看就没有警告信息
Docker通过镜像创建容器,而镜像存储在仓库中;
容器内包含自己需要的内容和设置,与外部交互需要进行端口映射。
[root@server1 sysctl.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
此时没有镜像,可以用命令docker pull nginx
来拉去 nginx 的镜像,在拉取的过程中可能网速的原因并不是很快,所以可以做加速器来使用国内的镜像;
[root@server1 sysctl.d]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# vim daemon.json
[root@server1 docker]# cat daemon.json
{
"registry-mirrors": ["https://vo5twm71.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl reload docker.service ##重启服务之后,此时便可以查看到其加速地址
[root@server1 docker]# docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 19.03.15
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: Red Hat Enterprise Linux Server 7.6 (Maipo)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.952GiB
Name: server1
ID: TLHU:36PR:7S7W:JCMA:EQ4D:6GM3:376K:LFRV:A4CP:TCNF:HQ6A:FCSC
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://vo5twm71.mirror.aliyuncs.com/ ##使用加速器的地址
Live Restore Enabled: false
此时再次拉取镜像时就会快很多;
docker 常用命令:
docker search nginx ##上传镜像
[root@server1 docker]# docker search yakexi007 ##搜索镜像
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
yakexi007/game2048 0
yakexi007/mario 0
yakexi007/nginx 0
[root@server1 docker]# docker pull yakexi007/game2048 ##拉取镜像
Using default tag: latest
latest: Pulling from yakexi007/game2048
534e72e7cedc: Pull complete
f62e2f6dfeef: Pull complete
fe7db6293242: Pull complete
3f120f6a2bf8: Pull complete
4ba4e6930ea5: Pull complete
Digest: sha256:8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
Status: Downloaded newer image for yakexi007/game2048:latest
docker.io/yakexi007/game2048:latest
[root@server1 docker]# docker images ##查看镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
yakexi007/game2048 latest 19299002fdbe 4 years ago 55.5MB
[root@server1 docker]# docker history yakexi007/game2048 ##查看镜像的打包历史
IMAGE CREATED CREATED BY SIZE COMMENT
19299002fdbe 4 years ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "sed … 0B
<missing> 4 years ago /bin/sh -c #(nop) EXPOSE 80/tcp 0B
<missing> 4 years ago /bin/sh -c #(nop) COPY dir:cb74e9c037a3d501c… 600kB
<missing> 4 years ago /bin/sh -c #(nop) MAINTAINER Golfen Guo
<missing> 4 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 4 years ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0B
<missing> 4 years ago /bin/sh -c #(nop) COPY file:d15ceb73c6ea776c… 1.1kB
<missing> 4 years ago /bin/sh -c #(nop) COPY file:af94db45bb7e4b8f… 643B
<missing> 4 years ago /bin/sh -c GPG_KEYS=B0F4253373F8F6F510D42178… 50.1MB
<missing> 4 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.7 0B
<missing> 4 years ago /bin/sh -c #(nop) MAINTAINER NGINX Docker M… 0B
<missing> 4 years ago /bin/sh -c #(nop) ADD file:7afbc23fda8b0b387… 4.8MB
[root@server1 docker]# docker run -d --name demo -p 80:80 yakexi007/game2048
42ce251ebfa9bda76b2bce1df56783e3d034fb4fafb6ecb29a691d0dcfd2c300
其中在运行容器中加入的参数含义:
run -->创建并启动
-d --> 打入后台
–name --> 起名
-p --> 做端口影射,为了访问容器内的镜像,:前面为真实主机的端口地址,后面为容器内的端口信息。
运行之后可以查看端口信息:
[root@server1 docker]# netstat -antulp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3227/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3329/master
tcp 0 0 172.25.25.1:54636 172.25.25.250:80 TIME_WAIT -
tcp 0 0 172.25.25.1:22 172.25.25.250:48296 ESTABLISHED 3487/sshd: root@pts
tcp6 0 0 :::80 :::* LISTEN 15345/docker-proxy ##为docker 影射后的信息
tcp6 0 0 :::22 :::* LISTEN 3227/sshd
tcp6 0 0 ::1:25 :::* LISTEN 3329/master
此时在网页中访问本机的80端口时,会映射到容器中的80 端口;
运行容器之后可以用命令来查看容器的进程信息:
[root@server1 docker]# docker ps ##列出当前运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42ce251ebfa9 yakexi007/game2048 "/bin/sh -c 'sed -i …" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, 443/tcp demo
[root@server1 docker]# docker ps -a ##列出所有的容器包括没有运行的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42ce251ebfa9 yakexi007/game2048 "/bin/sh -c 'sed -i …" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, 443/tcp demo
可以用命令来回收掉正在运行的容器:
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42ce251ebfa9 yakexi007/game2048 "/bin/sh -c 'sed -i …" 7 minutes ago Up 7 minutes 0.0.0.0:80->80/tcp, 443/tcp demo
[root@server1 docker]# docker rm -f demo
demo
[root@server1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
当容器正在运行时必须加入 -f 参数来强制回收;也可以先关闭容器再来回收,即可不用加参数 -f 。
启动 docker:
systemctl start docker
systemctl enable docker
导入镜像:
docker load -i game2048
当运行一个容器之后可以用命令 docker inspect demo
来查看运行的容器的信息,以及分配到的ip 等信息;