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

posted @ 2017-07-13 22:44  minseo  阅读(554)  评论(0编辑  收藏  举报