一、docker介绍
1、产生背景
由于最初的一台服务器部署一个应用的方法占用资源多、速度慢且不易迁移和扩展,所以出现了虚拟机,可以在一台服务器上虚拟出多个服务器来部署多个应用。但是虚拟机中每个虚拟的系统都是完整的系统,需要占用资源,且容量有限,其速度也不快。
docker容器实现了开发、测试和生产环境的标准化,镜像作为标准的交付件实现了三套环境上的应用及运行依赖环境完全一致。容器不是模拟一整个操作系统,而是对进程进行隔离,在正常的进程外套了一层保护层,对于容器里的进程来说所接触的环境是虚拟的,从而实现和底层系统的隔离。它和虚拟机相比启动更快、占用资源更少、体积更小。
特性 |
容器 |
虚拟机 |
启动 |
秒级 |
分钟级 |
硬盘使用 |
一般为 MB |
一般为 GB |
性能 |
接近原生 |
弱 |
系统支持量 |
单机支持上千个容器 |
一般几十个 |
docker特点:占用资源少、启动速度快、保证一致的运行环境
三大概念:镜像(image)、容器(container)、仓库(repository)
二、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-ce
# 网络不好或个人测试可以使用阿里云的yum源安装
yum install docker* docker-* -y
4.启动关闭docker systemctl start docker
5.查看版本
docker version
docker加速器
实际上就是修改了一段json字符串,改变下载源
#一条命令加速 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://95822026.m.daocloud.io
三、docker基本使用
# 查 docker search xxxx # 去docker hub 上搜索某个镜像 docker version # 查看版本 docker images # 查看镜像 docker image ls docker ps # 查看正在运行容器记录 docker ps -a # 查看所有停止的和运行的容器记录
docker logs -f 容器id # 查看正在运行的容器的日志 -f不间断打印 # 增 docker run 镜像id/镜像名 # 创建并运行一个容器实例 docker run centos # 运行centos镜像,但是因为没有任何后台进程所以会立刻结束,如果本地没有会去docker hub上下载 docker run -it centos # -i 交互式界面 -t 开启一个终端 docker run -it --rm ubuntu # --rm 退出时删除容器运行记录
docker run -d xxxx /sbin/bash # 后台运行
docker run -P xxxx # 随机映射一个宿主机端口到容器端口
docker run -p 8080:8000 xxx # 映射宿主机的8080端口到容器的8000端口
docker run -v /xxx/xxx:/xxx/xxx xxx # 映射宿主机的一个文件或文件夹到容器 docker pull centos # 去docker hub上下载镜像 # 删 docker rm 容器id # 删除停止的容器id docker rmi `docker images -aq` # 一次性删除所有的镜像 docker rmi 容器id # 删除一个镜像 docker rm `docker ps -aq` # 一次性删除所有的容器记录 # 改 docker commit 容器id 镜像名 # 提交容器记录为新的镜像 docker stop 容器id # 停止正在运行的容器 docker start 容器id # 运行关闭了的容器 docker save xxxx > /opt/xxx/xxx.tar.gz # 导出一个镜像到本地 docker load xxxx < /opt/xxx/xxx.tar.gz # 导入一个镜像
docker exec -it xxx # 进入已运行的容器
注意:如果docker run 命令总是报错,可能是linux版本和yum版本不匹配,可以sudo yum update升级,之后就好了。
四、定制镜像
定制镜像其实就是写一个dockerfile脚本文件,文件内包含着该镜像创建后做的命令,生成一个镜像的过程就是从上到下执行脚本命令的过程。
脚本语言:
FROM centos # 所使用的基础镜像,如果本地没有则会从dockerhub下载 LABEL version="1.0" # 容器元信息 LABEL maintainer="yinwnejiexxxx" #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令! RUN yum install vim -y RUN yum update && yum install -y vim Python-dev #反斜线换行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME” WORKDIR /root # 相当于cd命令 ADD hello.py / # 将宿主机的dockerfile文件所在目录的文件写进/ COPY xxx xxx # 和ADD一样,但是ADD会自动解压压缩包,COPY不会 ENV version 1.0 # 设置变量 RUN yum install -y python="$version" # 使用变量 CMD ["xx", "xxx"] # 设置镜像启动后默认执行的命令 EXPOSE 9999 # 暴露一个外部可以访问的端口
五、发布镜像到docker hub
第一种:发布到公有仓库
1.docker提供了一个类似于github的仓库dockerhub, 网址https://hub.docker.com/需要注册使用 2.注册docker id后,在linux中登录dockerhub docker login 注意上传镜像时需要修改镜像名: docker tag chaoyu/centos-vim yuchao163/centos-vim 语法是: docker tag 镜像名/id 账号ID/将要上传到的仓库名:镜像新tag
3.推送docker image到dockerhub docker push 账号ID/仓库名:tag4.在dockerhub中检查镜像 https://hub.docker.com/ 5.删除本地镜像,测试下载pull 镜像文件 docker pull 账号ID/仓库名:tag
第二种:发布到私有仓库
1.官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/repository/registry.html 2.一条命令下载registry镜像并且启动私有仓库容器 私有仓库会被创建在容器的/var/lib/registry下,因此通过-v参数将镜像文件存储到本地的/opt/data/registry下 端口映射容器中的5000端口到宿主机的5000端口 docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry 3.检查启动的registry容器 docker ps 4.测试连接容器 telnet 192.168.119.10 5000 5.修改镜像tag,以docker registry的地址端口开头 docker tag hello-world:latest 192.168.119.10:5000/hello-world:latest 6.查看docker镜像,找到registry的镜像 docker images 7.Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,这里必须写正确json数据 [root@master /]# cat /etc/docker/daemon.json {"registry-mirrors": ["http://95822026.m.daocloud.io"], "insecure-registries":["192.168.119.10:5000"] } 写入到docker服务中,写入到[Service]配置块中,加载此配置文件 [root@master home]# grep 'EnvironmentFile=/etc/docker/daemon.json' /lib/systemd/system/docker.service EnvironmentFile=-/etc/docker/daemon.json 8.修改了docker配置文件,重新加载docker systemctl daemon-reload 9.重启docker systemctl restart docker 10.重启了docker,刚才的registry容器进程挂掉了,因此重新启动它 docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全机制:设置特权级运行的容器 11.推送本地镜像 docker push 192.168.119.10:5000/hello-world 12.由于docker registry没有web节目,但是提供了API数据 官网教程:https://docs.docker.com/registry/spec/api/#listing-repositories curl http://192.168.119.10:5000/v2/_catalog 或者浏览器访问http://192.168.119.10:5000/v2/_catalog 13.删除本地镜像,从私有仓库中下载 docker pull 192.168.119.10:5000/hello-world
六、示例:打包flask程序
确保app.py和dockerfile在同一个目录! 1.准备好app.py的flask程序 [root@master home]# cat app.py #coding:utf8 from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080) [root@master home]# ls app.py Dockerfile 2.编写dockerfile FROM centos COPY CentOS-Base.repo /etc/yum.repos.d/ COPY epel.repo /etc/yum.repos.d/ RUN yum clean all RUN yum install python-setuptools -y RUN easy_install flask COPY s16-flask.py /opt/ WORKDIR /opt EXPOSE 8080 CMD ["python","s16-flask.py"] 3.构建镜像image docker build -t yuchao163/flask-hello-docker . 4.查看创建好的images docker image ls 5.启动此flask-hello-docker容器,映射一个端口供外部访问 docker run -d -p 8080:8080 yuchao163/flask-hello-docker 6.检查运行的容器 docker container ls