Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机( VM)额外的操作系统开销,提高资源利用率。
原理:建立-->传送-->运行
架构:C/S架构
组件:镜像(Image)、容器(Container)、仓库(Repository)
Docker与VM的区别:
docker与Openstack的对比
Docker用途:简单配置、代码流水线管理、开发效率、应用隔离、服务器整合、调试能力、多租户、快速部署
Docker改变了什么?
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致性
面向架构:自动化扩容
Docker环境的安装部署
环境准备(centos7)
yum install -y docker systemctl start docker systemctl enable docker
镜像的查看(docker images信息结果包括:镜像仓库、标签、镜像ID、创建时间、镜像大小 )
[root@linux-node2 ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/centos latest 60e65a8e4030 36 hours ago 196.6 MB docker.io/nginx latest 813e3731b203 9 days ago 133.8 MB docker.io/registry latest a8706c2bfd21 2 weeks ago 422.8 MB
镜像的导出、导入和下载(可以将本机下载的镜像导出,然后将导出文件上传到别的机器上,在别的机器上进行镜像导入)
1 2 3 4 5 |
|
镜像的删除(rmi后面可以跟多个id,用空格隔开)
docker rmi container_id
[root@linux-node2 ~]# docker rmi 813e3731b203
首次创建一个简单的容器
[root@linux-node2 ~]# docker run centos /bin/echo "hehe" hehe
命令解读:使用centos镜像,run执行命令,使用echo命令输出hehe
查看容器状态
可以使用docker ps只能看见存活的容器,docker ps -a 查看全部的容器,结果信息表示:
容器ID、使用的镜像、执行的命令、创建的时间、状态、端口、名称(如果不指定,自动生成)
[root@linux-node2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES daeb4d7f7aab centos "/bin/echo hehe" About a minute ago Exited (0) About a minute ago insane_einstein
创建容器
--name:指定容器名称
-t :分配一个tty终端
-i :容器的标准输保持打开的状态
[root@linux-node2 ~]# docker run --name mydocker -t -i centos /bin/bash [root@94ab7a046f7c /]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 11772 1872 ? Ss 03:42 0:00 /bin/bash root 14 0.0 0.0 35888 1472 ? R+ 03:43 0:00 ps aux
这种方式创建自动进入容器,开启的容器只执行/bin/bash;
在容器中查看主机名
[root@94ab7a046f7c /]# hostname 94ab7a046f7c [root@94ab7a046f7c /]# exit
启动、停止容器
[root@linux-node2 ~]# docker stop ID
[root@linux-node2 ~]# docker start ID
进入容器
[root@linux-node2 ~]# docker attach 94ab7a046f7c
[root@94ab7a046f7c /]#
删除容器
[root@linux-node2 ~]# docker rm ID/名称 加-f 强制删除,包括正在运行中的容器
映射
随机映射
端口的映射是系统自动分配的?
[root@linux-node2 ~]# docker run -d -P nginx 90316d97ee975b4e62e1927a9fb31f20703556b1a3ea07880d0c68dcb5bbd3bb [root@linux-node2 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 90316d97ee97 nginx "nginx -g 'daemon off" 25 seconds ago Up 23 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp ecstatic_almeida
指定映射
指定端口的映射
[root@linux-node2 ~]# docker run -d -p 81:80 nginx 0294a8f5b4fc81ba31383a8eb98ec62b136826eba92360c84afd87bf1bf819fc [root@linux-node2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0294a8f5b4fc nginx "nginx -g 'daemon off" 11 seconds ago Up 10 seconds 443/tcp, 0.0.0.0:81->80/tcp admiring_ramanujan
查看日志
[root@linux-node2 ~]# docker log +ID
数据管理
数据卷
默认挂载目录
创建一个数据卷,名称是volume-test1,挂载到data下默认挂载目录
[root@linux-node2 ~]# docker run -it --name volume-test1 -v /data centos [root@1768d6414cfc /]# ls -l /data/ total 0
打开一个新的窗口
列出容器的所有信息,查看mounts模块
[root@linux-node2 ~]# docker inspect 1768d6414cfc "Mounts": [ { "Name": "55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167", "Source": "/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true } ],
查找挂载点并进入
查看挂载的位置 [root@linux-node2 ~]# ll /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data 总用量 0 进入到挂载点 [root@linux-node2 ~]# cd /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data
创建一个cgt测试,并重新回到容器中查看
[root@linux-node2 _data]# mkdir cgt 去容器中查看 [root@1768d6414cfc /]# ls -l /data/ total 4 drwxr-xr-x 2 root root 4096 Jan 4 14:04 cgt
指定挂载目录
将/opt挂载到/opt目录下 [root@linux-node2 ~]# docker run -it --name volume-test1 -v /opt:/opt centos
指定权限
只需要在挂载后面加上权限即可。
加读写rw;只读ro
[root@linux-node2 ~]# docker run -it --name volume-test1 -v /opt:/opt:rw centos
挂载单个文件
记录历史记录
[root@linux-node2 ~]# docker run -it -v ~/.bash_history:/.bash_history centos
数据卷容器
让一个容器可以访问另一个容器的数据卷
启动两个容器
启动nfs容器,挂在一个卷,使用-d直接在后台执行 [root@linux-node2 ~]# docker run -d --name nfs -v /data centos 209bc89b365ad6bc1eeae693ada01c04c2d08e9ee2b8816e624882944c116126 启动test1容器,挂载到nfs的数据卷容器上, [root@linux-node2 ~]# docker run -it --name test1 --volumes-from nfs centos [root@5e399198d6a8 /]# ls /data/ 查看没内容
找到nfs容器的挂载点
(可以使用名称,不仅仅是ID)
找到nfs容器的ID [root@linux-node2 opt]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 209bc89b365a centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago nfs 找到nfs容器的挂载点
[root@linux-node2 _data]# docker inspect nfs [root@linux-node2 opt]# cd /var/lib/docker/volumes/3938c9b1143d41340e148a4c7bc12d13b53966b15380c5b958a9e035897450d5/_data [root@linux-node2 _data]# touch cgt
在test1上查看
到test1上查看 [root@5e399198d6a8 /]# ls /data/ cgt
注意:数据卷容器不论停止还是开启,不影响其他容器挂载使用
如何制作镜像
方式一:手动构建容器
1)创建一个容器mynginx,使用centos镜像
[root@linux-node2 ~]# docker run --name mynginx -it centos [root@f9c7dfb6f552 /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm [root@f9c7dfb6f552 /]# yum -y install nginx [root@f9c7dfb6f552 /]# exit exit
2)基于mynginx容器做一个镜像mynginx:v1
[root@linux-node2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f9c7dfb6f552 centos "/bin/bash" 3 minutes ago Exited (0) 15 seconds ago mynginx 基于mynginx这个容器做一个镜像 [root@linux-node2 ~]# docker commit -m "my nginx" f9c7dfb6f552 cgt/mynginx:v1 3f3adc859b77b2b47c3631229761bee6c7066f1c708bc01c5173c2ef5c0adce8 提交镜像,同时打一个标签叫mynginx:v1,cgt相当于你向github上提交的用户名 查看镜像 [root@linux-node2 ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cgt/mynginx v1 3f3adc859b77 About a minute ago 326.4 MB
3)基于mynginx:v1创建一个容器mynginxv1
目的是修改nginx不让其在后台运行
[root@linux-node2 ~]# docker run -it --name nginxv1 cgt/mynginx:v1 [root@ea64c5855006 /]# vi /etc/nginx/nginx.conf daemon off; # 不再后台运行 [root@ea64c5855006 /]# exit exit [root@linux-node2 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ea64c5855006 cgt/mynginx:v1 "/bin/bash" 2 minutes ago Exited (0) 42 seconds ago nginxv1
4)基于mynginxv1提交mynginxv2版本
重新提交V2版本 [root@linux-node2 ~]# docker commit -m "my nginx" ea64c5855006 cgt/mynginx:v2 a480cdf9055ec4e640c65df6404c6ba42903ea77198a26cec75eef0e4965fe67 查看V2镜像 [root@linux-node2 ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cgt/mynginx v2 a480cdf9055e 25 seconds ago
5)基于mynginxv2镜像,创建mynginxv2容器
启动容器,-d后台运行,-p指定端口 在后面是镜像,最后是命令(因为是yum安装的,可以直接写nginx,如果不是yum,那要写绝对路径) [root@linux-node2 ~]# docker run -d -p 82:80 cgt/mynginx:v2 nginx 4eaf8a19034a673100f9355504628fad45e6ecbab91615afd6cb4e7a18b82171 [root@linux-node2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4eaf8a19034a cgt/mynginx:v2 "nginx" 15 seconds ago Up 14 seconds 0.0.0.0:82->80/tcp elegant_leakey 可以在浏览器访问82端口
方式二:Dockerfile
1)Dockerfile包含的信息
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
2)文件的编写
[root@linux-node2 ~]# mkdir /opt/dockerfile/nginx/ -p [root@linux-node2 ~]# cd /opt/dockerfile/nginx/ 将index.html上传到此处 [root@linux-node2 nginx]# vim Dockerfile # This is docker file # version v1 # Author wangshibo # Base image(基础镜像) FROM centos # Maintainer(维护者信息) MAINTAINER wangshibo [email protected] # Commands(执行命令) RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum -y install nginx # Add(添加文件) ADD index.html /usr/share/nginx/html/index.html # index.html是自己编写的文件,放在后面的目录中,因为yum安装后Documentroot是在这里 RUN echo "daemon off;" >>/etc/nginx/nginx.conf EXPOSE 80 # 对外的端口 CMD ['nginx'] # 执行的命令
3)构建容器,并运行
1 2 3 4 |
|
-------------------------------------------------------------------------------------------------------------------------------
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。当你真正投入容器Docker的怀抱,不但可以发现它能解决很多问题,而且还具有众多的优点:
1 2 3 |
|
但是,许多用户依然像对待典型的虚拟机那样对待容器,似乎都忘记了除了与虚拟机相似的部分,容器还有一个很大的优点:它是一次性的。
这个“特性”本身促使用户改变他们关于使用和管理容器的习惯;下面将会说明下在容器中不应该做这些事,以确保最大地发挥容器的作用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
***************当你发现自己的才华撑不起野心时,就请安静下来学习吧***************