Docker 是一个开源的应用容器引擎,让开发者能够打包他们的应用以及依赖包到一个可移植的容器中,而后发布到任何流行的 Linux 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口。html
docker三大理念java
一,构建python
二,运输mysql
三,运行nginx
像java一次构建处处运行git
能够把运行环境和代码总体打包github
docker组成web
安装dockerredis
yum -y install dockersql
启动
docker是C/S结构 docker进程能够了解为server端执行命令理解为client端,若是把docker进程停了其余client也没法运行(不一样于KVM进程宕机了虚拟机还继续运行)
docker组件
a,镜像(Image) 相似于虚拟机的镜像,组成不一样,做用是同样的
b,容器(Container) 相似于运行KVM虚拟机,至关于从镜像建立了一个实例,容器间相互是隔离的,不一样于虚拟机那样是完全隔离
c,仓库(Repository) 相似于yum仓库,github
PS:容器能够理解为一个简化版的Linux环境
docker与虚拟机的区别
虚拟机的应用运行在操做系统上,docker直接运行不须要操做系统
PS:虚拟机用户资源是彻底隔离的
docker能够实现状态的回滚
docker的做用
1,简化配置,代码和环境在一块
2,代码流水线管理
3,提升开发效率
4,隔离应用
5,整合服务器
6,提升调试能力
7,多租户环境
8,快速部署
启动docker
systemctl start docker
(会产生一个docker的网桥)
docker的网络访问
与kvm同样是经过桥接的方式访问
搜索镜像
docker search centos
下载镜像
docker pull centos:7.2.1511
查看镜像
docker images
PS:不是pull下载的使用docker load --input centos.tar导入后再使用docker images查看
pull下来使用docker save -o centos.tar centos导出镜像
删除
docker rmi 镜像id
运行
docker run centos:7.2.1511 /bin/echo 'hello world'
PS:镜像名称centos必须在全部选项后面
不自定义名称会自动生成一个名称
查看在运行过的
docker ps -a
本身定义一个启动的docker的name
docker run --name mydocker -t -i centos:7.2.1511 /bin/bash
PS:-t启动伪终端 -i标准输入
伪终端能够运行各类命令
PS:进入了容器可是不是一个虚拟机,实际上是一个进程,进程结束了容器就结束了
中止的容器再启动
docker start mydocker
登陆这个容器
docker attach mydocker
exit退出之后这个容器也关闭了
删除
docker rm mydocker
PS:后面接容器名或者是容器ID
使用
nsenter链接
启动容器先获取Pid
docker inspect -f "{{ .State.Pid }}" mydocker
28254
nsenter -t 28254 -m -u -i -n -p
退出之后这个容器不会终止
写个脚本实现以上功能
vim docker_in.sh
#!/bin/bash #Use nsnter to access docker docker_in(){ NAME_ID=$1 PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID) nsenter -t $PID -m -u -i -n -p } docker_in $1
sh docker_in.sh mydocker
不进入容器执行一个命令
docker exec mydocker whoami
root
也能使用exec进入容器
docker exec -it mydocker /bin/bash
PS:建议使用nsenter进入容器由于使用exec进入可能会致使一些奇怪的问题
删除容器
docker rm mydocker
若是想删除正在运行的容器
docker rm -f mydocker
PS:能够在运行容器的时候加-rm参数 当一个容器运行完会自动删除
pull一个nginx
docker pull nginx
docker run -d nginx
-d后台运行而且输出id
怎么访问这个nginx
查看容器访问日志
docker logs c4aefb55c183 由于刚刚没有取name 因此这个用的是id
docker的网络访问
带端口启动
docker run -d -P nginx
把本机10000端口映射到80端口
访问如下
curl 127.0.0.1:10000
使用命令查看访问日志
docker logs 6c43246b6ce3
指定端口映射
docker run -d -p 10.13.85.9:81:80 --name mynginx nginx
本地ip是10.13.85.9 端口81映射到容器的80端口
访问
单独查看端口映射
docker port mynginx
也能够一次性启动多个端口
docker run -d -p 443:443 -p 82:80 --name nginxv2 nginx
docker数据管理
启动数据卷
docker run -d --name nginx-volume-test1 -v /data nginx
进入
./docker_in.sh nginx-volume-test1
输入
mount
退出
docker inspect -f {{.Mounts}} nginx-volume-test1
进入到对应的目录
/var/lib/docker/volumes/014fa27d7fea367252f91445c6268f1376b67357ca51f0163f7dc480174cbc5a/_data
新建一个文件
touch hehe
新建一个窗口进入容器
ls /data 就能看到新建的那个文件hehe了
另一种挂载方式
新建一个目录
mkdir -p /data/docker-volume-nginx
启动容器挂载
docker run -d --name nginx-volume-test2 -v /data/docker-volume-nginx/:/data/ nginx
进入容器
./docker_in.sh nginx-volume-test2
cd /data
touch hehe
退出在目录/data/docker-volume-nginx下面就有了文件hehe
PS:第二种方式比较经常使用,挂载数据致使移植性差
挂载单个文件
docker run --rm -it -v /root/.bash_history:/.bash_history nginx /bin/bash
PS: --rm参数退出后自动中止删除这个容器
数据卷容器
可让数据在多个容器之间共享
docker run -it --name volume-test3 --volumes-from nginx-volume-test2 centos /bin/bash
能够访问 nginx-volume-test2挂载的目录
PS:即便中止了容器nginx-volume-test2仍是同样能够访问
docker stop nginx-volume-test2
使用这种方式挂载不须要指定挂载目录了和源镜像挂载目录同样
Docker改变了什么
面向产品: 产品交付
面向开发: 简化环境配置
面向测试: 多版本测试
面向运维: 环境一致性
面向构架: 自动化扩容(微服务)
docker镜像的构建
1,手动构建
先kill掉全部运行的容器
docker kill $(docker ps -a -q)
删除全部容器
docker rm $(docker ps -a -q)
PS:生产最好不用这样作
构建
docker run --name mynginx -it centos
yum安装nginx
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx
编辑nginx配置文件
vim /etc/nginx/nginx.conf
加一行(尾部增长便可不是加在http里面)
daemon off;
PS:不能少掉;符号
表明nginx在前台运行
exit退出
提交到本地
docker commit -m "My Nginx" 0ef327b06604 oldboy/mynginx:v1
启动
docker run --name mynginxv1 -d -p 81:80 oldboy/mynginx:v1 nginx
PS:这里末尾nginx并不是nginx镜像而是nginx启动命令
访问
访问日志
sh docker_in.sh mynginxv1
vi /var/log/nginx/access.log
使用命令构建新建目录
vim Dockerfile
# This Dockerfile #Base image FROM centos MAINTAINER Jason.Zhao xxx@gmail.com #Commands RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm RUN yum -y install nginx && yum clean all RUN echo "daemon off;" >> /etc/nginx/nginx.conf ADD index.html /usr/share/nginx/html/index.html EXPOSE 80 CMD ["nginx"]
新建首页文件和Dockerfile在同一目录
echo "nginx in docker,hahha" >>index.html
构建
docker build -t mynginx:v2 .
生成了 查看一下
启动
docker run --name mynginx2 -d -p 82:80 mynginx:v2
访问82端口就是现实刚刚是index.html内容
CMD只能使用一次,加入使用了CMD在启动容器的时候优先使用指定的启动命令
生存环境构建docker镜像
分层设计
cd /root/docker/system/centos
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
mv /etc/yum.repos.d/epel.repo .
vim Dockerfile
#Docker for CentOS #Base image FROM centos #Who MAINTAINER Liuyueming #EPEL ADD epel.repo /etc/yum.repo.d/ #Base pkg RUN yum -y install wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all
构建
docker build -t oldboy/centos:base ./
PS:以上及把生产环境所需的最基础的包yum安装上,其余环境能够在此基础上继续构建,而不是其余环境须要这些包从新再安装一遍
建立应用环境就from oldboy/centos
cd /root/docker/runtime/python
vim Dockerfile
#Base image
FROM oldboy/centos:base
MAINTAINER Liuyueming
RUN yum install -y python-devel python-pip
#Upgrade pip
#RUN pip install --upgrade pip
构建
docker build -t oldboy/python ./
PS:加上升级pip的会报错
构建一个带ssh的
cd /root/docker/system/centos-ssh
#Docker for CentOS #Base image FROM centos #Who MAINTAINER Liuyueming #EPEL ADD epel.repo /etc/yum.repo.d/ #Base pkg RUN yum -y install openssh-clients openssl-devel openssh-server wget mysql-devel supervisor git redis tree net-tools sudo psmisc && yum clean all #For SSHD RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key RUN echo "root:oldboy"|chpasswd
构建
ocker build -t oldboy/centos-ssh ./
python也基于centos-ssh构建
cd /root/docker/runtime/python-ssh
vim Dockerfile
#Base image FROM oldboy/centos-ssh:latest MAINTAINER Liuyueming RUN yum install -y python-devel python-pip #Upgrade pip #RUN pip install --upgrade pip
docker build -t oldboy/python-ssh ./
使用这个运行一个python测试脚本
cd
/root/docker/app/shop-api
vim app.py
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello World!' if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
yum -y install python-pip
pip install flask
运行
python app.py
使用5000端口提供服务
访问
插入学习supervisor进程管理
yum -y install supervisor
vim /etc/supervisord.conf
docker仓库
做业:须要https加认证nginx
1,申请免费ssl证书(沃通)
2,部署
3,设置验证
4,proxy_pass 5000
5,docker run -d -p 5000:5000 --name registry registry:2
开源企业级 VMware Harbor
docker的web管理界面admiral
docker run -d -p 8282:8282 --name admiral vmware/admiral