Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机( VM)额外的操作系统开销,提高资源利用率。
原理:
建立====》传送====》运行
架构:
C/S架构
组件:
镜像(Image)
容器(Container)
仓库(Repository)
与VM的区别
docker与Openstack的对比
Docker能干嘛
简单配置、代码流水线管理、开发效率、应用隔离、服务器整合、调试能力、多租户、快速部署
Docker改变了什么?
面向产品:产品交付
面向开发:简化环境配置
面向测试:多版本测试
面向运维:环境一致性
面向架构:自动化扩容
Docker的部署安装
环境准备
yum install -y docker systemctl start docker systemctl enable docker
镜像的查看
[[email protected] ~]# 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
镜像仓库 标签 镜像ID 创建时间 镜像大小
镜像的下载、导出和导入
[[email protected] ~]# docker save centos > /opt/centos.tar.gz [[email protected] ~]# docker load < /opt/centos.tar.gz
[[email protected] ~]# docker pull centos
这次咱们做实验需要三个镜像: nginx、centos、registry
镜像的删除
docker:命令 rmi:参数 后面
[[email protected] ~]# docker rmi 813e3731b203
你的第一次(创建容器)
[[email protected] ~]# docker run centos /bin/echo "hehe" hehe
命令解读:使用centos镜像,run执行命令,使用echo命令输出hehe
查看容器状态
可以使用docker ps只能看见存活的容器,docker ps -a 查看全部的容器
容器ID 使用的镜像 执行的命令 创建的时间 状态 端口 名称(如果不指定,自动生成)
[[email protected] ~]# 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 :容器的标准输保持打开的状态
[[email protected] ~]# docker run --name mydocker -t -i centos /bin/bash [[email protected] /]# 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;
在容器中查看主机名
[[email protected] /]# hostname 94ab7a046f7c [[email protected] /]# exit
启动、停止容器
[[email protected] ~]# docker stop ID
[[email protected] ~]# docker start ID
进入容器
方式一:
[[email protected] ~]# docker attach 94ab7a046f7c
[[email protected] /]#
方式二:
先获取进程的PID然后在通过pid进入容器
[[email protected] ~]# docker inspect --format "{{.State.Pid}}" 94ab7a046f7c 4101 [[email protected] ~]# nsenter -t 4101 -u -i -p [[email protected] opt]# nsenter --help -t, --target <pid> target process to get namespaces from -m, --mount [=<file>] enter mount namespace -u, --uts [=<file>] enter UTS namespace (hostname etc) -i, --ipc [=<file>] enter System V IPC namespace -n, --net [=<file>] enter network namespace -p, --pid [=<file>] enter pid namespace -r, --root [=<dir>] set the root directory -w, --wd [=<dir>] set the working directory -F, --no-fork do not fork before exec‘ing <program>
通过脚本实现进入容器
#/bin/sh PID=$(docker inspect --format "{{.State.Pid}}" $1) nsenter -t $PID -p -i -u -n
删除容器
[[email protected] ~]# docker rm ID/名称 加-f 强制删除,包括正在运行中的容器
映射
随机映射
端口的映射是系统自动分配的?
[[email protected] ~]# docker run -d -P nginx 90316d97ee975b4e62e1927a9fb31f20703556b1a3ea07880d0c68dcb5bbd3bb [[email protected] ~]# 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
指定映射
指定端口的映射
[[email protected] ~]# docker run -d -p 81:80 nginx 0294a8f5b4fc81ba31383a8eb98ec62b136826eba92360c84afd87bf1bf819fc [[email protected] ~]# 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
查看日志
[[email protected] ~]# docker log +ID
数据管理
数据卷
默认挂载目录
创建一个数据卷,名称是volume-test1,挂载到data下默认挂载目录
[[email protected] ~]# docker run -it --name volume-test1 -v /data centos [[email protected] /]# ls -l /data/ total 0
打开一个新的窗口
列出容器的所有信息,查看mounts模块
[[email protected] ~]# docker inspect 1768d6414cfc "Mounts": [ { "Name": "55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167", "Source": "/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data", "Destination": "/data", "Driver": "local", "Mode": "", "RW": true } ],
查找挂载点并进入
查看挂载的位置 [[email protected] ~]# ll /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data 总用量 0 进入到挂载点 [[email protected] ~]# cd /var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data
创建一个cgt测试,并重新回到容器中查看
[[email protected] _data]# mkdir cgt 去容器中查看 [[email protected] /]# ls -l /data/ total 4 drwxr-xr-x 2 root root 4096 Jan 4 14:04 cgt
指定挂载目录
将/opt挂载到/opt目录下 [[email protected] ~]# docker run -it --name volume-test1 -v /opt:/opt centos
指定权限
只需要在挂载后面加上权限即可。
加读写rw;只读ro
[[email protected] ~]# docker run -it --name volume-test1 -v /opt:/opt:rw centos
挂载单个文件
记录历史记录
[[email protected] ~]# docker run -it -v ~/.bash_history:/.bash_history centos
数据卷容器
让一个容器可以访问另一个容器的数据卷
启动两个容器
启动nfs容器,挂在一个卷,使用-d直接在后台执行 [[email protected] ~]# docker run -d --name nfs -v /data centos 209bc89b365ad6bc1eeae693ada01c04c2d08e9ee2b8816e624882944c116126 启动test1容器,挂载到nfs的数据卷容器上, [[email protected] ~]# docker run -it --name test1 --volumes-from nfs centos [[email protected] /]# ls /data/ 查看没内容
找到nfs容器的挂载点
(可以使用名称,不仅仅是ID)
找到nfs容器的ID [[email protected] 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容器的挂载点
[[email protected] _data]# docker inspect nfs [[email protected] opt]# cd /var/lib/docker/volumes/3938c9b1143d41340e148a4c7bc12d13b53966b15380c5b958a9e035897450d5/_data [[email protected] _data]# touch cgt
在test1上查看
到test1上查看 [[email protected] /]# ls /data/ cgt
点睛:数据卷容器不论停止还是开启,不影响其他容器挂载使用
如何制作镜像
方式一:手动构建容器
1:创建一个容器mynginx,使用centos镜像
[[email protected] ~]# docker run --name mynginx -it centos [[email protected] /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm [[email protected] /]# yum -y install nginx [[email protected] /]# exit exit
2:基于mynginx容器做一个镜像mynginx:v1
[[email protected] ~]# 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这个容器做一个镜像 [[email protected] ~]# docker commit -m "my nginx" f9c7dfb6f552 cgt/mynginx:v1 3f3adc859b77b2b47c3631229761bee6c7066f1c708bc01c5173c2ef5c0adce8 提交镜像,同时打一个标签叫mynginx:v1,cgt相当于你向github上提交的用户名 查看镜像 [[email protected] ~]# 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不让其在后台运行
[[email protected] ~]# docker run -it --name nginxv1 cgt/mynginx:v1 [[email protected] /]# vi /etc/nginx/nginx.conf daemon off; # 不再后台运行 [[email protected] /]# exit exit [[email protected] ~]# 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版本 [[email protected] ~]# docker commit -m "my nginx" ea64c5855006 cgt/mynginx:v2 a480cdf9055ec4e640c65df6404c6ba42903ea77198a26cec75eef0e4965fe67 查看V2镜像 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE cgt/mynginx v2 a480cdf9055e 25 seconds ago
5:基于mynginxv2镜像,创建mynginxv2容器
启动容器,-d后台运行,-p指定端口 在后面是镜像,最后是命令(因为是yum安装的,可以直接写nginx,如果不是yum,那要写绝对路径) [[email protected] ~]# docker run -d -p 82:80 cgt/mynginx:v2 nginx 4eaf8a19034a673100f9355504628fad45e6ecbab91615afd6cb4e7a18b82171 [[email protected] ~]# 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:文件的编写
[[email protected] ~]# mkdir /opt/dockerfile/nginx/ -p [[email protected] ~]# cd /opt/dockerfile/nginx/ 将index.html上传到此处 [[email protected] nginx]# vim Dockerfile # This is docker file # version v1 # Author caoxiaojian # Base image(基础镜像) FROM centos # Maintainer(维护者信息) MAINTAINER caoxiaojian [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:构建容器,并运行
建立newnginx容器,-t:标签,执行/opt/dockerfile/nginx/下面的默认的Dockerfile文件 [[email protected] nginx]# docker build -t cgt/mynginx:v3 /opt/dockerfile/nginx/ [[email protected] nginx]# docker run -d -p 83:80 cgt/mynginx:v3 友好链接:http://itgladiator.github.io/%E6%9E%B6%E6%9E%84/2015/06/06/Docker%E5%AD%A6%E4%B9%A0.html