docker容器技术
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker三大理念
一,构建
二,运输
三,运行
像java一次构建到处运行
可以把运行环境和代码整体打包
docker组成
安装docker
yum -y install docker
启动
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