1.Dockerエントリー
1.なぜドッカ?
相比于传统:
部署非常慢
成本非常高
资源浪费
难于迁移和扩展
可能会被限定硬件厂商
物理マシンの多くの問題のため、以降の仮想マシンが登場
物理マシンの複数のVMに独立に各アプリケーションの実行アプリケーションを展開することができます。
しかし、また、仮想化の限界があり、各仮想マシンは、システムリソースを割り当てるための完全なオペレーティングシステムである、マルチチャネル仮想マシンの範囲は、オペレーティング・システム・リソースは、それ自体を使い果たし、または必須拡張します。
トラブル・デプロイメント構成環境ので、あまりがありました
- プログラマのコードやプログラムに依存し、ドッキングウィンドウのイメージファイルとしてパッケージ化され、このイメージファイルを配置する必要があり後に、分散テスト、運用・保守は、唯一、ドッキングウィンドウをインストールし、イメージファイルをインストールする必要があり、あなたは、開発環境を実行することができます。
伝統的な仮想マシンVS 2.Docker
プロパティ | 容器 | 仮想マシン |
---|---|---|
スタート | セカンドクラス | 微小レベル |
ハードドライブ | 通常MB | 通常、GB |
演奏 | ネイティブの近く | 弱いです |
システムのサポート量 | シングルは、コンテナの数千人をサポートしています | 一般的な数十 |
環境問題の3の設定
- 開発者のトラブルのための最も頭痛の一つは、環境に設定され、各コンピュータ環境は、どのようにあなたのマシンは、プログラムを起動し、それを実行している交換することができることを確認するために違うのですか?
- ユーザーはそれを確認する必要があります。
- 同じオペレーティングシステム
- プラットフォームとコンポーネントライブラリの多様性をインストールします。
- Pythonの依存関係など、環境変数
- 環境がとても痛みを伴うように構成されている場合は、マシンを交換する、あなたは、あなたがコピー元の環境とまったく同じ、ソフトウェアをインストールするときに、それを再設定する必要があります。
解決方法1:仮想マシン
- 仮想マシンはまた、仮想マシンを作成するためのテンプレートに基づいてテンプレートを作成、一貫した環境問題を確保することができます
- VM(仮想マシン)は、溶液と環境にインストールされています。それは、このようなLinuxシステムなどのオペレーティングシステムは、内部のWindowsシステム上で実行されているれている別のオペレーティングシステムを実行することができます。このような認識への適用は、仮想マシンが実際のシステムとまったく同じに見えますが、基礎となるシステムのために、仮想マシンは通常のファイルですので、あなたが削除さを必要としない、他の部分には影響がありません、ありません。
- ユーザーは、元のソフトウェア仮想マシン環境を復元することができますが。しかし、この解決策にはいくつかの欠点があります。
1)リソース使用率とより
メモリとハードディスクの空き容量の仮想マシンの排他的な部分。それが実行されている場合は、他のプログラムは、これらのリソースを使用することはできません。でも、仮想マシンのアプリケーション内で、実メモリの使用が唯一の1MBです、仮想マシンがまだ実行するメモリの数百MBが必要です。
(2)多段階の冗長性
仮想マシンは、完全なオペレーティングシステム、いくつかのシステムレベルの手順、多くの場合、ユーザのログインとして、スキップすることはできませんです。
(3)スロースタート
あなたは、仮想マシンを起動する必要がどのくらい、どのくらいのオペレーティングシステムを起動します。数分待つ必要があり、アプリケーションが実際に実行することができます。
解決策2:Linuxのコンテナ
- そのため、仮想マシンの多くの問題のため、Linuxは他の仮想化技術を開発しました:Linuxのコンテナ(Linuxのコンテナ、略語LXC)
- 今:支出ドッキングウィンドウコンテナ以来、私たちは、統一と標準化、開発、テスト環境と本番環境を実現することができます。
- Linuxのコンテナは、オペレーティング・システムの完全なシミュレーションではなく、分離のプロセスではありません。基礎となるシステムの単離を可能にする、容器内のプロセスのための保護層、接触している仮想リソースを設定し、通常のプロセスで
(1)高速起動
コンテナアプリケーション内では、直接基礎となるシステムではなく、仮想マシンプロセスの内部よりも、プロセスです。だから、代わりにオペレーティングシステムを起動するの、マシンを起動する処理容器と同等を開始するには、速度がはるかに高速です。
(2)小フットプリント
コンテナは必要なリソースを占有し、それらのリソースが使用されていない取ることはありません。仮想マシン、それは完全なオペレーティングシステムであるので、すべてのリソースを取ることは避けられません。また、複数のコンテナがリソースを共有することができ、仮想マシンが排他的資源です。
(3)小
限りコンテナファイルは、仮想マシンファイルよりもはるかに小さいので、仮想マシンは、オペレーティングシステム全体をパッケージ化している間コンテナは、使用可能なコンポーネントが含まれていて。
要するに、軽量コンテナ仮想マシンのようなビットは、仮想化環境を提供していますが、はるかに少ないオーバーヘッドを要することができます。
言っ人気のポイント:ドッカーの役割
解决环境部署问题,基于一个镜像文件,能够运行出容器示例,就不需要做环境部署。
利点4.dockerコンテナ
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统 资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运 行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环 境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意 地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员 可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在 很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一 个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
そして、仮想コンテナ5.作業
ライフサイクルの概念の6.Dockerの三
- 画像ファイルは、オペレーティングシステムとして理解することができます
- 容器の例としては、ドッカーミラー操作に基づいて、コンテナ・インスタンスは、マイクロオペレーティングシステムとして理解することができます
- ローカルストレージ、画像ファイルストレージ
7.dockerインストール
1.yum安装,配置yum仓库
-阿里云仓库,清华源仓库,163仓库, 问题是,docker的版本可能很低,有很多漏洞
-选择软件官方提供的yum仓库,版本都是最新的,但是可能下载较慢
-由于网速问题,学习阶段还是使用阿里云的docker
[root@xujunk ~]#yum install docker -y
2.rpm 不推荐
3.源码编译安装,很麻烦,如果没有特定需求,还是选择yum
- アンインストールドッカ
yum remove docker* docker-* -y
8.Dockerミラーアクセラレータ
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
9.ミラーの削除、倉庫、コンテナ管理の変更検索コマンド
- スタート
systemctl status/start/stop docker
- 増加
[root@xujunk ~]#docker images #列出当前所有的镜像文件
[root@xujunk ~]#docker run hello-world #运行镜像文件,生成docker容器实例,docker run命令,会自动下载不存在的镜像
#容器是随时创建,随时删除的,轻量级,每次docker run 都会生成新的容器记录
#docker容器进程,如果没有在后台运行的话,就会立即挂掉, (容器中必须有正在工作的进程)
#运行一个一直活着的容器进程
docker run -d centos /bin/sh -c "while true;do echo '你个糟老头子,不听课,坏得很'; sleep 1;done"
- 削除
docker rmi 镜像名字/镜像id #删除镜像文件
docker rm 容器id/容器进程名字 #删除容器记录
docker rmi -f #强制删除镜像文件
docker rm `docker ps -aq` #批量删除容器记录,只能删除挂掉的容器记录
- 変更
#docker容器进程的启停命令
docker start 容器id
docker stop 容器id
- 検索
docker search 镜像文件名字 #搜索镜像文件
docker images #列出当前所有的镜像文件
docker ps #列出当前记录正在运行的容器进程
docker ps -a #列出所有的容器进程,以及挂掉的
docker logs 容器id #查看容器内的日志信息
docker logs -f 容器id #检测容器内的日志
docker ps -aq #列出所有容器id
#进入容器空间内的命令
docker exec -it 容器id /bin/bash #进入容器空间内
-i 交互式命令操作
-t 开启一个新的终端
#退出容器
exit
#运行一个ubuntu容器
docker run -it ununtu
cat /etc/os-release #查看一个系统版本
- ミラーリングモードを削除するには
1.ps -a #查看是否有用此镜像运行中的容器
2.docker stop 容器id #将启动中的容器关闭
2.docker ps -a #查看所有的容器进程,以及挂掉的
4.docker rm 容器id #删除残留容器
5.docker rmi 镜像文件名字 #删除镜像文件
- カスタムイメージファイルを送信
#过程实现
#运行出容器实例 二次修改容器实例 提交容器实例为新的镜像 导出镜像 发给别人导入
1.docker run -it centos /bin/bash #进入一个纯净的centos容器空间内,此时是最小化安装的系统,没有vim 没有py3
2.在容器空间内 yum install vim ,然后退出容器
3.此时这个容器记录就是携带者 vim的容器记录了(可以理解为携带者程序依赖,或者python3等等)
4.提交这个容器为新的 镜像文件
311110e1ec56
docker commit 容器进程id 镜像文件的名字
docker commit 419 s21docker-centos-vim
#e.g.:[root@xujunk ~]#docker commit 311110e1ec56 docker-centos-vim
sha256:d1870159517111e3756f022fdc851a3c90b1bef6daf2c54b4d0a8a3da4224a1
5.导出docker镜像,成为一个压缩文件,可以发送给你的测试,运维同事了
docker save 镜像文件名/镜像id > /opt/centos-vim.tar.gz
[root@xujunk ~]#docker save d18701595171 > /opt/centos-vim.tar.gz
6.此时可以发送文件,给别人导入了
#这里为了简便在本机进行操作,将原镜像文件删除
[root@xujunk ~]#docker rmi 镜像文件id
docker load < 同事给你发的镜像文件
[root@xujunk ~]#docker load < /opt/centos-vim.tar.gz
- コンテナ、ポートマッピングで動作するWebアプリケーション
1.下载一个flask的docker镜像
[root@xujunk ~]#docker pull training/webapp
2.运行docker镜像
docker run -d -P
-d 后台运行
-P 随机端口映射 随机的宿主机的端口:容器内的端口(自动指定的,由代码指定)
-p 指定端口映射 宿主机的7777:8500
3.创建一个容器空间,然后在里面执行 python app.py 命令
[root@xujunk ~]#docker run -d -P training/webapp python app.py
创建一个容器空间,然后在里面执行 python app.py 命令
[root@xujunk ~]#docker run -d -p 6000:5000 training/webapp python app.py
3.查看后台运行容器端口:
[root@xujunk ~]#docker ps
"""
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ff5a02461a2 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:32769->5000/tcp musing_tesla
"""
4.访问这个容器应用
服务器ip:宿主机的映射端口
浏览器输入:
192.168.58.131:32768
5.进入容器空间内,查看代码
10.dockerfile学習
- イメージファイルを構築するために使用dockerfile学習、ドッキングウィンドウのスクリプトファイル、
#FROM指令用于 指定容器用什么发行版
#制作base image 基础镜像,尽量使用官方的image作为base image
FROM scratch
#使用base image
FROM centos
#带有tag的base image
FROM ubuntu:14.04
#定义标签变量的
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer="[email protected]"
#万能RUN指令,让容器自己去做些什么事
#对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
RUN yum update && yum install -y vim \
Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
RUN yum install redis #自动安装redis
WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd #打印结果应该是/test/demo
- 小示例:
"""
WORKDIR /opt
WORKDIR /tmp
WORKDIR ../
"""
#路径切换到根目录
# ADD命令用来 将宿主机的文件添加到容器空间内
#ADD存在压缩文件解压的功能,因此,仅仅添加文件到容器内,用COPY而不是ADD
ADD and COPY
ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz / #添加到根目录并解压
ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.6 #设置一个mysql常量
示例:RUN yum install -y mysql-server=“${MYSQL_VERSION}”
11.dockerfileフラスコのWebアプリケーションを構築します
1.创建一个文件:
[root@xujunk opt]#mkdir s21docker
[root@xujunk opt]#cd s21docker
2.编写flask代码文件
[root@xujunk s21docker]#vim s21flask.py
"""
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)
"""
3.准备Dockerfile (名字必须叫做 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 s21flask.py /opt/
WORKDIR /opt
EXPOSE 8080
CMD ["python","s21flask.py"]
"""
4.在Dockerfile同级目录,准备好其他环境文件,代码文件:CentOS-Base.repo Dockerfile epel.repo s21flask.py
[root@xujunk s21docker]#cp /etc/yum.repos.d/CentOS-Base.repo ./
[root@xujunk s21docker]#cp /etc/yum.repos.d/epel.repo ./
#查看s21docker目录下文件:
[root@xujunk s21docker]#ls
CentOS-Base.repo Dockerfile epel.repo s21flask.py
5.构建docker镜像
docker build -t xujunkai521/s21-flask-docker .
docker build 编译Dockerfile
-t 给镜像加上名字 ,镜像名字,以仓库地址开头,则可以推送到仓库中管理
. 找到当前的Dockefile文件
#会按照Dockerfile从上到下一步一步编译
6.构建完毕之后,查看镜像文件
[root@xujunk s21docker]#docker images
7.运行这个flask镜像文件,生成容器实例,代码就跑在容器中了
[root@xujunk s21docker]#docker run -d -p 9999:8080 指定你要运行的镜像id/名字
8.web端访问http://192.168.58.131:9999/ 成功访问
- ドッキングウィンドウの実行分析:
ハブ合計倉庫ドッカー〜12プッシュローカルミラー
- フローチャート:
コードの流れ
1.登录docker账户 [root@xujunk s21docker]#docker login 2.修改docker镜像文件名字,以docker hub账号开头 [root@xujunk s21docker]#docker tag docker.io/redis xujunkai521/redis 3.推送镜像到dockerhub仓库中,(注意这个是公共仓库) [root@xujunk s21docker]#docker push xujunkai521/redis
13. プライベートドッキングウィンドウの倉庫の建物(ミラーの安全性確保)
1.下载私有仓库镜像文件
[root@xujunk s21docker]#
docker run -d \
-p 5000:5000 \ # 宿主机的端口(自定义,自己考虑去分配):容器内暴露的端口(django中写了 8000),flask 5000
-v /opt/data/registry:/var/lib/registry \
registry
-p 表示端口映射
-v 表示宿主机路径和容器内路径的映射
2.修改docker的配置文件,支持推送非https的私有镜像
[root@xujunk s21docker]#cat /etc/docker/daemon.json ,内容如下
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": [
"192.168.58.131:5000"
]
}
3.修改docker的启动文件,加载第二步,修改的配置文件
[root@xujunk s21docker]#vim /lib/systemd/system/docker.service #找到如下的[Service] 代码块,添加参数
[Service]
EnvironmentFile= -/etc/docker/daemon.json
4.修改了docker配置文件,重新加载docker
[root@xujunk s21docker]#systemctl daemon-reload
5.重启docker服务
[root@xujunk s21docker]#systemctl restart docker
6.由于重启了docker,需要重新运行私有仓库的容器进程
[root@xujunk s21docker]#docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
--privileged=true docker容器的安全机制:设置特权级运行的容器
7.建立完私有云,就上传一波文件吧!
[root@xujunk s21docker]#docker tag docker.io/hello-world 192.168.58.131:5000/hello-666
#把hello-666镜像 上传到192.168.58.131:5000路径
[root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666
8.查看浏览器:
http://192.168.58.131:5000/v2/_catalog
- 民間倉庫にアップロードハロー-666
如何要把文件下拉下来,执行下面命令:
[root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666