docker学习
docker入门学习
docker是什么?
1.linux下容器技术有很多,docker是做的最杰出的一款
2.docker能够支持阿里双十一,可见安全和并发都没问题
3.docker容器很容易被大规模创建
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 使用 Google 公司推出的 Go 语言 进行开发实现。docker是linux容器的一种封装,提供简单易用的容器使用接口。它是最流行的Linux容器解决方案。docker的接口相当简单,用户可以方便的创建、销毁容器。docker将应用程序与程序的依赖,打包在一个文件里面。运行这个文件就会生成一个虚拟容器。程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了
4.docker能够解决什么问题?
ocke用场景
web应用的自动化打包和发布自动化测试和持续集成、发布在服务型环境中部署和调整数据库或其他应用
5.每一个docker容器,安装一个app
6.docker如同在os的进程上,接着一个马甲,其实还是运行在一个单独linux系统上
7.让开发人员最头疼的就是,环境配置问题,运行一个crm,可能要解决很多的依赖 关系,才能运行,
保证操作系统一致性,你本地是windows,服务器可能是centos/ubuntu
你本地开发的是python3,也得保证服务器是python3
还得解决pip依赖包
8.有没有一种办法,能把本地的开发代码,全部切换到服务器上呢?
解决办法1:vmware 虚拟机模板克隆
解决办法2:docker容器技术
将你的应用程序,和代码,全部打包在一个系统镜像内,(docker image 容器镜像),镜像就是一个操作的压缩文件。
基于系统镜像可以运行操作系统
基于docker镜像,运行出容器镜像
如果开发,把crm代码,和pip3程序的依赖,全部打包在一个镜像内
9.docker能够保证服务器的环境一致性
10.docker的生命周期
基于镜像,安装出系统
基于docker镜像,运行出实例
容器:就像类的实例化
镜像:就像class
docker的三大概念
容器:container 基于镜像,运行出的容器实例
镜像:image 电脑城,老板卖的光盘,只要系统环境一致性
仓库:存放镜像的地方
#托管代码的平台,叫做GitHub
#托管docker镜像的平台,叫做docker hub
配置一个人docker加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
把配置文件逗号去掉:vim /etc/docker/daemon.json
重启docker:sudo systemctl restart docker
docker的安装方式:
1.yum安装,必须指定yum源,yum源大致分为centos官方的源,阿里云这样的第三方源,官方源(生产环境配置它最正确)
获取docker社区版
社区ce缩写
企业版是EE缩写
官方教程如下,最正确安装docker姿势
1.卸载旧版本sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine?2.设置存储库sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2?sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo?3.安装docker社区版sudo yum install docker-ce4.启动关闭dockersystemctl start docker
2.选择阿里云的安装方式,配置好阿里云yum源
安装:yum install docker-server docker 或yum install docker -y
3.启动docker服务端
启动:systemctl start docker 查看状态:systemctl status docker
4.学习docker命令
开发人员需要管理,容器的启停,创建,足以
对docker容器,和镜像的增删改查
增
获取一个docker镜像,获取一个基础的ubuntu镜像
获取一个hello-world镜像
docker search hello-world #搜索docker镜像
docker pull hello-world # 下载镜像,就如同骑车去电脑城买光盘,目的为了获取一个镜像文件
#基于镜像,运行出容器实例
docker run hello-world #运行hello-world镜像文件
#下载ubuntu的镜像文件,一个微型的ubuntu系统
docker pull ubuntu
#运行ubuntu的系统,基于微型的ubuntu系统,运行一个容器实例,里面是ubuntu微型操作系统
docker run ubuntu
#交互式的运行一个ubuntu系统,可以进行命令交互,并且
docker run -it ubuntu /bin/bash
查看系统:cat /etc/os-release
参数解释
-i交互式的运行
-t开启一个终端 termenl
/bin/bash 就是linux的shell解释器
什么是linux的shell解释器
python解释器是用来解释且执行python代码
shell解释器是用来解释且执行shell代码,我们输入ls cd都是通过shell进行翻译,linux才认识
运行一个后台有进程的容器,活着的容器
docker run -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
参数解释
docker run 运行镜像
-d daemonize 后台运行
centos 镜像名
/bin/sh 指定shell的sh解释器
-c 指定一段shell代码
"while true;do echo hello centos; sleep 1;done" # 是循环,打印hello centos
运行一个自定义名字的容器记录
docker run --name s18foleng -d centos /bin/sh -c "while true;do echo hello centos; sleep 1;done"
删
docker rm 容器id前三位
docker rm f3a
一次性删除所有容器记录
docker rm docker ps -aq
删除镜像记录
docker rmi 镜像id
# 删除所有容器记录
docker rmi -f docker images -aq
#-f强制删除
改
进入正在运行容器空间内
docker exec -it 容器id /bin/bash
修改docker镜像名字
docker tag 镜像id 新的镜像名
docker tag cc2b20124a01 kevins
查
#查询当前机器拥有的镜像文件
docker image ls # 列出镜像文件
docker images #同上,版本升级,命令也就升级了
#运行过镜像后,会产生一个容器记录,容器进程的查看
docker ps #查看正在运行的容器记录,容器必须有后台运行的进程,否则容器挂掉
docker ps -a # 显示所有运行过的容器进程记录
查询容器内日志信息
docker logs 容器id #一次性打印日志
docker logs -f 容器id #不间断打印容器日志
容器创建非常简单,每次创建,都是新的容器记录,和之前没有关系
#基于镜像,可以很随意运行容器实例
构建自己的docker镜像,提交本地的docker容器
1.运行一个centos基础镜像,默认没有vim,在容器空间内安装vim
docker run -it centos /bin/bash
2.安装vim
yum install vim -y
3.退出容器空间
exit
4.提交这个容器记录,生成一个新的镜像文件
查看容器id:docker ps -a
docker commit 容器id 镜像名
docker commit 9dd7870654a6 kevins/s18-vim
5.导出这个镜像,成为一个压缩文件,我就可以给大家发送下去
docker save 镜像id > /opt/mydocker.tar.gz
docker save cc2b20124a01 > /opt/mydocker.tar.gz
6.导入docker镜像
docker load < /opt/mydocker.tar.gz
外部访问容器,是在容器空间内,暴露一个端口,供给外部客户去访问
容器内的端口映射
docker run -d -P training/webapp python app.py
#参数解释
-d 后台运行容器
-P 大写p 随机端口映射 宿主机端口:容器内端口
-p 小写p 指定端口映射 8080:8000
training/webapp 这个是镜像的名字
python app.py 容器要执行的命令
指定端口映射,暴露宿主机的7000,指定映射到容器的5000,这个5000是在容器代码内控制
docker run -d -p 7000:5000 training/webapp python app.py
docker run 如果运行不存在的镜像,默认会先去docker pull
启停docker容器
docker start 容器id
docker stop 容器id
登陆dockerhub个人主站,托管docker镜像的网址
1.下载dockerhub上的镜像
docker pull yunchao163/s13-hello-docker-world
2.在linux登陆docker hub ,然后推送镜像到公网
账号:kevinss
密码:kevinssid
登陆:docker login
3.修改本地镜像的名字,为docker hub的仓库id
docker tag 镜像id dockerhubID/镜像名
4.推送镜像到hub
docker push dockerhubID/镜像名
docker push kevinss/s18-hello-world
dockerfile的学习
指令如下
#你的项目依赖什么操作系统,这里就指定什么操作系统FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base imageFROM centos #使用base imageFROM ubuntu:14.04 #带有tag的base image?#label标签,告诉别人,这个dockerfile谁写的LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释LABEL maintainer=“"?#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!RUN yum update && yum install -y vim \ Python-dev #反斜线换行RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”?WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cdWORKDIR /test #如果没有就自动创建WORKDIR demo #再进入demo文件夹RUN pwd #打印结果应该是/test/demo?#ADD是可以将本地代码,添加到容器空间内ADD and COPY ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录ADD test.tar.gz / #添加到根目录并解压?WORKDIR /rootADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径COPY hello test/ #等同于上述ADD效果?ADD与COPY - 优先使用COPY命令 -ADD除了COPY功能还有解压功能添加远程文件/目录使用curl或wget?ENV #环境变量,尽可能使用ENV增加可维护性ENV MYSQL_VERSION 5.6 #设置一个mysql常量RUN yum install -y mysql-server=“${MYSQL_VERSION}” ------这里需要稍微理解一下了-------中级知识---先不讲VOLUME and EXPOSE
dockerfile实战,构建自己的flaks镜像
1.创建文件夹 :mkdir s18dockerfile
cd s18dockerfile文件目录中。建立两个文件
touch Dockerfile
touch s18-Flask.py
在 s18-Flask.py写入
#coding:utf8from flask import Flaskapp=Flask(__name__)@app.route(‘/‘)def hello(): return "hello docker"if __name__=="__main__": app.run(host=‘0.0.0.0‘,port=8080)
2.编写dockerfile
FROM centos #指定centos基础镜像 COPY CentOS-Base.repo /etc/yum.repos.d/ #拷贝宿主机的文件,到容器空间下 COPY epel.repo /etc/yum.repos.d/ #拷贝宿主机的文件,到容器空间下 RUN yum clean all #执行清空yum缓存的命令 RUN yum install python-setuptools -y #想安装python依赖工具 RUN easy_install flask #想让docker自动安装python2的flask模块 COPY s18-Flask.py/opt/ #把本地代码拷贝到容器内的opt目录下 WORKDIR /opt #进入到opt目录下 EXPOSE 8080 #暴露容器8080端口。供给外部宿主机访问 CMD ["python"," s18-Flask.py"] #cmd代表你要执行的命令
3.构建build这个dockerfile
cp /etc/yum.repos.d/CentOS-Base.repo ./
cp /etc/yum.repos.d/epel.repo ./
确保文件都准备好了,如下所示
[ s18dockerfile]# ls CentOS-Base.repo Dockerfile epel.repo s18-Flask.py
4.构建dockerfile
docker build .
5.通过自己构建的镜像,运行一个flask程序
docker run -d --name flask -p 5555:8080 s18-Flask.py
6.通过浏览器去访问宿主机 5555端口,即可访问flask程序
搭建私有仓库
1.搭建一个私有仓库镜像,官方提供的
docker pull registry
2.修改docker的配置文件,让他支持非https的方式推送,安全的方式推送倒私有仓库中
vim /etc/docker/daemon.json
{"registry-mirrors": ["http://95822026.m.daocloud.io"] ,"insecure-registries":["192.168.91.128:5000"]: }
3.修改docker的service配置文件,让他加载/etc/docker/daemon.json
修改如下配置文件
vim /lib/systemd/system/docker.service
只需写入到[service]代码块中如下:
EnvironmentFile=-/etc/docker/daemon.json
4.重启docker的服务
systemctl daemon-reload
systemctl restart docker
5.运行这个镜像,生成一个容器实例
docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry # -v 宿主机的文件夹目录映射容器内的文件夹目录 -p 端口映射 #--privileged=true docker容器的安全机制:设置特权级运行的容器
6.推送发到hub
docker push 192.168.91.128:5000/s18-hello-world
7.检查docker私有仓库的api地址,检查json数据
http://192.168.91.128:5000/v2/_catalog
8.尝试下载私有仓库的镜像(在局域网里面下载)
docker pull 192.168.91.128:5000/s18-hello-world