什么是Docker
Docker容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
Docker的用途
1)快速交付你的应用程序
Docker可以为你的开发过程提供完美的帮助。Docker允许开发者在本地包含了应用程序和服务的容器进行开发,之后可以集成到连续的一体化和部署工作流中。
举个例子,开发者们在本地编写代码并且使用Docker和同事分享其开发栈。当开发者们准备好了之后,他们可以将代码和开发栈推送到测试环境中,在该环境进行一切所需要的测试。从测试环境中,你可以将Docker镜像推送到服务器上进行部署。
2)开发和拓展更加简单
Docker的以容器为基础的平台允许高度可移植的工作。Docker容器可以在开发者机器上运行,也可以在实体或者虚拟机上运行,也可以在云平台上运行。
Docker的可移植、轻量特性同样让动态地管理负载更加简单。你可以用Docker快速地增加应用规模或者关闭应用程序和服务。Docker的快速意味着变动几乎是实时的。
3)达到高密度和更多负载
Docker轻巧快速,它提供了一个可行的、符合成本效益的替代基于虚拟机管理程序的虚拟机。这在高密度的环境下尤其有用。例如,构建你自己的云平台或者PaaS,在中小的部署环境下同样可以获取到更多的资源性能。
一个完整的Docker有以下几个部分组成:
dockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器
安装Docker
实验环境:
Selinux iptables off
Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)
(因为docker需要的版本较高,低版本会安装失败,所以我们使用7.3版本)
1.下载安装docker:
[root@foundation8 Desktop]# yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm -y
2.打开docker服务
[root@foundation8 Desktop]# systemctl start docker
3.docker的相关命令
[root@foundation8 ~]# docker info # docker宿主机的信息
[root@foundation8 ~]# docker version # docker的版本
Client:
Version: 17.03.1-ce
API version: 1.27
Go version: go1.7.5
Git commit: c6d412e
Built: Fri Mar 24 00:36:45 2017
OS/Arch: linux/amd64
Server:
Version: 17.03.1-ce
API version: 1.27 (minimum version 1.12)
Go version: go1.7.5
Git commit: c6d412e
Built: Fri Mar 24 00:36:45 2017
OS/Arch: linux/amd64
Experimental: false
现有镜像的导入和容器的使用
镜像用来创建容器,是容器的只读模板,默认可以从 docker hub 上下载。docker 的镜像是
增量修改,每次创建新的镜像都会在父镜像上构建一个增量的层,基于 AUFS 技术。
镜像管理的相关命令
# docker search 查询镜像
# docker pull 拉取镜像
# docker push 推送镜像
# docker save ubuntu > ubuntu.tar 导出镜像
# docker load -i ubuntu.tar 导入镜像
# docker commit 更新镜像
# docker rmi 删除镜像
1.导入镜像
[root@foundation8 Desktop]# docker load -i game2048.tar
011b303988d2: Loading layer 5.05 MB/5.05 MB
36e9226e74f8: Loading layer 51.46 MB/51.46 MB
192e9fad2abc: Loading layer 3.584 kB/3.584 kB
6d7504772167: Loading layer 4.608 kB/4.608 kB
88fca8ae768a: Loading layer 629.8 kB/629.8 kB
Loaded image: game2048:latest
2.查看镜像
[root@foundation8 Desktop]# docker images game2048
REPOSITORY TAG IMAGE ID CREATED SIZE
game2048 latest 19299002fdbe 20 months ago 55.5 MB
容器管理的相关命令
# docker run -it --name vm1 ubuntu bash 创建容器
# docker ps -a 查看容器进程
# docker attach vm1 连接容器
# docker top vm1 查看容器进程
# docker logs vm1 查看容器指令输出 -f 参数可以实时查看
# docker inspect vm1 查看容器详情
# docker stats vm1 查看容器资源使用率
# docker diff vm1 查看容器修改
# docker run -d --name vm1 ubuntu bash -c "while true; do echo westos; sleep 1; done"
后台运行
# docker stop vm1 停止容器
# docker start vm1 启动容器
# docker kill vm1 强制干掉容器
# docker restart vm1 重启容器
# docker pause/unpause vm1 暂停/恢复容器
# docker rm vm1 删除容器
# docker export vm1 > vm1.tar 导出容器
# docker import vm1.tar image 导入容器为镜像 image
3.运行docker
[root@foundation8 Desktop]# docker run -d --name vm1 game2048 # -d打入后台 --name表示为这个容器起的名字是vm1
99d04995f5381736a417e3911e578468b7cf6f372718235dbc6168c8aed71210
4.查看vm1容器的ip
[root@foundation8 Desktop]# docker inspect vm1 # 查看容器详情
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
[root@foundation8 Desktop]# ip addr # 查看ip
9: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ab:60:64:ed brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:abff:fe60:64ed/64 scope link
valid_lft forever preferred_lft forever
11: veth77e1d70@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 8e:24:fb:4d:4d:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::8c24:fbff:fe4d:4db9/64 scope link
valid_lft forever preferred_lft forever
5.在本机浏览器中输入该ip,访问该容器网址(需要注意的是:这个172.17.0.2是自己私有的ip地址,别人不能访问)
6.为了别人可以访问到,我们可以对ip地址进行映射,用nginx的镜像举例
对内:
对外:
7.删除镜像
[root@foundation8 Desktop]# docker stop vm1 # 停止vm1容器
vm1
[root@foundation8 Desktop]# docker container prune # 删除
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
99d04995f5381736a417e3911e578468b7cf6f372718235dbc6168c8aed71210
Total reclaimed space: 4.074 kB
网络拉取镜像:阿里云镜像加速器
1.输入:www.aliyun.com,点击注册–>注册帐号–>登陆—->管理控制台—>点击产品与服务–>容器镜像服务,点击镜像加速器查看配置文件
2.编辑/etc/docker/daemon.json
文件
[root@foundation8 Desktop]# mkdir -p /etc/docker
[root@foundation8 Desktop]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://ywf2cvt1.mirror.aliyuncs.com"]
}
2.重启服务
[root@foundation8 Desktop]# systemctl daemon-reload
[root@foundation8 Desktop]# systemctl restart docker
创建成功后可以进行查找对应的镜像
[root@foundation8 docker]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 9323 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 1386 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 609 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as... 396 [OK]
kong Open-source Microservice & API Management ... 216 [OK]
webdevops/php-nginx Nginx with PHP-FPM 111 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demons... 108
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server ... 63 [OK]
bitnami/nginx Bitnami nginx Docker Image 57 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 43 [OK]
linuxserver/nginx An Nginx container, brought to you by Linu... 38
tobi312/rpi-nginx NGINX on Raspberry Pi / armhf 20 [OK]
blacklabelops/nginx Dockerized Nginx Reverse Proxy Server. 12 [OK]
nginxdemos/nginx-ingress NGINX Ingress Controller for Kubernetes . ... 11
wodby/drupal-nginx Nginx for Drupal container image 10 [OK]
webdevops/nginx Nginx container 8 [OK]
nginxdemos/hello NGINX webserver that serves a simple page ... 8 [OK]
centos/nginx-18-centos7 Platform for running nginx 1.8 or building... 7
1science/nginx Nginx Docker images that include Consul Te... 4 [OK]
centos/nginx-112-centos7 Platform for running nginx 1.12 or buildin... 4
pebbletech/nginx-proxy nginx-proxy sets up a container running ng... 2 [OK]
toccoag/openshift-nginx Nginx reverse proxy for Nice running on sa... 1 [OK]
travix/nginx NGinx reverse proxy 1 [OK]
mailu/nginx Mailu nginx frontend 1 [OK]
ansibleplaybookbundle/nginx-apb An APB to deploy NGINX 0 [OK]
3.拉取镜像
[root@foundation8 Desktop]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Status: Downloaded newer image for nginx:latest
[root@foundation8 Desktop]# docker images nginx # 查看镜像
4.创建容器
[root@foundation8 Desktop]# docker run -d --name vm1 nginx
8b5a11af91dac05030ba3f38b981bf7e1be3c5fd60397d32fbb8e4e04ed5cb61
ctrl+pq将容器打入后台 ctrl+d关闭容器
[root@foundation8 ~]# docker run -it nginx bash # 进入容器
root@e5e31339f4e7:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@e5e31339f4e7:/# [root@foundation8 ~]# # ctlr+pq退出之后,重新连接容器
[root@foundation8 ~]# docker container attach vm1
root@e5e31339f4e7:/# exit # Ctrl+d退出并关闭容器
[root@foundation8 ~]# docker container attach vm1 # 无法进入容器
You cannot attach to a stopped container, start it first
[root@foundation8 ~]# docker start vm1 # 开启容器
vm1
[root@foundation8 ~]# docker container attach vm1
root@e5e31339f4e7:/#
拉取到nginx镜像之后,我们希望在物理主机向容器中的nginx服务传送html发布主页,我们该怎么做呢?
第一种传送首页的方法:在本地远程拷贝
[root@foundation8 Desktop]# vim index.html
<h1>www.westos.org</h1>
[root@foundation8 Desktop]# docker cp index.html vm1:/usr/share/nginx/html
[root@foundation8 Desktop]# docker inspect vm1
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
第二种传送首页的方法:在物理主机打开容器时-v挂载
[root@foundation8 Desktop]# cd /tmp/
[root@foundation8 tmp]# mkdir docker
[root@foundation8 tmp]# cd docker/
[root@foundation8 docker]# mkdir web
[root@foundation8 docker]# cd web/
[root@foundation8 web]# ls
[root@foundation8 web]# docker stop vm1
vm1
[root@foundation8 web]# docker container prune # 移除所有停止的容器
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
8b5a11af91dac05030ba3f38b981bf7e1be3c5fd60397d32fbb8e4e04ed5cb61
2bc6db45884ff96071582631844b686c5e5cdb004329926d1d6cccc26bb75a0c
Total reclaimed space: 24 B
[root@foundation8 web]# vim index.html
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
[root@foundation8 web]# docker run -d --name vm1 -v /tmp/docker/web:/usr/share/nginx/html nginx # 在本地导入nginx的默认发布目录,-v表示把宿主机的目录挂载到容器中
64f77462c1b03a1ebcc843a662b0ac09bf597b4fd76cdb39c407bb41d698667a
数据卷和数据卷容器
在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。
容器中数据管理主要有两种方式:数据卷和数据卷容器。
数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。
数据卷
数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。
数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。
数据卷的特性
数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
数据卷可以在容器之间共享和重用
可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
对数据卷的更新不会影响镜像的更新
数据卷会一直存在,即使挂载数据卷的容器已经被删除
[root@foundation8 web]# docker stop vm1
vm1
[root@foundation8 web]# docker rm -f vm1
vm1
[root@foundation8 web]# docker run -it --name vm1 -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro nginx bash
## 创建一个容器
## -v:挂载
## /tmp/data1:/data1 将宿主机的目录/tmp/data1影射到容器中的/data1目录
## /data1 默认可读写 /data2 只读
## 将宿主机/etc/yum.repos.d/dvd.repo文件映射到容器/etc/yum.repos.d/dvd.repo文件,可以使用yum源,但不能进行修改
root@845749407d5c:/# ls
bin data1 dev home lib64 mnt proc run srv tmp var
boot data2 etc lib media opt root sbin sys usr
root@845749407d5c:/# cd /etc/yum.repos.d/
root@845749407d5c:/etc/yum.repos.d# ls
dvd.repo
root@845749407d5c:/etc/yum.repos.d# cd /data2/
root@845749407d5c:/data2# touch file # /data2只读
touch: cannot touch 'file': Read-only file system
root@845749407d5c:/data2# cd /data1/ # /data1可读写
root@845749407d5c:/data1# touch file
root@845749407d5c:/data1# ls
file
在宿主机的/tmp目录对目录data1,data2进行操作
[root@foundation8 ~]# cd /tmp/
[root@foundation8 tmp]# cd data1/
[root@foundation8 data1]# touch file1
root@845749407d5c:/data1# ls
file file1
root@845749407d5c:/data1# rm -f file1
[root@foundation8 data2]# touch file2
root@845749407d5c:/data2# ls
file2
root@845749407d5c:/data2# rm -fr file2
rm: cannot remove 'file2': Read-only file system
[root@foundation8 web]# docker rm -f vm1
vm1
数据卷容器
用户需要在多个容器之间共享一些数据,就可以使用数据卷容器。
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫数据卷容器。
在容器中创建一个数据卷
[root@foundation8 web]# docker create --name datavol -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro nginx bash
2862fe11c05aa528746a5190887043111c34c2420ccab76c3c2deb5d7bf2ac34
[root@foundation8 web]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2862fe11c05a nginx "bash" 47 seconds ago Created datavol
[root@foundation8 web]# docker run -it --name vm1 --volumes-from datavol nginx bash
root@52465d9c7fb5:/# ls
bin data1 dev home lib64 mnt proc run srv tmp var
boot data2 etc lib media opt root sbin sys usr
root@52465d9c7fb5:/# cd /data1/
root@52465d9c7fb5:/data1# ls
file
root@52465d9c7fb5:/data1# cd /data2/
root@52465d9c7fb5:/data2# ls
file2
root@52465d9c7fb5:/data2# cd /etc/yum.repos.d/
root@52465d9c7fb5:/etc/yum.repos.d# ls
dvd.repo
root@52465d9c7fb5:/etc/yum.repos.d# exit
[root@foundation8 web]# docker run -it --name vm2 -v /tmp/backup:/backup nginx bash
root@222e9142b5a5:/# ls
backup boot etc lib media opt root sbin sys usr
bin dev home lib64 mnt proc run srv tmp var
[root@foundation8 web]# docker run --rm -v /tmp/backup:/backup ubuntu tar cf /backup/etc.tar /etc
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
c64513b74145: Pull complete
01b8b12bad90: Pull complete
c5d85cf7a05f: Pull complete
b6b268720157: Pull complete
e12192999ff1: Pull complete
Digest: sha256:3f119dc0737f57f704ebecac8a6d8477b0f6ca1ca0332c7ee1395ed2c6a82be7
Status: Downloaded newer image for ubuntu:latest
tar: Removing leading `/' from member names
[root@foundation8 web]# cd /tmp/backup/
[root@foundation8 backup]# ls
etc.tar
[root@foundation8 backup]# docker run -d --name vm1 game2048
[root@foundation8 backup]# docker inspect vm1 | grep Pid
"Pid": 12886,
"PidMode": "",
"PidsLimit": 0,
[root@foundation8 backup]# ps ax
12886 ? Ss 0:00 /bin/sh -c sed -i "s/ContainerID: /Containe
[root@foundation8 backup]# cd /proc/
[root@foundation8 proc]# cd 12886/
[root@foundation8 12886]# ls
attr environ mem pagemap stat
autogroup exe mountinfo personality statm
auxv fd mounts projid_map status
cgroup fdinfo mountstats root syscall
clear_refs gid_map net sched task
cmdline io ns schedstat timers
comm limits numa_maps sessionid uid_map
coredump_filter loginuid oom_adj setgroups wchan
cpuset map_files oom_score smaps
cwd maps oom_score_adj stack
[root@foundation8 12886]# cd ns
[root@foundation8 ns]# ls
ipc mnt net pid user uts
[root@foundation8 ns]# ll
total 0
lrwxrwxrwx 1 root root 0 Aug 19 15:11 ipc -> ipc:[4026532399]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 mnt -> mnt:[4026532397]
lrwxrwxrwx 1 root root 0 Aug 19 15:08 net -> net:[4026532402]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 pid -> pid:[4026532400]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Aug 19 15:11 uts -> uts:[4026532398]
[root@foundation8 ns]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0021cc7099f2 no enp0s25
vnet0
vnet1
vnet2
vnet3
vnet4